aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--commit.go10
-rw-r--r--examples/clone/main.go84
2 files changed, 94 insertions, 0 deletions
diff --git a/commit.go b/commit.go
index 3e82a8a..8bb675a 100644
--- a/commit.go
+++ b/commit.go
@@ -60,6 +60,16 @@ func (c *Commit) File(path string) (*File, error) {
return tree.File(path)
}
+// Files returns a FileIter allowing to iterate over the Tree
+func (c *Commit) Files() (*FileIter, error) {
+ tree, err := c.Tree()
+ if err != nil {
+ return nil, err
+ }
+
+ return tree.Files(), nil
+}
+
// ID returns the object ID of the commit. The returned value will always match
// the current value of Commit.Hash.
//
diff --git a/examples/clone/main.go b/examples/clone/main.go
new file mode 100644
index 0000000..f95dc8f
--- /dev/null
+++ b/examples/clone/main.go
@@ -0,0 +1,84 @@
+package main
+
+import (
+ "io"
+ "os"
+ "path/filepath"
+
+ "github.com/fatih/color"
+
+ "gopkg.in/src-d/go-git.v4"
+)
+
+func main() {
+ checkArgs()
+ url := os.Args[1]
+ directory := os.Args[2]
+
+ r := git.NewMemoryRepository()
+
+ // Clone the given repository, using depth we create a shallow clone :
+ // > git clone <url> --depth 1
+ color.Blue("git clone %s --depth 1 %s", url, directory)
+
+ err := r.Clone(&git.CloneOptions{
+ URL: url,
+ Depth: 1,
+ })
+ checkIfError(err)
+
+ // ... retrieving the branch being pointed by HEAD
+ ref, err := r.Head()
+ checkIfError(err)
+ // ... retrieving the commit object
+ commit, err := r.Commit(ref.Hash())
+ checkIfError(err)
+
+ // ... we get all the files from the commit
+ files, err := commit.Files()
+ checkIfError(err)
+
+ // ... now we iterate the files to save to disk
+ err = files.ForEach(func(f *git.File) error {
+ abs := filepath.Join(directory, f.Name)
+ dir := filepath.Dir(abs)
+
+ os.MkdirAll(dir, 0777)
+ file, err := os.Create(abs)
+ if err != nil {
+ return err
+ }
+
+ defer file.Close()
+ r, err := f.Reader()
+ if err != nil {
+ return err
+ }
+
+ defer r.Close()
+
+ if err := file.Chmod(f.Mode); err != nil {
+ return err
+ }
+
+ _, err = io.Copy(file, r)
+ return err
+ })
+ checkIfError(err)
+}
+
+func checkIfError(err error) {
+ if err == nil {
+ return
+ }
+
+ color.Red("error: %s", err)
+ os.Exit(1)
+}
+
+func checkArgs() {
+ if len(os.Args) < 3 {
+ color.Cyan("Usage: %s <url> <directory>", os.Args[0])
+ os.Exit(1)
+ }
+}