diff options
-rw-r--r-- | repository.go | 68 | ||||
-rw-r--r-- | repository_test.go | 15 |
2 files changed, 83 insertions, 0 deletions
diff --git a/repository.go b/repository.go new file mode 100644 index 0000000..2dadcb6 --- /dev/null +++ b/repository.go @@ -0,0 +1,68 @@ +package git + +import ( + "fmt" + + "gopkg.in/src-d/go-git.v2/clients/common" + "gopkg.in/src-d/go-git.v2/formats/packfile" + "gopkg.in/src-d/go-git.v2/internal" +) + +const ( + DefaultRemoteName = "origin" +) + +type Repository struct { + Remotes map[string]*Remote + Storage *internal.RAWObjectStorage +} + +// NewRepository creates a new repository setting remote as default remote +func NewRepository(url string) (*Repository, error) { + remote, err := NewRemote(url) + if err != nil { + return nil, err + } + + r := NewPlainRepository() + r.Remotes[DefaultRemoteName] = remote + + return r, nil +} + +// NewPlainRepository creates a new repository without remotes +func NewPlainRepository() *Repository { + return &Repository{ + Remotes: map[string]*Remote{}, + Storage: internal.NewRAWObjectStorage(), + } +} + +func (r *Repository) Pull(remoteName, branch string) error { + remote, ok := r.Remotes[remoteName] + if !ok { + return fmt.Errorf("unable to find remote %q", remoteName) + } + + if err := remote.Connect(); err != nil { + return err + } + + ref, err := remote.Ref(branch) + if err != nil { + return err + } + + reader, err := remote.Fetch(&common.GitUploadPackRequest{ + Want: []internal.Hash{ref}, + }) + + pr := packfile.NewReader(reader) + _, err = pr.Read(r.Storage) + + if err != nil { + return err + } + + return nil +} diff --git a/repository_test.go b/repository_test.go new file mode 100644 index 0000000..d0701fa --- /dev/null +++ b/repository_test.go @@ -0,0 +1,15 @@ +package git + +import . "gopkg.in/check.v1" + +type SuiteRepository struct{} + +var _ = Suite(&SuiteRepository{}) + +func (s *SuiteRepository) TestPull(c *C) { + r, err := NewRepository(RepositoryFixture) + c.Assert(err, IsNil) + c.Assert(r.Pull("origin", "refs/heads/master"), IsNil) + + //fmt.Println(r.Storage) +} |