aboutsummaryrefslogtreecommitdiffstats
path: root/modules
diff options
context:
space:
mode:
authorzeripath <art27@cantab.net>2023-03-03 22:28:38 +0000
committerGitHub <noreply@github.com>2023-03-03 17:28:38 -0500
commit5c4075e16dd7afc75557b178239b8172e286d5c3 (patch)
tree7d0864b447d57b6989044e0a94fb778f3c5837e3 /modules
parent7f9d58fab8a3c4fd1a8f18d58e36fbfab7b30f33 (diff)
downloadgitea-5c4075e16dd7afc75557b178239b8172e286d5c3.tar.gz
gitea-5c4075e16dd7afc75557b178239b8172e286d5c3.zip
Fix GetFilesChangedBetween if the file name may be escaped (#23272)
The code for GetFilesChangedBetween uses `git diff --name-only base..head` to get the names of files changed between base and head however this forgets that git will escape certain values. This PR simply switches to use `-z` which has the `NUL` character as the separator. Ref https://github.com/go-gitea/gitea/pull/22568#discussion_r1123138096 Signed-off-by: Andrew Thornton <art27@cantab.net> Co-authored-by: techknowlogick <techknowlogick@gitea.io>
Diffstat (limited to 'modules')
-rw-r--r--modules/git/repo_compare.go11
1 files changed, 9 insertions, 2 deletions
diff --git a/modules/git/repo_compare.go b/modules/git/repo_compare.go
index 9a4d66f2f5..439455e3c2 100644
--- a/modules/git/repo_compare.go
+++ b/modules/git/repo_compare.go
@@ -277,11 +277,18 @@ func (repo *Repository) GetPatch(base, head string, w io.Writer) error {
// GetFilesChangedBetween returns a list of all files that have been changed between the given commits
func (repo *Repository) GetFilesChangedBetween(base, head string) ([]string, error) {
- stdout, _, err := NewCommand(repo.Ctx, "diff", "--name-only").AddDynamicArguments(base + ".." + head).RunStdString(&RunOpts{Dir: repo.Path})
+ stdout, _, err := NewCommand(repo.Ctx, "diff", "--name-only", "-z").AddDynamicArguments(base + ".." + head).RunStdString(&RunOpts{Dir: repo.Path})
if err != nil {
return nil, err
}
- return strings.Split(stdout, "\n"), err
+ split := strings.Split(stdout, "\000")
+
+ // Because Git will always emit filenames with a terminal NUL ignore the last entry in the split - which will always be empty.
+ if len(split) > 0 {
+ split = split[:len(split)-1]
+ }
+
+ return split, err
}
// GetDiffFromMergeBase generates and return patch data from merge base to head