api: new methods to get branches and commit info

This commit is contained in:
mappu 2020-11-19 11:04:35 +13:00
parent 30e31f9a08
commit 818a93de1b

86
api.go
View File

@ -45,6 +45,34 @@ type MarkdownRequest struct {
Wiki bool Wiki bool
} }
type BranchCommit struct {
ID string `json:"id"`
Message string `json:"message"`
Timestamp time.Time `json:"timestamp"`
}
type Branch struct {
Name string `json:"name"`
Commit BranchCommit `json:"commit"`
}
type AuthorInfo struct {
Name string `json:"name"`
Email string `json:"email"`
Date time.Time `json:"date"`
}
type CommitListEntryCommit struct {
Message string `json:"message"`
Author AuthorInfo `json:"author"`
Committer AuthorInfo `json:"committer"`
}
type CommitListEntry struct {
ID string `json:"sha"`
Commit CommitListEntryCommit `json:"commit"`
}
func (this *Application) apiRequest(ctx context.Context, endpoint string, target interface{}) error { func (this *Application) apiRequest(ctx context.Context, endpoint string, target interface{}) error {
err := this.apiSem.Acquire(ctx, 1) err := this.apiSem.Acquire(ctx, 1)
if err != nil { if err != nil {
@ -75,6 +103,64 @@ func (this *Application) apiRequest(ctx context.Context, endpoint string, target
return nil return nil
} }
func (this *Application) branches(ctx context.Context, repo string) ([]Branch, error) {
var branches []Branch
err := this.apiRequest(ctx, `api/v1/repos/`+url.PathEscape(this.cfg.Gitea.Org)+`/`+url.PathEscape(repo)+`/branches`, &branches)
if err != nil {
return nil, err // e.g. ctx closed
}
return branches, nil
}
func (this *Application) commitsPage(ctx context.Context, repo, ref string, page, limit int) ([]CommitListEntry, error) {
var ret []CommitListEntry
err := this.apiRequest(ctx, fmt.Sprintf(`api/v1/repos/%s/%s/commits?page=%d&limit=%d`, url.PathEscape(this.cfg.Gitea.Org), url.PathEscape(repo), page, limit), &ret)
if err != nil {
return nil, err // e.g. ctx closed
}
return ret, nil
}
func (this *Application) commits(ctx context.Context, repo, ref string) ([]CommitListEntry, error) {
var ret []CommitListEntry
nextPage := 1 // Counting starts at 1
for {
page, err := this.commitsPage(ctx, repo, ref, nextPage, 300)
if err != nil {
return nil, err
}
if len(page) == 0 && len(ret) > 0 {
break // Found enough already
}
ret = append(ret, page...)
nextPage += 1
}
if len(ret) == 0 {
return nil, fmt.Errorf("no commits found")
}
return ret, nil
}
func (this *Application) oldestCommit(ctx context.Context, repo, ref string) (CommitListEntry, error) {
cc, err := this.commits(ctx, repo, ref)
if err != nil {
return CommitListEntry{}, err
}
// Take the last listed entry
// TODO maybe need to iterate/sort?
return cc[len(cc)-1], nil
}
// reposPage gets a single page of the list of Git repositories in this organisation. // reposPage gets a single page of the list of Git repositories in this organisation.
func (this *Application) reposPage(ctx context.Context, page, limit int) ([]Repo, error) { func (this *Application) reposPage(ctx context.Context, page, limit int) ([]Repo, error) {
var repos []Repo var repos []Repo