|
@@ -13,10 +13,10 @@ import (
|
|
|
|
|
|
"github.com/sergi/go-diff/diffmatchpatch"
|
|
"github.com/sergi/go-diff/diffmatchpatch"
|
|
"gopkg.in/src-d/go-git.v4"
|
|
"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"
|
|
"gopkg.in/src-d/go-git.v4/plumbing/object"
|
|
"gopkg.in/src-d/go-git.v4/plumbing/object"
|
|
"gopkg.in/src-d/go-git.v4/utils/merkletrie"
|
|
"gopkg.in/src-d/go-git.v4/utils/merkletrie"
|
|
- "gopkg.in/src-d/go-git.v4/config"
|
|
|
|
)
|
|
)
|
|
|
|
|
|
type Analyser struct {
|
|
type Analyser struct {
|
|
@@ -107,6 +107,10 @@ func (obj DummyEncodedObject) Writer() (io.WriteCloser, error) {
|
|
return DummyIO{}, nil
|
|
return DummyIO{}, nil
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+func createDummyBlob(hash *plumbing.Hash) (*object.Blob, error) {
|
|
|
|
+ return object.DecodeBlob(DummyEncodedObject{*hash})
|
|
|
|
+}
|
|
|
|
+
|
|
func (analyser *Analyser) handleInsertion(
|
|
func (analyser *Analyser) handleInsertion(
|
|
change *object.Change, day int, status map[int]int64, files map[string]*File,
|
|
change *object.Change, day int, status map[int]int64, files map[string]*File,
|
|
cache *map[plumbing.Hash]*object.Blob) {
|
|
cache *map[plumbing.Hash]*object.Blob) {
|
|
@@ -375,7 +379,7 @@ func (analyser *Analyser) blobsAreClose(
|
|
}
|
|
}
|
|
|
|
|
|
func (analyser *Analyser) getBlob(entry *object.ChangeEntry, commit *object.Commit) (
|
|
func (analyser *Analyser) getBlob(entry *object.ChangeEntry, commit *object.Commit) (
|
|
- *object.Blob, error) {
|
|
|
|
|
|
+ *object.Blob, error) {
|
|
blob, err := analyser.Repository.BlobObject(entry.TreeEntry.Hash)
|
|
blob, err := analyser.Repository.BlobObject(entry.TreeEntry.Hash)
|
|
if err != nil {
|
|
if err != nil {
|
|
if err.Error() != git.ErrObjectNotFound.Error() {
|
|
if err.Error() != git.ErrObjectNotFound.Error() {
|
|
@@ -398,7 +402,7 @@ func (analyser *Analyser) getBlob(entry *object.ChangeEntry, commit *object.Comm
|
|
_, exists := modules.Submodules[entry.Name]
|
|
_, exists := modules.Submodules[entry.Name]
|
|
if exists {
|
|
if exists {
|
|
// we found that this is a submodule
|
|
// we found that this is a submodule
|
|
- return object.DecodeBlob(DummyEncodedObject{entry.TreeEntry.Hash})
|
|
|
|
|
|
+ return createDummyBlob(&entry.TreeEntry.Hash)
|
|
}
|
|
}
|
|
return nil, err
|
|
return nil, err
|
|
}
|
|
}
|
|
@@ -406,7 +410,7 @@ func (analyser *Analyser) getBlob(entry *object.ChangeEntry, commit *object.Comm
|
|
}
|
|
}
|
|
|
|
|
|
func (analyser *Analyser) cacheBlobs(changes *object.Changes, commit *object.Commit) (
|
|
func (analyser *Analyser) cacheBlobs(changes *object.Changes, commit *object.Commit) (
|
|
- *map[plumbing.Hash]*object.Blob, error) {
|
|
|
|
|
|
+ *map[plumbing.Hash]*object.Blob, error) {
|
|
cache := make(map[plumbing.Hash]*object.Blob)
|
|
cache := make(map[plumbing.Hash]*object.Blob)
|
|
for _, change := range *changes {
|
|
for _, change := range *changes {
|
|
action, err := change.Action()
|
|
action, err := change.Action()
|
|
@@ -422,7 +426,12 @@ func (analyser *Analyser) cacheBlobs(changes *object.Changes, commit *object.Com
|
|
case merkletrie.Delete:
|
|
case merkletrie.Delete:
|
|
cache[change.From.TreeEntry.Hash], err = analyser.getBlob(&change.From, commit)
|
|
cache[change.From.TreeEntry.Hash], err = analyser.getBlob(&change.From, commit)
|
|
if err != nil {
|
|
if err != nil {
|
|
- fmt.Fprintf(os.Stderr, "file from %s\n", change.From.Name)
|
|
|
|
|
|
+ if err.Error() != git.ErrObjectNotFound.Error() {
|
|
|
|
+ fmt.Fprintf(os.Stderr, "file from %s\n", change.From.Name)
|
|
|
|
+ } else {
|
|
|
|
+ cache[change.From.TreeEntry.Hash], err = createDummyBlob(
|
|
|
|
+ &change.From.TreeEntry.Hash)
|
|
|
|
+ }
|
|
}
|
|
}
|
|
case merkletrie.Modify:
|
|
case merkletrie.Modify:
|
|
cache[change.To.TreeEntry.Hash], err = analyser.getBlob(&change.To, commit)
|
|
cache[change.To.TreeEntry.Hash], err = analyser.getBlob(&change.To, commit)
|