blob: ab3866dd4960c7e0421b4e0b74a45d7c061f9343 [file] [log] [blame]
package vcsinfo
import (
"context"
"time"
)
var (
// Minimum time (the epoch)
MinTime = time.Unix(0, 0)
// MaxTime is the maximum time we consider. It's the equivalent of approximately November 2286.
// It is intended to be used as a value for range queries to get everything
// after a specified start time.
MaxTime = time.Unix(9999999999, 0)
)
// IndexCommit is information about a commit that includes the commit's index
// in the linear ancestry path obtained by following each commit's first parent
// backward in history. The first commit in a given branch has Index 0.
type IndexCommit struct {
Hash string
Index int
Timestamp time.Time
}
// ShortCommit stores the hash, author, and subject of a git commit.
type ShortCommit struct {
Hash string `json:"hash"`
Author string `json:"author"`
Subject string `json:"subject"`
}
// LongCommit gives more detailed information about a commit.
type LongCommit struct {
*ShortCommit
Parents []string `json:"parent"`
Body string `json:"body"`
Timestamp time.Time `json:"timestamp"`
// Index is this Commit's index in the linear ancestry path obtained by
// following each commit's first parent backward in history. The first
// commit in a given branch has Index 0. This field is not set by
// default.
Index int `json:"-"`
// Branches indicates which branches can reach this commit.
Branches map[string]bool `json:"-"`
}
func NewLongCommit() *LongCommit {
return &LongCommit{ShortCommit: &ShortCommit{}}
}
func (c *LongCommit) IndexCommit() *IndexCommit {
return &IndexCommit{
Hash: c.Hash,
Index: c.Index,
Timestamp: c.Timestamp,
}
}
// LongCommitSlice represents a slice of LongCommit objects used for sorting
// commits by timestamp, most recent first.
type LongCommitSlice []*LongCommit
func (s LongCommitSlice) Len() int { return len(s) }
func (s LongCommitSlice) Less(i, j int) bool { return s[i].Timestamp.After(s[j].Timestamp) }
func (s LongCommitSlice) Swap(i, j int) { s[i], s[j] = s[j], s[i] }
// IndexCommitSlice represents a slice of IndexCommit objects used for sorting
// commits by index, then by timestamp, then by hash.
type IndexCommitSlice []*IndexCommit
func (s IndexCommitSlice) Len() int { return len(s) }
func (s IndexCommitSlice) Less(i, j int) bool {
return s[i].Index < s[j].Index ||
((s[i].Index == s[j].Index) && s[i].Timestamp.Before(s[j].Timestamp)) ||
((s[i].Index == s[j].Index) && s[i].Timestamp.Equal(s[j].Timestamp) &&
(s[i].Hash < s[j].Hash))
}
func (s IndexCommitSlice) Swap(i, j int) { s[i], s[j] = s[j], s[i] }
// VCS is a generic interface to the information contained in a version
// control system.
type VCS interface {
// Update updates the local checkout of the repo.
Update(ctx context.Context, pull, allBranches bool) error
// From returns commit hashes for the time frame from 'start' to now.
From(start time.Time) []string
// Details returns the full commit information for the given hash.
// If includeBranchInfo is true the Branches field of the returned
// result will contain all branches that contain the given commit,
// otherwise Branches will be empty.
// Note: Retrieving the branch information can be expensive and should
// only be used if the membership in branches is really needed.
Details(ctx context.Context, hash string, includeBranchInfo bool) (*LongCommit, error)
// DetailsMulti returns multiple details at once, which is a lot faster for some implementations,
// e.g. the implementation based on BigTable where we can avoid multiple roundtrips to the database.
DetailsMulti(ctx context.Context, hashes []string, includeBranchInfo bool) ([]*LongCommit, error)
// LastNIndex returns the last N commits.
LastNIndex(N int) []*IndexCommit
// Range returns all commits from the half open interval ['begin', 'end'), i.e.
// includes 'begin' and excludes 'end'.
Range(begin, end time.Time) []*IndexCommit
// IndexOf returns the index of the commit hash, where 0 is the index of the first commit.
IndexOf(ctx context.Context, hash string) (int, error)
// ByIndex returns a LongCommit describing the commit
// at position N, as ordered in the current branch.
ByIndex(ctx context.Context, N int) (*LongCommit, error)
}