diff options
| author | Aleksandr Nogikh <nogikh@google.com> | 2024-10-21 17:38:01 +0200 |
|---|---|---|
| committer | Taras Madan <tarasmadan@google.com> | 2024-10-25 12:08:02 +0000 |
| commit | c0390c277e5fcda8d7288b717ff952e01dcdcb8d (patch) | |
| tree | dec1a2b0e5417c4e1a403c20b3ef3e7d0b95a082 /pkg | |
| parent | 500aee76e6243afdb6c953d37e5f1016f73a04cc (diff) | |
pkg/vcs: parse git diffs
Provide a functionality to extract the files affected by a git patch.
Diffstat (limited to 'pkg')
| -rw-r--r-- | pkg/vcs/git.go | 11 | ||||
| -rw-r--r-- | pkg/vcs/git_test.go | 22 |
2 files changed, 33 insertions, 0 deletions
diff --git a/pkg/vcs/git.go b/pkg/vcs/git.go index 7425066d2..b75859338 100644 --- a/pkg/vcs/git.go +++ b/pkg/vcs/git.go @@ -654,3 +654,14 @@ func (git *git) PushCommit(repo, commit string) error { } return nil } + +var fileNameRe = regexp.MustCompile(`(?m)^diff.* b\/([^\s]+)`) + +// ParseGitDiff extracts the files modified in the git patch. +func ParseGitDiff(patch []byte) []string { + var files []string + for _, match := range fileNameRe.FindAllStringSubmatch(string(patch), -1) { + files = append(files, match[1]) + } + return files +} diff --git a/pkg/vcs/git_test.go b/pkg/vcs/git_test.go index a46408417..daef69501 100644 --- a/pkg/vcs/git_test.go +++ b/pkg/vcs/git_test.go @@ -462,3 +462,25 @@ func TestGitFetchShortHash(t *testing.T) { _, err := local.CheckoutCommit(remoteRepoDir, refCommit.Hash[:12]) assert.NoError(t, err) } + +func TestParseGitDiff(t *testing.T) { + files := ParseGitDiff([]byte(`diff --git a/a.txt b/a.txt +index 4c5fd91..8fe1e32 100644 +--- a/a.txt ++++ b/a.txt +@@ -1 +1 @@ +-First file ++First file! +diff --git a/b.txt b/b.txt +new file mode 100644 +index 0000000..f8a9677 +--- /dev/null ++++ b/b.txt +@@ -0,0 +1 @@ ++Second file. +diff --git a/c/c.txt b/c/c.txt +new file mode 100644 +index 0000000..e69de29 +`)) + assert.ElementsMatch(t, files, []string{"a.txt", "b.txt", "c/c.txt"}) +} |
