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

Commit

Permalink
Add testable example of diffing
Browse files Browse the repository at this point in the history
Signed-off-by: Andrew Z Allen <[email protected]>
  • Loading branch information
achew22 committed Mar 26, 2020
1 parent 1a7db85 commit 77d499f
Showing 1 changed file with 133 additions and 1 deletion.
134 changes: 133 additions & 1 deletion example_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,17 +6,74 @@ import (
"io/ioutil"
"log"
"os"
"path"
"path/filepath"
"strconv"
"testing"

"gopkg.in/src-d/go-git.v4"
"github.com/src-d/go-git/plumbing/object"
git "gopkg.in/src-d/go-git.v4"
"gopkg.in/src-d/go-git.v4/config"
"gopkg.in/src-d/go-git.v4/plumbing"
"gopkg.in/src-d/go-git.v4/plumbing/transport/http"
"gopkg.in/src-d/go-git.v4/storage/memory"
"gopkg.in/src-d/go-git.v4/utils/merkletrie"

"gopkg.in/src-d/go-billy.v4/memfs"
)

// repository is a boilerplate sample repository (go-git itself).
var repository *git.Repository

func init() {
cwd, err := os.Getwd()
if err == nil {
for true {
files, err := ioutil.ReadDir(cwd)
if err != nil {
break
}
found := false
for _, f := range files {
if f.Name() == "README.md" {
found = true
break
}
}
if found {
break
}
oldCwd := cwd
cwd = path.Dir(cwd)
if oldCwd == cwd {
break
}
}
Repository, err = git.PlainOpen(cwd)
if err == nil {
iter, err := Repository.CommitObjects()
if err == nil {
commits := -1
for ; err != io.EOF; _, err = iter.Next() {
if err != nil {
panic(err)
}
commits++
if commits >= 100 {
return
}
}
}
}
}
Repository, err = git.Clone(memory.NewStorage(), nil, &git.CloneOptions{
URL: "https://github.com/src-d/go-git",
})
if err != nil {
panic(err)
}
}

func ExampleClone() {
// Filesystem abstraction based on memory
fs := memfs.New()
Expand Down Expand Up @@ -164,3 +221,78 @@ func ExampleRepository_CreateRemote() {
// example https://github.com/git-fixtures/basic.git (fetch)
// example https://github.com/git-fixtures/basic.git (push)
}

func ExampleDiffRepo(t *testing.T) {
var hash plumbing.Hash

prevHash := plumbing.NewHash("5fddbeb678bd2c36c5e5c891ab8f2b143ced5baf")
hash := plumbing.NewHash("c088fd6a7e1a38e9d5a9815265cb575bb08d08ff")

prevCommit, err := repo.CommitObject(prevHash)
if err != nil {
t.Fatalf("repo.CommitObject(%q) error: %v", prevHash, err)
}

commit, err := repo.CommitObject(hash)
if err != nil {
t.Fatalf("repo.CommitObject(%q) error: %v", hash, err)
}

fmt.Println("Comparing from:" + prevCommit.Hash.String() + " to:" + commit.Hash.String())

isAncestor, err := commit.IsAncestor(prevCommit)
if err != nil {
t.Fatalf("commit.IsAncestor(%q) error: %v", prevCommit, err)
}

fmt.Printf("Is the prevCommit an ancestor of commit? : %v %v\n", isAncestor)

currentTree, err := commit.Tree()
if err != nil {
t.Errorf("commit.Tree() error: %v", err)
}

prevTree, err := prevCommit.Tree()
if err != nil {
t.Errorf("prevCommit.Tree() error: %v", err)
}

patch, err := currentTree.Patch(prevTree)
if err != nil {
t.Errorf("currentTree.Patch(%q) error: %v", prevTree, err)
}
fmt.Println("Got here" + strconv.Itoa(len(patch.Stats())))

var changedFiles []string
for _, fileStat := range patch.Stats() {
fmt.Println(fileStat.Name)
changedFiles = append(changedFiles, fileStat.Name)
}

changes, err := currentTree.Diff(prevTree)
if err != nil {
t.Errorf("currentTree.Diff(%v) error: %v", prevTree, err)
}

fmt.Println("Got here!")
for _, change := range changes {
// Ignore deleted files
action, err := change.Action()
if err != nil {
t.Errorf("change.Action() error: %v", err)
}
if action == merkletrie.Delete {
fmt.Println("Skipping delete")
continue
}

// Get list of involved files
name := change.To.Name

var empty = object.ChangeEntry{}
if change.From != empty {
name = change.From.Name
}
fmt.Println(name)
}
}

0 comments on commit 77d499f

Please sign in to comment.