all repos — elgit @ e0f34796a37666058dce61277bc546add707fb2e

fork of legit: web frontend for git, written in go

git: fix trees
Anirudh Oppiliappan x@icyphox.sh
Sun, 11 Dec 2022 21:16:42 +0530
commit

e0f34796a37666058dce61277bc546add707fb2e

parent

ac6ca71f01885b3fff692b4b9ee36ed33965d396

2 files changed, 97 insertions(+), 59 deletions(-)

jump to
M git/git.gogit/git.go
@@ -8,64 +8,52 @@ "github.com/go-git/go-git/v5/plumbing" 	"github.com/go-git/go-git/v5/plumbing/object"
 )
 
-func AllCommits(r *git.Repository) ([]*object.Commit, error) {
-	ci, err := r.Log(&git.LogOptions{All: true})
-	if err != nil {
-		return nil, fmt.Errorf("all commits: %w", err)
-	}
-
-	commits := []*object.Commit{}
-	ci.ForEach(func(c *object.Commit) error {
-		commits = append(commits, c)
-		return nil
-	})
-
-	return commits, nil
-}
-
-// A nicer git tree representation.
-type NiceTree struct {
-	Name   string
-	Mode   string
-	Size   int64
-	IsFile bool
+type GitRepo struct {
+	r *git.Repository
+	h plumbing.Hash
 }
 
-func FilesAtRef(r *git.Repository, hash plumbing.Hash, path string) ([]NiceTree, error) {
-	c, err := r.CommitObject(hash)
+func Open(path string, ref string) (*GitRepo, error) {
+	var err error
+	g := GitRepo{}
+	g.r, err = git.PlainOpen(path)
 	if err != nil {
-		return nil, fmt.Errorf("commit object: %w", err)
+		return nil, fmt.Errorf("opening %s: %w", path, err)
 	}
 
-	files := []NiceTree{}
-	tree, err := c.Tree()
-	if err != nil {
-		return nil, fmt.Errorf("file tree: %w", err)
-	}
-
-	if path == "" {
-		files = makeNiceTree(tree.Entries)
+	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 {
-		o, err := tree.FindEntry(path)
+		hash, err := g.r.ResolveRevision(plumbing.Revision(ref))
 		if err != nil {
-			return nil, err
+			return nil, fmt.Errorf("resolving rev %s for %s: %w", ref, path, err)
 		}
+		g.h = *hash
+	}
+	return &g, nil
+}
 
-		if !o.Mode.IsFile() {
-			subtree, err := tree.Tree(path)
-			if err != nil {
-				return nil, err
-			}
-
-			files = makeNiceTree(subtree.Entries)
-		}
+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)
 	}
 
-	return files, nil
+	commits := []*object.Commit{}
+	ci.ForEach(func(c *object.Commit) error {
+		commits = append(commits, c)
+		return nil
+	})
+
+	return commits, nil
 }
 
-func FileContentAtRef(r *git.Repository, hash plumbing.Hash, path string) (string, error) {
-	c, err := r.CommitObject(hash)
+func (g *GitRepo) FileContent(path string) (string, error) {
+	c, err := g.r.CommitObject(g.h)
 	if err != nil {
 		return "", fmt.Errorf("commit object: %w", err)
 	}
@@ -82,17 +70,3 @@ } 
 	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
-}
A git/tree.go
@@ -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
+}