From c0390c277e5fcda8d7288b717ff952e01dcdcb8d Mon Sep 17 00:00:00 2001 From: Aleksandr Nogikh Date: Mon, 21 Oct 2024 17:38:01 +0200 Subject: pkg/vcs: parse git diffs Provide a functionality to extract the files affected by a git patch. --- pkg/vcs/git.go | 11 +++++++++++ pkg/vcs/git_test.go | 22 ++++++++++++++++++++++ 2 files changed, 33 insertions(+) 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"}) +} -- cgit mrf-deployment