Handle pending actions properly in git commands that require credentials

I don't know if this is a hack or not: we run a git command and increment the pending action
count to 1 but at some point the command requests a username or password, so we need to prompt
the user to enter that. At that point we don't want to say that there is a pending action,
so we decrement the action count before prompting the user and then re-increment it again afterward.

Given that we panic when the counter goes below zero, it's important that it's not zero
when we run the git command (should be impossible anyway).

I toyed with a different approach using channels and a long-running goroutine that
handles all commands that request credentials but it feels over-engineered compared to this
commit's approach.
This commit is contained in:
Jesse Duffield 2023-07-08 14:17:54 +10:00
parent 6c4e7ee972
commit 26ca41a40e
5 changed files with 111 additions and 68 deletions

View file

@ -15,6 +15,18 @@ func getRunner() *cmdObjRunner {
}
}
func toChanFn(f func(ct CredentialType) string) func(CredentialType) <-chan string {
return func(ct CredentialType) <-chan string {
ch := make(chan string)
go func() {
ch <- f(ct)
}()
return ch
}
}
func TestProcessOutput(t *testing.T) {
defaultPromptUserForCredential := func(ct CredentialType) string {
switch ct {
@ -99,7 +111,7 @@ func TestProcessOutput(t *testing.T) {
reader := strings.NewReader(scenario.output)
writer := &strings.Builder{}
runner.processOutput(reader, writer, scenario.promptUserForCredential)
runner.processOutput(reader, writer, toChanFn(scenario.promptUserForCredential))
if writer.String() != scenario.expectedToWrite {
t.Errorf("expected to write '%s' but got '%s'", scenario.expectedToWrite, writer.String())