226 lines
6.4 KiB
Go
226 lines
6.4 KiB
Go
|
package git
|
||
|
|
||
|
import (
|
||
|
"io/ioutil"
|
||
|
"os"
|
||
|
"path/filepath"
|
||
|
"testing"
|
||
|
)
|
||
|
|
||
|
func assertSamePath(t *testing.T, expected string, actual string) {
|
||
|
var err error
|
||
|
expected, err = filepath.EvalSymlinks(expected)
|
||
|
checkFatal(t, err)
|
||
|
actual, err = filepath.EvalSymlinks(actual)
|
||
|
checkFatal(t, err)
|
||
|
|
||
|
if expected != actual {
|
||
|
t.Fatalf("wrong path (expected %s, got %s)", expected, actual)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func TestAddWorkspace(t *testing.T) {
|
||
|
t.Parallel()
|
||
|
repo := createTestRepo(t)
|
||
|
defer cleanupTestRepo(t, repo)
|
||
|
seedTestRepo(t, repo)
|
||
|
|
||
|
worktreeTemporaryPath, err := ioutil.TempDir("", "git2go")
|
||
|
checkFatal(t, err)
|
||
|
defer func() { checkFatal(t, os.RemoveAll(worktreeTemporaryPath)) }()
|
||
|
worktreeName := "testWorktree"
|
||
|
worktreePath := filepath.Join(worktreeTemporaryPath, "worktree")
|
||
|
|
||
|
worktree, err := repo.Worktrees.Add(worktreeName, worktreePath, &AddWorktreeOptions{
|
||
|
Lock: true, CheckoutOptions: CheckoutOptions{Strategy: CheckoutForce},
|
||
|
})
|
||
|
checkFatal(t, err)
|
||
|
|
||
|
if name := worktree.Name(); name != worktreeName {
|
||
|
t.Fatalf("wrong worktree name: %s != %s", worktreeName, name)
|
||
|
}
|
||
|
locked, _, err := worktree.IsLocked()
|
||
|
checkFatal(t, err)
|
||
|
if locked != true {
|
||
|
t.Fatal("worktree isn't locked")
|
||
|
}
|
||
|
assertSamePath(t, worktreePath, worktree.Path())
|
||
|
checkFatal(t, worktree.Validate())
|
||
|
}
|
||
|
|
||
|
func TestAddWorkspaceWithoutOptions(t *testing.T) {
|
||
|
t.Parallel()
|
||
|
repo := createTestRepo(t)
|
||
|
defer cleanupTestRepo(t, repo)
|
||
|
seedTestRepo(t, repo)
|
||
|
|
||
|
worktreeTemporaryPath, err := ioutil.TempDir("", "git2go")
|
||
|
checkFatal(t, err)
|
||
|
defer func() { checkFatal(t, os.RemoveAll(worktreeTemporaryPath)) }()
|
||
|
worktreeName := "testWorktree"
|
||
|
worktreePath := filepath.Join(worktreeTemporaryPath, "worktree")
|
||
|
|
||
|
worktree, err := repo.Worktrees.Add(worktreeName, worktreePath, nil)
|
||
|
checkFatal(t, err)
|
||
|
|
||
|
if name := worktree.Name(); name != worktreeName {
|
||
|
t.Fatalf("wrong worktree name: %s != %s", worktreeName, name)
|
||
|
}
|
||
|
locked, _, err := worktree.IsLocked()
|
||
|
checkFatal(t, err)
|
||
|
if locked != false {
|
||
|
t.Fatal("worktree is locked")
|
||
|
}
|
||
|
assertSamePath(t, worktreePath, worktree.Path())
|
||
|
checkFatal(t, worktree.Validate())
|
||
|
}
|
||
|
|
||
|
func TestLookupWorkspace(t *testing.T) {
|
||
|
t.Parallel()
|
||
|
repo := createTestRepo(t)
|
||
|
defer cleanupTestRepo(t, repo)
|
||
|
seedTestRepo(t, repo)
|
||
|
|
||
|
worktreeTemporaryPath, err := ioutil.TempDir("", "git2go")
|
||
|
checkFatal(t, err)
|
||
|
defer func() { checkFatal(t, os.RemoveAll(worktreeTemporaryPath)) }()
|
||
|
worktreeName := "testWorktree"
|
||
|
|
||
|
worktree, err := repo.Worktrees.Add(worktreeName, filepath.Join(worktreeTemporaryPath, "worktree"), nil)
|
||
|
checkFatal(t, err)
|
||
|
retrievedWorktree, err := repo.Worktrees.Lookup(worktreeName)
|
||
|
checkFatal(t, err)
|
||
|
|
||
|
assertSamePath(t, worktree.Path(), retrievedWorktree.Path())
|
||
|
}
|
||
|
|
||
|
func TestListWorkspaces(t *testing.T) {
|
||
|
t.Parallel()
|
||
|
repo := createTestRepo(t)
|
||
|
defer cleanupTestRepo(t, repo)
|
||
|
seedTestRepo(t, repo)
|
||
|
|
||
|
worktreeTemporaryPath, err := ioutil.TempDir("", "git2go")
|
||
|
checkFatal(t, err)
|
||
|
defer func() { checkFatal(t, os.RemoveAll(worktreeTemporaryPath)) }()
|
||
|
|
||
|
worktreeNames := []string{"worktree1", "worktree2", "worktree3"}
|
||
|
for _, name := range worktreeNames {
|
||
|
_, err = repo.Worktrees.Add(name, filepath.Join(worktreeTemporaryPath, name), nil)
|
||
|
checkFatal(t, err)
|
||
|
}
|
||
|
listedWorktree, err := repo.Worktrees.List()
|
||
|
checkFatal(t, err)
|
||
|
|
||
|
if len(worktreeNames) != len(listedWorktree) {
|
||
|
t.Fatalf("len(worktreeNames) != len(listedWorktree) as %d != %d", len(worktreeNames), len(listedWorktree))
|
||
|
}
|
||
|
for _, name := range worktreeNames {
|
||
|
found := false
|
||
|
for _, nameToMatch := range listedWorktree {
|
||
|
if name == nameToMatch {
|
||
|
found = true
|
||
|
break
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if !found {
|
||
|
t.Fatalf("worktree %s is missing", name)
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func TestOpenWorkspaceFromRepository(t *testing.T) {
|
||
|
t.Parallel()
|
||
|
repo := createTestRepo(t)
|
||
|
defer cleanupTestRepo(t, repo)
|
||
|
seedTestRepo(t, repo)
|
||
|
|
||
|
worktreeTemporaryPath, err := ioutil.TempDir("", "git2go")
|
||
|
checkFatal(t, err)
|
||
|
defer func() { checkFatal(t, os.RemoveAll(worktreeTemporaryPath)) }()
|
||
|
|
||
|
worktree, err := repo.Worktrees.Add("testWorktree", filepath.Join(worktreeTemporaryPath, "worktree"), nil)
|
||
|
checkFatal(t, err)
|
||
|
worktreeRepo, err := OpenRepository(worktree.Path())
|
||
|
checkFatal(t, err)
|
||
|
worktreeFromRepo, err := worktreeRepo.Worktrees.OpenFromRepository()
|
||
|
checkFatal(t, err)
|
||
|
|
||
|
if worktreeFromRepo.Name() != worktree.Name() {
|
||
|
t.Fatalf("wrong name (expected %s, got %s)", worktreeFromRepo.Name(), worktree.Name())
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func TestWorktreeIsPrunable(t *testing.T) {
|
||
|
t.Parallel()
|
||
|
repo := createTestRepo(t)
|
||
|
defer cleanupTestRepo(t, repo)
|
||
|
seedTestRepo(t, repo)
|
||
|
|
||
|
worktreeTemporaryPath, err := ioutil.TempDir("", "git2go")
|
||
|
checkFatal(t, err)
|
||
|
defer func() { checkFatal(t, os.RemoveAll(worktreeTemporaryPath)) }()
|
||
|
|
||
|
worktree, err := repo.Worktrees.Add("testWorktree", filepath.Join(worktreeTemporaryPath, "worktree"), nil)
|
||
|
checkFatal(t, err)
|
||
|
err = worktree.Lock("test")
|
||
|
checkFatal(t, err)
|
||
|
|
||
|
isPrunableWithoutLockedFlag, err := worktree.IsPrunable(WorktreePruneValid)
|
||
|
checkFatal(t, err)
|
||
|
if isPrunableWithoutLockedFlag {
|
||
|
t.Fatal("worktree shouldn't be prunable without the WorktreePruneLocked flag")
|
||
|
}
|
||
|
isPrunableWithLockedFlag, err := worktree.IsPrunable(WorktreePruneValid | WorktreePruneLocked)
|
||
|
checkFatal(t, err)
|
||
|
if !isPrunableWithLockedFlag {
|
||
|
t.Fatal("worktree should be prunable with the WorktreePruneLocked flag")
|
||
|
}
|
||
|
|
||
|
err = worktree.Prune(WorktreePruneValid | WorktreePruneLocked)
|
||
|
checkFatal(t, err)
|
||
|
}
|
||
|
|
||
|
func TestWorktreeCanBeLockedAndUnlocked(t *testing.T) {
|
||
|
t.Parallel()
|
||
|
repo := createTestRepo(t)
|
||
|
defer cleanupTestRepo(t, repo)
|
||
|
seedTestRepo(t, repo)
|
||
|
|
||
|
worktreeTemporaryPath, err := ioutil.TempDir("", "git2go")
|
||
|
checkFatal(t, err)
|
||
|
defer func() { checkFatal(t, os.RemoveAll(worktreeTemporaryPath)) }()
|
||
|
|
||
|
worktree, err := repo.Worktrees.Add("testWorktree", filepath.Join(worktreeTemporaryPath, "worktree"), nil)
|
||
|
checkFatal(t, err)
|
||
|
notLocked, err := worktree.Unlock()
|
||
|
checkFatal(t, err)
|
||
|
if !notLocked {
|
||
|
t.Fatal("worktree should be unlocked by default")
|
||
|
}
|
||
|
|
||
|
expectedReason := "toTestIt"
|
||
|
err = worktree.Lock(expectedReason)
|
||
|
checkFatal(t, err)
|
||
|
isLocked, reason, err := worktree.IsLocked()
|
||
|
checkFatal(t, err)
|
||
|
if !isLocked {
|
||
|
t.Fatal("worktree should be locked after the locking operation")
|
||
|
}
|
||
|
if expectedReason != reason {
|
||
|
t.Fatalf("locked reason doesn't match: %s != %s", expectedReason, reason)
|
||
|
}
|
||
|
|
||
|
notLocked, err = worktree.Unlock()
|
||
|
checkFatal(t, err)
|
||
|
if notLocked {
|
||
|
t.Fatal("worktree was lock before so notLocked should be false")
|
||
|
}
|
||
|
isLocked, _, err = worktree.IsLocked()
|
||
|
checkFatal(t, err)
|
||
|
if isLocked {
|
||
|
t.Fatal("worktree should be unlocked after the Unlock() call")
|
||
|
}
|
||
|
}
|