Display file mode for new file and file mode changes ()

This MR introduces the addition of file mode display support for both
new file creation and file mode changes, following a similar approach as
GitLab.

GitLab:

![изображение](https://github.com/go-gitea/gitea/assets/1969460/4c0d0d74-30b2-486c-ac12-ef2355b04c96)


Gitea:

![изображение](https://github.com/go-gitea/gitea/assets/1969460/8237fe99-2507-42c0-a40c-cd52ad355ab7)

Replaces: https://github.com/go-gitea/gitea/pull/23159
Closes: https://github.com/go-gitea/gitea/issues/23021

---------

Co-authored-by: silverwind <me@silverwind.io>
Co-authored-by: delvh <dev.lh@web.de>
Co-authored-by: Giteabot <teabot@gitea.io>
This commit is contained in:
Yevhen Pavlov 2023-05-29 20:56:08 +03:00 committed by GitHub
parent e06f3d2ee5
commit a36c620583
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 28 additions and 4 deletions
services/gitdiff
templates/repo/diff

View file

@ -371,6 +371,8 @@ type DiffFile struct {
IsViewed bool // User specific IsViewed bool // User specific
HasChangedSinceLastReview bool // User specific HasChangedSinceLastReview bool // User specific
Language string Language string
Mode string
OldMode string
} }
// GetType returns type of diff file. // GetType returns type of diff file.
@ -501,6 +503,11 @@ func ParsePatch(maxLines, maxLineCharacters, maxFiles int, reader io.Reader, ski
} }
return diff, err return diff, err
} }
prepareValue := func(s, p string) string {
return strings.TrimSpace(strings.TrimPrefix(s, p))
}
parsingLoop: parsingLoop:
for { for {
// 1. A patch file always begins with `diff --git ` + `a/path b/path` (possibly quoted) // 1. A patch file always begins with `diff --git ` + `a/path b/path` (possibly quoted)
@ -585,11 +592,20 @@ parsingLoop:
} }
break parsingLoop break parsingLoop
} }
switch { switch {
case strings.HasPrefix(line, cmdDiffHead): case strings.HasPrefix(line, cmdDiffHead):
break curFileLoop break curFileLoop
case strings.HasPrefix(line, "old mode ") || case strings.HasPrefix(line, "old mode ") ||
strings.HasPrefix(line, "new mode "): strings.HasPrefix(line, "new mode "):
if strings.HasPrefix(line, "old mode ") {
curFile.OldMode = prepareValue(line, "old mode ")
}
if strings.HasPrefix(line, "new mode ") {
curFile.Mode = prepareValue(line, "new mode ")
}
if strings.HasSuffix(line, " 160000\n") { if strings.HasSuffix(line, " 160000\n") {
curFile.IsSubmodule = true curFile.IsSubmodule = true
} }
@ -597,31 +613,34 @@ parsingLoop:
curFile.IsRenamed = true curFile.IsRenamed = true
curFile.Type = DiffFileRename curFile.Type = DiffFileRename
if curFile.IsAmbiguous { if curFile.IsAmbiguous {
curFile.OldName = line[len("rename from ") : len(line)-1] curFile.OldName = prepareValue(line, "rename from ")
} }
case strings.HasPrefix(line, "rename to "): case strings.HasPrefix(line, "rename to "):
curFile.IsRenamed = true curFile.IsRenamed = true
curFile.Type = DiffFileRename curFile.Type = DiffFileRename
if curFile.IsAmbiguous { if curFile.IsAmbiguous {
curFile.Name = line[len("rename to ") : len(line)-1] curFile.Name = prepareValue(line, "rename to ")
curFile.IsAmbiguous = false curFile.IsAmbiguous = false
} }
case strings.HasPrefix(line, "copy from "): case strings.HasPrefix(line, "copy from "):
curFile.IsRenamed = true curFile.IsRenamed = true
curFile.Type = DiffFileCopy curFile.Type = DiffFileCopy
if curFile.IsAmbiguous { if curFile.IsAmbiguous {
curFile.OldName = line[len("copy from ") : len(line)-1] curFile.OldName = prepareValue(line, "copy from ")
} }
case strings.HasPrefix(line, "copy to "): case strings.HasPrefix(line, "copy to "):
curFile.IsRenamed = true curFile.IsRenamed = true
curFile.Type = DiffFileCopy curFile.Type = DiffFileCopy
if curFile.IsAmbiguous { if curFile.IsAmbiguous {
curFile.Name = line[len("copy to ") : len(line)-1] curFile.Name = prepareValue(line, "copy to ")
curFile.IsAmbiguous = false curFile.IsAmbiguous = false
} }
case strings.HasPrefix(line, "new file"): case strings.HasPrefix(line, "new file"):
curFile.Type = DiffFileAdd curFile.Type = DiffFileAdd
curFile.IsCreated = true curFile.IsCreated = true
if strings.HasPrefix(line, "new file mode ") {
curFile.Mode = prepareValue(line, "new file mode ")
}
if strings.HasSuffix(line, " 160000\n") { if strings.HasSuffix(line, " 160000\n") {
curFile.IsSubmodule = true curFile.IsSubmodule = true
} }

View file

@ -113,6 +113,11 @@
{{if $file.IsVendored}} {{if $file.IsVendored}}
<span class="ui label gt-ml-3">{{$.locale.Tr "repo.diff.vendored"}}</span> <span class="ui label gt-ml-3">{{$.locale.Tr "repo.diff.vendored"}}</span>
{{end}} {{end}}
{{if and $file.Mode $file.OldMode}}
<span class="gt-ml-4 gt-mono">{{$file.OldMode}} &rarr; {{$file.Mode}}</span>
{{else if $file.Mode}}
<span class="gt-ml-4 gt-mono">{{$file.Mode}}</span>
{{end}}
</div> </div>
<div class="diff-file-header-actions gt-df gt-ac"> <div class="diff-file-header-actions gt-df gt-ac">
{{if $showFileViewToggle}} {{if $showFileViewToggle}}