Compare commits
5 Commits
submodulem
...
main
Author | SHA256 | Date | |
---|---|---|---|
168a419bbe | |||
6a71641295 | |||
5addde0a71 | |||
90ea1c9463 | |||
a4fb3e6151 |
@@ -24,11 +24,13 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"log"
|
"log"
|
||||||
|
"net/http"
|
||||||
"net/url"
|
"net/url"
|
||||||
"os"
|
"os"
|
||||||
"path"
|
"path"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"slices"
|
"slices"
|
||||||
|
"strconv"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
transport "github.com/go-openapi/runtime/client"
|
transport "github.com/go-openapi/runtime/client"
|
||||||
@@ -182,7 +184,6 @@ type Gitea interface {
|
|||||||
GiteaCommitStatusGetter
|
GiteaCommitStatusGetter
|
||||||
GiteaCommitStatusSetter
|
GiteaCommitStatusSetter
|
||||||
GiteaSetRepoOptions
|
GiteaSetRepoOptions
|
||||||
GiteaTimelineFetcher
|
|
||||||
|
|
||||||
GetNotifications(Type string, since *time.Time) ([]*models.NotificationThread, error)
|
GetNotifications(Type string, since *time.Time) ([]*models.NotificationThread, error)
|
||||||
GetDoneNotifications(Type string, page int64) ([]*models.NotificationThread, error)
|
GetDoneNotifications(Type string, page int64) ([]*models.NotificationThread, error)
|
||||||
@@ -199,7 +200,32 @@ type Gitea interface {
|
|||||||
GetCurrentUser() (*models.User, error)
|
GetCurrentUser() (*models.User, error)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type GiteaHeaderInterceptor struct {
|
||||||
|
Length int
|
||||||
|
http.RoundTripper
|
||||||
|
}
|
||||||
|
|
||||||
|
func (i *GiteaHeaderInterceptor) RoundTrip(req *http.Request) (*http.Response, error) {
|
||||||
|
resp, err := i.RoundTripper.RoundTrip(req)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
count_header := resp.Header["X-Total-Count"]
|
||||||
|
if len(count_header) == 1 {
|
||||||
|
i.Length, err = strconv.Atoi(resp.Header["X-Total-Count"][0])
|
||||||
|
if err != nil {
|
||||||
|
LogError("Converting X-Total-Count response header error", err)
|
||||||
|
i.Length = -1
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
i.Length = -1
|
||||||
|
}
|
||||||
|
return resp, nil
|
||||||
|
}
|
||||||
|
|
||||||
type GiteaTransport struct {
|
type GiteaTransport struct {
|
||||||
|
headers *GiteaHeaderInterceptor
|
||||||
transport *transport.Runtime
|
transport *transport.Runtime
|
||||||
client *apiclient.GiteaAPI
|
client *apiclient.GiteaAPI
|
||||||
}
|
}
|
||||||
@@ -212,7 +238,9 @@ func AllocateGiteaTransport(giteaUrl string) Gitea {
|
|||||||
log.Panicln("Failed to parse gitea url:", err)
|
log.Panicln("Failed to parse gitea url:", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
r.headers = &GiteaHeaderInterceptor{RoundTripper: http.DefaultTransport}
|
||||||
r.transport = transport.New(url.Host, apiclient.DefaultBasePath, [](string){url.Scheme})
|
r.transport = transport.New(url.Host, apiclient.DefaultBasePath, [](string){url.Scheme})
|
||||||
|
r.transport.Transport = r.headers
|
||||||
r.transport.DefaultAuthentication = transport.BearerToken(giteaToken)
|
r.transport.DefaultAuthentication = transport.BearerToken(giteaToken)
|
||||||
|
|
||||||
r.client = apiclient.New(r.transport, nil)
|
r.client = apiclient.New(r.transport, nil)
|
||||||
@@ -287,10 +315,9 @@ func (gitea *GiteaTransport) ManualMergePR(org, repo string, num int64, commitid
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (gitea *GiteaTransport) GetPullRequests(org, repo string) ([]*models.PullRequest, error) {
|
func (gitea *GiteaTransport) GetPullRequests(org, repo string) ([]*models.PullRequest, error) {
|
||||||
var page, limit int64
|
var page int64
|
||||||
|
|
||||||
prs := make([]*models.PullRequest, 0)
|
prs := make([]*models.PullRequest, 0)
|
||||||
limit = 20
|
|
||||||
state := "open"
|
state := "open"
|
||||||
|
|
||||||
for {
|
for {
|
||||||
@@ -302,16 +329,18 @@ func (gitea *GiteaTransport) GetPullRequests(org, repo string) ([]*models.PullRe
|
|||||||
WithOwner(org).
|
WithOwner(org).
|
||||||
WithRepo(repo).
|
WithRepo(repo).
|
||||||
WithState(&state).
|
WithState(&state).
|
||||||
WithPage(&page).
|
WithPage(&page),
|
||||||
WithLimit(&limit),
|
|
||||||
gitea.transport.DefaultAuthentication)
|
gitea.transport.DefaultAuthentication)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("cannot fetch PR list for %s / %s : %w", org, repo, err)
|
return nil, fmt.Errorf("cannot fetch PR list for %s / %s : %w", org, repo, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if len(req.Payload) == 0 {
|
||||||
|
break
|
||||||
|
}
|
||||||
prs = slices.Concat(prs, req.Payload)
|
prs = slices.Concat(prs, req.Payload)
|
||||||
if len(req.Payload) < int(limit) {
|
if len(prs) >= gitea.headers.Length {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -320,21 +349,23 @@ func (gitea *GiteaTransport) GetPullRequests(org, repo string) ([]*models.PullRe
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (gitea *GiteaTransport) GetCommitStatus(org, repo, hash string) ([]*models.CommitStatus, error) {
|
func (gitea *GiteaTransport) GetCommitStatus(org, repo, hash string) ([]*models.CommitStatus, error) {
|
||||||
page := int64(1)
|
var page int64
|
||||||
limit := int64(10)
|
|
||||||
var res []*models.CommitStatus
|
var res []*models.CommitStatus
|
||||||
|
|
||||||
for {
|
for {
|
||||||
|
page++
|
||||||
r, err := gitea.client.Repository.RepoListStatuses(
|
r, err := gitea.client.Repository.RepoListStatuses(
|
||||||
repository.NewRepoListStatusesParams().WithDefaults().WithOwner(org).WithRepo(repo).WithSha(hash).WithPage(&page).WithLimit(&limit),
|
repository.NewRepoListStatusesParams().WithDefaults().WithOwner(org).WithRepo(repo).WithSha(hash).WithPage(&page),
|
||||||
gitea.transport.DefaultAuthentication)
|
gitea.transport.DefaultAuthentication)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return res, err
|
return res, err
|
||||||
}
|
}
|
||||||
|
if len(r.Payload) == 0 {
|
||||||
|
break
|
||||||
|
}
|
||||||
res = append(res, r.Payload...)
|
res = append(res, r.Payload...)
|
||||||
if len(r.Payload) < int(limit) {
|
if len(res) >= gitea.headers.Length {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -377,19 +408,18 @@ func (gitea *GiteaTransport) GetRepository(org, pkg string) (*models.Repository,
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (gitea *GiteaTransport) GetPullRequestReviews(org, project string, PRnum int64) ([]*models.PullReview, error) {
|
func (gitea *GiteaTransport) GetPullRequestReviews(org, project string, PRnum int64) ([]*models.PullReview, error) {
|
||||||
limit := int64(20)
|
|
||||||
var page int64
|
var page int64
|
||||||
var allReviews []*models.PullReview
|
var allReviews []*models.PullReview
|
||||||
|
|
||||||
for {
|
for {
|
||||||
|
page++
|
||||||
reviews, err := gitea.client.Repository.RepoListPullReviews(
|
reviews, err := gitea.client.Repository.RepoListPullReviews(
|
||||||
repository.NewRepoListPullReviewsParams().
|
repository.NewRepoListPullReviewsParams().
|
||||||
WithDefaults().
|
WithDefaults().
|
||||||
WithOwner(org).
|
WithOwner(org).
|
||||||
WithRepo(project).
|
WithRepo(project).
|
||||||
WithIndex(PRnum).
|
WithIndex(PRnum).
|
||||||
WithPage(&page).
|
WithPage(&page),
|
||||||
WithLimit(&limit),
|
|
||||||
gitea.transport.DefaultAuthentication,
|
gitea.transport.DefaultAuthentication,
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -397,11 +427,13 @@ func (gitea *GiteaTransport) GetPullRequestReviews(org, project string, PRnum in
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
allReviews = slices.Concat(allReviews, reviews.Payload)
|
if len(reviews.Payload) == 0 {
|
||||||
if len(reviews.Payload) < int(limit) {
|
break
|
||||||
|
}
|
||||||
|
allReviews = slices.Concat(allReviews, reviews.Payload)
|
||||||
|
if len(allReviews) >= gitea.headers.Length {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
page++
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return allReviews, nil
|
return allReviews, nil
|
||||||
@@ -469,7 +501,6 @@ const (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func (gitea *GiteaTransport) GetNotifications(Type string, since *time.Time) ([]*models.NotificationThread, error) {
|
func (gitea *GiteaTransport) GetNotifications(Type string, since *time.Time) ([]*models.NotificationThread, error) {
|
||||||
bigLimit := int64(20)
|
|
||||||
ret := make([]*models.NotificationThread, 0, 100)
|
ret := make([]*models.NotificationThread, 0, 100)
|
||||||
|
|
||||||
for page := int64(1); ; page++ {
|
for page := int64(1); ; page++ {
|
||||||
@@ -477,7 +508,6 @@ func (gitea *GiteaTransport) GetNotifications(Type string, since *time.Time) ([]
|
|||||||
WithDefaults().
|
WithDefaults().
|
||||||
WithSubjectType([]string{Type}).
|
WithSubjectType([]string{Type}).
|
||||||
WithStatusTypes([]string{"unread"}).
|
WithStatusTypes([]string{"unread"}).
|
||||||
WithLimit(&bigLimit).
|
|
||||||
WithPage(&page)
|
WithPage(&page)
|
||||||
|
|
||||||
if since != nil {
|
if since != nil {
|
||||||
@@ -490,8 +520,11 @@ func (gitea *GiteaTransport) GetNotifications(Type string, since *time.Time) ([]
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if len(list.Payload) == 0 {
|
||||||
|
break
|
||||||
|
}
|
||||||
ret = slices.Concat(ret, list.Payload)
|
ret = slices.Concat(ret, list.Payload)
|
||||||
if len(list.Payload) < int(bigLimit) {
|
if len(ret) >= gitea.headers.Length {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -500,7 +533,6 @@ func (gitea *GiteaTransport) GetNotifications(Type string, since *time.Time) ([]
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (gitea *GiteaTransport) GetDoneNotifications(Type string, page int64) ([]*models.NotificationThread, error) {
|
func (gitea *GiteaTransport) GetDoneNotifications(Type string, page int64) ([]*models.NotificationThread, error) {
|
||||||
limit := int64(20)
|
|
||||||
t := true
|
t := true
|
||||||
|
|
||||||
if page <= 0 {
|
if page <= 0 {
|
||||||
@@ -511,7 +543,6 @@ func (gitea *GiteaTransport) GetDoneNotifications(Type string, page int64) ([]*m
|
|||||||
WithAll(&t).
|
WithAll(&t).
|
||||||
WithSubjectType([]string{Type}).
|
WithSubjectType([]string{Type}).
|
||||||
WithStatusTypes([]string{"read"}).
|
WithStatusTypes([]string{"read"}).
|
||||||
WithLimit(&limit).
|
|
||||||
WithPage(&page),
|
WithPage(&page),
|
||||||
gitea.transport.DefaultAuthentication)
|
gitea.transport.DefaultAuthentication)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -564,9 +595,12 @@ func (gitea *GiteaTransport) GetOrganizationRepositories(orgName string) ([]*mod
|
|||||||
if len(ret.Payload) == 0 {
|
if len(ret.Payload) == 0 {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
|
||||||
repos = append(repos, ret.Payload...)
|
repos = append(repos, ret.Payload...)
|
||||||
page++
|
page++
|
||||||
|
|
||||||
|
if len(repos) >= gitea.headers.Length {
|
||||||
|
break
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return repos, nil
|
return repos, nil
|
||||||
@@ -780,15 +814,18 @@ func (gitea *GiteaTransport) GetTimeline(org, repo string, idx int64) ([]*models
|
|||||||
|
|
||||||
resCount = len(res.Payload)
|
resCount = len(res.Payload)
|
||||||
LogDebug("page:", page, "len:", resCount)
|
LogDebug("page:", page, "len:", resCount)
|
||||||
|
if resCount == 0 {
|
||||||
|
break
|
||||||
|
}
|
||||||
page++
|
page++
|
||||||
|
|
||||||
for _, d := range res.Payload {
|
retData = append(retData, res.Payload...)
|
||||||
if d != nil {
|
if len(retData) >= gitea.headers.Length {
|
||||||
retData = append(retData, d)
|
break
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
LogDebug("total results:", len(retData))
|
LogDebug("total results:", len(retData))
|
||||||
|
retData = slices.DeleteFunc(retData, func(a *models.TimelineComment) bool { return a == nil })
|
||||||
slices.SortFunc(retData, func(a, b *models.TimelineComment) int {
|
slices.SortFunc(retData, func(a, b *models.TimelineComment) int {
|
||||||
return time.Time(b.Created).Compare(time.Time(a.Created))
|
return time.Time(b.Created).Compare(time.Time(a.Created))
|
||||||
})
|
})
|
||||||
|
@@ -20,6 +20,7 @@ package main
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
|
"encoding/json"
|
||||||
"flag"
|
"flag"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
@@ -268,6 +269,32 @@ func main() {
|
|||||||
|
|
||||||
res.Write(BuildStatusSvg(nil, &common.PackageBuildStatus{Package: pkg, Code: "unknown"}))
|
res.Write(BuildStatusSvg(nil, &common.PackageBuildStatus{Package: pkg, Code: "unknown"}))
|
||||||
})
|
})
|
||||||
|
http.HandleFunc("GET /search", func(res http.ResponseWriter, req *http.Request) {
|
||||||
|
common.LogInfo("GET /serach?" + req.URL.RawQuery)
|
||||||
|
queries := req.URL.Query()
|
||||||
|
if !queries.Has("q") {
|
||||||
|
res.WriteHeader(400)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
names := queries["q"]
|
||||||
|
if len(names) < 1 || len(names) > 10 {
|
||||||
|
res.WriteHeader(400)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
packages := FindPackages(names)
|
||||||
|
data, err := json.MarshalIndent(packages, "", " ")
|
||||||
|
if err != nil {
|
||||||
|
res.WriteHeader(500)
|
||||||
|
common.LogError("Error in marshalling data.", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
res.Write(data)
|
||||||
|
res.WriteHeader(200)
|
||||||
|
})
|
||||||
|
|
||||||
http.HandleFunc("GET /buildlog/{Project}/{Package}/{Repository}/{Arch}", func(res http.ResponseWriter, req *http.Request) {
|
http.HandleFunc("GET /buildlog/{Project}/{Package}/{Repository}/{Arch}", func(res http.ResponseWriter, req *http.Request) {
|
||||||
prj := req.PathValue("Project")
|
prj := req.PathValue("Project")
|
||||||
pkg := req.PathValue("Package")
|
pkg := req.PathValue("Package")
|
||||||
|
@@ -110,6 +110,33 @@ func FindRepoResults(project, repo string) []*common.BuildResult {
|
|||||||
return ret
|
return ret
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func FindPackages(search_terms []string) []string {
|
||||||
|
RepoStatusLock.RLock()
|
||||||
|
defer RepoStatusLock.RUnlock()
|
||||||
|
|
||||||
|
data := make([]string, 0, 100)
|
||||||
|
for _, repo := range RepoStatus {
|
||||||
|
for _, status := range repo.Status {
|
||||||
|
pkg := status.Package
|
||||||
|
match := true
|
||||||
|
for _, term := range search_terms {
|
||||||
|
match = match && strings.Contains(pkg, term)
|
||||||
|
}
|
||||||
|
|
||||||
|
if match {
|
||||||
|
entry := repo.Project + "/" + repo.Status[0].Package
|
||||||
|
if idx, found := slices.BinarySearch(data, entry); !found {
|
||||||
|
data = slices.Insert(data, idx, entry)
|
||||||
|
if len(data) >= 100 {
|
||||||
|
return data
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return data
|
||||||
|
}
|
||||||
|
|
||||||
func FindAndUpdateProjectResults(project string) []*common.BuildResult {
|
func FindAndUpdateProjectResults(project string) []*common.BuildResult {
|
||||||
res := FindProjectResults(project)
|
res := FindProjectResults(project)
|
||||||
wg := &sync.WaitGroup{}
|
wg := &sync.WaitGroup{}
|
||||||
|
@@ -317,9 +317,14 @@ func (pr *PRProcessor) UpdatePrjGitPR(prset *common.PRSet) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
PrjGitTitle, PrjGitBody := PrjGitDescription(prset)
|
PrjGitTitle, PrjGitBody := PrjGitDescription(prset)
|
||||||
if PrjGitPR.PR.Title != PrjGitTitle || PrjGitPR.PR.Body != PrjGitBody {
|
if PrjGitPR.PR.User.UserName == CurrentUser.UserName {
|
||||||
common.LogDebug("New title:", PrjGitTitle)
|
if PrjGitPR.PR.Title != PrjGitTitle || PrjGitPR.PR.Body != PrjGitBody {
|
||||||
common.LogDebug(PrjGitBody)
|
common.LogDebug("New title:", PrjGitTitle)
|
||||||
|
common.LogDebug(PrjGitBody)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// TODO: find our first comment in timeline
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if !common.IsDryRun {
|
if !common.IsDryRun {
|
||||||
|
Reference in New Issue
Block a user