mirror of
				https://gitee.com/gitea/gitea
				synced 2025-11-04 08:30:25 +08:00 
			
		
		
		
	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:  Gitea:  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:
		@@ -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}}
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user