Skip to content

Commit 7bb817e

Browse files
blueworrybearlafriks
authored andcommitted
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
1 parent e7fbc55 commit 7bb817e

File tree

5 files changed

+61
-6
lines changed

5 files changed

+61
-6
lines changed

models/repo.go

+16
Original file line numberDiff line numberDiff line change
@@ -2810,3 +2810,19 @@ func (repo *Repository) GetOriginalURLHostname() string {
28102810

28112811
return u.Host
28122812
}
2813+
2814+
// GetTreePathLock returns LSF lock for the treePath
2815+
func (repo *Repository) GetTreePathLock(treePath string) (*LFSLock, error) {
2816+
if setting.LFS.StartServer {
2817+
locks, err := GetLFSLockByRepoID(repo.ID)
2818+
if err != nil {
2819+
return nil, err
2820+
}
2821+
for _, lock := range locks {
2822+
if lock.Path == treePath {
2823+
return lock, nil
2824+
}
2825+
}
2826+
}
2827+
return nil, nil
2828+
}

options/locale/locale_en-US.ini

+1
Original file line numberDiff line numberDiff line change
@@ -703,6 +703,7 @@ editor.preview_changes = Preview Changes
703703
editor.cannot_edit_lfs_files = LFS files cannot be edited in the web interface.
704704
editor.cannot_edit_non_text_files = Binary files cannot be edited in the web interface.
705705
editor.edit_this_file = Edit File
706+
editor.this_file_locked = File is locked
706707
editor.must_be_on_a_branch = You must be on a branch to make or propose changes to this file.
707708
editor.fork_before_edit = You must fork this repository to make or propose changes to this file.
708709
editor.delete_this_file = Delete File

routers/repo/blame.go

+13-2
Original file line numberDiff line numberDiff line change
@@ -119,8 +119,19 @@ func RefBlame(ctx *context.Context) {
119119
ctx.Data["IsBlame"] = true
120120

121121
if ctx.Repo.CanEnableEditor() {
122-
ctx.Data["CanDeleteFile"] = true
123-
ctx.Data["DeleteFileTooltip"] = ctx.Tr("repo.editor.delete_this_file")
122+
// Check LFS Lock
123+
lfsLock, err := ctx.Repo.Repository.GetTreePathLock(ctx.Repo.TreePath)
124+
if err != nil {
125+
ctx.ServerError("GetTreePathLock", err)
126+
return
127+
}
128+
if lfsLock != nil && lfsLock.OwnerID != ctx.User.ID {
129+
ctx.Data["CanDeleteFile"] = false
130+
ctx.Data["DeleteFileTooltip"] = ctx.Tr("repo.editor.this_file_locked")
131+
} else {
132+
ctx.Data["CanDeleteFile"] = true
133+
ctx.Data["DeleteFileTooltip"] = ctx.Tr("repo.editor.delete_this_file")
134+
}
124135
} else if !ctx.Repo.IsViewBranch {
125136
ctx.Data["DeleteFileTooltip"] = ctx.Tr("repo.editor.must_be_on_a_branch")
126137
} else if !ctx.Repo.CanWrite(models.UnitTypeCode) {

routers/repo/view.go

+25-4
Original file line numberDiff line numberDiff line change
@@ -265,6 +265,17 @@ func renderFile(ctx *context.Context, entry *git.TreeEntry, treeLink, rawLink st
265265
ctx.Data["RawFileLink"] = fmt.Sprintf("%s%s.git/info/lfs/objects/%s/%s", setting.AppURL, ctx.Repo.Repository.FullName(), meta.Oid, filenameBase64)
266266
}
267267
}
268+
// Check LFS Lock
269+
lfsLock, err := ctx.Repo.Repository.GetTreePathLock(ctx.Repo.TreePath)
270+
ctx.Data["LFSLock"] = lfsLock
271+
if err != nil {
272+
ctx.ServerError("GetTreePathLock", err)
273+
return
274+
}
275+
if lfsLock != nil {
276+
ctx.Data["LFSLockOwner"] = lfsLock.Owner.DisplayName()
277+
ctx.Data["LFSLockHint"] = ctx.Tr("repo.editor.this_file_locked")
278+
}
268279

269280
// Assume file is not editable first.
270281
if isLFSFile {
@@ -334,8 +345,13 @@ func renderFile(ctx *context.Context, entry *git.TreeEntry, treeLink, rawLink st
334345
}
335346
if !isLFSFile {
336347
if ctx.Repo.CanEnableEditor() {
337-
ctx.Data["CanEditFile"] = true
338-
ctx.Data["EditFileTooltip"] = ctx.Tr("repo.editor.edit_this_file")
348+
if lfsLock != nil && lfsLock.OwnerID != ctx.User.ID {
349+
ctx.Data["CanEditFile"] = false
350+
ctx.Data["EditFileTooltip"] = ctx.Tr("repo.editor.this_file_locked")
351+
} else {
352+
ctx.Data["CanEditFile"] = true
353+
ctx.Data["EditFileTooltip"] = ctx.Tr("repo.editor.edit_this_file")
354+
}
339355
} else if !ctx.Repo.IsViewBranch {
340356
ctx.Data["EditFileTooltip"] = ctx.Tr("repo.editor.must_be_on_a_branch")
341357
} else if !ctx.Repo.CanWrite(models.UnitTypeCode) {
@@ -368,8 +384,13 @@ func renderFile(ctx *context.Context, entry *git.TreeEntry, treeLink, rawLink st
368384
}
369385

370386
if ctx.Repo.CanEnableEditor() {
371-
ctx.Data["CanDeleteFile"] = true
372-
ctx.Data["DeleteFileTooltip"] = ctx.Tr("repo.editor.delete_this_file")
387+
if lfsLock != nil && lfsLock.OwnerID != ctx.User.ID {
388+
ctx.Data["CanDeleteFile"] = false
389+
ctx.Data["DeleteFileTooltip"] = ctx.Tr("repo.editor.this_file_locked")
390+
} else {
391+
ctx.Data["CanDeleteFile"] = true
392+
ctx.Data["DeleteFileTooltip"] = ctx.Tr("repo.editor.delete_this_file")
393+
}
373394
} else if !ctx.Repo.IsViewBranch {
374395
ctx.Data["DeleteFileTooltip"] = ctx.Tr("repo.editor.must_be_on_a_branch")
375396
} else if !ctx.Repo.CanWrite(models.UnitTypeCode) {

templates/repo/view_file.tmpl

+6
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,12 @@
1616
{{FileSize .FileSize}}{{if .IsLFSFile}} ({{.i18n.Tr "repo.stored_lfs"}}){{end}}
1717
</div>
1818
{{end}}
19+
{{if .LFSLock}}
20+
<div class="file-info-entry">
21+
<i class="fa fa-lock poping up disabled" data-content="{{.LFSLockHint}}" data-position="bottom center" data-variation="tiny inverted"></i>
22+
<a href="{{AppSubUrl}}/{{.LFSLock.Owner.Name}}">{{.LFSLockOwner}}</a>
23+
</div>
24+
{{end}}
1925
</div>
2026
{{end}}
2127
</div>

0 commit comments

Comments
 (0)