diff options
author | Jacob Vosmaer (GitLab) <jacob@gitlab.com> | 2017-03-06 13:46:43 +0300 |
---|---|---|
committer | Jacob Vosmaer (GitLab) <jacob@gitlab.com> | 2017-03-06 13:46:43 +0300 |
commit | c48485c62cf7a5288f4a3176567abb2e88af8f66 (patch) | |
tree | e8f36725c53e3963c96d8b21b277585bcd29b4d8 | |
parent | 23ce9de01b2869f9907e132c94d50594087e2b0b (diff) | |
parent | 809602219db38b3fe373877b37e5603525654307 (diff) |
Merge branch 'fix/parsing-when-git-diff-fails' into 'master'
Fix infinite parsing loop when git diff fails
See merge request !86
-rw-r--r-- | internal/diff/diff.go | 6 | ||||
-rw-r--r-- | internal/service/diff/commit_test.go | 21 |
2 files changed, 26 insertions, 1 deletions
diff --git a/internal/diff/diff.go b/internal/diff/diff.go index 8a659af20..c5d2f5573 100644 --- a/internal/diff/diff.go +++ b/internal/diff/diff.go @@ -61,7 +61,11 @@ func (parser *Parser) Parse() bool { if err == io.EOF { parser.finished = true - if len(line) < 10 && parser.currentDiff != nil { + if parser.currentDiff == nil { // Probably NewDiffParser was passed an empty src (e.g. git diff failed) + return false + } + + if len(line) < 10 { consumeChunkLine(parser.reader, parser.currentDiff) return true } diff --git a/internal/service/diff/commit_test.go b/internal/service/diff/commit_test.go index 324eb73fb..ffd9c4dda 100644 --- a/internal/service/diff/commit_test.go +++ b/internal/service/diff/commit_test.go @@ -273,6 +273,27 @@ func TestFailedCommitDiffRequestWithEmptyCommit(t *testing.T) { } } +func TestFailedCommitDiffRequestWithNonExistentCommit(t *testing.T) { + server := runDiffServer(t) + defer server.Stop() + + client := newDiffClient(t) + repo := &pb.Repository{Path: path.Join(testRepoRoot, testRepo)} + nonExistentCommitID := "deadfacedeadfacedeadfacedeadfacedeadface" + leftCommit := nonExistentCommitID + "~" // Parent of rightCommit + rpcRequest := &pb.CommitDiffRequest{Repository: repo, RightCommitId: nonExistentCommitID, LeftCommitId: leftCommit} + + c, err := client.CommitDiff(context.Background(), rpcRequest) + if err != nil { + t.Fatal(err) + } + + expectedError := "Command failed to complete successfully" + if err := drainCommitDiffResponse(c); !strings.Contains(err.Error(), expectedError) { + t.Errorf("Expected error to be %q, got %q", expectedError, err.Error()) + } +} + func runDiffServer(t *testing.T) *grpc.Server { server := grpc.NewServer() listener, err := net.Listen("unix", serverSocketPath) |