@@ -6,17 +6,74 @@ import (
6
6
"io/ioutil"
7
7
"log"
8
8
"os"
9
+ "path"
9
10
"path/filepath"
11
+ "strconv"
12
+ "testing"
10
13
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"
12
16
"gopkg.in/src-d/go-git.v4/config"
13
17
"gopkg.in/src-d/go-git.v4/plumbing"
14
18
"gopkg.in/src-d/go-git.v4/plumbing/transport/http"
15
19
"gopkg.in/src-d/go-git.v4/storage/memory"
20
+ "gopkg.in/src-d/go-git.v4/utils/merkletrie"
16
21
17
22
"gopkg.in/src-d/go-billy.v4/memfs"
18
23
)
19
24
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
+
20
77
func ExampleClone () {
21
78
// Filesystem abstraction based on memory
22
79
fs := memfs .New ()
@@ -164,3 +221,78 @@ func ExampleRepository_CreateRemote() {
164
221
// example https://github.com/git-fixtures/basic.git (fetch)
165
222
// example https://github.com/git-fixtures/basic.git (push)
166
223
}
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