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

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

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}}