···
+
"github.com/go-git/go-git/v5/plumbing"
+
"github.com/go-git/go-git/v5/plumbing/object"
+
"tangled.sh/tangled.sh/core/types"
+
func (g *GitRepo) Branches() ([]types.Branch, error) {
+
var outFormat strings.Builder
+
outFormat.WriteString("--format=")
+
for i, f := range fields {
+
outFormat.WriteString(fieldSeparator)
+
outFormat.WriteString(fmt.Sprintf("%%(%s)", f))
+
outFormat.WriteString("")
+
outFormat.WriteString(recordSeparator)
+
output, err := g.forEachRef(outFormat.String(), "refs/heads")
+
return nil, fmt.Errorf("failed to get branches: %w", err)
+
records := strings.Split(strings.TrimSpace(string(output)), recordSeparator)
+
if len(records) == 1 && records[0] == "" {
+
branches := make([]types.Branch, 0, len(records))
+
defaultBranch, _ := g.FindMainBranch()
+
for _, line := range records {
+
parts := strings.SplitN(strings.TrimSpace(line), fieldSeparator, len(fields))
+
commitHash := plumbing.NewHash(parts[1])
+
authorEmail := strings.TrimSuffix(strings.TrimPrefix(parts[3], "<"), ">")
+
committerName := parts[5]
+
committerEmail := strings.TrimSuffix(strings.TrimPrefix(parts[6], "<"), ">")
+
committerDate := parts[7]
+
treeHash := plumbing.NewHash(parts[8])
+
parentHash := plumbing.NewHash(parts[9])
+
var authoredAt, committedAt time.Time
+
if unix, err := strconv.ParseInt(authorDate, 10, 64); err == nil {
+
authoredAt = time.Unix(unix, 0)
+
if unix, err := strconv.ParseInt(committerDate, 10, 64); err == nil {
+
committedAt = time.Unix(unix, 0)
+
branch := types.Branch{
+
IsDefault: branchName == defaultBranch,
+
Reference: types.Reference{
+
Hash: commitHash.String(),
+
Commit: &object.Commit{
+
Author: object.Signature{
+
Committer: object.Signature{
+
ParentHashes: []plumbing.Hash{parentHash},
+
branches = append(branches, branch)
+
slices.Reverse(branches)