forked from gitea/gitea
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:
parent
e06f3d2ee5
commit
a36c620583
|
@ -371,6 +371,8 @@ type DiffFile struct {
|
|||
IsViewed bool // User specific
|
||||
HasChangedSinceLastReview bool // User specific
|
||||
Language string
|
||||
Mode string
|
||||
OldMode string
|
||||
}
|
||||
|
||||
// GetType returns type of diff file.
|
||||
|
@ -501,6 +503,11 @@ func ParsePatch(maxLines, maxLineCharacters, maxFiles int, reader io.Reader, ski
|
|||
}
|
||||
return diff, err
|
||||
}
|
||||
|
||||
prepareValue := func(s, p string) string {
|
||||
return strings.TrimSpace(strings.TrimPrefix(s, p))
|
||||
}
|
||||
|
||||
parsingLoop:
|
||||
for {
|
||||
// 1. A patch file always begins with `diff --git ` + `a/path b/path` (possibly quoted)
|
||||
|
@ -585,11 +592,20 @@ parsingLoop:
|
|||
}
|
||||
break parsingLoop
|
||||
}
|
||||
|
||||
switch {
|
||||
case strings.HasPrefix(line, cmdDiffHead):
|
||||
break curFileLoop
|
||||
case strings.HasPrefix(line, "old 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") {
|
||||
curFile.IsSubmodule = true
|
||||
}
|
||||
|
@ -597,31 +613,34 @@ parsingLoop:
|
|||
curFile.IsRenamed = true
|
||||
curFile.Type = DiffFileRename
|
||||
if curFile.IsAmbiguous {
|
||||
curFile.OldName = line[len("rename from ") : len(line)-1]
|
||||
curFile.OldName = prepareValue(line, "rename from ")
|
||||
}
|
||||
case strings.HasPrefix(line, "rename to "):
|
||||
curFile.IsRenamed = true
|
||||
curFile.Type = DiffFileRename
|
||||
if curFile.IsAmbiguous {
|
||||
curFile.Name = line[len("rename to ") : len(line)-1]
|
||||
curFile.Name = prepareValue(line, "rename to ")
|
||||
curFile.IsAmbiguous = false
|
||||
}
|
||||
case strings.HasPrefix(line, "copy from "):
|
||||
curFile.IsRenamed = true
|
||||
curFile.Type = DiffFileCopy
|
||||
if curFile.IsAmbiguous {
|
||||
curFile.OldName = line[len("copy from ") : len(line)-1]
|
||||
curFile.OldName = prepareValue(line, "copy from ")
|
||||
}
|
||||
case strings.HasPrefix(line, "copy to "):
|
||||
curFile.IsRenamed = true
|
||||
curFile.Type = DiffFileCopy
|
||||
if curFile.IsAmbiguous {
|
||||
curFile.Name = line[len("copy to ") : len(line)-1]
|
||||
curFile.Name = prepareValue(line, "copy to ")
|
||||
curFile.IsAmbiguous = false
|
||||
}
|
||||
case strings.HasPrefix(line, "new file"):
|
||||
curFile.Type = DiffFileAdd
|
||||
curFile.IsCreated = true
|
||||
if strings.HasPrefix(line, "new file mode ") {
|
||||
curFile.Mode = prepareValue(line, "new file mode ")
|
||||
}
|
||||
if strings.HasSuffix(line, " 160000\n") {
|
||||
curFile.IsSubmodule = true
|
||||
}
|
||||
|
|
|
@ -113,6 +113,11 @@
|
|||
{{if $file.IsVendored}}
|
||||
<span class="ui label gt-ml-3">{{$.locale.Tr "repo.diff.vendored"}}</span>
|
||||
{{end}}
|
||||
{{if and $file.Mode $file.OldMode}}
|
||||
<span class="gt-ml-4 gt-mono">{{$file.OldMode}} → {{$file.Mode}}</span>
|
||||
{{else if $file.Mode}}
|
||||
<span class="gt-ml-4 gt-mono">{{$file.Mode}}</span>
|
||||
{{end}}
|
||||
</div>
|
||||
<div class="diff-file-header-actions gt-df gt-ac">
|
||||
{{if $showFileViewToggle}}
|
||||
|
|
Loading…
Reference in New Issue