diff options
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 +} |