bridge/github: recover terminal state in password prompts

Amine Hilaly created

commands: error if a token is provide but not the bridge name and target

Change summary

bridge/github/config.go      | 11 +++++++++++
commands/bridge_configure.go |  4 ++++
2 files changed, 15 insertions(+)

Detailed changes

bridge/github/config.go 🔗

@@ -21,6 +21,7 @@ import (
 
 	"github.com/MichaelMure/git-bug/bridge/core"
 	"github.com/MichaelMure/git-bug/repository"
+	"github.com/MichaelMure/git-bug/util/interrupt"
 )
 
 const (
@@ -236,6 +237,16 @@ func promptTokenOptions(owner, project string) (string, error) {
 			return promptToken()
 		}
 
+		// Register restore state cleaner before prompting passwords inputs
+		termState, err := terminal.GetState(int(syscall.Stdin))
+		if err != nil {
+			return "", err
+		}
+
+		interrupt.RegisterCleaner(func() error {
+			return terminal.Restore(int(syscall.Stdin), termState)
+		})
+
 		return loginAndRequestToken(owner, project)
 	}
 }

commands/bridge_configure.go 🔗

@@ -35,6 +35,10 @@ func runBridgeConfigure(cmd *cobra.Command, args []string) error {
 	defer backend.Close()
 	interrupt.RegisterCleaner(backend.Close)
 
+	if (tokenStdin || bridgeParams.Token != "") && (bridgeConfigureName == "" || bridgeConfigureTarget == "") {
+		return fmt.Errorf("you must bridge name and target to configure a bridge with a token")
+	}
+
 	if bridgeConfigureTarget == "" {
 		bridgeConfigureTarget, err = promptTarget()
 		if err != nil {