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
|
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
|
||||||
}
|
}
|
||||||
|
|
|
@ -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}} → {{$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}}
|
||||||
|
|
Loading…
Reference in a new issue