@@ -6,17 +6,74 @@ import (
66 "io/ioutil"
77 "log"
88 "os"
9+ "path"
910 "path/filepath"
11+ "strconv"
12+ "testing"
1013
11- "gopkg.in/src-d/go-git.v4"
14+ "github.com/src-d/go-git/plumbing/object"
15+ git "gopkg.in/src-d/go-git.v4"
1216 "gopkg.in/src-d/go-git.v4/config"
1317 "gopkg.in/src-d/go-git.v4/plumbing"
1418 "gopkg.in/src-d/go-git.v4/plumbing/transport/http"
1519 "gopkg.in/src-d/go-git.v4/storage/memory"
20+ "gopkg.in/src-d/go-git.v4/utils/merkletrie"
1621
1722 "gopkg.in/src-d/go-billy.v4/memfs"
1823)
1924
25+ // repository is a boilerplate sample repository (go-git itself).
26+ var repository * git.Repository
27+
28+ func init () {
29+ cwd , err := os .Getwd ()
30+ if err == nil {
31+ for true {
32+ files , err := ioutil .ReadDir (cwd )
33+ if err != nil {
34+ break
35+ }
36+ found := false
37+ for _ , f := range files {
38+ if f .Name () == "README.md" {
39+ found = true
40+ break
41+ }
42+ }
43+ if found {
44+ break
45+ }
46+ oldCwd := cwd
47+ cwd = path .Dir (cwd )
48+ if oldCwd == cwd {
49+ break
50+ }
51+ }
52+ Repository , err = git .PlainOpen (cwd )
53+ if err == nil {
54+ iter , err := Repository .CommitObjects ()
55+ if err == nil {
56+ commits := - 1
57+ for ; err != io .EOF ; _ , err = iter .Next () {
58+ if err != nil {
59+ panic (err )
60+ }
61+ commits ++
62+ if commits >= 100 {
63+ return
64+ }
65+ }
66+ }
67+ }
68+ }
69+ Repository , err = git .Clone (memory .NewStorage (), nil , & git.CloneOptions {
70+ URL : "https://github.com/src-d/go-git" ,
71+ })
72+ if err != nil {
73+ panic (err )
74+ }
75+ }
76+
2077func ExampleClone () {
2178 // Filesystem abstraction based on memory
2279 fs := memfs .New ()
@@ -164,3 +221,78 @@ func ExampleRepository_CreateRemote() {
164221 // example https://github.com/git-fixtures/basic.git (fetch)
165222 // example https://github.com/git-fixtures/basic.git (push)
166223}
224+
225+ func ExampleDiffRepo (t * testing.T ) {
226+ var hash plumbing.Hash
227+
228+ prevHash := plumbing .NewHash ("5fddbeb678bd2c36c5e5c891ab8f2b143ced5baf" )
229+ hash := plumbing .NewHash ("c088fd6a7e1a38e9d5a9815265cb575bb08d08ff" )
230+
231+ prevCommit , err := repo .CommitObject (prevHash )
232+ if err != nil {
233+ t .Fatalf ("repo.CommitObject(%q) error: %v" , prevHash , err )
234+ }
235+
236+ commit , err := repo .CommitObject (hash )
237+ if err != nil {
238+ t .Fatalf ("repo.CommitObject(%q) error: %v" , hash , err )
239+ }
240+
241+ fmt .Println ("Comparing from:" + prevCommit .Hash .String () + " to:" + commit .Hash .String ())
242+
243+ isAncestor , err := commit .IsAncestor (prevCommit )
244+ if err != nil {
245+ t .Fatalf ("commit.IsAncestor(%q) error: %v" , prevCommit , err )
246+ }
247+
248+ fmt .Printf ("Is the prevCommit an ancestor of commit? : %v %v\n " , isAncestor )
249+
250+ currentTree , err := commit .Tree ()
251+ if err != nil {
252+ t .Errorf ("commit.Tree() error: %v" , err )
253+ }
254+
255+ prevTree , err := prevCommit .Tree ()
256+ if err != nil {
257+ t .Errorf ("prevCommit.Tree() error: %v" , err )
258+ }
259+
260+ patch , err := currentTree .Patch (prevTree )
261+ if err != nil {
262+ t .Errorf ("currentTree.Patch(%q) error: %v" , prevTree , err )
263+ }
264+ fmt .Println ("Got here" + strconv .Itoa (len (patch .Stats ())))
265+
266+ var changedFiles []string
267+ for _ , fileStat := range patch .Stats () {
268+ fmt .Println (fileStat .Name )
269+ changedFiles = append (changedFiles , fileStat .Name )
270+ }
271+
272+ changes , err := currentTree .Diff (prevTree )
273+ if err != nil {
274+ t .Errorf ("currentTree.Diff(%v) error: %v" , prevTree , err )
275+ }
276+
277+ fmt .Println ("Got here!" )
278+ for _ , change := range changes {
279+ // Ignore deleted files
280+ action , err := change .Action ()
281+ if err != nil {
282+ t .Errorf ("change.Action() error: %v" , err )
283+ }
284+ if action == merkletrie .Delete {
285+ fmt .Println ("Skipping delete" )
286+ continue
287+ }
288+
289+ // Get list of involved files
290+ name := change .To .Name
291+
292+ var empty = object.ChangeEntry {}
293+ if change .From != empty {
294+ name = change .From .Name
295+ }
296+ fmt .Println (name )
297+ }
298+ }
0 commit comments