git: fix trees
This commit is contained in:
parent
ac6ca71f01
commit
e0f34796a3
2 changed files with 98 additions and 60 deletions
94
git/git.go
94
git/git.go
|
@ -8,10 +8,39 @@ import (
|
||||||
"github.com/go-git/go-git/v5/plumbing/object"
|
"github.com/go-git/go-git/v5/plumbing/object"
|
||||||
)
|
)
|
||||||
|
|
||||||
func AllCommits(r *git.Repository) ([]*object.Commit, error) {
|
type GitRepo struct {
|
||||||
ci, err := r.Log(&git.LogOptions{All: true})
|
r *git.Repository
|
||||||
|
h plumbing.Hash
|
||||||
|
}
|
||||||
|
|
||||||
|
func Open(path string, ref string) (*GitRepo, error) {
|
||||||
|
var err error
|
||||||
|
g := GitRepo{}
|
||||||
|
g.r, err = git.PlainOpen(path)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("all commits: %w", err)
|
return nil, fmt.Errorf("opening %s: %w", path, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if ref == "" {
|
||||||
|
head, err := g.r.Head()
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("getting head of %s: %w", path, err)
|
||||||
|
}
|
||||||
|
g.h = head.Hash()
|
||||||
|
} else {
|
||||||
|
hash, err := g.r.ResolveRevision(plumbing.Revision(ref))
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("resolving rev %s for %s: %w", ref, path, err)
|
||||||
|
}
|
||||||
|
g.h = *hash
|
||||||
|
}
|
||||||
|
return &g, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (g *GitRepo) Commits() ([]*object.Commit, error) {
|
||||||
|
ci, err := g.r.Log(&git.LogOptions{From: g.h})
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("commits from ref: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
commits := []*object.Commit{}
|
commits := []*object.Commit{}
|
||||||
|
@ -23,49 +52,8 @@ func AllCommits(r *git.Repository) ([]*object.Commit, error) {
|
||||||
return commits, nil
|
return commits, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// A nicer git tree representation.
|
func (g *GitRepo) FileContent(path string) (string, error) {
|
||||||
type NiceTree struct {
|
c, err := g.r.CommitObject(g.h)
|
||||||
Name string
|
|
||||||
Mode string
|
|
||||||
Size int64
|
|
||||||
IsFile bool
|
|
||||||
}
|
|
||||||
|
|
||||||
func FilesAtRef(r *git.Repository, hash plumbing.Hash, path string) ([]NiceTree, error) {
|
|
||||||
c, err := r.CommitObject(hash)
|
|
||||||
if err != nil {
|
|
||||||
return nil, fmt.Errorf("commit object: %w", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
files := []NiceTree{}
|
|
||||||
tree, err := c.Tree()
|
|
||||||
if err != nil {
|
|
||||||
return nil, fmt.Errorf("file tree: %w", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
if path == "" {
|
|
||||||
files = makeNiceTree(tree.Entries)
|
|
||||||
} else {
|
|
||||||
o, err := tree.FindEntry(path)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
if !o.Mode.IsFile() {
|
|
||||||
subtree, err := tree.Tree(path)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
files = makeNiceTree(subtree.Entries)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return files, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func FileContentAtRef(r *git.Repository, hash plumbing.Hash, path string) (string, error) {
|
|
||||||
c, err := r.CommitObject(hash)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", fmt.Errorf("commit object: %w", err)
|
return "", fmt.Errorf("commit object: %w", err)
|
||||||
}
|
}
|
||||||
|
@ -82,17 +70,3 @@ func FileContentAtRef(r *git.Repository, hash plumbing.Hash, path string) (strin
|
||||||
|
|
||||||
return file.Contents()
|
return file.Contents()
|
||||||
}
|
}
|
||||||
|
|
||||||
func makeNiceTree(es []object.TreeEntry) []NiceTree {
|
|
||||||
nts := []NiceTree{}
|
|
||||||
for _, e := range es {
|
|
||||||
mode, _ := e.Mode.ToOSFileMode()
|
|
||||||
nts = append(nts, NiceTree{
|
|
||||||
Name: e.Name,
|
|
||||||
Mode: mode.String(),
|
|
||||||
IsFile: e.Mode.IsFile(),
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
return nts
|
|
||||||
}
|
|
||||||
|
|
64
git/tree.go
Normal file
64
git/tree.go
Normal file
|
@ -0,0 +1,64 @@
|
||||||
|
package git
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
"github.com/go-git/go-git/v5/plumbing/object"
|
||||||
|
)
|
||||||
|
|
||||||
|
func (g *GitRepo) FileTree(path string) ([]NiceTree, error) {
|
||||||
|
c, err := g.r.CommitObject(g.h)
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("commit object: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
files := []NiceTree{}
|
||||||
|
tree, err := c.Tree()
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("file tree: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if path == "" {
|
||||||
|
files = makeNiceTree(tree.Entries)
|
||||||
|
} else {
|
||||||
|
o, err := tree.FindEntry(path)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
if !o.Mode.IsFile() {
|
||||||
|
subtree, err := tree.Tree(path)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
files = makeNiceTree(subtree.Entries)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return files, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// A nicer git tree representation.
|
||||||
|
type NiceTree struct {
|
||||||
|
Name string
|
||||||
|
Mode string
|
||||||
|
Size int64
|
||||||
|
IsFile bool
|
||||||
|
IsSubtree bool
|
||||||
|
}
|
||||||
|
|
||||||
|
func makeNiceTree(es []object.TreeEntry) []NiceTree {
|
||||||
|
nts := []NiceTree{}
|
||||||
|
|
||||||
|
for _, e := range es {
|
||||||
|
mode, _ := e.Mode.ToOSFileMode()
|
||||||
|
nts = append(nts, NiceTree{
|
||||||
|
Name: e.Name,
|
||||||
|
Mode: mode.String(),
|
||||||
|
IsFile: e.Mode.IsFile(),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
return nts
|
||||||
|
}
|
Loading…
Reference in a new issue