Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitaly.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJacob Vosmaer (GitLab) <jacob@gitlab.com>2017-03-06 13:46:43 +0300
committerJacob Vosmaer (GitLab) <jacob@gitlab.com>2017-03-06 13:46:43 +0300
commitc48485c62cf7a5288f4a3176567abb2e88af8f66 (patch)
treee8f36725c53e3963c96d8b21b277585bcd29b4d8
parent23ce9de01b2869f9907e132c94d50594087e2b0b (diff)
parent809602219db38b3fe373877b37e5603525654307 (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.go6
-rw-r--r--internal/service/diff/commit_test.go21
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)