diff options
author | Máximo Cuadros <mcuadros@gmail.com> | 2015-10-26 01:23:18 +0100 |
---|---|---|
committer | Máximo Cuadros <mcuadros@gmail.com> | 2015-10-26 01:23:18 +0100 |
commit | a2e49a59782a50a9ff116c6d17c6e3888502f2ad (patch) | |
tree | fe423602d05ff2a0b7bf5550c21fee223de13f9b /repository.go | |
parent | 688e802814f791a8723874dc88437bd8d140e103 (diff) | |
download | go-git-a2e49a59782a50a9ff116c6d17c6e3888502f2ad.tar.gz |
repository
Diffstat (limited to 'repository.go')
-rw-r--r-- | repository.go | 68 |
1 files changed, 68 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 +} |