caddy-git-server

Provides a git_server caddy module for serving git repositories.

package gitserver

import (
	"sort"

	"github.com/go-git/go-git/v5"
	"github.com/go-git/go-git/v5/plumbing/object"
)

type GitBrowserLog struct {
	Commits []GitCommit
}

type GitCommit struct {
	// SHA1 commit hash
	Hash string
	// Committer of commit
	Committer string
	// Commit message
	Message string
	// Creation date (done by Author)
	Date string
}

func (gb *GitBrowser) browseLog() error {
	pageData := new(GitBrowserLog)
	// Extract commits if needed
	commits, _ := gb.Repo.Log(&git.LogOptions{From: *gb.RefHash})
	var unsortedCommits = make(map[int64]GitCommit)
	commits.ForEach(func(c *object.Commit) error {
		commit := GitCommit{
			Hash:      c.Hash.String(),
			Committer: c.Author.String(),
			Message:   c.Message,
			Date:      c.Committer.When.UTC().Format(dateFmt),
		}
		unsortedCommits[c.Committer.When.Unix()] = commit
		return nil
	})

	keys := make([]int, 0, len(unsortedCommits))
	for k := range unsortedCommits {
		keys = append(keys, int(k))
	}
	sort.Sort(sort.Reverse(sort.IntSlice(keys)))

	for _, key := range keys {
		pageData.Commits = append(pageData.Commits, unsortedCommits[int64(key)])
	}

	gb.PageData = pageData

	return nil
}