mirror of
				https://gitee.com/gitea/gitea
				synced 2025-11-04 16:40:24 +08:00 
			
		
		
		
	Respect LFS File Lock on UI (#8719)
* update #8687 respect file locking * upate #8687 Add LFS locker information * update #8719 enhance coding style and return error
This commit is contained in:
		@@ -2810,3 +2810,19 @@ func (repo *Repository) GetOriginalURLHostname() string {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	return u.Host
 | 
						return u.Host
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// GetTreePathLock returns LSF lock for the treePath
 | 
				
			||||||
 | 
					func (repo *Repository) GetTreePathLock(treePath string) (*LFSLock, error) {
 | 
				
			||||||
 | 
						if setting.LFS.StartServer {
 | 
				
			||||||
 | 
							locks, err := GetLFSLockByRepoID(repo.ID)
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								return nil, err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							for _, lock := range locks {
 | 
				
			||||||
 | 
								if lock.Path == treePath {
 | 
				
			||||||
 | 
									return lock, nil
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return nil, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -703,6 +703,7 @@ editor.preview_changes = Preview Changes
 | 
				
			|||||||
editor.cannot_edit_lfs_files = LFS files cannot be edited in the web interface.
 | 
					editor.cannot_edit_lfs_files = LFS files cannot be edited in the web interface.
 | 
				
			||||||
editor.cannot_edit_non_text_files = Binary files cannot be edited in the web interface.
 | 
					editor.cannot_edit_non_text_files = Binary files cannot be edited in the web interface.
 | 
				
			||||||
editor.edit_this_file = Edit File
 | 
					editor.edit_this_file = Edit File
 | 
				
			||||||
 | 
					editor.this_file_locked = File is locked
 | 
				
			||||||
editor.must_be_on_a_branch = You must be on a branch to make or propose changes to this file.
 | 
					editor.must_be_on_a_branch = You must be on a branch to make or propose changes to this file.
 | 
				
			||||||
editor.fork_before_edit = You must fork this repository to make or propose changes to this file.
 | 
					editor.fork_before_edit = You must fork this repository to make or propose changes to this file.
 | 
				
			||||||
editor.delete_this_file = Delete File
 | 
					editor.delete_this_file = Delete File
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -119,8 +119,19 @@ func RefBlame(ctx *context.Context) {
 | 
				
			|||||||
	ctx.Data["IsBlame"] = true
 | 
						ctx.Data["IsBlame"] = true
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if ctx.Repo.CanEnableEditor() {
 | 
						if ctx.Repo.CanEnableEditor() {
 | 
				
			||||||
 | 
							// Check LFS Lock
 | 
				
			||||||
 | 
							lfsLock, err := ctx.Repo.Repository.GetTreePathLock(ctx.Repo.TreePath)
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								ctx.ServerError("GetTreePathLock", err)
 | 
				
			||||||
 | 
								return
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if lfsLock != nil && lfsLock.OwnerID != ctx.User.ID {
 | 
				
			||||||
 | 
								ctx.Data["CanDeleteFile"] = false
 | 
				
			||||||
 | 
								ctx.Data["DeleteFileTooltip"] = ctx.Tr("repo.editor.this_file_locked")
 | 
				
			||||||
 | 
							} else {
 | 
				
			||||||
			ctx.Data["CanDeleteFile"] = true
 | 
								ctx.Data["CanDeleteFile"] = true
 | 
				
			||||||
			ctx.Data["DeleteFileTooltip"] = ctx.Tr("repo.editor.delete_this_file")
 | 
								ctx.Data["DeleteFileTooltip"] = ctx.Tr("repo.editor.delete_this_file")
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
	} else if !ctx.Repo.IsViewBranch {
 | 
						} else if !ctx.Repo.IsViewBranch {
 | 
				
			||||||
		ctx.Data["DeleteFileTooltip"] = ctx.Tr("repo.editor.must_be_on_a_branch")
 | 
							ctx.Data["DeleteFileTooltip"] = ctx.Tr("repo.editor.must_be_on_a_branch")
 | 
				
			||||||
	} else if !ctx.Repo.CanWrite(models.UnitTypeCode) {
 | 
						} else if !ctx.Repo.CanWrite(models.UnitTypeCode) {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -265,6 +265,17 @@ func renderFile(ctx *context.Context, entry *git.TreeEntry, treeLink, rawLink st
 | 
				
			|||||||
			ctx.Data["RawFileLink"] = fmt.Sprintf("%s%s.git/info/lfs/objects/%s/%s", setting.AppURL, ctx.Repo.Repository.FullName(), meta.Oid, filenameBase64)
 | 
								ctx.Data["RawFileLink"] = fmt.Sprintf("%s%s.git/info/lfs/objects/%s/%s", setting.AppURL, ctx.Repo.Repository.FullName(), meta.Oid, filenameBase64)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
						// Check LFS Lock
 | 
				
			||||||
 | 
						lfsLock, err := ctx.Repo.Repository.GetTreePathLock(ctx.Repo.TreePath)
 | 
				
			||||||
 | 
						ctx.Data["LFSLock"] = lfsLock
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							ctx.ServerError("GetTreePathLock", err)
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if lfsLock != nil {
 | 
				
			||||||
 | 
							ctx.Data["LFSLockOwner"] = lfsLock.Owner.DisplayName()
 | 
				
			||||||
 | 
							ctx.Data["LFSLockHint"] = ctx.Tr("repo.editor.this_file_locked")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Assume file is not editable first.
 | 
						// Assume file is not editable first.
 | 
				
			||||||
	if isLFSFile {
 | 
						if isLFSFile {
 | 
				
			||||||
@@ -334,8 +345,13 @@ func renderFile(ctx *context.Context, entry *git.TreeEntry, treeLink, rawLink st
 | 
				
			|||||||
		}
 | 
							}
 | 
				
			||||||
		if !isLFSFile {
 | 
							if !isLFSFile {
 | 
				
			||||||
			if ctx.Repo.CanEnableEditor() {
 | 
								if ctx.Repo.CanEnableEditor() {
 | 
				
			||||||
 | 
									if lfsLock != nil && lfsLock.OwnerID != ctx.User.ID {
 | 
				
			||||||
 | 
										ctx.Data["CanEditFile"] = false
 | 
				
			||||||
 | 
										ctx.Data["EditFileTooltip"] = ctx.Tr("repo.editor.this_file_locked")
 | 
				
			||||||
 | 
									} else {
 | 
				
			||||||
					ctx.Data["CanEditFile"] = true
 | 
										ctx.Data["CanEditFile"] = true
 | 
				
			||||||
					ctx.Data["EditFileTooltip"] = ctx.Tr("repo.editor.edit_this_file")
 | 
										ctx.Data["EditFileTooltip"] = ctx.Tr("repo.editor.edit_this_file")
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
			} else if !ctx.Repo.IsViewBranch {
 | 
								} else if !ctx.Repo.IsViewBranch {
 | 
				
			||||||
				ctx.Data["EditFileTooltip"] = ctx.Tr("repo.editor.must_be_on_a_branch")
 | 
									ctx.Data["EditFileTooltip"] = ctx.Tr("repo.editor.must_be_on_a_branch")
 | 
				
			||||||
			} else if !ctx.Repo.CanWrite(models.UnitTypeCode) {
 | 
								} else if !ctx.Repo.CanWrite(models.UnitTypeCode) {
 | 
				
			||||||
@@ -368,8 +384,13 @@ func renderFile(ctx *context.Context, entry *git.TreeEntry, treeLink, rawLink st
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if ctx.Repo.CanEnableEditor() {
 | 
						if ctx.Repo.CanEnableEditor() {
 | 
				
			||||||
 | 
							if lfsLock != nil && lfsLock.OwnerID != ctx.User.ID {
 | 
				
			||||||
 | 
								ctx.Data["CanDeleteFile"] = false
 | 
				
			||||||
 | 
								ctx.Data["DeleteFileTooltip"] = ctx.Tr("repo.editor.this_file_locked")
 | 
				
			||||||
 | 
							} else {
 | 
				
			||||||
			ctx.Data["CanDeleteFile"] = true
 | 
								ctx.Data["CanDeleteFile"] = true
 | 
				
			||||||
			ctx.Data["DeleteFileTooltip"] = ctx.Tr("repo.editor.delete_this_file")
 | 
								ctx.Data["DeleteFileTooltip"] = ctx.Tr("repo.editor.delete_this_file")
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
	} else if !ctx.Repo.IsViewBranch {
 | 
						} else if !ctx.Repo.IsViewBranch {
 | 
				
			||||||
		ctx.Data["DeleteFileTooltip"] = ctx.Tr("repo.editor.must_be_on_a_branch")
 | 
							ctx.Data["DeleteFileTooltip"] = ctx.Tr("repo.editor.must_be_on_a_branch")
 | 
				
			||||||
	} else if !ctx.Repo.CanWrite(models.UnitTypeCode) {
 | 
						} else if !ctx.Repo.CanWrite(models.UnitTypeCode) {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -16,6 +16,12 @@
 | 
				
			|||||||
							{{FileSize .FileSize}}{{if .IsLFSFile}} ({{.i18n.Tr "repo.stored_lfs"}}){{end}}
 | 
												{{FileSize .FileSize}}{{if .IsLFSFile}} ({{.i18n.Tr "repo.stored_lfs"}}){{end}}
 | 
				
			||||||
						</div>
 | 
											</div>
 | 
				
			||||||
					{{end}}
 | 
										{{end}}
 | 
				
			||||||
 | 
										{{if .LFSLock}}
 | 
				
			||||||
 | 
											<div class="file-info-entry">
 | 
				
			||||||
 | 
												<i class="fa fa-lock poping up disabled" data-content="{{.LFSLockHint}}" data-position="bottom center" data-variation="tiny inverted"></i>
 | 
				
			||||||
 | 
												<a href="{{AppSubUrl}}/{{.LFSLock.Owner.Name}}">{{.LFSLockOwner}}</a>
 | 
				
			||||||
 | 
											</div>
 | 
				
			||||||
 | 
										{{end}}
 | 
				
			||||||
				</div>
 | 
									</div>
 | 
				
			||||||
			{{end}}
 | 
								{{end}}
 | 
				
			||||||
		</div>
 | 
							</div>
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user