mirror of
				https://gitee.com/gitea/gitea
				synced 2025-11-04 08:30:25 +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
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 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_non_text_files = Binary files cannot be edited in the web interface.
 | 
			
		||||
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.fork_before_edit = You must fork this repository to make or propose changes to this file.
 | 
			
		||||
editor.delete_this_file = Delete File
 | 
			
		||||
 
 | 
			
		||||
@@ -119,8 +119,19 @@ func RefBlame(ctx *context.Context) {
 | 
			
		||||
	ctx.Data["IsBlame"] = true
 | 
			
		||||
 | 
			
		||||
	if ctx.Repo.CanEnableEditor() {
 | 
			
		||||
		ctx.Data["CanDeleteFile"] = true
 | 
			
		||||
		ctx.Data["DeleteFileTooltip"] = ctx.Tr("repo.editor.delete_this_file")
 | 
			
		||||
		// 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["DeleteFileTooltip"] = ctx.Tr("repo.editor.delete_this_file")
 | 
			
		||||
		}
 | 
			
		||||
	} else if !ctx.Repo.IsViewBranch {
 | 
			
		||||
		ctx.Data["DeleteFileTooltip"] = ctx.Tr("repo.editor.must_be_on_a_branch")
 | 
			
		||||
	} 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)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	// 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.
 | 
			
		||||
	if isLFSFile {
 | 
			
		||||
@@ -334,8 +345,13 @@ func renderFile(ctx *context.Context, entry *git.TreeEntry, treeLink, rawLink st
 | 
			
		||||
		}
 | 
			
		||||
		if !isLFSFile {
 | 
			
		||||
			if ctx.Repo.CanEnableEditor() {
 | 
			
		||||
				ctx.Data["CanEditFile"] = true
 | 
			
		||||
				ctx.Data["EditFileTooltip"] = ctx.Tr("repo.editor.edit_this_file")
 | 
			
		||||
				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["EditFileTooltip"] = ctx.Tr("repo.editor.edit_this_file")
 | 
			
		||||
				}
 | 
			
		||||
			} else if !ctx.Repo.IsViewBranch {
 | 
			
		||||
				ctx.Data["EditFileTooltip"] = ctx.Tr("repo.editor.must_be_on_a_branch")
 | 
			
		||||
			} 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() {
 | 
			
		||||
		ctx.Data["CanDeleteFile"] = true
 | 
			
		||||
		ctx.Data["DeleteFileTooltip"] = ctx.Tr("repo.editor.delete_this_file")
 | 
			
		||||
		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["DeleteFileTooltip"] = ctx.Tr("repo.editor.delete_this_file")
 | 
			
		||||
		}
 | 
			
		||||
	} else if !ctx.Repo.IsViewBranch {
 | 
			
		||||
		ctx.Data["DeleteFileTooltip"] = ctx.Tr("repo.editor.must_be_on_a_branch")
 | 
			
		||||
	} else if !ctx.Repo.CanWrite(models.UnitTypeCode) {
 | 
			
		||||
 
 | 
			
		||||
@@ -16,6 +16,12 @@
 | 
			
		||||
							{{FileSize .FileSize}}{{if .IsLFSFile}} ({{.i18n.Tr "repo.stored_lfs"}}){{end}}
 | 
			
		||||
						</div>
 | 
			
		||||
					{{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>
 | 
			
		||||
			{{end}}
 | 
			
		||||
		</div>
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user