Merge branch 'master' into migrate-disambiguate-references
This commit is contained in:
commit
35b1500cb0
@ -8,6 +8,7 @@ import (
|
|||||||
|
|
||||||
"github.com/git-lfs/git-lfs/config"
|
"github.com/git-lfs/git-lfs/config"
|
||||||
"github.com/git-lfs/git-lfs/errors"
|
"github.com/git-lfs/git-lfs/errors"
|
||||||
|
"github.com/git-lfs/git-lfs/git"
|
||||||
"github.com/git-lfs/git-lfs/lfsapi"
|
"github.com/git-lfs/git-lfs/lfsapi"
|
||||||
"github.com/git-lfs/git-lfs/locking"
|
"github.com/git-lfs/git-lfs/locking"
|
||||||
"github.com/git-lfs/git-lfs/tq"
|
"github.com/git-lfs/git-lfs/tq"
|
||||||
@ -23,7 +24,7 @@ const (
|
|||||||
|
|
||||||
func verifyLocksForUpdates(lv *lockVerifier, updates []*refUpdate) {
|
func verifyLocksForUpdates(lv *lockVerifier, updates []*refUpdate) {
|
||||||
for _, update := range updates {
|
for _, update := range updates {
|
||||||
lv.Verify(update.Right().Name)
|
lv.Verify(update.Right())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -44,8 +45,8 @@ type lockVerifier struct {
|
|||||||
unownedLocks []*refLock
|
unownedLocks []*refLock
|
||||||
}
|
}
|
||||||
|
|
||||||
func (lv *lockVerifier) Verify(ref string) {
|
func (lv *lockVerifier) Verify(ref *git.Ref) {
|
||||||
if lv.verifyState == verifyStateDisabled || lv.verifiedRefs[ref] {
|
if lv.verifyState == verifyStateDisabled || lv.verifiedRefs[ref.Refspec()] {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -76,10 +77,10 @@ func (lv *lockVerifier) Verify(ref string) {
|
|||||||
|
|
||||||
lv.addLocks(ref, ours, lv.ourLocks)
|
lv.addLocks(ref, ours, lv.ourLocks)
|
||||||
lv.addLocks(ref, theirs, lv.theirLocks)
|
lv.addLocks(ref, theirs, lv.theirLocks)
|
||||||
lv.verifiedRefs[ref] = true
|
lv.verifiedRefs[ref.Refspec()] = true
|
||||||
}
|
}
|
||||||
|
|
||||||
func (lv *lockVerifier) addLocks(ref string, locks []locking.Lock, set map[string]*refLock) {
|
func (lv *lockVerifier) addLocks(ref *git.Ref, locks []locking.Lock, set map[string]*refLock) {
|
||||||
for _, l := range locks {
|
for _, l := range locks {
|
||||||
if rl, ok := set[l.Path]; ok {
|
if rl, ok := set[l.Path]; ok {
|
||||||
if err := rl.Add(ref, l); err != nil {
|
if err := rl.Add(ref, l); err != nil {
|
||||||
@ -136,11 +137,11 @@ func (lv *lockVerifier) Enabled() bool {
|
|||||||
return lv.verifyState == verifyStateEnabled
|
return lv.verifyState == verifyStateEnabled
|
||||||
}
|
}
|
||||||
|
|
||||||
func (lv *lockVerifier) newRefLocks(ref string, l locking.Lock) *refLock {
|
func (lv *lockVerifier) newRefLocks(ref *git.Ref, l locking.Lock) *refLock {
|
||||||
return &refLock{
|
return &refLock{
|
||||||
allRefs: lv.verifiedRefs,
|
allRefs: lv.verifiedRefs,
|
||||||
path: l.Path,
|
path: l.Path,
|
||||||
refs: map[string]locking.Lock{ref: l},
|
refs: map[*git.Ref]locking.Lock{ref: l},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -169,7 +170,7 @@ func newLockVerifier(m *tq.Manifest) *lockVerifier {
|
|||||||
type refLock struct {
|
type refLock struct {
|
||||||
path string
|
path string
|
||||||
allRefs map[string]bool
|
allRefs map[string]bool
|
||||||
refs map[string]locking.Lock
|
refs map[*git.Ref]locking.Lock
|
||||||
}
|
}
|
||||||
|
|
||||||
// Path returns the locked path.
|
// Path returns the locked path.
|
||||||
@ -189,7 +190,7 @@ func (r *refLock) Owners() string {
|
|||||||
if _, ok := users[u]; !ok {
|
if _, ok := users[u]; !ok {
|
||||||
users[u] = make([]string, 0, len(r.refs))
|
users[u] = make([]string, 0, len(r.refs))
|
||||||
}
|
}
|
||||||
users[u] = append(users[u], ref)
|
users[u] = append(users[u], ref.Name)
|
||||||
}
|
}
|
||||||
|
|
||||||
owners := make([]string, 0, len(users))
|
owners := make([]string, 0, len(users))
|
||||||
@ -212,7 +213,7 @@ func (r *refLock) Owners() string {
|
|||||||
return strings.Join(owners, ", ")
|
return strings.Join(owners, ", ")
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r *refLock) Add(ref string, l locking.Lock) error {
|
func (r *refLock) Add(ref *git.Ref, l locking.Lock) error {
|
||||||
r.refs[ref] = l
|
r.refs[ref] = l
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
@ -57,7 +57,7 @@ func defaultRemoteRef(g config.Environment, remote string, left *git.Ref) *git.R
|
|||||||
|
|
||||||
// When pushing to a remote that is different from the remote you normally
|
// When pushing to a remote that is different from the remote you normally
|
||||||
// pull from, work as current.
|
// pull from, work as current.
|
||||||
return &git.Ref{Name: left.Name}
|
return left
|
||||||
case "upstream", "tracking":
|
case "upstream", "tracking":
|
||||||
// push the current branch back to the branch whose changes are usually
|
// push the current branch back to the branch whose changes are usually
|
||||||
// integrated into the current branch
|
// integrated into the current branch
|
||||||
@ -65,10 +65,10 @@ func defaultRemoteRef(g config.Environment, remote string, left *git.Ref) *git.R
|
|||||||
case "current":
|
case "current":
|
||||||
// push the current branch to update a branch with the same name on the
|
// push the current branch to update a branch with the same name on the
|
||||||
// receiving end.
|
// receiving end.
|
||||||
return &git.Ref{Name: left.Name}
|
return left
|
||||||
default:
|
default:
|
||||||
tracerx.Printf("WARNING: %q push mode not supported", pushMode)
|
tracerx.Printf("WARNING: %q push mode not supported", pushMode)
|
||||||
return &git.Ref{Name: left.Name}
|
return left
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -76,7 +76,7 @@ func trackingRef(g config.Environment, left *git.Ref) *git.Ref {
|
|||||||
if merge, ok := g.Get(fmt.Sprintf("branch.%s.merge", left.Name)); ok {
|
if merge, ok := g.Get(fmt.Sprintf("branch.%s.merge", left.Name)); ok {
|
||||||
return git.ParseRef(merge, "")
|
return git.ParseRef(merge, "")
|
||||||
}
|
}
|
||||||
return &git.Ref{Name: left.Name}
|
return left
|
||||||
}
|
}
|
||||||
|
|
||||||
func (u *refUpdate) RightCommitish() string {
|
func (u *refUpdate) RightCommitish() string {
|
||||||
|
@ -19,8 +19,9 @@ func TestRefUpdateDefault(t *testing.T) {
|
|||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
|
||||||
u := newRefUpdate(cfg.Git, "origin", git.ParseRef("left", ""), nil)
|
u := newRefUpdate(cfg.Git, "origin", git.ParseRef("refs/heads/left", ""), nil)
|
||||||
assert.Equal(t, "left", u.Right().Name, "pushmode=%q", pushMode)
|
assert.Equal(t, "left", u.Right().Name, "pushmode=%q", pushMode)
|
||||||
|
assert.Equal(t, git.RefTypeLocalBranch, u.Right().Type, "pushmode=%q", pushMode)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -31,12 +32,13 @@ func TestRefUpdateTrackedDefault(t *testing.T) {
|
|||||||
Git: map[string][]string{
|
Git: map[string][]string{
|
||||||
"push.default": []string{pushMode},
|
"push.default": []string{pushMode},
|
||||||
"branch.left.remote": []string{"origin"},
|
"branch.left.remote": []string{"origin"},
|
||||||
"branch.left.merge": []string{"tracked"},
|
"branch.left.merge": []string{"refs/heads/tracked"},
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
|
||||||
u := newRefUpdate(cfg.Git, "origin", git.ParseRef("left", ""), nil)
|
u := newRefUpdate(cfg.Git, "origin", git.ParseRef("refs/heads/left", ""), nil)
|
||||||
assert.Equal(t, "tracked", u.Right().Name, "pushmode=%s", pushMode)
|
assert.Equal(t, "tracked", u.Right().Name, "pushmode=%s", pushMode)
|
||||||
|
assert.Equal(t, git.RefTypeLocalBranch, u.Right().Type, "pushmode=%q", pushMode)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -49,12 +51,13 @@ func TestRefUpdateCurrentDefault(t *testing.T) {
|
|||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
|
||||||
u := newRefUpdate(cfg.Git, "origin", git.ParseRef("left", ""), nil)
|
u := newRefUpdate(cfg.Git, "origin", git.ParseRef("refs/heads/left", ""), nil)
|
||||||
assert.Equal(t, "left", u.Right().Name)
|
assert.Equal(t, "left", u.Right().Name)
|
||||||
|
assert.Equal(t, git.RefTypeLocalBranch, u.Right().Type)
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestRefUpdateExplicitLeftAndRight(t *testing.T) {
|
func TestRefUpdateExplicitLeftAndRight(t *testing.T) {
|
||||||
u := newRefUpdate(nil, "", git.ParseRef("left", "abc123"), git.ParseRef("right", "def456"))
|
u := newRefUpdate(nil, "", git.ParseRef("refs/heads/left", "abc123"), git.ParseRef("refs/heads/right", "def456"))
|
||||||
assert.Equal(t, "left", u.Left().Name)
|
assert.Equal(t, "left", u.Left().Name)
|
||||||
assert.Equal(t, "abc123", u.Left().Sha)
|
assert.Equal(t, "abc123", u.Left().Sha)
|
||||||
assert.Equal(t, "abc123", u.LeftCommitish())
|
assert.Equal(t, "abc123", u.LeftCommitish())
|
||||||
@ -62,7 +65,7 @@ func TestRefUpdateExplicitLeftAndRight(t *testing.T) {
|
|||||||
assert.Equal(t, "def456", u.Right().Sha)
|
assert.Equal(t, "def456", u.Right().Sha)
|
||||||
assert.Equal(t, "def456", u.RightCommitish())
|
assert.Equal(t, "def456", u.RightCommitish())
|
||||||
|
|
||||||
u = newRefUpdate(nil, "", git.ParseRef("left", ""), git.ParseRef("right", ""))
|
u = newRefUpdate(nil, "", git.ParseRef("refs/heads/left", ""), git.ParseRef("refs/heads/right", ""))
|
||||||
assert.Equal(t, "left", u.Left().Name)
|
assert.Equal(t, "left", u.Left().Name)
|
||||||
assert.Equal(t, "", u.Left().Sha)
|
assert.Equal(t, "", u.Left().Sha)
|
||||||
assert.Equal(t, "left", u.LeftCommitish())
|
assert.Equal(t, "left", u.LeftCommitish())
|
||||||
|
@ -36,7 +36,7 @@ func (s *AttributeSource) String() string {
|
|||||||
|
|
||||||
// GetAttributePaths returns a list of entries in .gitattributes which are
|
// GetAttributePaths returns a list of entries in .gitattributes which are
|
||||||
// configured with the filter=lfs attribute
|
// configured with the filter=lfs attribute
|
||||||
// workingDIr is the root of the working copy
|
// workingDir is the root of the working copy
|
||||||
// gitDir is the root of the git repo
|
// gitDir is the root of the git repo
|
||||||
func GetAttributePaths(workingDir, gitDir string) []AttributePath {
|
func GetAttributePaths(workingDir, gitDir string) []AttributePath {
|
||||||
paths := make([]AttributePath, 0)
|
paths := make([]AttributePath, 0)
|
||||||
@ -56,7 +56,11 @@ func GetAttributePaths(workingDir, gitDir string) []AttributePath {
|
|||||||
scanner.Split(le.ScanLines)
|
scanner.Split(le.ScanLines)
|
||||||
|
|
||||||
for scanner.Scan() {
|
for scanner.Scan() {
|
||||||
line := scanner.Text()
|
line := strings.TrimSpace(scanner.Text())
|
||||||
|
|
||||||
|
if strings.HasPrefix(line, "#") {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
// Check for filter=lfs (signifying that LFS is tracking
|
// Check for filter=lfs (signifying that LFS is tracking
|
||||||
// this file) or "lockable", which indicates that the
|
// this file) or "lockable", which indicates that the
|
||||||
|
@ -54,12 +54,8 @@ func (t RefType) Prefix() (string, bool) {
|
|||||||
return "refs/tags", true
|
return "refs/tags", true
|
||||||
case RefTypeRemoteTag:
|
case RefTypeRemoteTag:
|
||||||
return "refs/remotes/tags", true
|
return "refs/remotes/tags", true
|
||||||
case RefTypeHEAD:
|
|
||||||
return "", false
|
|
||||||
case RefTypeOther:
|
|
||||||
return "", false
|
|
||||||
default:
|
default:
|
||||||
panic(fmt.Sprintf("git: unknown RefType %d", t))
|
return "", false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -623,16 +623,3 @@ func TestRefTypeKnownPrefixes(t *testing.T) {
|
|||||||
assert.Equal(t, expected.Ok, ok)
|
assert.Equal(t, expected.Ok, ok)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestRefTypeUnknownPrefix(t *testing.T) {
|
|
||||||
defer func() {
|
|
||||||
if err := recover(); err != nil {
|
|
||||||
assert.Equal(t, "git: unknown RefType -1", err)
|
|
||||||
} else {
|
|
||||||
t.Fatal("git: expected panic() from RefType.Prefix()")
|
|
||||||
}
|
|
||||||
}()
|
|
||||||
|
|
||||||
unknown := RefType(-1)
|
|
||||||
unknown.Prefix()
|
|
||||||
}
|
|
||||||
|
@ -225,7 +225,7 @@ func NewRevListScanner(include, excluded []string, opt *ScanRefsOptions) (*RevLi
|
|||||||
// occurred.
|
// occurred.
|
||||||
func revListArgs(include, exclude []string, opt *ScanRefsOptions) (io.Reader, []string, error) {
|
func revListArgs(include, exclude []string, opt *ScanRefsOptions) (io.Reader, []string, error) {
|
||||||
var stdin io.Reader
|
var stdin io.Reader
|
||||||
args := []string{"rev-list"}
|
args := []string{"rev-list", "--stdin"}
|
||||||
if !opt.CommitsOnly {
|
if !opt.CommitsOnly {
|
||||||
args = append(args, "--objects")
|
args = append(args, "--objects")
|
||||||
}
|
}
|
||||||
@ -246,15 +246,16 @@ func revListArgs(include, exclude []string, opt *ScanRefsOptions) (io.Reader, []
|
|||||||
args = append(args, "--do-walk")
|
args = append(args, "--do-walk")
|
||||||
}
|
}
|
||||||
|
|
||||||
args = append(args, includeExcludeShas(include, exclude)...)
|
stdin = strings.NewReader(strings.Join(
|
||||||
|
includeExcludeShas(include, exclude), "\n"))
|
||||||
case ScanAllMode:
|
case ScanAllMode:
|
||||||
args = append(args, "--all")
|
args = append(args, "--all")
|
||||||
case ScanLeftToRemoteMode:
|
case ScanLeftToRemoteMode:
|
||||||
if len(opt.SkippedRefs) == 0 {
|
if len(opt.SkippedRefs) == 0 {
|
||||||
args = append(args, includeExcludeShas(include, exclude)...)
|
|
||||||
args = append(args, "--not", "--remotes="+opt.Remote)
|
args = append(args, "--not", "--remotes="+opt.Remote)
|
||||||
|
stdin = strings.NewReader(strings.Join(
|
||||||
|
includeExcludeShas(include, exclude), "\n"))
|
||||||
} else {
|
} else {
|
||||||
args = append(args, "--stdin")
|
|
||||||
stdin = strings.NewReader(strings.Join(
|
stdin = strings.NewReader(strings.Join(
|
||||||
append(includeExcludeShas(include, exclude), opt.SkippedRefs...), "\n"),
|
append(includeExcludeShas(include, exclude), opt.SkippedRefs...), "\n"),
|
||||||
)
|
)
|
||||||
|
@ -4,13 +4,13 @@ import (
|
|||||||
"bufio"
|
"bufio"
|
||||||
"encoding/hex"
|
"encoding/hex"
|
||||||
"errors"
|
"errors"
|
||||||
|
"fmt"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"strings"
|
"strings"
|
||||||
"sync/atomic"
|
"sync/atomic"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
"github.com/stretchr/testify/require"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type ArgsTestCase struct {
|
type ArgsTestCase struct {
|
||||||
@ -32,11 +32,7 @@ func (c *ArgsTestCase) Assert(t *testing.T) {
|
|||||||
assert.Nil(t, err)
|
assert.Nil(t, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
require.Equal(t, len(c.ExpectedArgs), len(args))
|
assert.EqualValues(t, c.ExpectedArgs, args)
|
||||||
for i := 0; i < len(c.ExpectedArgs); i++ {
|
|
||||||
assert.Equal(t, c.ExpectedArgs[i], args[i],
|
|
||||||
"element #%d not equal: wanted %q, got %q", i, c.ExpectedArgs[i], args[i])
|
|
||||||
}
|
|
||||||
|
|
||||||
if stdin != nil {
|
if stdin != nil {
|
||||||
b, err := ioutil.ReadAll(stdin)
|
b, err := ioutil.ReadAll(stdin)
|
||||||
@ -60,34 +56,38 @@ func TestRevListArgs(t *testing.T) {
|
|||||||
Mode: ScanRefsMode,
|
Mode: ScanRefsMode,
|
||||||
SkipDeletedBlobs: false,
|
SkipDeletedBlobs: false,
|
||||||
},
|
},
|
||||||
ExpectedArgs: []string{"rev-list", "--objects", "--do-walk", s1, "^" + s2, "--"},
|
ExpectedStdin: fmt.Sprintf("%s\n^%s", s1, s2),
|
||||||
|
ExpectedArgs: []string{"rev-list", "--stdin", "--objects", "--do-walk", "--"},
|
||||||
},
|
},
|
||||||
"scan refs not deleted, left and right": {
|
"scan refs not deleted, left and right": {
|
||||||
Include: []string{s1}, Exclude: []string{s2}, Opt: &ScanRefsOptions{
|
Include: []string{s1}, Exclude: []string{s2}, Opt: &ScanRefsOptions{
|
||||||
Mode: ScanRefsMode,
|
Mode: ScanRefsMode,
|
||||||
SkipDeletedBlobs: true,
|
SkipDeletedBlobs: true,
|
||||||
},
|
},
|
||||||
ExpectedArgs: []string{"rev-list", "--objects", "--no-walk", s1, "^" + s2, "--"},
|
ExpectedStdin: fmt.Sprintf("%s\n^%s", s1, s2),
|
||||||
|
ExpectedArgs: []string{"rev-list", "--stdin", "--objects", "--no-walk", "--"},
|
||||||
},
|
},
|
||||||
"scan refs deleted, left only": {
|
"scan refs deleted, left only": {
|
||||||
Include: []string{s1}, Opt: &ScanRefsOptions{
|
Include: []string{s1}, Opt: &ScanRefsOptions{
|
||||||
Mode: ScanRefsMode,
|
Mode: ScanRefsMode,
|
||||||
SkipDeletedBlobs: false,
|
SkipDeletedBlobs: false,
|
||||||
},
|
},
|
||||||
ExpectedArgs: []string{"rev-list", "--objects", "--do-walk", s1, "--"},
|
ExpectedStdin: s1,
|
||||||
|
ExpectedArgs: []string{"rev-list", "--stdin", "--objects", "--do-walk", "--"},
|
||||||
},
|
},
|
||||||
"scan refs not deleted, left only": {
|
"scan refs not deleted, left only": {
|
||||||
Include: []string{s1}, Opt: &ScanRefsOptions{
|
Include: []string{s1}, Opt: &ScanRefsOptions{
|
||||||
Mode: ScanRefsMode,
|
Mode: ScanRefsMode,
|
||||||
SkipDeletedBlobs: true,
|
SkipDeletedBlobs: true,
|
||||||
},
|
},
|
||||||
ExpectedArgs: []string{"rev-list", "--objects", "--no-walk", s1, "--"},
|
ExpectedStdin: s1,
|
||||||
|
ExpectedArgs: []string{"rev-list", "--stdin", "--objects", "--no-walk", "--"},
|
||||||
},
|
},
|
||||||
"scan all": {
|
"scan all": {
|
||||||
Include: []string{s1}, Exclude: []string{s2}, Opt: &ScanRefsOptions{
|
Include: []string{s1}, Exclude: []string{s2}, Opt: &ScanRefsOptions{
|
||||||
Mode: ScanAllMode,
|
Mode: ScanAllMode,
|
||||||
},
|
},
|
||||||
ExpectedArgs: []string{"rev-list", "--objects", "--all", "--"},
|
ExpectedArgs: []string{"rev-list", "--stdin", "--objects", "--all", "--"},
|
||||||
},
|
},
|
||||||
"scan left to remote, no skipped refs": {
|
"scan left to remote, no skipped refs": {
|
||||||
Include: []string{s1}, Opt: &ScanRefsOptions{
|
Include: []string{s1}, Opt: &ScanRefsOptions{
|
||||||
@ -95,7 +95,8 @@ func TestRevListArgs(t *testing.T) {
|
|||||||
Remote: "origin",
|
Remote: "origin",
|
||||||
SkippedRefs: []string{},
|
SkippedRefs: []string{},
|
||||||
},
|
},
|
||||||
ExpectedArgs: []string{"rev-list", "--objects", s1, "--not", "--remotes=origin", "--"},
|
ExpectedStdin: s1,
|
||||||
|
ExpectedArgs: []string{"rev-list", "--stdin", "--objects", "--not", "--remotes=origin", "--"},
|
||||||
},
|
},
|
||||||
"scan left to remote, skipped refs": {
|
"scan left to remote, skipped refs": {
|
||||||
Include: []string{s1}, Exclude: []string{s2}, Opt: &ScanRefsOptions{
|
Include: []string{s1}, Exclude: []string{s2}, Opt: &ScanRefsOptions{
|
||||||
@ -103,7 +104,7 @@ func TestRevListArgs(t *testing.T) {
|
|||||||
Remote: "origin",
|
Remote: "origin",
|
||||||
SkippedRefs: []string{"a", "b", "c"},
|
SkippedRefs: []string{"a", "b", "c"},
|
||||||
},
|
},
|
||||||
ExpectedArgs: []string{"rev-list", "--objects", "--stdin", "--"},
|
ExpectedArgs: []string{"rev-list", "--stdin", "--objects", "--"},
|
||||||
ExpectedStdin: s1 + "\n^" + s2 + "\na\nb\nc",
|
ExpectedStdin: s1 + "\n^" + s2 + "\na\nb\nc",
|
||||||
},
|
},
|
||||||
"scan unknown type": {
|
"scan unknown type": {
|
||||||
@ -117,35 +118,40 @@ func TestRevListArgs(t *testing.T) {
|
|||||||
Mode: ScanRefsMode,
|
Mode: ScanRefsMode,
|
||||||
Order: DateRevListOrder,
|
Order: DateRevListOrder,
|
||||||
},
|
},
|
||||||
ExpectedArgs: []string{"rev-list", "--objects", "--date-order", "--do-walk", s1, "^" + s2, "--"},
|
ExpectedStdin: fmt.Sprintf("%s\n^%s", s1, s2),
|
||||||
|
ExpectedArgs: []string{"rev-list", "--stdin", "--objects", "--date-order", "--do-walk", "--"},
|
||||||
},
|
},
|
||||||
"scan author date order": {
|
"scan author date order": {
|
||||||
Include: []string{s1}, Exclude: []string{s2}, Opt: &ScanRefsOptions{
|
Include: []string{s1}, Exclude: []string{s2}, Opt: &ScanRefsOptions{
|
||||||
Mode: ScanRefsMode,
|
Mode: ScanRefsMode,
|
||||||
Order: AuthorDateRevListOrder,
|
Order: AuthorDateRevListOrder,
|
||||||
},
|
},
|
||||||
ExpectedArgs: []string{"rev-list", "--objects", "--author-date-order", "--do-walk", s1, "^" + s2, "--"},
|
ExpectedStdin: fmt.Sprintf("%s\n^%s", s1, s2),
|
||||||
|
ExpectedArgs: []string{"rev-list", "--stdin", "--objects", "--author-date-order", "--do-walk", "--"},
|
||||||
},
|
},
|
||||||
"scan topo order": {
|
"scan topo order": {
|
||||||
Include: []string{s1}, Exclude: []string{s2}, Opt: &ScanRefsOptions{
|
Include: []string{s1}, Exclude: []string{s2}, Opt: &ScanRefsOptions{
|
||||||
Mode: ScanRefsMode,
|
Mode: ScanRefsMode,
|
||||||
Order: TopoRevListOrder,
|
Order: TopoRevListOrder,
|
||||||
},
|
},
|
||||||
ExpectedArgs: []string{"rev-list", "--objects", "--topo-order", "--do-walk", s1, "^" + s2, "--"},
|
ExpectedStdin: fmt.Sprintf("%s\n^%s", s1, s2),
|
||||||
|
ExpectedArgs: []string{"rev-list", "--stdin", "--objects", "--topo-order", "--do-walk", "--"},
|
||||||
},
|
},
|
||||||
"scan commits only": {
|
"scan commits only": {
|
||||||
Include: []string{s1}, Exclude: []string{s2}, Opt: &ScanRefsOptions{
|
Include: []string{s1}, Exclude: []string{s2}, Opt: &ScanRefsOptions{
|
||||||
Mode: ScanRefsMode,
|
Mode: ScanRefsMode,
|
||||||
CommitsOnly: true,
|
CommitsOnly: true,
|
||||||
},
|
},
|
||||||
ExpectedArgs: []string{"rev-list", "--do-walk", s1, "^" + s2, "--"},
|
ExpectedStdin: fmt.Sprintf("%s\n^%s", s1, s2),
|
||||||
|
ExpectedArgs: []string{"rev-list", "--stdin", "--do-walk", "--"},
|
||||||
},
|
},
|
||||||
"scan reverse": {
|
"scan reverse": {
|
||||||
Include: []string{s1}, Exclude: []string{s2}, Opt: &ScanRefsOptions{
|
Include: []string{s1}, Exclude: []string{s2}, Opt: &ScanRefsOptions{
|
||||||
Mode: ScanRefsMode,
|
Mode: ScanRefsMode,
|
||||||
Reverse: true,
|
Reverse: true,
|
||||||
},
|
},
|
||||||
ExpectedArgs: []string{"rev-list", "--objects", "--reverse", "--do-walk", s1, "^" + s2, "--"},
|
ExpectedStdin: fmt.Sprintf("%s\n^%s", s1, s2),
|
||||||
|
ExpectedArgs: []string{"rev-list", "--stdin", "--objects", "--reverse", "--do-walk", "--"},
|
||||||
},
|
},
|
||||||
} {
|
} {
|
||||||
t.Run(desc, c.Assert)
|
t.Run(desc, c.Assert)
|
||||||
|
@ -206,11 +206,11 @@ func (c *Client) SearchLocks(filter map[string]string, limit int, localOnly bool
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *Client) VerifiableLocks(ref string, limit int) (ourLocks, theirLocks []Lock, err error) {
|
func (c *Client) VerifiableLocks(ref *git.Ref, limit int) (ourLocks, theirLocks []Lock, err error) {
|
||||||
ourLocks = make([]Lock, 0, limit)
|
ourLocks = make([]Lock, 0, limit)
|
||||||
theirLocks = make([]Lock, 0, limit)
|
theirLocks = make([]Lock, 0, limit)
|
||||||
body := &lockVerifiableRequest{
|
body := &lockVerifiableRequest{
|
||||||
Ref: &lockRef{Name: ref},
|
Ref: &lockRef{Name: ref.Refspec()},
|
||||||
Limit: limit,
|
Limit: limit,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -64,7 +64,7 @@ func TestRefreshCache(t *testing.T) {
|
|||||||
assert.Nil(t, err)
|
assert.Nil(t, err)
|
||||||
assert.Empty(t, locks)
|
assert.Empty(t, locks)
|
||||||
|
|
||||||
_, _, err = client.VerifiableLocks("", 100)
|
_, _, err = client.VerifiableLocks(nil, 100)
|
||||||
assert.Nil(t, err)
|
assert.Nil(t, err)
|
||||||
|
|
||||||
locks, err = client.SearchLocks(nil, 0, true)
|
locks, err = client.SearchLocks(nil, 0, true)
|
||||||
@ -130,7 +130,7 @@ func TestGetVerifiableLocks(t *testing.T) {
|
|||||||
client, err := NewClient("", lfsclient)
|
client, err := NewClient("", lfsclient)
|
||||||
assert.Nil(t, err)
|
assert.Nil(t, err)
|
||||||
|
|
||||||
ourLocks, theirLocks, err := client.VerifiableLocks("", 0)
|
ourLocks, theirLocks, err := client.VerifiableLocks(nil, 0)
|
||||||
assert.Nil(t, err)
|
assert.Nil(t, err)
|
||||||
|
|
||||||
// Need to include zero time in structure for equal to work
|
// Need to include zero time in structure for equal to work
|
||||||
|
@ -50,17 +50,24 @@ func mainIntegration() {
|
|||||||
for _, file := range files {
|
for _, file := range files {
|
||||||
tests <- file
|
tests <- file
|
||||||
}
|
}
|
||||||
|
close(tests)
|
||||||
|
|
||||||
|
outputDone := make(chan bool)
|
||||||
|
go func() {
|
||||||
|
for out := range output {
|
||||||
|
fmt.Println(out)
|
||||||
|
}
|
||||||
|
outputDone <- true
|
||||||
|
}()
|
||||||
|
|
||||||
go printOutput(output)
|
|
||||||
for i := 0; i < maxprocs; i++ {
|
for i := 0; i < maxprocs; i++ {
|
||||||
wg.Add(1)
|
wg.Add(1)
|
||||||
go worker(tests, output, &wg)
|
go worker(tests, output, &wg)
|
||||||
}
|
}
|
||||||
|
|
||||||
close(tests)
|
|
||||||
wg.Wait()
|
wg.Wait()
|
||||||
close(output)
|
close(output)
|
||||||
printOutput(output)
|
<-outputDone
|
||||||
|
|
||||||
if erroring {
|
if erroring {
|
||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
@ -116,19 +123,6 @@ func sendTestOutput(output chan string, testname string, buf *bytes.Buffer, err
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func printOutput(output <-chan string) {
|
|
||||||
for {
|
|
||||||
select {
|
|
||||||
case out, ok := <-output:
|
|
||||||
if !ok {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
fmt.Println(out)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func worker(tests <-chan string, output chan string, wg *sync.WaitGroup) {
|
func worker(tests <-chan string, output chan string, wg *sync.WaitGroup) {
|
||||||
defer wg.Done()
|
defer wg.Done()
|
||||||
for {
|
for {
|
||||||
|
@ -1101,14 +1101,14 @@ func locksHandler(w http.ResponseWriter, r *http.Request, repo string) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if strings.HasSuffix(repo, "ref-required") {
|
if strings.HasSuffix(repo, "branch-required") {
|
||||||
parts := strings.Split(repo, "-")
|
parts := strings.Split(repo, "-")
|
||||||
lenParts := len(parts)
|
lenParts := len(parts)
|
||||||
if lenParts > 3 && parts[lenParts-3] != reqBody.RefName() {
|
if lenParts > 3 && "refs/heads/"+parts[lenParts-3] != reqBody.RefName() {
|
||||||
w.WriteHeader(403)
|
w.WriteHeader(403)
|
||||||
enc.Encode(struct {
|
enc.Encode(struct {
|
||||||
Message string `json:"message"`
|
Message string `json:"message"`
|
||||||
}{fmt.Sprintf("Expected ref %q, got %q", parts[lenParts-3], reqBody.RefName())})
|
}{fmt.Sprintf("Expected ref %q, got %q", "refs/heads/"+parts[lenParts-3], reqBody.RefName())})
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -781,7 +781,7 @@ begin_test "pre-push locks verify 403 with good ref"
|
|||||||
(
|
(
|
||||||
set -e
|
set -e
|
||||||
|
|
||||||
reponame="lock-verify-master-ref-required"
|
reponame="lock-verify-master-branch-required"
|
||||||
setup_remote_repo "$reponame"
|
setup_remote_repo "$reponame"
|
||||||
clone_repo "$reponame" "$reponame"
|
clone_repo "$reponame" "$reponame"
|
||||||
|
|
||||||
@ -803,7 +803,7 @@ begin_test "pre-push locks verify 403 with good tracked ref"
|
|||||||
(
|
(
|
||||||
set -e
|
set -e
|
||||||
|
|
||||||
reponame="lock-verify-tracked-ref-required"
|
reponame="lock-verify-tracked-branch-required"
|
||||||
setup_remote_repo "$reponame"
|
setup_remote_repo "$reponame"
|
||||||
clone_repo "$reponame" "$reponame"
|
clone_repo "$reponame" "$reponame"
|
||||||
|
|
||||||
@ -827,7 +827,7 @@ begin_test "pre-push locks verify 403 with explicit ref"
|
|||||||
(
|
(
|
||||||
set -e
|
set -e
|
||||||
|
|
||||||
reponame="lock-verify-explicit-ref-required"
|
reponame="lock-verify-explicit-branch-required"
|
||||||
setup_remote_repo "$reponame"
|
setup_remote_repo "$reponame"
|
||||||
clone_repo "$reponame" "$reponame"
|
clone_repo "$reponame" "$reponame"
|
||||||
|
|
||||||
@ -849,7 +849,7 @@ begin_test "pre-push locks verify 403 with bad ref"
|
|||||||
(
|
(
|
||||||
set -e
|
set -e
|
||||||
|
|
||||||
reponame="lock-verify-other-ref-required"
|
reponame="lock-verify-other-branch-required"
|
||||||
setup_remote_repo "$reponame"
|
setup_remote_repo "$reponame"
|
||||||
clone_repo "$reponame" "$reponame"
|
clone_repo "$reponame" "$reponame"
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user