diff options
author | zeripath <art27@cantab.net> | 2019-12-12 13:18:07 +0000 |
---|---|---|
committer | Lunny Xiao <xiaolunwen@gmail.com> | 2019-12-12 21:18:07 +0800 |
commit | dc2fe9801f1a83a5810a778b806dac1bc210f110 (patch) | |
tree | c8f45d4005f90cd5727dc9ec44fdd35641c88376 /modules | |
parent | 751cfb805ddddbb4242583db2a71d8d3ed00f9d7 (diff) | |
download | gitea-dc2fe9801f1a83a5810a778b806dac1bc210f110.tar.gz gitea-dc2fe9801f1a83a5810a778b806dac1bc210f110.zip |
Make repository management section handle lfs locks (#8726)
* Make repository maangement section handle lfs locks
* Add check attribute handling and handle locking paths better
* More cleanly check-attributes
* handle error
* Check if file exists in default branch before linking to it.
* fixup
* Properly cleanPath
* Use cleanPath
* Sigh
Diffstat (limited to 'modules')
-rw-r--r-- | modules/git/repo_attribute.go | 84 | ||||
-rw-r--r-- | modules/lfs/locks.go | 4 |
2 files changed, 86 insertions, 2 deletions
diff --git a/modules/git/repo_attribute.go b/modules/git/repo_attribute.go new file mode 100644 index 0000000000..c10c96f558 --- /dev/null +++ b/modules/git/repo_attribute.go @@ -0,0 +1,84 @@ +// Copyright 2019 The Gitea Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package git + +import ( + "bytes" + "fmt" + + "github.com/mcuadros/go-version" +) + +// CheckAttributeOpts represents the possible options to CheckAttribute +type CheckAttributeOpts struct { + CachedOnly bool + AllAttributes bool + Attributes []string + Filenames []string +} + +// CheckAttribute return the Blame object of file +func (repo *Repository) CheckAttribute(opts CheckAttributeOpts) (map[string]map[string]string, error) { + binVersion, err := BinVersion() + if err != nil { + return nil, fmt.Errorf("Git version missing: %v", err) + } + + stdOut := new(bytes.Buffer) + stdErr := new(bytes.Buffer) + + cmdArgs := []string{"check-attr", "-z"} + + if opts.AllAttributes { + cmdArgs = append(cmdArgs, "-a") + } else { + for _, attribute := range opts.Attributes { + if attribute != "" { + cmdArgs = append(cmdArgs, attribute) + } + } + } + + // git check-attr --cached first appears in git 1.7.8 + if opts.CachedOnly && version.Compare(binVersion, "1.7.8", ">=") { + cmdArgs = append(cmdArgs, "--cached") + } + + cmdArgs = append(cmdArgs, "--") + + for _, arg := range opts.Filenames { + if arg != "" { + cmdArgs = append(cmdArgs, arg) + } + } + + cmd := NewCommand(cmdArgs...) + + if err := cmd.RunInDirPipeline(repo.Path, stdOut, stdErr); err != nil { + return nil, fmt.Errorf("Failed to run check-attr: %v\n%s\n%s", err, stdOut.String(), stdErr.String()) + } + + fields := bytes.Split(stdOut.Bytes(), []byte{'\000'}) + + if len(fields)%3 != 1 { + return nil, fmt.Errorf("Wrong number of fields in return from check-attr") + } + + var name2attribute2info = make(map[string]map[string]string) + + for i := 0; i < (len(fields) / 3); i++ { + filename := string(fields[3*i]) + attribute := string(fields[3*i+1]) + info := string(fields[3*i+2]) + attribute2info := name2attribute2info[filename] + if attribute2info == nil { + attribute2info = make(map[string]string) + } + attribute2info[attribute] = info + name2attribute2info[filename] = attribute2info + } + + return name2attribute2info, nil +} diff --git a/modules/lfs/locks.go b/modules/lfs/locks.go index 9ffe6b9d59..b077cd2d0b 100644 --- a/modules/lfs/locks.go +++ b/modules/lfs/locks.go @@ -110,7 +110,7 @@ func GetListLockHandler(ctx *context.Context) { } //If no query params path or id - lockList, err := models.GetLFSLockByRepoID(repository.ID) + lockList, err := models.GetLFSLockByRepoID(repository.ID, 0, 0) if err != nil { ctx.JSON(500, api.LFSLockError{ Message: "unable to list locks : " + err.Error(), @@ -220,7 +220,7 @@ func VerifyLockHandler(ctx *context.Context) { } //TODO handle body json cursor and limit - lockList, err := models.GetLFSLockByRepoID(repository.ID) + lockList, err := models.GetLFSLockByRepoID(repository.ID, 0, 0) if err != nil { ctx.JSON(500, api.LFSLockError{ Message: "unable to list locks : " + err.Error(), |