Skip to content
Snippets Groups Projects

Initial implementation of an elasticsearch indexer in Go

Merged Nick Thomas requested to merge 1-initial-implementation into master
All threads resolved!
7 files
+ 95
45
Compare changes
  • Side-by-side
  • Inline
Files
7
+ 37
15
@@ -14,7 +14,7 @@ var (
endError = fmt.Errorf("Finished") // not really an error
)
type Repo struct {
type goGitRepository struct {
Repo *git.Repository
FromHash plumbing.Hash
@@ -24,8 +24,8 @@ type Repo struct {
ToCommit *object.Commit
}
func NewRepo(projectPath string, fromSHA string, toSHA string) (*Repo, error) {
out := &Repo{}
func NewGoGitRepository(projectPath string, fromSHA string, toSHA string) (*goGitRepository, error) {
out := &goGitRepository{}
repo, err := git.PlainOpen(projectPath)
if err != nil {
@@ -67,7 +67,7 @@ func NewRepo(projectPath string, fromSHA string, toSHA string) (*Repo, error) {
return out, nil
}
func (r *Repo) Diff() (object.Changes, error) {
func (r *goGitRepository) diff() (object.Changes, error) {
var fromTree, toTree *object.Tree
if r.FromCommit != nil {
@@ -87,14 +87,32 @@ func (r *Repo) Diff() (object.Changes, error) {
return object.DiffTree(fromTree, toTree)
}
type FileFunc func(file *object.File, fromCommit, toCommit *object.Commit) error
func goGitBuildSignature(sig object.Signature) Signature {
return Signature{
Name: sig.Name,
Email: sig.Email,
When: sig.When,
}
}
func goGitBuildFile(change object.ChangeEntry, file *object.File) *File {
return &File{
Path: change.Name,
Oid: file.ID().String(),
Blob: file.Blob.Reader,
Size: file.Size,
}
}
func (r *Repo) EachFileChange(ins, mod, del FileFunc) error {
changes, err := r.Diff()
func (r *goGitRepository) EachFileChange(ins, mod, del FileFunc) error {
changes, err := r.diff()
if err != nil {
return err
}
fromCommitStr := r.FromHash.String()
toCommitStr := r.ToHash.String()
for _, change := range changes {
// FIXME(nick): submodules may need better support
// https://github.com/src-d/go-git/issues/317
@@ -114,14 +132,11 @@ func (r *Repo) EachFileChange(ins, mod, del FileFunc) error {
switch action {
case merkletrie.Insert:
toF.Name = change.To.Name
err = ins(toF, r.FromCommit, r.ToCommit)
err = ins(goGitBuildFile(change.To, toF), fromCommitStr, toCommitStr)
case merkletrie.Modify:
toF.Name = change.To.Name
err = mod(toF, r.FromCommit, r.ToCommit)
err = mod(goGitBuildFile(change.To, toF), fromCommitStr, toCommitStr)
case merkletrie.Delete:
fromF.Name = change.From.Name
err = del(fromF, r.FromCommit, r.ToCommit)
err = del(goGitBuildFile(change.From, fromF), fromCommitStr, toCommitStr)
default:
err = fmt.Errorf("Unrecognised change calculating diff: %+v", change)
}
@@ -136,9 +151,16 @@ func (r *Repo) EachFileChange(ins, mod, del FileFunc) error {
// EachCommit runs `f` for each commit within `fromSHA`...`toSHA` (i.e., the
// inclusive set).
func (r *Repo) EachCommit(f func(*object.Commit) error) error {
func (r *goGitRepository) EachCommit(f CommitFunc) error {
err := object.WalkCommitHistory(r.ToCommit, func(c *object.Commit) error {
if err := f(c); err != nil {
commit := &Commit{
Message: c.Message,
Hash: c.Hash.String(),
Author: goGitBuildSignature(c.Author),
Committer: goGitBuildSignature(c.Committer),
}
if err := f(commit); err != nil {
return err
}
Loading