package dotgit
import (
"io"
"io/ioutil"
"log"
"os"
"path/filepath"
"testing"
"gopkg.in/src-d/go-git.v4/core"
"gopkg.in/src-d/go-git.v4/utils/fs"
"github.com/alcortesm/tgz"
. "gopkg.in/check.v1"
)
func Test(t *testing.T) { TestingT(t) }
var initFixtures = [...]struct {
name string
tgz string
}{
{
name: "spinnaker",
tgz: "fixtures/spinnaker-gc.tgz",
}, {
name: "no-packfile-no-idx",
tgz: "fixtures/no-packfile-no-idx.tgz",
}, {
name: "empty",
tgz: "fixtures/empty-gitdir.tgz",
}, {
name: "unpacked",
tgz: "fixtures/unpacked-objects-no-packfile-no-idx.tgz",
}, {
name: "unpacked-dummy",
tgz: "fixtures/unpacked-objects-exist-one-dummy-object-no-packfile-no-idx.tgz",
},
}
type SuiteDotGit struct {
fixtures map[string]fs.Filesystem
}
var _ = Suite(&SuiteDotGit{})
func (s *SuiteDotGit) SetUpSuite(c *C) {
s.fixtures = make(map[string]fs.Filesystem, len(initFixtures))
for _, init := range initFixtures {
com := Commentf("fixture name = %s\n", init.name)
path, err := tgz.Extract(init.tgz)
c.Assert(err, IsNil, com)
s.fixtures[init.name] = fs.NewOSClient(filepath.Join(path, ".git"))
}
}
func (s *SuiteDotGit) TearDownSuite(c *C) {
for _, f := range s.fixtures {
err := os.RemoveAll(f.Base())
c.Assert(err, IsNil)
}
}
func (s *SuiteDotGit) TestRefsFromPackedRefs(c *C) {
dir := s.newFixtureDir(c, "spinnaker")
refs, err := dir.Refs()
c.Assert(err, IsNil)
ref := findReference(refs, "refs/tags/v0.37.0")
c.Assert(ref, NotNil)
c.Assert(ref.Hash().String(), Equals, "85ec60477681933961c9b64c18ada93220650ac5")
}
func (s *SuiteDotGit) TestRefsFromReferenceFile(c *C) {
dir := s.newFixtureDir(c, "spinnaker")
refs, err := dir.Refs()
c.Assert(err, IsNil)
ref := findReference(refs, "refs/remotes/origin/HEAD")
c.Assert(ref, NotNil)
c.Assert(ref.Type(), Equals, core.SymbolicReference)
c.Assert(string(ref.Target()), Equals, "refs/remotes/origin/master")
}
func (s *SuiteDotGit) TestRefsFromHEADFile(c *C) {
dir := s.newFixtureDir(c, "spinnaker")
refs, err := dir.Refs()
c.Assert(err, IsNil)
ref := findReference(refs, "HEAD")
c.Assert(ref, NotNil)
c.Assert(ref.Type(), Equals, core.SymbolicReference)
c.Assert(string(ref.Target()), Equals, "refs/heads/master")
}
func (s *SuiteDotGit) TestConfig(c *C) {
dir := s.newFixtureDir(c, "spinnaker")
file, err := dir.Config()
c.Assert(err, IsNil)
c.Assert(filepath.Base(file.Filename()), Equals, "config")
}
func findReference(refs []*core.Reference, name string) *core.Reference {
n := core.ReferenceName(name)
for _, ref := range refs {
if ref.Name() == n {
return ref
}
}
return nil
}
func (s *SuiteDotGit) newFixtureDir(c *C, fixName string) *DotGit {
f, ok := s.fixtures[fixName]
c.Assert(ok, Equals, true)
return New(f)
}
func (s *SuiteDotGit) TestObjectsPack(c *C) {
dir := s.newFixtureDir(c, "spinnaker")
files, err := dir.ObjectsPacks()
c.Assert(err, IsNil)
c.Assert(files, HasLen, 1)
}
func (s *SuiteDotGit) TestObjectsNoPackile(c *C) {
dir := s.newFixtureDir(c, "no-packfile-no-idx")
files, err := dir.ObjectsPacks()
c.Assert(err, IsNil)
c.Assert(files, HasLen, 0)
}
func (s *SuiteDotGit) TestObjectsPackFolderNotExists(c *C) {
dir := s.newFixtureDir(c, "empty")
files, err := dir.ObjectsPacks()
c.Assert(err, IsNil)
c.Assert(files, HasLen, 0)
}
func (s *SuiteDotGit) TestObjectPack(c *C) {
dir := s.newFixtureDir(c, "spinnaker")
filename := "pack-584416f86235cac0d54bfabbdc399fb2b09a5269.pack"
pack, idx, err := dir.ObjectPack(filename)
c.Assert(err, IsNil)
c.Assert(filepath.Ext(pack.Filename()), Equals, ".pack")
c.Assert(filepath.Ext(idx.Filename()), Equals, ".idx")
}
func (s *SuiteDotGit) TestObjectPackNotFound(c *C) {
dir := s.newFixtureDir(c, "spinnaker")
filename := "pack-not-exists.pack"
pack, idx, err := dir.ObjectPack(filename)
c.Assert(err, Equals, ErrPackfileNotFound)
c.Assert(pack, IsNil)
c.Assert(idx, IsNil)
}
func (s *SuiteDotGit) TestObjects(c *C) {
dir := s.newFixtureDir(c, "unpacked")
hashes, err := dir.Objects()
c.Assert(err, IsNil)
c.Assert(hashes, HasLen, 3)
c.Assert(hashes[0].String(), Equals, "1e0304e3cb54d0ad612ad70f1f15a285a65a4b8e")
c.Assert(hashes[1].String(), Equals, "5efb9bc29c482e023e40e0a2b3b7e49cec842034")
c.Assert(hashes[2].String(), Equals, "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391")
}
func (s *SuiteDotGit) TestObjectsWithGarbage(c *C) {
dir := s.newFixtureDir(c, "unpacked-dummy")
hashes, err := dir.Objects()
c.Assert(err, IsNil)
c.Assert(hashes, HasLen, 3)
c.Assert(hashes[0].String(), Equals, "1e0304e3cb54d0ad612ad70f1f15a285a65a4b8e")
c.Assert(hashes[1].String(), Equals, "5efb9bc29c482e023e40e0a2b3b7e49cec842034")
c.Assert(hashes[2].String(), Equals, "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391")
}
func (s *SuiteDotGit) TestObjectsNoPackage(c *C) {
dir := s.newFixtureDir(c, "empty")
hashes, err := dir.Objects()
c.Assert(err, IsNil)
c.Assert(hashes, HasLen, 0)
}
func (s *SuiteDotGit) TestObjectsNoObjects(c *C) {
dir := s.newFixtureDir(c, "no-packfile-no-idx")
hashes, err := dir.Objects()
c.Assert(err, IsNil)
c.Assert(hashes, HasLen, 0)
}
func (s *SuiteDotGit) TestObject(c *C) {
dir := s.newFixtureDir(c, "unpacked")
hash := core.NewHash("1e0304e3cb54d0ad612ad70f1f15a285a65a4b8e")
file, err := dir.Object(hash)
c.Assert(err, IsNil)
c.Assert(file.Filename(), Not(Equals), "")
}
func (s *SuiteDotGit) TestObjectNotFound(c *C) {
dir := s.newFixtureDir(c, "unpacked")
hash := core.NewHash("not-found-object")
file, err := dir.Object(hash)
c.Assert(err, NotNil)
c.Assert(file, IsNil)
}
func (s *SuiteDotGit) TestNewObjectPack(c *C) {
dir, err := ioutil.TempDir("", "example")
if err != nil {
log.Fatal(err)
}
dot := New(fs.NewOSClient(dir))
r, err := os.Open("../../../../formats/packfile/fixtures/git-fixture.ofs-delta")
c.Assert(err, IsNil)
w, err := dot.NewObjectPack()
c.Assert(err, IsNil)
n, err := io.Copy(w, r)
c.Assert(err, IsNil)
c.Check(n, Equals, int64(85300))
c.Assert(w.Close(), IsNil)
}