From 49389456687a923c1809df8d6eb5ce72c30404f0 Mon Sep 17 00:00:00 2001 From: Kirill Bolashev <111061261+kbolashev@users.noreply.github.com> Date: Thu, 16 Mar 2023 18:03:04 +0200 Subject: [PATCH] Handle files starting with colons in WalkGitLog (#22935) Currently gitea shows no commit information for files starting with a colon. [I set up a minimal repro repository that reproduces this error once it's migrated on gitea](https://github.com/kbolashev/colon-test) image This is happening because the filenames piped to the `git log` command are written as is, and it doesn't work when you have a colon at the start of the filename, and you need to escape it. You can test it locally, if you do ``` mkdir repo git init touch :file git add . && git commit -m "Add file with colon" git log -- :file ``` git log returns nothing. However, if you do `git log -- "\:file"`, it will show the commit with the file change. This PR escapes the starting colons in paths in the `LogNameStatusRepo` function, making gitea return commit info about the file with the bad filename. image This error shows up only with files starting with colon, anywhere else in filename is ok. Dashes at the beginning also seem to be working. I don't know gitea internals well enough to know where else this error can pop up, so I'm keeping this PR small as suggested by your contributor guide --- modules/git/log_name_status.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/modules/git/log_name_status.go b/modules/git/log_name_status.go index fe3b6598d..70f6ef9db 100644 --- a/modules/git/log_name_status.go +++ b/modules/git/log_name_status.go @@ -56,6 +56,10 @@ func LogNameStatusRepo(ctx context.Context, repository, head, treepath string, p } else if treepath != "" { files = append(files, treepath) } + // Use the :(literal) pathspec magic to handle edge cases with files named like ":file.txt" or "*.jpg" + for i, file := range files { + files[i] = ":(literal)" + file + } cmd.AddDashesAndList(files...) go func() {