all repos — homestead @ 431e351c78000ccd0d6bf035b4cd1092a7744d85

Code for my website

internal/vcs/filelog.go (view raw)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
package vcs

import (
	"net/url"
	"time"

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

type Author struct {
	Name  string
	Email string
}

type Commit struct {
	Hash    string
	Message string
	Author  Author
	Date    time.Time
	Link    *url.URL
}

func (r *Repository) makeCommitURL(hash string) *url.URL {
	u := r.remoteURL.JoinPath("commit")
	q := u.Query()
	q.Add("id", hash)
	u.RawQuery = q.Encode()

	return u
}

func (r *Repository) GetFileLog(filename string) (cs []*Commit, err error) {
	fl, err := r.repo.Log(&git.LogOptions{
		Order:    git.LogOrderCommitterTime,
		FileName: &filename,
	})
	if err != nil {
		return nil, errors.WithMessagef(err, "could not get git log for file %s", filename)
	}

	defer fl.Close()
	err = fl.ForEach(func(c *object.Commit) error {
		cs = append(cs, &Commit{
			Hash:    c.Hash.String(),
			Message: c.Message,
			Author: Author{
				Name:  c.Author.Name,
				Email: c.Author.Email,
			},
			Date: c.Author.When,
			Link: r.makeCommitURL(c.Hash.String()),
		})

		return nil
	})
	if err != nil {
		return nil, errors.WithMessagef(err, "could not iterate over commits for file %s", filename)
	}

	return cs, nil
}