Skip to content
This repository was archived by the owner on Sep 11, 2020. It is now read-only.

Commit 87d2e56

Browse files
committed
Add testable example of diffing
1 parent 1a7db85 commit 87d2e56

File tree

1 file changed

+133
-1
lines changed

1 file changed

+133
-1
lines changed

example_test.go

+133-1
Original file line numberDiff line numberDiff line change
@@ -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+
2077
func 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

Comments
 (0)