1 Commits

Author SHA256 Message Date
fa61af0db6 Implement detection for local repositories
Repositories which build against another repo in the same project need
to do so also in the forked project. This is eg for consuming rpms
from one repo in an image build from same project.
2025-05-05 11:26:07 +02:00
776 changed files with 2687 additions and 162610 deletions

1
.gitignore vendored
View File

@@ -3,4 +3,3 @@ node_modules
*.obscpio *.obscpio
autogits-tmp.tar.zst autogits-tmp.tar.zst
*.osc *.osc
*.conf

View File

@@ -22,15 +22,4 @@ Bugs
Report bugs to issue tracker at https://src.opensuse.org/adamm/autogits Report bugs to issue tracker at https://src.opensuse.org/adamm/autogits
Build Status
------------
main branch build status:
![Devel Build Status](https://br.opensuse.org/status/home:adamm:autogits/autogits)
Devel project build status:
![devel:Factory:git-workflow](https://br.opensuse.org/status/devel:Factory:git-workflow/autogits)

View File

@@ -22,19 +22,16 @@ Release: 0
Summary: GitWorkflow utilities Summary: GitWorkflow utilities
License: GPL-2.0-or-later License: GPL-2.0-or-later
URL: https://src.opensuse.org/adamm/autogits URL: https://src.opensuse.org/adamm/autogits
Source1: vendor.tar.zst
BuildRequires: golang-packaging
BuildRequires: systemd-rpm-macros BuildRequires: systemd-rpm-macros
BuildRequires: go BuildRequires: zstd
%{?systemd_ordering} %{?systemd_ordering}
%description %description
Git Workflow tooling and utilities enabling automated handing of OBS projects Git Workflow tooling and utilities enabling automated handing of OBS projects
as git repositories as git repositories
%package -n hujson
Summary: HuJSON to JSON parser
%description -n hujson
HuJSON to JSON parser, using stdin -> stdout pipe
%package -n gitea-events-rabbitmq-publisher %package -n gitea-events-rabbitmq-publisher
Summary: Publishes Gitea webhook data via RabbitMQ Summary: Publishes Gitea webhook data via RabbitMQ
@@ -52,6 +49,13 @@ Summary: Common documentation files
Common documentation files Common documentation files
%package -n devel-importer
Summary: Imports devel projects from obs to git
%description -n devel-importer
Command-line tool to import devel projects from obs to git
%package -n group-review %package -n group-review
Summary: Reviews of groups defined in ProjectGit Summary: Reviews of groups defined in ProjectGit
@@ -91,40 +95,47 @@ Keeps ProjectGit PR in-sync with a PackageGit PR
%prep %prep
cp -r /home/abuild/rpmbuild/SOURCES/* ./ cp -r /home/abuild/rpmbuild/SOURCES/* ./
tar x --zstd -f %{SOURCE1}
%build %build
go build \ go build \
-C hujson \ -C gitea-events-rabbitmq-publisher \
-mod=vendor \
-buildmode=pie -buildmode=pie
go build \ go build \
-C gitea-events-rabbitmq-publisher \ -C devel-importer \
-mod=vendor \
-buildmode=pie -buildmode=pie
go build \ go build \
-C group-review \ -C group-review \
-mod=vendor \
-buildmode=pie -buildmode=pie
go build \ go build \
-C obs-staging-bot \ -C obs-staging-bot \
-mod=vendor \
-buildmode=pie -buildmode=pie
go build \ go build \
-C obs-status-service \ -C obs-status-service \
-mod=vendor \
-buildmode=pie -buildmode=pie
go build \ #go build \
-C workflow-direct \ # -C workflow-direct \
-buildmode=pie # -mod=vendor \
go build \ # -buildmode=pie
-C workflow-pr \ #go build \
-buildmode=pie # -C workflow-pr \
# -mod=vendor \
# -buildmode=pie
%install %install
install -D -m0755 gitea-events-rabbitmq-publisher/gitea-events-rabbitmq-publisher %{buildroot}%{_bindir}/gitea-events-rabbitmq-publisher install -D -m0755 gitea-events-rabbitmq-publisher/gitea-events-rabbitmq-publisher %{buildroot}%{_bindir}/gitea-events-rabbitmq-publisher
install -D -m0644 systemd/gitea-events-rabbitmq-publisher.service %{buildroot}%{_unitdir}/gitea-events-rabbitmq-publisher.service install -D -m0644 systemd/gitea-events-rabbitmq-publisher.service %{buildroot}%{_unitdir}/gitea-events-rabbitmq-publisher.service
install -D -m0755 devel-importer/devel-importer %{buildroot}%{_bindir}/devel-importer
install -D -m0755 group-review/group-review %{buildroot}%{_bindir}/group-review install -D -m0755 group-review/group-review %{buildroot}%{_bindir}/group-review
install -D -m0755 obs-staging-bot/obs-staging-bot %{buildroot}%{_bindir}/obs-staging-bot install -D -m0755 obs-staging-bot/obs-staging-bot %{buildroot}%{_bindir}/obs-staging-bot
install -D -m0644 systemd/obs-staging-bot.service %{buildroot}%{_unitdir}/obs-staging-bot.service
install -D -m0755 obs-status-service/obs-status-service %{buildroot}%{_bindir}/obs-status-service install -D -m0755 obs-status-service/obs-status-service %{buildroot}%{_bindir}/obs-status-service
install -D -m0755 workflow-direct/workflow-direct %{buildroot}%{_bindir}/workflow-direct #install -D -m0755 workflow-direct/workflow-direct %{buildroot}%{_bindir}/workflow-direct
install -D -m0755 workflow-pr/workflow-pr %{buildroot}%{_bindir}/workflow-pr #install -D -m0755 workflow-pr/workflow-pr %{buildroot}%{_bindir}/workflow-pr
install -D -m0755 hujson/hujson %{buildroot}%{_bindir}/hujson
%pre -n gitea-events-rabbitmq-publisher %pre -n gitea-events-rabbitmq-publisher
%service_add_pre gitea-events-rabbitmq-publisher.service %service_add_pre gitea-events-rabbitmq-publisher.service
@@ -138,18 +149,6 @@ install -D -m0755 hujson/hujson
%postun -n gitea-events-rabbitmq-publisher %postun -n gitea-events-rabbitmq-publisher
%service_del_postun gitea-events-rabbitmq-publisher.service %service_del_postun gitea-events-rabbitmq-publisher.service
%pre -n obs-staging-bot
%service_add_pre obs-staging-bot.service
%post -n obs-staging-bot
%service_add_post obs-staging-bot.service
%preun -n obs-staging-bot
%service_del_preun obs-staging-bot.service
%postun -n obs-staging-bot
%service_del_postun obs-staging-bot.service
%files -n gitea-events-rabbitmq-publisher %files -n gitea-events-rabbitmq-publisher
%license COPYING %license COPYING
%doc gitea-events-rabbitmq-publisher/README.md %doc gitea-events-rabbitmq-publisher/README.md
@@ -161,20 +160,20 @@ install -D -m0755 hujson/hujson
%doc doc/README.md %doc doc/README.md
%doc doc/workflows.md %doc doc/workflows.md
%files -n devel-importer
%license COPYING
%doc devel-importer/README.md
%{_bindir}/devel-importer
%files -n group-review %files -n group-review
%license COPYING %license COPYING
%doc group-review/README.md %doc group-review/README.md
%{_bindir}/group-review %{_bindir}/group-review
%files -n hujson
%license COPYING
%{_bindir}/hujson
%files -n obs-staging-bot %files -n obs-staging-bot
%license COPYING %license COPYING
%doc obs-staging-bot/README.md %doc obs-staging-bot/README.md
%{_bindir}/obs-staging-bot %{_bindir}/obs-staging-bot
%{_unitdir}/obs-staging-bot.service
%files -n obs-status-service %files -n obs-status-service
%license COPYING %license COPYING
@@ -184,10 +183,10 @@ install -D -m0755 hujson/hujson
%files -n workflow-direct %files -n workflow-direct
%license COPYING %license COPYING
%doc workflow-direct/README.md %doc workflow-direct/README.md
%{_bindir}/workflow-direct #%{_bindir}/workflow-direct
%files -n workflow-pr %files -n workflow-pr
%license COPYING %license COPYING
%doc workflow-pr/README.md %doc workflow-pr/README.md
%{_bindir}/workflow-pr #%{_bindir}/workflow-pr

View File

@@ -1,15 +1,13 @@
all: build all: build
api.json:: api.json:
curl -o api.json https://src.opensuse.org/swagger.v1.json curl -o api.json https://src.opensuse.org/swagger.v1.json
gitea-generated/client/gitea_api_client.go: api.json gitea-generated/client/gitea_api_client.go:: api.json
[ -d gitea-generated ] || mkdir gitea-generated [ -d gitea-generated ] || mkdir gitea-generated
podman run --rm -v $$(pwd)/..:/api ghcr.io/go-swagger/go-swagger generate client -f /api/common/api.json -t /api/common/gitea-generated podman run --rm -v $$(pwd):/api ghcr.io/go-swagger/go-swagger generate client -f /api/api.json -t /api/gitea-generated
swagger: gitea-generated/client/gitea_api_client.go api: gitea-generated/client/gitea_api_client.go mock_gitea_utils.go
api:
go generate go generate
build: api build: api

File diff suppressed because it is too large Load Diff

View File

@@ -11,14 +11,14 @@ import (
"strings" "strings"
) )
const PrPattern = "PR: %s/%s!%d" const PrPattern = "PR: %s/%s#%d"
type BasicPR struct { type BasicPR struct {
Org, Repo string Org, Repo string
Num int64 Num int64
} }
var validOrgAndRepoRx *regexp.Regexp = regexp.MustCompile("^[A-Za-z0-9_\\.-]+$") var validOrgAndRepoRx *regexp.Regexp = regexp.MustCompile("^[A-Za-z0-9_-]+$")
func parsePrLine(line string) (BasicPR, error) { func parsePrLine(line string) (BasicPR, error) {
var ret BasicPR var ret BasicPR
@@ -36,14 +36,10 @@ func parsePrLine(line string) (BasicPR, error) {
return ret, errors.New("missing / separator") return ret, errors.New("missing / separator")
} }
repo := strings.SplitN(org[1], "!", 2) repo := strings.SplitN(org[1], "#", 2)
ret.Repo = repo[0] ret.Repo = repo[0]
if len(repo) != 2 { if len(repo) != 2 {
repo = strings.SplitN(org[1], "#", 2) return ret, errors.New("Missing # separator")
ret.Repo = repo[0]
}
if len(repo) != 2 {
return ret, errors.New("Missing ! or # separator")
} }
// Gitea requires that each org and repo be [A-Za-z0-9_-]+ // Gitea requires that each org and repo be [A-Za-z0-9_-]+

View File

@@ -34,7 +34,7 @@ func TestAssociatedPRScanner(t *testing.T) {
}, },
{ {
"Multiple PRs", "Multiple PRs",
"Some header of the issue\n\nFollowed by some description\nPR: test/foo#4\n\nPR: test/goo!5\n", "Some header of the issue\n\nFollowed by some description\nPR: test/foo#4\n\nPR: test/goo#5\n",
[]common.BasicPR{ []common.BasicPR{
{Org: "test", Repo: "foo", Num: 4}, {Org: "test", Repo: "foo", Num: 4},
{Org: "test", Repo: "goo", Num: 5}, {Org: "test", Repo: "goo", Num: 5},
@@ -107,7 +107,7 @@ func TestAppendingPRsToDescription(t *testing.T) {
[]common.BasicPR{ []common.BasicPR{
{Org: "a", Repo: "b", Num: 100}, {Org: "a", Repo: "b", Num: 100},
}, },
"something\n\nPR: a/b!100", "something\n\nPR: a/b#100",
}, },
{ {
"Append multiple PR to end of description", "Append multiple PR to end of description",
@@ -119,7 +119,7 @@ func TestAppendingPRsToDescription(t *testing.T) {
{Org: "b", Repo: "b", Num: 100}, {Org: "b", Repo: "b", Num: 100},
{Org: "c", Repo: "b", Num: 100}, {Org: "c", Repo: "b", Num: 100},
}, },
"something\n\nPR: a1/b!100\nPR: a1/c!100\nPR: a1/c!101\nPR: b/b!100\nPR: c/b!100", "something\n\nPR: a1/b#100\nPR: a1/c#100\nPR: a1/c#101\nPR: b/b#100\nPR: c/b#100",
}, },
{ {
"Append multiple sorted PR to end of description and remove dups", "Append multiple sorted PR to end of description and remove dups",
@@ -133,7 +133,7 @@ func TestAppendingPRsToDescription(t *testing.T) {
{Org: "a1", Repo: "c", Num: 101}, {Org: "a1", Repo: "c", Num: 101},
{Org: "a1", Repo: "b", Num: 100}, {Org: "a1", Repo: "b", Num: 100},
}, },
"something\n\nPR: a1/b!100\nPR: a1/c!100\nPR: a1/c!101\nPR: b/b!100\nPR: c/b!100", "something\n\nPR: a1/b#100\nPR: a1/c#100\nPR: a1/c#101\nPR: b/b#100\nPR: c/b#100",
}, },
} }

View File

@@ -43,7 +43,6 @@ type ConfigFile struct {
type ReviewGroup struct { type ReviewGroup struct {
Name string Name string
Silent bool // will not request reviews from group members
Reviewers []string Reviewers []string
} }
@@ -58,13 +57,7 @@ type AutogitConfig struct {
GitProjectName string // Organization/GitProjectName.git is PrjGit GitProjectName string // Organization/GitProjectName.git is PrjGit
Branch string // branch name of PkgGit that aligns with PrjGit submodules Branch string // branch name of PkgGit that aligns with PrjGit submodules
Reviewers []string // only used by `pr` workflow Reviewers []string // only used by `pr` workflow
ReviewGroups []*ReviewGroup ReviewGroups []ReviewGroup
Committers []string // group in addition to Reviewers and Maintainers that can order the bot around, mostly as helper for factory-maintainers
Subdirs []string // list of directories to sort submodules into. Needed b/c _manifest cannot list non-existent directories
NoProjectGitPR bool // do not automatically create project git PRs, just assign reviewers and assume somethign else creates the ProjectGit PR
ManualMergeOnly bool // only merge with "Merge OK" comment by Project Maintainers and/or Package Maintainers and/or reviewers
ManualMergeProject bool // require merge of ProjectGit PRs with "Merge OK" by ProjectMaintainers and/or reviewers
} }
type AutogitConfigs []*AutogitConfig type AutogitConfigs []*AutogitConfig
@@ -102,7 +95,7 @@ type GiteaFileContentAndRepoFetcher interface {
GiteaRepoFetcher GiteaRepoFetcher
} }
func UnmarshalWorkflowConfig(data []byte) (*AutogitConfig, error) { func PartiallyParseWorkflowConfig(data []byte) (*AutogitConfig, error) {
var config AutogitConfig var config AutogitConfig
data, err := hujson.Standardize(data) data, err := hujson.Standardize(data)
if err != nil { if err != nil {
@@ -137,7 +130,7 @@ func ReadWorkflowConfig(gitea GiteaFileContentAndRepoFetcher, git_project string
return nil, fmt.Errorf("Error fetching 'workflow.config' for %s/%s#%s: %w", a[0], prjGitRepo, branch, err) return nil, fmt.Errorf("Error fetching 'workflow.config' for %s/%s#%s: %w", a[0], prjGitRepo, branch, err)
} }
config, err := UnmarshalWorkflowConfig(data) config, err := PartiallyParseWorkflowConfig(data)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@@ -196,19 +189,10 @@ func (config *AutogitConfig) GetReviewGroupMembers(reviewer string) ([]string, e
return nil, errors.New("User " + reviewer + " not found as group reviewer for " + config.GitProjectName) return nil, errors.New("User " + reviewer + " not found as group reviewer for " + config.GitProjectName)
} }
func (config *AutogitConfig) GetReviewGroup(reviewer string) (*ReviewGroup, error) {
for _, g := range config.ReviewGroups {
if g.Name == reviewer {
return g, nil
}
}
return nil, errors.New("User " + reviewer + " not found as group reviewer for " + config.GitProjectName)
}
func (config *AutogitConfig) GetPrjGit() (string, string, string) { func (config *AutogitConfig) GetPrjGit() (string, string, string) {
org := config.Organization org := config.Organization
repo := DefaultGitPrj repo := DefaultGitPrj
branch := "" branch := "master"
a := strings.Split(config.GitProjectName, "/") a := strings.Split(config.GitProjectName, "/")
if len(a[0]) > 0 { if len(a[0]) > 0 {
@@ -232,9 +216,6 @@ func (config *AutogitConfig) GetPrjGit() (string, string, string) {
} }
} }
if len(branch) == 0 {
panic("branch for project is undefined. Should not happend." + org + "/" + repo)
}
return org, repo, branch return org, repo, branch
} }
@@ -243,9 +224,8 @@ func (config *AutogitConfig) GetRemoteBranch() string {
} }
type StagingConfig struct { type StagingConfig struct {
ObsProject string ObsProject string
RebuildAll bool RebuildAll bool
CleanupDelay int // cleanup delay, in hours, for unmerged closed PRs (def: 48)
// if set, then only use pull request numbers as unique identifiers // if set, then only use pull request numbers as unique identifiers
StagingProject string StagingProject string
@@ -258,7 +238,6 @@ func ParseStagingConfig(data []byte) (*StagingConfig, error) {
if err != nil { if err != nil {
return nil, err return nil, err
} }
staging.CleanupDelay = 48
if err := json.Unmarshal(data, &staging); err != nil { if err := json.Unmarshal(data, &staging); err != nil {
return nil, err return nil, err
} }

View File

@@ -10,62 +10,6 @@ import (
mock_common "src.opensuse.org/autogits/common/mock" mock_common "src.opensuse.org/autogits/common/mock"
) )
func TestProjectConfigMatcher(t *testing.T) {
configs := common.AutogitConfigs{
{
Organization: "test",
GitProjectName: "test/prjgit#main",
},
{
Organization: "test",
Branch: "main",
GitProjectName: "test/prjgit#main",
},
}
tests := []struct {
name string
org string
repo string
branch string
config int
}{
{
name: "invalid match",
org: "foo",
repo: "bar",
config: -1,
},
{
name: "default branch",
org: "test",
repo: "foo",
branch: "",
config: 0,
},
{
name: "main branch",
org: "test",
repo: "foo",
branch: "main",
config: 1,
},
}
for _, test := range tests {
t.Run(test.name, func(t *testing.T) {
c := configs.GetPrjGitConfig(test.org, test.repo, test.branch)
if test.config < 0 {
if c != nil {
t.Fatal("Expected nil. Got:", *c)
}
} else if config := configs[test.config]; c != config {
t.Fatal("Expected", *config, "got", *c)
}
})
}
}
func TestConfigWorkflowParser(t *testing.T) { func TestConfigWorkflowParser(t *testing.T) {
tests := []struct { tests := []struct {
name string name string
@@ -97,19 +41,14 @@ func TestConfigWorkflowParser(t *testing.T) {
gitea.EXPECT().GetRepositoryFileContent("foo", "bar", "", "workflow.config").Return([]byte(test.config_json), "abc", nil) gitea.EXPECT().GetRepositoryFileContent("foo", "bar", "", "workflow.config").Return([]byte(test.config_json), "abc", nil)
gitea.EXPECT().GetRepository("foo", "bar").Return(&test.repo, nil) gitea.EXPECT().GetRepository("foo", "bar").Return(&test.repo, nil)
config, err := common.ReadWorkflowConfig(gitea, "foo/bar") _, err := common.ReadWorkflowConfig(gitea, "foo/bar")
if err != nil { if err != nil {
t.Fatal(err) t.Fatal(err)
} }
if config.ManualMergeOnly != false {
t.Fatal("This should be false")
}
}) })
} }
} }
// FIXME: should test ReadWorkflowConfig as it will always set prjgit completely
func TestProjectGitParser(t *testing.T) { func TestProjectGitParser(t *testing.T) {
tests := []struct { tests := []struct {
name string name string
@@ -120,21 +59,20 @@ func TestProjectGitParser(t *testing.T) {
}{ }{
{ {
name: "repo only", name: "repo only",
prjgit: "repo.git#master", prjgit: "repo.git",
org: "org", org: "org",
branch: "br", branch: "br",
res: [3]string{"org", "repo.git", "master"}, res: [3]string{"org", "repo.git", "master"},
}, },
{ {
name: "default", name: "default",
org: "org", org: "org",
prjgit: "org/_ObsPrj#master", res: [3]string{"org", common.DefaultGitPrj, "master"},
res: [3]string{"org", common.DefaultGitPrj, "master"},
}, },
{ {
name: "repo with branch", name: "repo with branch",
org: "org2", org: "org2",
prjgit: "org2/repo.git#somebranch", prjgit: "repo.git#somebranch",
res: [3]string{"org2", "repo.git", "somebranch"}, res: [3]string{"org2", "repo.git", "somebranch"},
}, },
{ {
@@ -144,32 +82,32 @@ func TestProjectGitParser(t *testing.T) {
res: [3]string{"oorg", "foo.bar", "point"}, res: [3]string{"oorg", "foo.bar", "point"},
}, },
{ {
name: "whitespace shouldn't matter", name: "whitespace shouldn't matter",
prjgit: " oorg / \nfoo.bar\t # point ", prjgit: " oorg / \nfoo.bar\t # point ",
res: [3]string{"oorg", "foo.bar", "point"}, res: [3]string{"oorg", "foo.bar", "point"},
}, },
{ {
name: "repo org and empty branch", name: "repo org and empty branch",
org: "org3", org: "org3",
prjgit: "oorg/foo.bar#master", prjgit: "oorg/foo.bar#",
res: [3]string{"oorg", "foo.bar", "master"}, res: [3]string{"oorg", "foo.bar", "master"},
}, },
{ {
name: "only branch defined", name: "only branch defined",
org: "org3", org: "org3",
prjgit: "org3/_ObsPrj#mybranch", prjgit: "#mybranch",
res: [3]string{"org3", "_ObsPrj", "mybranch"}, res: [3]string{"org3", "_ObsPrj", "mybranch"},
}, },
{ {
name: "only org and branch defined", name: "only org and branch defined",
org: "org3", org: "org3",
prjgit: "org1/_ObsPrj#mybranch", prjgit: "org1/#mybranch",
res: [3]string{"org1", "_ObsPrj", "mybranch"}, res: [3]string{"org1", "_ObsPrj", "mybranch"},
}, },
{ {
name: "empty org and repo", name: "empty org and repo",
org: "org3", org: "org3",
prjgit: "org3/repo#master", prjgit: "/repo#",
res: [3]string{"org3", "repo", "master"}, res: [3]string{"org3", "repo", "master"},
}, },
} }

View File

@@ -33,6 +33,3 @@ const (
TopicApp = "src" TopicApp = "src"
) )
// when set, pushing to remote does not happen, and other remote side-effects should also not happen
var IsDryRun bool

View File

@@ -1,296 +0,0 @@
package common
import (
"errors"
"fmt"
"io"
)
const (
GitStatus_Untracked = 0
GitStatus_Modified = 1
GitStatus_Ignored = 2
GitStatus_Unmerged = 3 // States[0..3] -- Stage1, Stage2, Stage3 of merge objects
GitStatus_Renamed = 4 // orig name in States[0]
)
type GitStatusData struct {
Path string
Status int
States [3]string
/*
<sub> A 4 character field describing the submodule state.
"N..." when the entry is not a submodule.
"S<c><m><u>" when the entry is a submodule.
<c> is "C" if the commit changed; otherwise ".".
<m> is "M" if it has tracked changes; otherwise ".".
<u> is "U" if there are untracked changes; otherwise ".".
*/
SubmoduleChanges string
}
func parseGit_HexString(data io.ByteReader) (string, error) {
str := make([]byte, 0, 32)
for {
c, err := data.ReadByte()
if err != nil {
return "", err
}
switch {
case c == 0 || c == ' ':
return string(str), nil
case c >= 'a' && c <= 'f':
case c >= 'A' && c <= 'F':
case c >= '0' && c <= '9':
default:
return "", errors.New("Invalid character in hex string:" + string(c))
}
str = append(str, c)
}
}
func parseGit_String(data io.ByteReader) (string, error) {
str := make([]byte, 0, 100)
for {
c, err := data.ReadByte()
if err != nil {
return "", errors.New("Unexpected EOF. Expected NUL string term")
}
if c == 0 || c == ' ' {
return string(str), nil
}
str = append(str, c)
}
}
func parseGit_StringWithSpace(data io.ByteReader) (string, error) {
str := make([]byte, 0, 100)
for {
c, err := data.ReadByte()
if err != nil {
return "", errors.New("Unexpected EOF. Expected NUL string term")
}
if c == 0 {
return string(str), nil
}
str = append(str, c)
}
}
func skipGitStatusEntry(data io.ByteReader, skipSpaceLen int) error {
for skipSpaceLen > 0 {
c, err := data.ReadByte()
if err != nil {
return err
}
if c == ' ' {
skipSpaceLen--
}
}
return nil
}
func parseSingleStatusEntry(data io.ByteReader) (*GitStatusData, error) {
ret := GitStatusData{}
statusType, err := data.ReadByte()
if err != nil {
return nil, nil
}
switch statusType {
case '1':
var err error
if err = skipGitStatusEntry(data, 8); err != nil {
return nil, err
}
ret.Status = GitStatus_Modified
ret.Path, err = parseGit_StringWithSpace(data)
if err != nil {
return nil, err
}
case '2':
var err error
if err = skipGitStatusEntry(data, 9); err != nil {
return nil, err
}
ret.Status = GitStatus_Renamed
ret.Path, err = parseGit_StringWithSpace(data)
if err != nil {
return nil, err
}
ret.States[0], err = parseGit_StringWithSpace(data)
if err != nil {
return nil, err
}
case '?':
var err error
if err = skipGitStatusEntry(data, 1); err != nil {
return nil, err
}
ret.Status = GitStatus_Untracked
ret.Path, err = parseGit_StringWithSpace(data)
if err != nil {
return nil, err
}
case '!':
var err error
if err = skipGitStatusEntry(data, 1); err != nil {
return nil, err
}
ret.Status = GitStatus_Ignored
ret.Path, err = parseGit_StringWithSpace(data)
if err != nil {
return nil, err
}
case 'u':
var err error
if err = skipGitStatusEntry(data, 2); err != nil {
return nil, err
}
if ret.SubmoduleChanges, err = parseGit_String(data); err != nil {
return nil, err
}
if err = skipGitStatusEntry(data, 4); err != nil {
return nil, err
}
if ret.States[0], err = parseGit_HexString(data); err != nil {
return nil, err
}
if ret.States[1], err = parseGit_HexString(data); err != nil {
return nil, err
}
if ret.States[2], err = parseGit_HexString(data); err != nil {
return nil, err
}
ret.Status = GitStatus_Unmerged
ret.Path, err = parseGit_StringWithSpace(data)
if err != nil {
return nil, err
}
default:
return nil, errors.New("Invalid status type" + string(statusType))
}
return &ret, nil
}
func parseGitStatusData(data io.ByteReader) (Data, error) {
ret := make([]GitStatusData, 0, 10)
for {
data, err := parseSingleStatusEntry(data)
if err != nil {
return nil, err
} else if data == nil {
break
}
ret = append(ret, *data)
}
return ret, nil
}
type Data interface{}
type CommitStatus int
const (
Add CommitStatus = iota
Rm
Copy
Modify
Rename
TypeChange
Unmerged
Unknown
)
type GitDiffRawData struct {
SrcMode, DstMode string
SrcCommit, DstCommit string
Status CommitStatus
Src, Dst string
}
func parseGit_DiffIndexStatus(data io.ByteReader, d *GitDiffRawData) error {
b, err := data.ReadByte()
if err != nil {
return err
}
switch b {
case 'A':
d.Status = Add
case 'C':
d.Status = Copy
case 'D':
d.Status = Rm
case 'M':
d.Status = Modify
case 'R':
d.Status = Rename
case 'T':
d.Status = TypeChange
case 'U':
d.Status = Unmerged
case 'X':
return fmt.Errorf("Unexpected unknown change type. This is a git bug")
}
_, err = parseGit_StringWithSpace(data)
if err != nil {
return err
}
return nil
}
func parseSingleGitDiffIndexRawData(data io.ByteReader) (*GitDiffRawData, error) {
var ret GitDiffRawData
b, err := data.ReadByte()
if err != nil {
return nil, err
}
if b != ':' {
return nil, fmt.Errorf("Expected ':' but got '%s'", string(b))
}
if ret.SrcMode, err = parseGit_String(data); err != nil {
return nil, err
}
if ret.DstMode, err = parseGit_String(data); err != nil {
return nil, err
}
if ret.Src, err = parseGit_String(data); err != nil {
return nil, err
}
if ret.Dst, err = parseGit_String(data); err != nil {
return nil, err
}
if err = parseGit_DiffIndexStatus(data, &ret); err != nil {
return nil, err
}
ret.Dst = ret.Src
switch ret.Status {
case Copy, Rename:
if ret.Src, err = parseGit_StringWithSpace(data); err != nil {
return nil, err
}
}
return &ret, nil
}
func parseGitDiffIndexRawData(data io.ByteReader) (Data, error) {
ret := make([]GitDiffRawData, 0, 10)
for {
data, err := parseSingleGitDiffIndexRawData(data)
if err != nil {
return nil, err
} else if data == nil {
break
}
ret = append(ret, *data)
}
return ret, nil
}

View File

@@ -19,14 +19,15 @@ package common
*/ */
import ( import (
"bufio"
"bytes" "bytes"
"errors"
"fmt" "fmt"
"io" "io"
"os" "os"
"os/exec" "os/exec"
"path" "path"
"path/filepath" "path/filepath"
"slices"
"strings" "strings"
"sync" "sync"
) )
@@ -38,18 +39,10 @@ type GitSubmoduleLister interface {
GitSubmoduleCommitId(cwd, packageName, commitId string) (subCommitId string, valid bool) GitSubmoduleCommitId(cwd, packageName, commitId string) (subCommitId string, valid bool)
} }
type GitSubmoduleFileConflictResolver interface {
GitResolveSubmoduleFileConflict(cwd string) error
}
type GitStatusLister interface { type GitStatusLister interface {
GitStatus(cwd string) ([]GitStatusData, error) GitStatus(cwd string) ([]GitStatusData, error)
} }
type GitDiffLister interface {
GitDiff(cwd, base, head string) (string, error)
}
type Git interface { type Git interface {
// error if git, but wrong remote // error if git, but wrong remote
GitClone(repo, branch, remoteUrl string) (string, error) // clone, or check if path is already checked out remote and force pulls, error otherwise. Return remotename, errror GitClone(repo, branch, remoteUrl string) (string, error) // clone, or check if path is already checked out remote and force pulls, error otherwise. Return remotename, errror
@@ -69,10 +62,6 @@ type Git interface {
GitExecOrPanic(cwd string, params ...string) GitExecOrPanic(cwd string, params ...string)
GitExec(cwd string, params ...string) error GitExec(cwd string, params ...string) error
GitExecWithOutput(cwd string, params ...string) (string, error) GitExecWithOutput(cwd string, params ...string) (string, error)
GitExecQuietOrPanic(cwd string, params ...string)
GitDiffLister
GitSubmoduleFileConflictResolver
} }
type GitHandlerImpl struct { type GitHandlerImpl struct {
@@ -80,8 +69,7 @@ type GitHandlerImpl struct {
GitCommiter string GitCommiter string
GitEmail string GitEmail string
lock *sync.Mutex lock *sync.Mutex
quiet bool
} }
func (s *GitHandlerImpl) GetPath() string { func (s *GitHandlerImpl) GetPath() string {
@@ -144,7 +132,6 @@ func (s *gitHandlerGeneratorImpl) CreateGitHandler(org string) (Git, error) {
} }
func (s *gitHandlerGeneratorImpl) ReadExistingPath(org string) (Git, error) { func (s *gitHandlerGeneratorImpl) ReadExistingPath(org string) (Git, error) {
LogDebug("Locking git org:", org)
s.lock_lock.Lock() s.lock_lock.Lock()
defer s.lock_lock.Unlock() defer s.lock_lock.Unlock()
@@ -166,7 +153,6 @@ func (s *gitHandlerGeneratorImpl) ReadExistingPath(org string) (Git, error) {
func (s *gitHandlerGeneratorImpl) ReleaseLock(org string) { func (s *gitHandlerGeneratorImpl) ReleaseLock(org string) {
m, ok := s.lock[org] m, ok := s.lock[org]
if ok { if ok {
LogDebug("Unlocking git org:", org)
m.Unlock() m.Unlock()
} }
} }
@@ -210,26 +196,19 @@ func (refs *GitReferences) addReference(id, branch string) {
} }
func (e *GitHandlerImpl) GitClone(repo, branch, remoteUrl string) (string, error) { func (e *GitHandlerImpl) GitClone(repo, branch, remoteUrl string) (string, error) {
LogDebug("Cloning", remoteUrl, " repo:", repo, " branch:", branch)
remoteUrlComp, err := ParseGitRemoteUrl(remoteUrl) remoteUrlComp, err := ParseGitRemoteUrl(remoteUrl)
if err != nil { if err != nil {
return "", fmt.Errorf("Cannot parse remote URL: %w", err) return "", fmt.Errorf("Cannot parse remote URL: %w", err)
} }
remoteBranch := "HEAD" if len(branch) == 0 {
if len(branch) == 0 && remoteUrlComp != nil && remoteUrlComp.Commit != "HEAD" {
branch = remoteUrlComp.Commit branch = remoteUrlComp.Commit
remoteBranch = branch }
} else if len(branch) > 0 { if len(branch) == 0 {
remoteBranch = branch branch = "HEAD"
} }
remoteName := remoteUrlComp.RemoteName() remoteName := remoteUrlComp.RemoteName()
if remoteUrlComp != nil { LogDebug("Clone", *remoteUrlComp, " -> ", remoteName)
LogDebug("Clone", *remoteUrlComp, " -> ", remoteName)
} else {
LogDebug("Clone", "[default] -> ", remoteName)
}
remoteRef := remoteName + "/" + remoteBranch
if fi, err := os.Stat(path.Join(e.GitPath, repo)); os.IsNotExist(err) { if fi, err := os.Stat(path.Join(e.GitPath, repo)); os.IsNotExist(err) {
if err = e.GitExec("", "clone", "--origin", remoteName, remoteUrl, repo); err != nil { if err = e.GitExec("", "clone", "--origin", remoteName, remoteUrl, repo); err != nil {
return remoteName, err return remoteName, err
@@ -243,53 +222,18 @@ func (e *GitHandlerImpl) GitClone(repo, branch, remoteUrl string) (string, error
e.GitExecOrPanic(repo, "remote", "set-url", remoteName, remoteUrl) e.GitExecOrPanic(repo, "remote", "set-url", remoteName, remoteUrl)
} }
// check if we have submodule to deinit e.GitExecOrPanic(repo, "fetch", remoteName, branch)
if list, _ := e.GitSubmoduleList(repo, "HEAD"); len(list) > 0 {
e.GitExecQuietOrPanic(repo, "submodule", "deinit", "--all", "--force")
}
e.GitExecOrPanic(repo, "fetch", "--prune", remoteName, remoteBranch)
} }
/* return remoteName, e.GitExec(repo, "checkout", "-B", branch, "refs/remotes/"+remoteName+"/"+branch)
refsBytes, err := os.ReadFile(path.Join(e.GitPath, repo, ".git/refs/remotes", remoteName, "HEAD"))
if err != nil {
LogError("Cannot read HEAD of remote", remoteName)
return remoteName, fmt.Errorf("Cannot read HEAD of remote %s", remoteName)
}
refs := string(refsBytes)
if refs[0:5] != "ref: " {
LogError("Unexpected format of remote HEAD ref:", refs)
return remoteName, fmt.Errorf("Unexpected format of remote HEAD ref: %s", refs)
}
if len(branch) == 0 || branch == "HEAD" {
remoteRef = strings.TrimSpace(refs[5:])
branch = remoteRef[strings.LastIndex(remoteRef, "/")+1:]
LogDebug("remoteRef", remoteRef)
LogDebug("branch", branch)
}
*/
args := []string{"fetch", "--prune", remoteName, branch}
if strings.TrimSpace(e.GitExecWithOutputOrPanic(repo, "rev-parse", "--is-shallow-repository")) == "true" {
args = slices.Insert(args, 1, "--unshallow")
}
e.GitExecOrPanic(repo, args...)
return remoteName, e.GitExec(repo, "checkout", "--track", "-B", branch, remoteRef)
} }
func (e *GitHandlerImpl) GitBranchHead(gitDir, branchName string) (string, error) { func (e *GitHandlerImpl) GitBranchHead(gitDir, branchName string) (string, error) {
id, err := e.GitExecWithOutput(gitDir, "show-ref", "--heads", "--hash", branchName) id, err := e.GitExecWithOutput(gitDir, "show-ref", "--hash", "--verify", "refs/heads/"+branchName)
if err != nil { if err != nil {
return "", fmt.Errorf("Can't find default branch: %s", branchName) return "", fmt.Errorf("Can't find default branch: %s", branchName)
} }
id = strings.TrimSpace(SplitLines(id)[0]) return strings.TrimSpace(id), nil
if len(id) < 10 {
return "", fmt.Errorf("Can't find branch: %s", branchName)
}
return id, nil
} }
func (e *GitHandlerImpl) GitRemoteHead(gitDir, remote, branchName string) (string, error) { func (e *GitHandlerImpl) GitRemoteHead(gitDir, remote, branchName string) (string, error) {
@@ -302,7 +246,6 @@ func (e *GitHandlerImpl) GitRemoteHead(gitDir, remote, branchName string) (strin
} }
func (e *GitHandlerImpl) Close() error { func (e *GitHandlerImpl) Close() error {
LogDebug("Unlocking git lock")
e.lock.Unlock() e.lock.Unlock()
return nil return nil
} }
@@ -355,7 +298,6 @@ func (e *GitHandlerImpl) GitExecWithOutput(cwd string, params ...string) (string
"GIT_COMMITTER_NAME=" + e.GitCommiter, "GIT_COMMITTER_NAME=" + e.GitCommiter,
"EMAIL=not@exist@src.opensuse.org", "EMAIL=not@exist@src.opensuse.org",
"GIT_LFS_SKIP_SMUDGE=1", "GIT_LFS_SKIP_SMUDGE=1",
"GIT_LFS_SKIP_PUSH=1",
"GIT_SSH_COMMAND=/usr/bin/ssh -o StrictHostKeyChecking=yes", "GIT_SSH_COMMAND=/usr/bin/ssh -o StrictHostKeyChecking=yes",
} }
if len(ExtraGitParams) > 0 { if len(ExtraGitParams) > 0 {
@@ -364,11 +306,9 @@ func (e *GitHandlerImpl) GitExecWithOutput(cwd string, params ...string) (string
cmd.Dir = filepath.Join(e.GitPath, cwd) cmd.Dir = filepath.Join(e.GitPath, cwd)
cmd.Stdin = nil cmd.Stdin = nil
LogDebug("git execute @", cwd, ":", cmd.Args) LogDebug("git execute:", cmd.Args)
out, err := cmd.CombinedOutput() out, err := cmd.CombinedOutput()
if !e.quiet { LogDebug(string(out))
LogDebug(string(out))
}
if err != nil { if err != nil {
LogError("git", cmd.Args, " error:", err) LogError("git", cmd.Args, " error:", err)
return "", fmt.Errorf("error executing: git %#v \n%s\n err: %w", cmd.Args, out, err) return "", fmt.Errorf("error executing: git %#v \n%s\n err: %w", cmd.Args, out, err)
@@ -377,13 +317,6 @@ func (e *GitHandlerImpl) GitExecWithOutput(cwd string, params ...string) (string
return string(out), nil return string(out), nil
} }
func (e *GitHandlerImpl) GitExecQuietOrPanic(cwd string, params ...string) {
e.quiet = true
e.GitExecOrPanic(cwd, params...)
e.quiet = false
return
}
type ChanIO struct { type ChanIO struct {
ch chan byte ch chan byte
} }
@@ -513,29 +446,21 @@ func parseGitMsg(data <-chan byte) (GitMsg, error) {
}, nil }, nil
} }
func parseGitCommitHdr(oldHdr [2]string, data <-chan byte) ([2]string, int, error) { func parseGitCommitHdr(data <-chan byte) ([2]string, error) {
hdr := make([]byte, 0, 60) hdr := make([]byte, 0, 60)
val := make([]byte, 0, 1000) val := make([]byte, 0, 1000)
c := <-data c := <-data
size := 1
if c != '\n' { // end of header marker if c != '\n' { // end of header marker
for ; c != ' '; c = <-data { for ; c != ' '; c = <-data {
hdr = append(hdr, c) hdr = append(hdr, c)
size++
}
if size == 1 { // continuation header here
hdr = []byte(oldHdr[0])
val = append([]byte(oldHdr[1]), '\n')
} }
for c := <-data; c != '\n'; c = <-data { for c := <-data; c != '\n'; c = <-data {
val = append(val, c) val = append(val, c)
size++
} }
size++
} }
return [2]string{string(hdr), string(val)}, size, nil return [2]string{string(hdr), string(val)}, nil
} }
func parseGitCommitMsg(data <-chan byte, l int) (string, error) { func parseGitCommitMsg(data <-chan byte, l int) (string, error) {
@@ -545,6 +470,7 @@ func parseGitCommitMsg(data <-chan byte, l int) (string, error) {
msg = append(msg, c) msg = append(msg, c)
l-- l--
} }
// l--
if l != 0 { if l != 0 {
return "", fmt.Errorf("Unexpected data in the git commit msg: l=%d", l) return "", fmt.Errorf("Unexpected data in the git commit msg: l=%d", l)
@@ -564,14 +490,12 @@ func parseGitCommit(data <-chan byte) (GitCommit, error) {
var c GitCommit var c GitCommit
l := hdr.size l := hdr.size
for { for {
var hdr [2]string hdr, err := parseGitCommitHdr(data)
hdr, size, err := parseGitCommitHdr(hdr, data)
if err != nil { if err != nil {
return GitCommit{}, nil return GitCommit{}, nil
} }
l -= size
if size == 1 { if len(hdr[0])+len(hdr[1]) == 0 { // hdr end marker
break break
} }
@@ -579,7 +503,10 @@ func parseGitCommit(data <-chan byte) (GitCommit, error) {
case "tree": case "tree":
c.Tree = hdr[1] c.Tree = hdr[1]
} }
l -= len(hdr[0]) + len(hdr[1]) + 2
} }
l--
c.Msg, err = parseGitCommitMsg(data, l) c.Msg, err = parseGitCommitMsg(data, l)
return c, err return c, err
@@ -668,7 +595,7 @@ func (e *GitHandlerImpl) GitParseCommits(cwd string, commitIDs []string) (parsed
var done sync.Mutex var done sync.Mutex
done.Lock() done.Lock()
data_in, data_out := ChanIO{make(chan byte)}, ChanIO{make(chan byte)} data_in, data_out := ChanIO{make(chan byte, 256)}, ChanIO{make(chan byte, 70)}
parsedCommits = make([]GitCommit, 0, len(commitIDs)) parsedCommits = make([]GitCommit, 0, len(commitIDs))
go func() { go func() {
@@ -702,12 +629,7 @@ func (e *GitHandlerImpl) GitParseCommits(cwd string, commitIDs []string) (parsed
return len(data), nil return len(data), nil
}) })
LogDebug("command run:", cmd.Args) LogDebug("command run:", cmd.Args)
if e := cmd.Run(); e != nil { err = cmd.Run()
LogError(e)
close(data_in.ch)
close(data_out.ch)
return nil, e
}
done.Lock() done.Lock()
return return
@@ -718,7 +640,7 @@ func (e *GitHandlerImpl) GitCatFile(cwd, commitId, filename string) (data []byte
var done sync.Mutex var done sync.Mutex
done.Lock() done.Lock()
data_in, data_out := ChanIO{make(chan byte)}, ChanIO{make(chan byte)} data_in, data_out := ChanIO{make(chan byte, 256)}, ChanIO{make(chan byte, 70)}
go func() { go func() {
defer done.Unlock() defer done.Unlock()
@@ -772,7 +694,6 @@ func (e *GitHandlerImpl) GitCatFile(cwd, commitId, filename string) (data []byte
}) })
LogDebug("command run:", cmd.Args) LogDebug("command run:", cmd.Args)
if e := cmd.Run(); e != nil { if e := cmd.Run(); e != nil {
LogError(e)
close(data_in.ch) close(data_in.ch)
close(data_out.ch) close(data_out.ch)
return nil, e return nil, e
@@ -787,9 +708,7 @@ func (e *GitHandlerImpl) GitSubmoduleList(gitPath, commitId string) (submoduleLi
submoduleList = make(map[string]string) submoduleList = make(map[string]string)
done.Lock() done.Lock()
data_in, data_out := ChanIO{make(chan byte)}, ChanIO{make(chan byte)} data_in, data_out := ChanIO{make(chan byte, 256)}, ChanIO{make(chan byte, 70)}
LogDebug("Getting submodules for:", commitId)
go func() { go func() {
defer done.Unlock() defer done.Unlock()
@@ -847,19 +766,14 @@ func (e *GitHandlerImpl) GitSubmoduleList(gitPath, commitId string) (submoduleLi
return len(data), nil return len(data), nil
}) })
LogDebug("command run:", cmd.Args) LogDebug("command run:", cmd.Args)
if e := cmd.Run(); e != nil { err = cmd.Run()
LogError(e)
close(data_in.ch)
close(data_out.ch)
return submoduleList, e
}
done.Lock() done.Lock()
return submoduleList, err return submoduleList, err
} }
func (e *GitHandlerImpl) GitSubmoduleCommitId(cwd, packageName, commitId string) (subCommitId string, valid bool) { func (e *GitHandlerImpl) GitSubmoduleCommitId(cwd, packageName, commitId string) (subCommitId string, valid bool) {
data_in, data_out := ChanIO{make(chan byte)}, ChanIO{make(chan byte)} data_in, data_out := ChanIO{make(chan byte, 256)}, ChanIO{make(chan byte, 70)}
var wg sync.WaitGroup var wg sync.WaitGroup
wg.Add(1) wg.Add(1)
@@ -868,7 +782,7 @@ func (e *GitHandlerImpl) GitSubmoduleCommitId(cwd, packageName, commitId string)
go func() { go func() {
defer func() { defer func() {
if recover() != nil { if recover() != nil {
subCommitId = "" subCommitId = "wrong"
commitId = "ok" commitId = "ok"
valid = false valid = false
} }
@@ -915,155 +829,185 @@ func (e *GitHandlerImpl) GitSubmoduleCommitId(cwd, packageName, commitId string)
return len(data), nil return len(data), nil
}) })
LogDebug("command run:", cmd.Args) LogDebug("command run:", cmd.Args)
if e := cmd.Run(); e != nil { if err := cmd.Run(); err != nil {
LogError(e) LogError("Error running command:", cmd.Args, err)
close(data_in.ch)
close(data_out.ch)
return subCommitId, false
} }
wg.Wait() wg.Wait()
return subCommitId, len(subCommitId) > 0 return subCommitId, len(subCommitId) == len(commitId)
} }
func (e *GitHandlerImpl) GitExecWithDataParse(cwd string, dataprocessor func(io.ByteReader) (Data, error), gitcmd string, args ...string) (Data, error) { const (
LogDebug("getting", gitcmd) GitStatus_Untracked = 0
args = append([]string{gitcmd}, args...) GitStatus_Modified = 1
cmd := exec.Command("/usr/bin/git", args...) GitStatus_Ignored = 2
cmd.Env = []string{ GitStatus_Unmerged = 3 // States[0..3] -- Stage1, Stage2, Stage3 of merge objects
"GIT_CEILING_DIRECTORIES=" + e.GitPath, GitStatus_Renamed = 4 // orig name in States[0]
"GIT_LFS_SKIP_SMUDGE=1", )
"GIT_CONFIG_GLOBAL=/dev/null",
}
cmd.Dir = filepath.Join(e.GitPath, cwd)
cmd.Stderr = writeFunc(func(data []byte) (int, error) {
LogError(string(data))
return len(data), nil
})
LogDebug("command run:", cmd.Args)
out, err := cmd.Output()
if err != nil {
LogError("Error running command", cmd.Args, err)
}
return dataprocessor(bytes.NewReader(out)) type GitStatusData struct {
Path string
Status int
States [3]string
} }
func (e *GitHandlerImpl) GitStatus(cwd string) (ret []GitStatusData, err error) { func parseGitStatusHexString(data io.ByteReader) (string, error) {
data, err := e.GitExecWithDataParse(cwd, parseGitStatusData, "status", "--porcelain=2", "-z") str := make([]byte, 0, 32)
return data.([]GitStatusData), err for {
c, err := data.ReadByte()
if err != nil {
return "", err
}
switch {
case c == 0 || c == ' ':
return string(str), nil
case c >= 'a' && c <= 'f':
case c >= 'A' && c <= 'F':
case c >= '0' && c <= '9':
default:
return "", errors.New("Invalid character in hex string:" + string(c))
}
str = append(str, c)
}
}
func parseGitStatusString(data io.ByteReader) (string, error) {
str := make([]byte, 0, 100)
for {
c, err := data.ReadByte()
if err != nil {
return "", errors.New("Unexpected EOF. Expected NUL string term")
}
if c == 0 {
return string(str), nil
}
str = append(str, c)
}
} }
func (e *GitHandlerImpl) GitDiff(cwd, base, head string) (string, error) { func skipGitStatusEntry(data io.ByteReader, skipSpaceLen int) error {
LogDebug("getting diff from", base, "..", head) for skipSpaceLen > 0 {
c, err := data.ReadByte()
cmd := exec.Command("/usr/bin/git", "diff", base+".."+head) if err != nil {
cmd.Env = []string{ return err
"GIT_CEILING_DIRECTORIES=" + e.GitPath, }
"GIT_LFS_SKIP_SMUDGE=1", if c == ' ' {
"GIT_CONFIG_GLOBAL=/dev/null", skipSpaceLen--
}
cmd.Dir = filepath.Join(e.GitPath, cwd)
cmd.Stderr = writeFunc(func(data []byte) (int, error) {
LogError(string(data))
return len(data), nil
})
LogDebug("command run:", cmd.Args)
out, err := cmd.Output()
if err != nil {
LogError("Error running command", cmd.Args, err)
}
return string(out), nil
}
func (e *GitHandlerImpl) GitDiffIndex(cwd, commit string) ([]GitDiffRawData, error) {
data, err := e.GitExecWithDataParse("diff-index", parseGitDiffIndexRawData, cwd, "diff-index", "-z", "--raw", "--full-index", "--submodule=short", "HEAD")
return data.([]GitDiffRawData), err
}
func (git *GitHandlerImpl) GitResolveSubmoduleFileConflict(cwd string) error {
status, err := git.GitStatus(cwd)
if err != nil {
return fmt.Errorf("Status failed: %w", err)
}
// we can only resolve conflicts with .gitmodules
for _, s := range status {
if s.Status == GitStatus_Unmerged {
if s.Path != ".gitmodules" {
return err
}
submodules, err := git.GitSubmoduleList(cwd, "HEAD")
if err != nil {
return fmt.Errorf("Failed to fetch submodules during merge resolution: %w", err)
}
// We need to adjust the `submodules` list by the pending changes to the index
s1, err := git.GitExecWithOutput(cwd, "cat-file", "blob", s.States[0])
if err != nil {
return fmt.Errorf("Failed fetching data during .gitmodules merge resoulution: %w", err)
}
s2, err := git.GitExecWithOutput(cwd, "cat-file", "blob", s.States[1])
if err != nil {
return fmt.Errorf("Failed fetching data during .gitmodules merge resoulution: %w", err)
}
s3, err := git.GitExecWithOutput(cwd, "cat-file", "blob", s.States[2])
if err != nil {
return fmt.Errorf("Failed fetching data during .gitmodules merge resoulution: %w", err)
}
subs1, err := ParseSubmodulesFile(strings.NewReader(s1))
if err != nil {
return fmt.Errorf("Failed parsing submodule file [%s] in merge: %w", s.States[0], err)
}
subs2, err := ParseSubmodulesFile(strings.NewReader(s2))
if err != nil {
return fmt.Errorf("Failed parsing submodule file [%s] in merge: %w", s.States[0], err)
}
subs3, err := ParseSubmodulesFile(strings.NewReader(s3))
if err != nil {
return fmt.Errorf("Failed parsing submodule file [%s] in merge: %w", s.States[0], err)
}
for r := range submodules {
LogError(r)
}
// merge from subs3 (target), subs1 (orig), subs2 (2-nd base that is missing from target base)
// this will update submodules
mergedSubs := slices.Concat(subs1, subs2, subs3)
var filteredSubs []Submodule = make([]Submodule, 0, max(len(subs1), len(subs2), len(subs3)))
nextSub:
for subName := range submodules {
for i := range mergedSubs {
if path.Base(mergedSubs[i].Path) == subName {
filteredSubs = append(filteredSubs, mergedSubs[i])
continue nextSub
}
}
return fmt.Errorf("Cannot find submodule for path: %s", subName)
}
out, err := os.Create(path.Join(git.GetPath(), cwd, ".gitmodules"))
if err != nil {
return fmt.Errorf("Can't open .gitmodules for writing: %w", err)
}
if err = WriteSubmodules(filteredSubs, out); err != nil {
return fmt.Errorf("Can't write .gitmodules: %w", err)
}
if out.Close(); err != nil {
return fmt.Errorf("Can't close .gitmodules: %w", err)
}
git.GitExecOrPanic(cwd, "add", ".gitmodules")
git.GitExecOrPanic(cwd, "-c", "core.editor=true", "merge", "--continue")
} }
} }
return nil return nil
} }
func parseSingleStatusEntry(data io.ByteReader) (*GitStatusData, error) {
ret := GitStatusData{}
statusType, err := data.ReadByte()
if err != nil {
return nil, nil
}
switch statusType {
case '1':
var err error
if err = skipGitStatusEntry(data, 8); err != nil {
return nil, err
}
ret.Status = GitStatus_Modified
ret.Path, err = parseGitStatusString(data)
if err != nil {
return nil, err
}
case '2':
var err error
if err = skipGitStatusEntry(data, 9); err != nil {
return nil, err
}
ret.Status = GitStatus_Renamed
ret.Path, err = parseGitStatusString(data)
if err != nil {
return nil, err
}
ret.States[0], err = parseGitStatusString(data)
if err != nil {
return nil, err
}
case '?':
var err error
if err = skipGitStatusEntry(data, 1); err != nil {
return nil, err
}
ret.Status = GitStatus_Untracked
ret.Path, err = parseGitStatusString(data)
if err != nil {
return nil, err
}
case '!':
var err error
if err = skipGitStatusEntry(data, 1); err != nil {
return nil, err
}
ret.Status = GitStatus_Ignored
ret.Path, err = parseGitStatusString(data)
if err != nil {
return nil, err
}
case 'u':
var err error
if err = skipGitStatusEntry(data, 7); err != nil {
return nil, err
}
if ret.States[0], err = parseGitStatusHexString(data); err != nil {
return nil, err
}
if ret.States[1], err = parseGitStatusHexString(data); err != nil {
return nil, err
}
if ret.States[2], err = parseGitStatusHexString(data); err != nil {
return nil, err
}
ret.Status = GitStatus_Unmerged
ret.Path, err = parseGitStatusString(data)
if err != nil {
return nil, err
}
default:
return nil, errors.New("Invalid status type" + string(statusType))
}
return &ret, nil
}
func parseGitStatusData(data io.ByteReader) ([]GitStatusData, error) {
ret := make([]GitStatusData, 0, 10)
for {
data, err := parseSingleStatusEntry(data)
if err != nil {
return nil, err
} else if data == nil {
break
}
ret = append(ret, *data)
}
return ret, nil
}
func (e *GitHandlerImpl) GitStatus(cwd string) (ret []GitStatusData, err error) {
LogDebug("getting git-status()")
cmd := exec.Command("/usr/bin/git", "status", "--porcelain=2", "-z")
cmd.Env = []string{
"GIT_CEILING_DIRECTORIES=" + e.GitPath,
"GIT_LFS_SKIP_SMUDGE=1",
"GIT_CONFIG_GLOBAL=/dev/null",
}
cmd.Dir = filepath.Join(e.GitPath, cwd)
cmd.Stderr = writeFunc(func(data []byte) (int, error) {
LogError(string(data))
return len(data), nil
})
LogDebug("command run:", cmd.Args)
out, err := cmd.Output()
if err != nil {
LogError("Error running command", cmd.Args, err)
}
return parseGitStatusData(bufio.NewReader(bytes.NewReader(out)))
}

View File

@@ -24,7 +24,6 @@ import (
"os" "os"
"os/exec" "os/exec"
"path" "path"
"runtime/debug"
"slices" "slices"
"strings" "strings"
"testing" "testing"
@@ -55,8 +54,6 @@ func TestGitClone(t *testing.T) {
}, },
} }
return
execPath, err := os.Getwd() execPath, err := os.Getwd()
if err != nil { if err != nil {
t.Fatal(err) t.Fatal(err)
@@ -94,93 +91,6 @@ func TestGitClone(t *testing.T) {
} }
} }
func TestSubmoduleConflictResolution(t *testing.T) {
tests := []struct {
name string
checkout, merge string
result string
}{
{
name: "adding two submodules",
checkout: "base_add_b1",
merge: "base_add_b2",
result: `[submodule "pkgA"]
path = pkgA
url = ../pkgA
[submodule "pkgB"]
path = pkgB
url = ../pkgB
[submodule "pkgC"]
path = pkgC
url = ../pkgC
[submodule "pkgB1"]
path = pkgB1
url = ../pkgB1
[submodule "pkgB2"]
path = pkgB2
url = ../pkgB2
`,
},
}
d, err := os.MkdirTemp(os.TempDir(), "submoduletests")
if err != nil {
t.Fatal(err)
}
cwd, err := os.Getwd()
if err != nil {
t.Fatal(err)
}
cmd := exec.Command(cwd + "/test_repo_setup.sh")
cmd.Dir = d
_, err = cmd.Output()
if err != nil {
t.Fatal(err)
}
gh, err := AllocateGitWorkTree(d, "test", "foo@example.com")
if err != nil {
t.Fatal(err)
}
success := true
noErrorOrFail := func(t *testing.T, err error) {
if err != nil {
t.Fatal(string(debug.Stack()), err)
}
}
for _, test := range tests {
success = t.Run(test.name, func(t *testing.T) {
git, err := gh.ReadExistingPath("prjgit")
if err != nil {
t.Fatal(err)
}
noErrorOrFail(t, git.GitExec("", "checkout", "-B", "test", "main"))
noErrorOrFail(t, git.GitExec("", "merge", "base_add_b1"))
err = git.GitExec("", "merge", "base_add_b2")
if err == nil {
t.Fatal("expected a conflict")
}
err = git.GitResolveSubmoduleFileConflict("")
if err != nil {
t.Fatal(err)
}
data, err := os.ReadFile(git.GetPath() + "/.gitmodules")
if err != nil {
t.Fatal("Cannot read .gitmodules.", err)
}
if string(data) != test.result {
t.Error("Expected", test.result, "but have", string(data))
}
}) && success
}
if success {
os.RemoveAll(d)
}
}
func TestGitMsgParsing(t *testing.T) { func TestGitMsgParsing(t *testing.T) {
t.Run("tree message with size 56", func(t *testing.T) { t.Run("tree message with size 56", func(t *testing.T) {
const hdr = "f40888ea4515fe2e8eea617a16f5f50a45f652d894de3ad181d58de3aafb8f98 tree 56\x00" const hdr = "f40888ea4515fe2e8eea617a16f5f50a45f652d894de3ad181d58de3aafb8f98 tree 56\x00"
@@ -288,7 +198,7 @@ committer Adam Majer <amajer@suse.com> 1720709149 +0200
}) })
t.Run("parse multiline headers", func(t *testing.T) { t.Run("parse multiline headers", func(t *testing.T) {
const commitData = "cae5831ab48470ff060a5aaa12eb6e5a7acaf91e commit 1492\000" + const commitData = "cae5831ab48470ff060a5aaa12eb6e5a7acaf91e commit 1491\x00" +
`tree 1f9c8fe8099615d6d3921528402ac53f09213b02 `tree 1f9c8fe8099615d6d3921528402ac53f09213b02
parent e08a654fae0ecc91678819e0b62a2e014bad3339 parent e08a654fae0ecc91678819e0b62a2e014bad3339
author Yagiz Nizipli <yagiz@nizipli.com> 1720967314 -0400 author Yagiz Nizipli <yagiz@nizipli.com> 1720967314 -0400
@@ -320,7 +230,7 @@ Reviewed-By: Luigi Pinca <luigipinca@gmail.com>
Reviewed-By: Matteo Collina <matteo.collina@gmail.com> Reviewed-By: Matteo Collina <matteo.collina@gmail.com>
Reviewed-By: Ulises Gascón <ulisesgascongonzalez@gmail.com> Reviewed-By: Ulises Gascón <ulisesgascongonzalez@gmail.com>
Reviewed-By: Richard Lau <rlau@redhat.com> Reviewed-By: Richard Lau <rlau@redhat.com>
Reviewed-By: Marco Ippolito <marcoippolito54@gmail.com>` + "\000" Reviewed-By: Marco Ippolito <marcoippolito54@gmail.com>` + "\x00"
ch := make(chan byte, 5000) ch := make(chan byte, 5000)
for _, b := range []byte(commitData) { for _, b := range []byte(commitData) {
@@ -341,51 +251,6 @@ Reviewed-By: Marco Ippolito <marcoippolito54@gmail.com>` + "\000"
} }
}) })
t.Run("parse multiline headers", func(t *testing.T) {
const commitData = "c07c52c57a10fb355956df3caad2986613838f149274fbe312ad76560764829d commit 1150\000" + `tree 3e06b280ea056141ed5e8af9794a41ae5281930c45321803eab53a240cb60044
parent 19362a2cecb1fd25a89e03611d08ac68dcb1732f9dc0a68a40926356787fa4ca
author Adrian Schröter <adrian@suse.de> 1746600403 +0200
committer Adrian Schröter <adrian@suse.de> 1746600403 +0200
gpgsig-sha256 -----BEGIN PGP SIGNATURE-----
iQIzBAABCgAdFiEE1QF1zm/pNbvyhgLFkY2MlUwI22cFAmgbAd0ACgkQkY2MlUwI
22dxtA//eUCzIqxVdaEnOrFeTyxKig/mCOjaAyctmwr0vXUyElRtjXe4TzVG3QtR
uDfhIrKYLZ2tU/0TewTW/4XopWxLuqEzVQLrjuYl7K5P3GoYk52W1yGT0szzm7/i
87j4UdRL9YGU/gYO7nSzstcfTP6AcmYzVUoOnwYR0K2vyOVjO4niL3mFXxLkIgIt
jd82xcE4JpQz9Yjyq2nDdz4A55kLAwsqY+dOct4oC6bZmj1/JeoGQfPvUsvsQgcI
syCHVh0GBxjvSv50V/VPzxQTFMal/TdtvAD4kmP/9RDi/5THzus8Peam8pV0gEIC
Q15ZcuLwIsC9i7ifUDYgzLgBBRdpSI0qji4Y6clWULPVjsyghgyfQw1trBSySpC8
O1XfajUM+rXyrBLP6kzY+zl/zyzRdJ8JhljmC+SmNuyyEB77Hkn83k0f+aBhhqC2
4b3fIsKtwJZ1w6gr6SSz1BottiT9ShQzRaL8iRoF/2l5MkHPR+QFg2J7EIBqCbCQ
hFUjdvWAXQBWkkTQlJmLmJBXDOLQg3o6xCbnZM0gPFjZWE7e3Mpky7H0+xPnoeg9
ukuvkexXQ6yrdiekA7HRLc76Te/I0m7KDOOWZ3rbJV6uH/3ps4FbLQTZO12AtZ6J
n8hYdYfw9yjCxiKUjnEtXtDRe8DJpqv+hO0Wj4MI5gIA2JE2lzY=
=Keg5
-----END PGP SIGNATURE-----
dummy change, don't merge
` + "\000"
ch := make(chan byte)
go func() {
for _, b := range []byte(commitData) {
ch <- b
}
}()
commit, err := parseGitCommit(ch)
if err != nil {
t.Error(err)
}
if commit.Tree != "3e06b280ea056141ed5e8af9794a41ae5281930c45321803eab53a240cb60044" {
t.Errorf("Invalid commit object: %#v", commit)
}
if commit.Msg != "dummy change, don't merge\n" {
t.Errorf("Invalid commit msg: '%s'", commit.Msg)
}
})
t.Run("parse tree object", func(t *testing.T) { t.Run("parse tree object", func(t *testing.T) {
const treeData = "\x31\x61\x30\x35\x64\x62\x37\x33\x36\x39\x33\x37\x34\x33\x30\x65\x31\x38\x64\x66\x34\x33\x61\x32\x37\x61\x39\x38\x30\x30\x31\x30\x31\x32\x65\x31\x65\x64\x32\x30\x34\x38\x32\x39\x38\x36\x37\x31\x32\x38\x66\x32\x63\x65\x38\x34\x30\x36\x62\x35\x63\x66\x63\x39\x20\x74\x72\x65\x65\x20\x32\x30\x35\x00\x34\x30\x30\x30\x30\x20\x62\x6f\x74\x73\x2d\x63\x6f\x6d\x6d\x6f\x6e\x00\x93\x17\xaa\x47\xf6\xea\x37\xe8\xbc\xe2\x80\x77\x57\x90\xf4\xa8\x01\xd7\xe3\x70\x2f\x84\xfb\xe1\xb0\x0e\x4a\x2c\x1c\x75\x2c\x2b\x34\x30\x30\x30\x30\x20\x6f\x62\x73\x2d\x73\x74\x61\x67\x69\x6e\x67\x2d\x62\x6f\x74\x00\x79\x77\x8b\x28\x7d\x37\x10\x59\xb9\x71\x28\x36\xed\x20\x31\x5f\xfb\xe1\xed\xb5\xba\x4f\x5e\xbb\x65\x65\x68\x23\x77\x32\x58\xfe\x34\x30\x30\x30\x30\x20\x70\x72\x2d\x72\x65\x76\x69\x65\x77\x00\x36\x0d\x45\xcb\x76\xb8\x93\xb3\x21\xba\xfa\xd5\x00\x9d\xfc\x59\xab\x88\xc1\x3c\x81\xcb\x48\x5a\xe0\x29\x29\x0f\xe3\x6b\x3c\x5e\x34\x30\x30\x30\x30\x20\x70\x72\x6a\x67\x69\x74\x2d\x75\x70\x64\x61\x74\x65\x72\x00\xb4\x0b\x1c\xf5\xfb\xec\x9a\xb2\x9f\x48\x3e\x21\x18\x0d\x51\xb7\x98\x6e\x21\x99\x74\x84\x67\x71\x41\x24\x42\xfc\xc9\x04\x12\x99\x00" const treeData = "\x31\x61\x30\x35\x64\x62\x37\x33\x36\x39\x33\x37\x34\x33\x30\x65\x31\x38\x64\x66\x34\x33\x61\x32\x37\x61\x39\x38\x30\x30\x31\x30\x31\x32\x65\x31\x65\x64\x32\x30\x34\x38\x32\x39\x38\x36\x37\x31\x32\x38\x66\x32\x63\x65\x38\x34\x30\x36\x62\x35\x63\x66\x63\x39\x20\x74\x72\x65\x65\x20\x32\x30\x35\x00\x34\x30\x30\x30\x30\x20\x62\x6f\x74\x73\x2d\x63\x6f\x6d\x6d\x6f\x6e\x00\x93\x17\xaa\x47\xf6\xea\x37\xe8\xbc\xe2\x80\x77\x57\x90\xf4\xa8\x01\xd7\xe3\x70\x2f\x84\xfb\xe1\xb0\x0e\x4a\x2c\x1c\x75\x2c\x2b\x34\x30\x30\x30\x30\x20\x6f\x62\x73\x2d\x73\x74\x61\x67\x69\x6e\x67\x2d\x62\x6f\x74\x00\x79\x77\x8b\x28\x7d\x37\x10\x59\xb9\x71\x28\x36\xed\x20\x31\x5f\xfb\xe1\xed\xb5\xba\x4f\x5e\xbb\x65\x65\x68\x23\x77\x32\x58\xfe\x34\x30\x30\x30\x30\x20\x70\x72\x2d\x72\x65\x76\x69\x65\x77\x00\x36\x0d\x45\xcb\x76\xb8\x93\xb3\x21\xba\xfa\xd5\x00\x9d\xfc\x59\xab\x88\xc1\x3c\x81\xcb\x48\x5a\xe0\x29\x29\x0f\xe3\x6b\x3c\x5e\x34\x30\x30\x30\x30\x20\x70\x72\x6a\x67\x69\x74\x2d\x75\x70\x64\x61\x74\x65\x72\x00\xb4\x0b\x1c\xf5\xfb\xec\x9a\xb2\x9f\x48\x3e\x21\x18\x0d\x51\xb7\x98\x6e\x21\x99\x74\x84\x67\x71\x41\x24\x42\xfc\xc9\x04\x12\x99\x00"
@@ -643,8 +508,6 @@ func TestGitStatusParse(t *testing.T) {
Path: ".gitmodules", Path: ".gitmodules",
Status: GitStatus_Unmerged, Status: GitStatus_Unmerged,
States: [3]string{"587ec403f01113f2629da538f6e14b84781f70ac59c41aeedd978ea8b1253a76", "d23eb05d9ca92883ab9f4d28f3ec90c05f667f3a5c8c8e291bd65e03bac9ae3c", "087b1d5f22dbf0aa4a879fff27fff03568b334c90daa5f2653f4a7961e24ea33"}, States: [3]string{"587ec403f01113f2629da538f6e14b84781f70ac59c41aeedd978ea8b1253a76", "d23eb05d9ca92883ab9f4d28f3ec90c05f667f3a5c8c8e291bd65e03bac9ae3c", "087b1d5f22dbf0aa4a879fff27fff03568b334c90daa5f2653f4a7961e24ea33"},
SubmoduleChanges: "N...",
}, },
}, },
}, },

View File

@@ -36,12 +36,6 @@ func (o *IssueEditIssueAttachmentReader) ReadResponse(response runtime.ClientRes
return nil, err return nil, err
} }
return nil, result return nil, result
case 422:
result := NewIssueEditIssueAttachmentUnprocessableEntity()
if err := result.readResponse(response, consumer, o.formats); err != nil {
return nil, err
}
return nil, result
case 423: case 423:
result := NewIssueEditIssueAttachmentLocked() result := NewIssueEditIssueAttachmentLocked()
if err := result.readResponse(response, consumer, o.formats); err != nil { if err := result.readResponse(response, consumer, o.formats); err != nil {
@@ -195,78 +189,6 @@ func (o *IssueEditIssueAttachmentNotFound) readResponse(response runtime.ClientR
return nil return nil
} }
// NewIssueEditIssueAttachmentUnprocessableEntity creates a IssueEditIssueAttachmentUnprocessableEntity with default headers values
func NewIssueEditIssueAttachmentUnprocessableEntity() *IssueEditIssueAttachmentUnprocessableEntity {
return &IssueEditIssueAttachmentUnprocessableEntity{}
}
/*
IssueEditIssueAttachmentUnprocessableEntity describes a response with status code 422, with default header values.
APIValidationError is error format response related to input validation
*/
type IssueEditIssueAttachmentUnprocessableEntity struct {
Message string
URL string
}
// IsSuccess returns true when this issue edit issue attachment unprocessable entity response has a 2xx status code
func (o *IssueEditIssueAttachmentUnprocessableEntity) IsSuccess() bool {
return false
}
// IsRedirect returns true when this issue edit issue attachment unprocessable entity response has a 3xx status code
func (o *IssueEditIssueAttachmentUnprocessableEntity) IsRedirect() bool {
return false
}
// IsClientError returns true when this issue edit issue attachment unprocessable entity response has a 4xx status code
func (o *IssueEditIssueAttachmentUnprocessableEntity) IsClientError() bool {
return true
}
// IsServerError returns true when this issue edit issue attachment unprocessable entity response has a 5xx status code
func (o *IssueEditIssueAttachmentUnprocessableEntity) IsServerError() bool {
return false
}
// IsCode returns true when this issue edit issue attachment unprocessable entity response a status code equal to that given
func (o *IssueEditIssueAttachmentUnprocessableEntity) IsCode(code int) bool {
return code == 422
}
// Code gets the status code for the issue edit issue attachment unprocessable entity response
func (o *IssueEditIssueAttachmentUnprocessableEntity) Code() int {
return 422
}
func (o *IssueEditIssueAttachmentUnprocessableEntity) Error() string {
return fmt.Sprintf("[PATCH /repos/{owner}/{repo}/issues/{index}/assets/{attachment_id}][%d] issueEditIssueAttachmentUnprocessableEntity", 422)
}
func (o *IssueEditIssueAttachmentUnprocessableEntity) String() string {
return fmt.Sprintf("[PATCH /repos/{owner}/{repo}/issues/{index}/assets/{attachment_id}][%d] issueEditIssueAttachmentUnprocessableEntity", 422)
}
func (o *IssueEditIssueAttachmentUnprocessableEntity) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
// hydrates response header message
hdrMessage := response.GetHeader("message")
if hdrMessage != "" {
o.Message = hdrMessage
}
// hydrates response header url
hdrURL := response.GetHeader("url")
if hdrURL != "" {
o.URL = hdrURL
}
return nil
}
// NewIssueEditIssueAttachmentLocked creates a IssueEditIssueAttachmentLocked with default headers values // NewIssueEditIssueAttachmentLocked creates a IssueEditIssueAttachmentLocked with default headers values
func NewIssueEditIssueAttachmentLocked() *IssueEditIssueAttachmentLocked { func NewIssueEditIssueAttachmentLocked() *IssueEditIssueAttachmentLocked {
return &IssueEditIssueAttachmentLocked{} return &IssueEditIssueAttachmentLocked{}

View File

@@ -36,12 +36,6 @@ func (o *IssueEditIssueCommentAttachmentReader) ReadResponse(response runtime.Cl
return nil, err return nil, err
} }
return nil, result return nil, result
case 422:
result := NewIssueEditIssueCommentAttachmentUnprocessableEntity()
if err := result.readResponse(response, consumer, o.formats); err != nil {
return nil, err
}
return nil, result
case 423: case 423:
result := NewIssueEditIssueCommentAttachmentLocked() result := NewIssueEditIssueCommentAttachmentLocked()
if err := result.readResponse(response, consumer, o.formats); err != nil { if err := result.readResponse(response, consumer, o.formats); err != nil {
@@ -195,78 +189,6 @@ func (o *IssueEditIssueCommentAttachmentNotFound) readResponse(response runtime.
return nil return nil
} }
// NewIssueEditIssueCommentAttachmentUnprocessableEntity creates a IssueEditIssueCommentAttachmentUnprocessableEntity with default headers values
func NewIssueEditIssueCommentAttachmentUnprocessableEntity() *IssueEditIssueCommentAttachmentUnprocessableEntity {
return &IssueEditIssueCommentAttachmentUnprocessableEntity{}
}
/*
IssueEditIssueCommentAttachmentUnprocessableEntity describes a response with status code 422, with default header values.
APIValidationError is error format response related to input validation
*/
type IssueEditIssueCommentAttachmentUnprocessableEntity struct {
Message string
URL string
}
// IsSuccess returns true when this issue edit issue comment attachment unprocessable entity response has a 2xx status code
func (o *IssueEditIssueCommentAttachmentUnprocessableEntity) IsSuccess() bool {
return false
}
// IsRedirect returns true when this issue edit issue comment attachment unprocessable entity response has a 3xx status code
func (o *IssueEditIssueCommentAttachmentUnprocessableEntity) IsRedirect() bool {
return false
}
// IsClientError returns true when this issue edit issue comment attachment unprocessable entity response has a 4xx status code
func (o *IssueEditIssueCommentAttachmentUnprocessableEntity) IsClientError() bool {
return true
}
// IsServerError returns true when this issue edit issue comment attachment unprocessable entity response has a 5xx status code
func (o *IssueEditIssueCommentAttachmentUnprocessableEntity) IsServerError() bool {
return false
}
// IsCode returns true when this issue edit issue comment attachment unprocessable entity response a status code equal to that given
func (o *IssueEditIssueCommentAttachmentUnprocessableEntity) IsCode(code int) bool {
return code == 422
}
// Code gets the status code for the issue edit issue comment attachment unprocessable entity response
func (o *IssueEditIssueCommentAttachmentUnprocessableEntity) Code() int {
return 422
}
func (o *IssueEditIssueCommentAttachmentUnprocessableEntity) Error() string {
return fmt.Sprintf("[PATCH /repos/{owner}/{repo}/issues/comments/{id}/assets/{attachment_id}][%d] issueEditIssueCommentAttachmentUnprocessableEntity", 422)
}
func (o *IssueEditIssueCommentAttachmentUnprocessableEntity) String() string {
return fmt.Sprintf("[PATCH /repos/{owner}/{repo}/issues/comments/{id}/assets/{attachment_id}][%d] issueEditIssueCommentAttachmentUnprocessableEntity", 422)
}
func (o *IssueEditIssueCommentAttachmentUnprocessableEntity) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
// hydrates response header message
hdrMessage := response.GetHeader("message")
if hdrMessage != "" {
o.Message = hdrMessage
}
// hydrates response header url
hdrURL := response.GetHeader("url")
if hdrURL != "" {
o.URL = hdrURL
}
return nil
}
// NewIssueEditIssueCommentAttachmentLocked creates a IssueEditIssueCommentAttachmentLocked with default headers values // NewIssueEditIssueCommentAttachmentLocked creates a IssueEditIssueCommentAttachmentLocked with default headers values
func NewIssueEditIssueCommentAttachmentLocked() *IssueEditIssueCommentAttachmentLocked { func NewIssueEditIssueCommentAttachmentLocked() *IssueEditIssueCommentAttachmentLocked {
return &IssueEditIssueCommentAttachmentLocked{} return &IssueEditIssueCommentAttachmentLocked{}

View File

@@ -64,13 +64,13 @@ type IssueSearchIssuesParams struct {
/* Assigned. /* Assigned.
Filter issues or pulls assigned to the authenticated user filter (issues / pulls) assigned to you, default is false
*/ */
Assigned *bool Assigned *bool
/* Before. /* Before.
Only show issues updated before the given time (RFC 3339 format) Only show notifications updated before the given time. This is a timestamp in RFC 3339 format
Format: date-time Format: date-time
*/ */
@@ -78,51 +78,49 @@ type IssueSearchIssuesParams struct {
/* Created. /* Created.
Filter issues or pulls created by the authenticated user filter (issues / pulls) created by you, default is false
*/ */
Created *bool Created *bool
/* Labels. /* Labels.
Comma-separated list of label names. Fetch only issues that have any of these labels. Non existent labels are discarded. comma separated list of labels. Fetch only issues that have any of this labels. Non existent labels are discarded
*/ */
Labels *string Labels *string
/* Limit. /* Limit.
Number of items per page page size of results
*/ */
Limit *int64 Limit *int64
/* Mentioned. /* Mentioned.
Filter issues or pulls mentioning the authenticated user filter (issues / pulls) mentioning you, default is false
*/ */
Mentioned *bool Mentioned *bool
/* Milestones. /* Milestones.
Comma-separated list of milestone names. Fetch only issues that have any of these milestones. Non existent milestones are discarded. comma separated list of milestone names. Fetch only issues that have any of this milestones. Non existent are discarded
*/ */
Milestones *string Milestones *string
/* Owner. /* Owner.
Filter by repository owner filter by owner
*/ */
Owner *string Owner *string
/* Page. /* Page.
Page number of results to return (1-based) page number of results to return (1-based)
Default: 1
*/ */
Page *int64 Page *int64
/* PriorityRepoID. /* PriorityRepoID.
Repository ID to prioritize in the results repository to prioritize in the results
Format: int64 Format: int64
*/ */
@@ -130,25 +128,25 @@ type IssueSearchIssuesParams struct {
/* Q. /* Q.
Search string search string
*/ */
Q *string Q *string
/* ReviewRequested. /* ReviewRequested.
Filter pull requests where the authenticated user's review was requested filter pulls requesting your review, default is false
*/ */
ReviewRequested *bool ReviewRequested *bool
/* Reviewed. /* Reviewed.
Filter pull requests reviewed by the authenticated user filter pulls reviewed by you, default is false
*/ */
Reviewed *bool Reviewed *bool
/* Since. /* Since.
Only show issues updated after the given time (RFC 3339 format) Only show notifications updated after the given time. This is a timestamp in RFC 3339 format
Format: date-time Format: date-time
*/ */
@@ -156,21 +154,19 @@ type IssueSearchIssuesParams struct {
/* State. /* State.
State of the issue whether issue is open or closed
Default: "open"
*/ */
State *string State *string
/* Team. /* Team.
Filter by team (requires organization owner parameter) filter by team (requires organization owner parameter to be provided)
*/ */
Team *string Team *string
/* Type. /* Type.
Filter by issue type filter by type (issues / pulls) if set
*/ */
Type *string Type *string
@@ -191,36 +187,7 @@ func (o *IssueSearchIssuesParams) WithDefaults() *IssueSearchIssuesParams {
// //
// All values with no default are reset to their zero value. // All values with no default are reset to their zero value.
func (o *IssueSearchIssuesParams) SetDefaults() { func (o *IssueSearchIssuesParams) SetDefaults() {
var ( // no default values defined for this parameter
assignedDefault = bool(false)
createdDefault = bool(false)
mentionedDefault = bool(false)
pageDefault = int64(1)
reviewRequestedDefault = bool(false)
reviewedDefault = bool(false)
stateDefault = string("open")
)
val := IssueSearchIssuesParams{
Assigned: &assignedDefault,
Created: &createdDefault,
Mentioned: &mentionedDefault,
Page: &pageDefault,
ReviewRequested: &reviewRequestedDefault,
Reviewed: &reviewedDefault,
State: &stateDefault,
}
val.timeout = o.timeout
val.Context = o.Context
val.HTTPClient = o.HTTPClient
*o = val
} }
// WithTimeout adds the timeout to the issue search issues params // WithTimeout adds the timeout to the issue search issues params

View File

@@ -30,18 +30,6 @@ func (o *IssueSearchIssuesReader) ReadResponse(response runtime.ClientResponse,
return nil, err return nil, err
} }
return result, nil return result, nil
case 400:
result := NewIssueSearchIssuesBadRequest()
if err := result.readResponse(response, consumer, o.formats); err != nil {
return nil, err
}
return nil, result
case 422:
result := NewIssueSearchIssuesUnprocessableEntity()
if err := result.readResponse(response, consumer, o.formats); err != nil {
return nil, err
}
return nil, result
default: default:
return nil, runtime.NewAPIError("[GET /repos/issues/search] issueSearchIssues", response, response.Code()) return nil, runtime.NewAPIError("[GET /repos/issues/search] issueSearchIssues", response, response.Code())
} }
@@ -114,147 +102,3 @@ func (o *IssueSearchIssuesOK) readResponse(response runtime.ClientResponse, cons
return nil return nil
} }
// NewIssueSearchIssuesBadRequest creates a IssueSearchIssuesBadRequest with default headers values
func NewIssueSearchIssuesBadRequest() *IssueSearchIssuesBadRequest {
return &IssueSearchIssuesBadRequest{}
}
/*
IssueSearchIssuesBadRequest describes a response with status code 400, with default header values.
APIError is error format response
*/
type IssueSearchIssuesBadRequest struct {
Message string
URL string
}
// IsSuccess returns true when this issue search issues bad request response has a 2xx status code
func (o *IssueSearchIssuesBadRequest) IsSuccess() bool {
return false
}
// IsRedirect returns true when this issue search issues bad request response has a 3xx status code
func (o *IssueSearchIssuesBadRequest) IsRedirect() bool {
return false
}
// IsClientError returns true when this issue search issues bad request response has a 4xx status code
func (o *IssueSearchIssuesBadRequest) IsClientError() bool {
return true
}
// IsServerError returns true when this issue search issues bad request response has a 5xx status code
func (o *IssueSearchIssuesBadRequest) IsServerError() bool {
return false
}
// IsCode returns true when this issue search issues bad request response a status code equal to that given
func (o *IssueSearchIssuesBadRequest) IsCode(code int) bool {
return code == 400
}
// Code gets the status code for the issue search issues bad request response
func (o *IssueSearchIssuesBadRequest) Code() int {
return 400
}
func (o *IssueSearchIssuesBadRequest) Error() string {
return fmt.Sprintf("[GET /repos/issues/search][%d] issueSearchIssuesBadRequest", 400)
}
func (o *IssueSearchIssuesBadRequest) String() string {
return fmt.Sprintf("[GET /repos/issues/search][%d] issueSearchIssuesBadRequest", 400)
}
func (o *IssueSearchIssuesBadRequest) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
// hydrates response header message
hdrMessage := response.GetHeader("message")
if hdrMessage != "" {
o.Message = hdrMessage
}
// hydrates response header url
hdrURL := response.GetHeader("url")
if hdrURL != "" {
o.URL = hdrURL
}
return nil
}
// NewIssueSearchIssuesUnprocessableEntity creates a IssueSearchIssuesUnprocessableEntity with default headers values
func NewIssueSearchIssuesUnprocessableEntity() *IssueSearchIssuesUnprocessableEntity {
return &IssueSearchIssuesUnprocessableEntity{}
}
/*
IssueSearchIssuesUnprocessableEntity describes a response with status code 422, with default header values.
APIValidationError is error format response related to input validation
*/
type IssueSearchIssuesUnprocessableEntity struct {
Message string
URL string
}
// IsSuccess returns true when this issue search issues unprocessable entity response has a 2xx status code
func (o *IssueSearchIssuesUnprocessableEntity) IsSuccess() bool {
return false
}
// IsRedirect returns true when this issue search issues unprocessable entity response has a 3xx status code
func (o *IssueSearchIssuesUnprocessableEntity) IsRedirect() bool {
return false
}
// IsClientError returns true when this issue search issues unprocessable entity response has a 4xx status code
func (o *IssueSearchIssuesUnprocessableEntity) IsClientError() bool {
return true
}
// IsServerError returns true when this issue search issues unprocessable entity response has a 5xx status code
func (o *IssueSearchIssuesUnprocessableEntity) IsServerError() bool {
return false
}
// IsCode returns true when this issue search issues unprocessable entity response a status code equal to that given
func (o *IssueSearchIssuesUnprocessableEntity) IsCode(code int) bool {
return code == 422
}
// Code gets the status code for the issue search issues unprocessable entity response
func (o *IssueSearchIssuesUnprocessableEntity) Code() int {
return 422
}
func (o *IssueSearchIssuesUnprocessableEntity) Error() string {
return fmt.Sprintf("[GET /repos/issues/search][%d] issueSearchIssuesUnprocessableEntity", 422)
}
func (o *IssueSearchIssuesUnprocessableEntity) String() string {
return fmt.Sprintf("[GET /repos/issues/search][%d] issueSearchIssuesUnprocessableEntity", 422)
}
func (o *IssueSearchIssuesUnprocessableEntity) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
// hydrates response header message
hdrMessage := response.GetHeader("message")
if hdrMessage != "" {
o.Message = hdrMessage
}
// hydrates response header url
hdrURL := response.GetHeader("url")
if hdrURL != "" {
o.URL = hdrURL
}
return nil
}

View File

@@ -1,242 +0,0 @@
// Code generated by go-swagger; DO NOT EDIT.
package repository
// This file was generated by the swagger tool.
// Editing this file might prove futile when you re-run the swagger generate command
import (
"context"
"net/http"
"time"
"github.com/go-openapi/errors"
"github.com/go-openapi/runtime"
cr "github.com/go-openapi/runtime/client"
"github.com/go-openapi/strfmt"
"github.com/go-openapi/swag"
)
// NewListActionTasksParams creates a new ListActionTasksParams object,
// with the default timeout for this client.
//
// Default values are not hydrated, since defaults are normally applied by the API server side.
//
// To enforce default values in parameter, use SetDefaults or WithDefaults.
func NewListActionTasksParams() *ListActionTasksParams {
return &ListActionTasksParams{
timeout: cr.DefaultTimeout,
}
}
// NewListActionTasksParamsWithTimeout creates a new ListActionTasksParams object
// with the ability to set a timeout on a request.
func NewListActionTasksParamsWithTimeout(timeout time.Duration) *ListActionTasksParams {
return &ListActionTasksParams{
timeout: timeout,
}
}
// NewListActionTasksParamsWithContext creates a new ListActionTasksParams object
// with the ability to set a context for a request.
func NewListActionTasksParamsWithContext(ctx context.Context) *ListActionTasksParams {
return &ListActionTasksParams{
Context: ctx,
}
}
// NewListActionTasksParamsWithHTTPClient creates a new ListActionTasksParams object
// with the ability to set a custom HTTPClient for a request.
func NewListActionTasksParamsWithHTTPClient(client *http.Client) *ListActionTasksParams {
return &ListActionTasksParams{
HTTPClient: client,
}
}
/*
ListActionTasksParams contains all the parameters to send to the API endpoint
for the list action tasks operation.
Typically these are written to a http.Request.
*/
type ListActionTasksParams struct {
/* Limit.
page size of results, default maximum page size is 50
*/
Limit *int64
/* Owner.
owner of the repo
*/
Owner string
/* Page.
page number of results to return (1-based)
*/
Page *int64
/* Repo.
name of the repo
*/
Repo string
timeout time.Duration
Context context.Context
HTTPClient *http.Client
}
// WithDefaults hydrates default values in the list action tasks params (not the query body).
//
// All values with no default are reset to their zero value.
func (o *ListActionTasksParams) WithDefaults() *ListActionTasksParams {
o.SetDefaults()
return o
}
// SetDefaults hydrates default values in the list action tasks params (not the query body).
//
// All values with no default are reset to their zero value.
func (o *ListActionTasksParams) SetDefaults() {
// no default values defined for this parameter
}
// WithTimeout adds the timeout to the list action tasks params
func (o *ListActionTasksParams) WithTimeout(timeout time.Duration) *ListActionTasksParams {
o.SetTimeout(timeout)
return o
}
// SetTimeout adds the timeout to the list action tasks params
func (o *ListActionTasksParams) SetTimeout(timeout time.Duration) {
o.timeout = timeout
}
// WithContext adds the context to the list action tasks params
func (o *ListActionTasksParams) WithContext(ctx context.Context) *ListActionTasksParams {
o.SetContext(ctx)
return o
}
// SetContext adds the context to the list action tasks params
func (o *ListActionTasksParams) SetContext(ctx context.Context) {
o.Context = ctx
}
// WithHTTPClient adds the HTTPClient to the list action tasks params
func (o *ListActionTasksParams) WithHTTPClient(client *http.Client) *ListActionTasksParams {
o.SetHTTPClient(client)
return o
}
// SetHTTPClient adds the HTTPClient to the list action tasks params
func (o *ListActionTasksParams) SetHTTPClient(client *http.Client) {
o.HTTPClient = client
}
// WithLimit adds the limit to the list action tasks params
func (o *ListActionTasksParams) WithLimit(limit *int64) *ListActionTasksParams {
o.SetLimit(limit)
return o
}
// SetLimit adds the limit to the list action tasks params
func (o *ListActionTasksParams) SetLimit(limit *int64) {
o.Limit = limit
}
// WithOwner adds the owner to the list action tasks params
func (o *ListActionTasksParams) WithOwner(owner string) *ListActionTasksParams {
o.SetOwner(owner)
return o
}
// SetOwner adds the owner to the list action tasks params
func (o *ListActionTasksParams) SetOwner(owner string) {
o.Owner = owner
}
// WithPage adds the page to the list action tasks params
func (o *ListActionTasksParams) WithPage(page *int64) *ListActionTasksParams {
o.SetPage(page)
return o
}
// SetPage adds the page to the list action tasks params
func (o *ListActionTasksParams) SetPage(page *int64) {
o.Page = page
}
// WithRepo adds the repo to the list action tasks params
func (o *ListActionTasksParams) WithRepo(repo string) *ListActionTasksParams {
o.SetRepo(repo)
return o
}
// SetRepo adds the repo to the list action tasks params
func (o *ListActionTasksParams) SetRepo(repo string) {
o.Repo = repo
}
// WriteToRequest writes these params to a swagger request
func (o *ListActionTasksParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
if err := r.SetTimeout(o.timeout); err != nil {
return err
}
var res []error
if o.Limit != nil {
// query param limit
var qrLimit int64
if o.Limit != nil {
qrLimit = *o.Limit
}
qLimit := swag.FormatInt64(qrLimit)
if qLimit != "" {
if err := r.SetQueryParam("limit", qLimit); err != nil {
return err
}
}
}
// path param owner
if err := r.SetPathParam("owner", o.Owner); err != nil {
return err
}
if o.Page != nil {
// query param page
var qrPage int64
if o.Page != nil {
qrPage = *o.Page
}
qPage := swag.FormatInt64(qrPage)
if qPage != "" {
if err := r.SetQueryParam("page", qPage); err != nil {
return err
}
}
}
// path param repo
if err := r.SetPathParam("repo", o.Repo); err != nil {
return err
}
if len(res) > 0 {
return errors.CompositeValidationError(res...)
}
return nil
}

View File

@@ -1,464 +0,0 @@
// Code generated by go-swagger; DO NOT EDIT.
package repository
// This file was generated by the swagger tool.
// Editing this file might prove futile when you re-run the swagger generate command
import (
"encoding/json"
"fmt"
"io"
"github.com/go-openapi/runtime"
"github.com/go-openapi/strfmt"
"src.opensuse.org/autogits/common/gitea-generated/models"
)
// ListActionTasksReader is a Reader for the ListActionTasks structure.
type ListActionTasksReader struct {
formats strfmt.Registry
}
// ReadResponse reads a server response into the received o.
func (o *ListActionTasksReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
switch response.Code() {
case 200:
result := NewListActionTasksOK()
if err := result.readResponse(response, consumer, o.formats); err != nil {
return nil, err
}
return result, nil
case 400:
result := NewListActionTasksBadRequest()
if err := result.readResponse(response, consumer, o.formats); err != nil {
return nil, err
}
return nil, result
case 403:
result := NewListActionTasksForbidden()
if err := result.readResponse(response, consumer, o.formats); err != nil {
return nil, err
}
return nil, result
case 404:
result := NewListActionTasksNotFound()
if err := result.readResponse(response, consumer, o.formats); err != nil {
return nil, err
}
return nil, result
case 409:
result := NewListActionTasksConflict()
if err := result.readResponse(response, consumer, o.formats); err != nil {
return nil, err
}
return nil, result
case 422:
result := NewListActionTasksUnprocessableEntity()
if err := result.readResponse(response, consumer, o.formats); err != nil {
return nil, err
}
return nil, result
default:
return nil, runtime.NewAPIError("[GET /repos/{owner}/{repo}/actions/tasks] ListActionTasks", response, response.Code())
}
}
// NewListActionTasksOK creates a ListActionTasksOK with default headers values
func NewListActionTasksOK() *ListActionTasksOK {
return &ListActionTasksOK{}
}
/*
ListActionTasksOK describes a response with status code 200, with default header values.
TasksList
*/
type ListActionTasksOK struct {
Payload *models.ActionTaskResponse
}
// IsSuccess returns true when this list action tasks o k response has a 2xx status code
func (o *ListActionTasksOK) IsSuccess() bool {
return true
}
// IsRedirect returns true when this list action tasks o k response has a 3xx status code
func (o *ListActionTasksOK) IsRedirect() bool {
return false
}
// IsClientError returns true when this list action tasks o k response has a 4xx status code
func (o *ListActionTasksOK) IsClientError() bool {
return false
}
// IsServerError returns true when this list action tasks o k response has a 5xx status code
func (o *ListActionTasksOK) IsServerError() bool {
return false
}
// IsCode returns true when this list action tasks o k response a status code equal to that given
func (o *ListActionTasksOK) IsCode(code int) bool {
return code == 200
}
// Code gets the status code for the list action tasks o k response
func (o *ListActionTasksOK) Code() int {
return 200
}
func (o *ListActionTasksOK) Error() string {
payload, _ := json.Marshal(o.Payload)
return fmt.Sprintf("[GET /repos/{owner}/{repo}/actions/tasks][%d] listActionTasksOK %s", 200, payload)
}
func (o *ListActionTasksOK) String() string {
payload, _ := json.Marshal(o.Payload)
return fmt.Sprintf("[GET /repos/{owner}/{repo}/actions/tasks][%d] listActionTasksOK %s", 200, payload)
}
func (o *ListActionTasksOK) GetPayload() *models.ActionTaskResponse {
return o.Payload
}
func (o *ListActionTasksOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
o.Payload = new(models.ActionTaskResponse)
// response payload
if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
return err
}
return nil
}
// NewListActionTasksBadRequest creates a ListActionTasksBadRequest with default headers values
func NewListActionTasksBadRequest() *ListActionTasksBadRequest {
return &ListActionTasksBadRequest{}
}
/*
ListActionTasksBadRequest describes a response with status code 400, with default header values.
APIError is error format response
*/
type ListActionTasksBadRequest struct {
Message string
URL string
}
// IsSuccess returns true when this list action tasks bad request response has a 2xx status code
func (o *ListActionTasksBadRequest) IsSuccess() bool {
return false
}
// IsRedirect returns true when this list action tasks bad request response has a 3xx status code
func (o *ListActionTasksBadRequest) IsRedirect() bool {
return false
}
// IsClientError returns true when this list action tasks bad request response has a 4xx status code
func (o *ListActionTasksBadRequest) IsClientError() bool {
return true
}
// IsServerError returns true when this list action tasks bad request response has a 5xx status code
func (o *ListActionTasksBadRequest) IsServerError() bool {
return false
}
// IsCode returns true when this list action tasks bad request response a status code equal to that given
func (o *ListActionTasksBadRequest) IsCode(code int) bool {
return code == 400
}
// Code gets the status code for the list action tasks bad request response
func (o *ListActionTasksBadRequest) Code() int {
return 400
}
func (o *ListActionTasksBadRequest) Error() string {
return fmt.Sprintf("[GET /repos/{owner}/{repo}/actions/tasks][%d] listActionTasksBadRequest", 400)
}
func (o *ListActionTasksBadRequest) String() string {
return fmt.Sprintf("[GET /repos/{owner}/{repo}/actions/tasks][%d] listActionTasksBadRequest", 400)
}
func (o *ListActionTasksBadRequest) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
// hydrates response header message
hdrMessage := response.GetHeader("message")
if hdrMessage != "" {
o.Message = hdrMessage
}
// hydrates response header url
hdrURL := response.GetHeader("url")
if hdrURL != "" {
o.URL = hdrURL
}
return nil
}
// NewListActionTasksForbidden creates a ListActionTasksForbidden with default headers values
func NewListActionTasksForbidden() *ListActionTasksForbidden {
return &ListActionTasksForbidden{}
}
/*
ListActionTasksForbidden describes a response with status code 403, with default header values.
APIForbiddenError is a forbidden error response
*/
type ListActionTasksForbidden struct {
Message string
URL string
}
// IsSuccess returns true when this list action tasks forbidden response has a 2xx status code
func (o *ListActionTasksForbidden) IsSuccess() bool {
return false
}
// IsRedirect returns true when this list action tasks forbidden response has a 3xx status code
func (o *ListActionTasksForbidden) IsRedirect() bool {
return false
}
// IsClientError returns true when this list action tasks forbidden response has a 4xx status code
func (o *ListActionTasksForbidden) IsClientError() bool {
return true
}
// IsServerError returns true when this list action tasks forbidden response has a 5xx status code
func (o *ListActionTasksForbidden) IsServerError() bool {
return false
}
// IsCode returns true when this list action tasks forbidden response a status code equal to that given
func (o *ListActionTasksForbidden) IsCode(code int) bool {
return code == 403
}
// Code gets the status code for the list action tasks forbidden response
func (o *ListActionTasksForbidden) Code() int {
return 403
}
func (o *ListActionTasksForbidden) Error() string {
return fmt.Sprintf("[GET /repos/{owner}/{repo}/actions/tasks][%d] listActionTasksForbidden", 403)
}
func (o *ListActionTasksForbidden) String() string {
return fmt.Sprintf("[GET /repos/{owner}/{repo}/actions/tasks][%d] listActionTasksForbidden", 403)
}
func (o *ListActionTasksForbidden) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
// hydrates response header message
hdrMessage := response.GetHeader("message")
if hdrMessage != "" {
o.Message = hdrMessage
}
// hydrates response header url
hdrURL := response.GetHeader("url")
if hdrURL != "" {
o.URL = hdrURL
}
return nil
}
// NewListActionTasksNotFound creates a ListActionTasksNotFound with default headers values
func NewListActionTasksNotFound() *ListActionTasksNotFound {
return &ListActionTasksNotFound{}
}
/*
ListActionTasksNotFound describes a response with status code 404, with default header values.
APINotFound is a not found empty response
*/
type ListActionTasksNotFound struct {
}
// IsSuccess returns true when this list action tasks not found response has a 2xx status code
func (o *ListActionTasksNotFound) IsSuccess() bool {
return false
}
// IsRedirect returns true when this list action tasks not found response has a 3xx status code
func (o *ListActionTasksNotFound) IsRedirect() bool {
return false
}
// IsClientError returns true when this list action tasks not found response has a 4xx status code
func (o *ListActionTasksNotFound) IsClientError() bool {
return true
}
// IsServerError returns true when this list action tasks not found response has a 5xx status code
func (o *ListActionTasksNotFound) IsServerError() bool {
return false
}
// IsCode returns true when this list action tasks not found response a status code equal to that given
func (o *ListActionTasksNotFound) IsCode(code int) bool {
return code == 404
}
// Code gets the status code for the list action tasks not found response
func (o *ListActionTasksNotFound) Code() int {
return 404
}
func (o *ListActionTasksNotFound) Error() string {
return fmt.Sprintf("[GET /repos/{owner}/{repo}/actions/tasks][%d] listActionTasksNotFound", 404)
}
func (o *ListActionTasksNotFound) String() string {
return fmt.Sprintf("[GET /repos/{owner}/{repo}/actions/tasks][%d] listActionTasksNotFound", 404)
}
func (o *ListActionTasksNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
return nil
}
// NewListActionTasksConflict creates a ListActionTasksConflict with default headers values
func NewListActionTasksConflict() *ListActionTasksConflict {
return &ListActionTasksConflict{}
}
/*
ListActionTasksConflict describes a response with status code 409, with default header values.
APIConflict is a conflict empty response
*/
type ListActionTasksConflict struct {
}
// IsSuccess returns true when this list action tasks conflict response has a 2xx status code
func (o *ListActionTasksConflict) IsSuccess() bool {
return false
}
// IsRedirect returns true when this list action tasks conflict response has a 3xx status code
func (o *ListActionTasksConflict) IsRedirect() bool {
return false
}
// IsClientError returns true when this list action tasks conflict response has a 4xx status code
func (o *ListActionTasksConflict) IsClientError() bool {
return true
}
// IsServerError returns true when this list action tasks conflict response has a 5xx status code
func (o *ListActionTasksConflict) IsServerError() bool {
return false
}
// IsCode returns true when this list action tasks conflict response a status code equal to that given
func (o *ListActionTasksConflict) IsCode(code int) bool {
return code == 409
}
// Code gets the status code for the list action tasks conflict response
func (o *ListActionTasksConflict) Code() int {
return 409
}
func (o *ListActionTasksConflict) Error() string {
return fmt.Sprintf("[GET /repos/{owner}/{repo}/actions/tasks][%d] listActionTasksConflict", 409)
}
func (o *ListActionTasksConflict) String() string {
return fmt.Sprintf("[GET /repos/{owner}/{repo}/actions/tasks][%d] listActionTasksConflict", 409)
}
func (o *ListActionTasksConflict) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
return nil
}
// NewListActionTasksUnprocessableEntity creates a ListActionTasksUnprocessableEntity with default headers values
func NewListActionTasksUnprocessableEntity() *ListActionTasksUnprocessableEntity {
return &ListActionTasksUnprocessableEntity{}
}
/*
ListActionTasksUnprocessableEntity describes a response with status code 422, with default header values.
APIValidationError is error format response related to input validation
*/
type ListActionTasksUnprocessableEntity struct {
Message string
URL string
}
// IsSuccess returns true when this list action tasks unprocessable entity response has a 2xx status code
func (o *ListActionTasksUnprocessableEntity) IsSuccess() bool {
return false
}
// IsRedirect returns true when this list action tasks unprocessable entity response has a 3xx status code
func (o *ListActionTasksUnprocessableEntity) IsRedirect() bool {
return false
}
// IsClientError returns true when this list action tasks unprocessable entity response has a 4xx status code
func (o *ListActionTasksUnprocessableEntity) IsClientError() bool {
return true
}
// IsServerError returns true when this list action tasks unprocessable entity response has a 5xx status code
func (o *ListActionTasksUnprocessableEntity) IsServerError() bool {
return false
}
// IsCode returns true when this list action tasks unprocessable entity response a status code equal to that given
func (o *ListActionTasksUnprocessableEntity) IsCode(code int) bool {
return code == 422
}
// Code gets the status code for the list action tasks unprocessable entity response
func (o *ListActionTasksUnprocessableEntity) Code() int {
return 422
}
func (o *ListActionTasksUnprocessableEntity) Error() string {
return fmt.Sprintf("[GET /repos/{owner}/{repo}/actions/tasks][%d] listActionTasksUnprocessableEntity", 422)
}
func (o *ListActionTasksUnprocessableEntity) String() string {
return fmt.Sprintf("[GET /repos/{owner}/{repo}/actions/tasks][%d] listActionTasksUnprocessableEntity", 422)
}
func (o *ListActionTasksUnprocessableEntity) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
// hydrates response header message
hdrMessage := response.GetHeader("message")
if hdrMessage != "" {
o.Message = hdrMessage
}
// hydrates response header url
hdrURL := response.GetHeader("url")
if hdrURL != "" {
o.URL = hdrURL
}
return nil
}

View File

@@ -1,194 +0,0 @@
// Code generated by go-swagger; DO NOT EDIT.
package repository
// This file was generated by the swagger tool.
// Editing this file might prove futile when you re-run the swagger generate command
import (
"context"
"net/http"
"time"
"github.com/go-openapi/errors"
"github.com/go-openapi/runtime"
cr "github.com/go-openapi/runtime/client"
"github.com/go-openapi/strfmt"
"src.opensuse.org/autogits/common/gitea-generated/models"
)
// NewRepoCreateTagProtectionParams creates a new RepoCreateTagProtectionParams object,
// with the default timeout for this client.
//
// Default values are not hydrated, since defaults are normally applied by the API server side.
//
// To enforce default values in parameter, use SetDefaults or WithDefaults.
func NewRepoCreateTagProtectionParams() *RepoCreateTagProtectionParams {
return &RepoCreateTagProtectionParams{
timeout: cr.DefaultTimeout,
}
}
// NewRepoCreateTagProtectionParamsWithTimeout creates a new RepoCreateTagProtectionParams object
// with the ability to set a timeout on a request.
func NewRepoCreateTagProtectionParamsWithTimeout(timeout time.Duration) *RepoCreateTagProtectionParams {
return &RepoCreateTagProtectionParams{
timeout: timeout,
}
}
// NewRepoCreateTagProtectionParamsWithContext creates a new RepoCreateTagProtectionParams object
// with the ability to set a context for a request.
func NewRepoCreateTagProtectionParamsWithContext(ctx context.Context) *RepoCreateTagProtectionParams {
return &RepoCreateTagProtectionParams{
Context: ctx,
}
}
// NewRepoCreateTagProtectionParamsWithHTTPClient creates a new RepoCreateTagProtectionParams object
// with the ability to set a custom HTTPClient for a request.
func NewRepoCreateTagProtectionParamsWithHTTPClient(client *http.Client) *RepoCreateTagProtectionParams {
return &RepoCreateTagProtectionParams{
HTTPClient: client,
}
}
/*
RepoCreateTagProtectionParams contains all the parameters to send to the API endpoint
for the repo create tag protection operation.
Typically these are written to a http.Request.
*/
type RepoCreateTagProtectionParams struct {
// Body.
Body *models.CreateTagProtectionOption
/* Owner.
owner of the repo
*/
Owner string
/* Repo.
name of the repo
*/
Repo string
timeout time.Duration
Context context.Context
HTTPClient *http.Client
}
// WithDefaults hydrates default values in the repo create tag protection params (not the query body).
//
// All values with no default are reset to their zero value.
func (o *RepoCreateTagProtectionParams) WithDefaults() *RepoCreateTagProtectionParams {
o.SetDefaults()
return o
}
// SetDefaults hydrates default values in the repo create tag protection params (not the query body).
//
// All values with no default are reset to their zero value.
func (o *RepoCreateTagProtectionParams) SetDefaults() {
// no default values defined for this parameter
}
// WithTimeout adds the timeout to the repo create tag protection params
func (o *RepoCreateTagProtectionParams) WithTimeout(timeout time.Duration) *RepoCreateTagProtectionParams {
o.SetTimeout(timeout)
return o
}
// SetTimeout adds the timeout to the repo create tag protection params
func (o *RepoCreateTagProtectionParams) SetTimeout(timeout time.Duration) {
o.timeout = timeout
}
// WithContext adds the context to the repo create tag protection params
func (o *RepoCreateTagProtectionParams) WithContext(ctx context.Context) *RepoCreateTagProtectionParams {
o.SetContext(ctx)
return o
}
// SetContext adds the context to the repo create tag protection params
func (o *RepoCreateTagProtectionParams) SetContext(ctx context.Context) {
o.Context = ctx
}
// WithHTTPClient adds the HTTPClient to the repo create tag protection params
func (o *RepoCreateTagProtectionParams) WithHTTPClient(client *http.Client) *RepoCreateTagProtectionParams {
o.SetHTTPClient(client)
return o
}
// SetHTTPClient adds the HTTPClient to the repo create tag protection params
func (o *RepoCreateTagProtectionParams) SetHTTPClient(client *http.Client) {
o.HTTPClient = client
}
// WithBody adds the body to the repo create tag protection params
func (o *RepoCreateTagProtectionParams) WithBody(body *models.CreateTagProtectionOption) *RepoCreateTagProtectionParams {
o.SetBody(body)
return o
}
// SetBody adds the body to the repo create tag protection params
func (o *RepoCreateTagProtectionParams) SetBody(body *models.CreateTagProtectionOption) {
o.Body = body
}
// WithOwner adds the owner to the repo create tag protection params
func (o *RepoCreateTagProtectionParams) WithOwner(owner string) *RepoCreateTagProtectionParams {
o.SetOwner(owner)
return o
}
// SetOwner adds the owner to the repo create tag protection params
func (o *RepoCreateTagProtectionParams) SetOwner(owner string) {
o.Owner = owner
}
// WithRepo adds the repo to the repo create tag protection params
func (o *RepoCreateTagProtectionParams) WithRepo(repo string) *RepoCreateTagProtectionParams {
o.SetRepo(repo)
return o
}
// SetRepo adds the repo to the repo create tag protection params
func (o *RepoCreateTagProtectionParams) SetRepo(repo string) {
o.Repo = repo
}
// WriteToRequest writes these params to a swagger request
func (o *RepoCreateTagProtectionParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
if err := r.SetTimeout(o.timeout); err != nil {
return err
}
var res []error
if o.Body != nil {
if err := r.SetBodyParam(o.Body); err != nil {
return err
}
}
// path param owner
if err := r.SetPathParam("owner", o.Owner); err != nil {
return err
}
// path param repo
if err := r.SetPathParam("repo", o.Repo); err != nil {
return err
}
if len(res) > 0 {
return errors.CompositeValidationError(res...)
}
return nil
}

View File

@@ -1,402 +0,0 @@
// Code generated by go-swagger; DO NOT EDIT.
package repository
// This file was generated by the swagger tool.
// Editing this file might prove futile when you re-run the swagger generate command
import (
"encoding/json"
"fmt"
"io"
"github.com/go-openapi/runtime"
"github.com/go-openapi/strfmt"
"src.opensuse.org/autogits/common/gitea-generated/models"
)
// RepoCreateTagProtectionReader is a Reader for the RepoCreateTagProtection structure.
type RepoCreateTagProtectionReader struct {
formats strfmt.Registry
}
// ReadResponse reads a server response into the received o.
func (o *RepoCreateTagProtectionReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
switch response.Code() {
case 201:
result := NewRepoCreateTagProtectionCreated()
if err := result.readResponse(response, consumer, o.formats); err != nil {
return nil, err
}
return result, nil
case 403:
result := NewRepoCreateTagProtectionForbidden()
if err := result.readResponse(response, consumer, o.formats); err != nil {
return nil, err
}
return nil, result
case 404:
result := NewRepoCreateTagProtectionNotFound()
if err := result.readResponse(response, consumer, o.formats); err != nil {
return nil, err
}
return nil, result
case 422:
result := NewRepoCreateTagProtectionUnprocessableEntity()
if err := result.readResponse(response, consumer, o.formats); err != nil {
return nil, err
}
return nil, result
case 423:
result := NewRepoCreateTagProtectionLocked()
if err := result.readResponse(response, consumer, o.formats); err != nil {
return nil, err
}
return nil, result
default:
return nil, runtime.NewAPIError("[POST /repos/{owner}/{repo}/tag_protections] repoCreateTagProtection", response, response.Code())
}
}
// NewRepoCreateTagProtectionCreated creates a RepoCreateTagProtectionCreated with default headers values
func NewRepoCreateTagProtectionCreated() *RepoCreateTagProtectionCreated {
return &RepoCreateTagProtectionCreated{}
}
/*
RepoCreateTagProtectionCreated describes a response with status code 201, with default header values.
TagProtection
*/
type RepoCreateTagProtectionCreated struct {
Payload *models.TagProtection
}
// IsSuccess returns true when this repo create tag protection created response has a 2xx status code
func (o *RepoCreateTagProtectionCreated) IsSuccess() bool {
return true
}
// IsRedirect returns true when this repo create tag protection created response has a 3xx status code
func (o *RepoCreateTagProtectionCreated) IsRedirect() bool {
return false
}
// IsClientError returns true when this repo create tag protection created response has a 4xx status code
func (o *RepoCreateTagProtectionCreated) IsClientError() bool {
return false
}
// IsServerError returns true when this repo create tag protection created response has a 5xx status code
func (o *RepoCreateTagProtectionCreated) IsServerError() bool {
return false
}
// IsCode returns true when this repo create tag protection created response a status code equal to that given
func (o *RepoCreateTagProtectionCreated) IsCode(code int) bool {
return code == 201
}
// Code gets the status code for the repo create tag protection created response
func (o *RepoCreateTagProtectionCreated) Code() int {
return 201
}
func (o *RepoCreateTagProtectionCreated) Error() string {
payload, _ := json.Marshal(o.Payload)
return fmt.Sprintf("[POST /repos/{owner}/{repo}/tag_protections][%d] repoCreateTagProtectionCreated %s", 201, payload)
}
func (o *RepoCreateTagProtectionCreated) String() string {
payload, _ := json.Marshal(o.Payload)
return fmt.Sprintf("[POST /repos/{owner}/{repo}/tag_protections][%d] repoCreateTagProtectionCreated %s", 201, payload)
}
func (o *RepoCreateTagProtectionCreated) GetPayload() *models.TagProtection {
return o.Payload
}
func (o *RepoCreateTagProtectionCreated) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
o.Payload = new(models.TagProtection)
// response payload
if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
return err
}
return nil
}
// NewRepoCreateTagProtectionForbidden creates a RepoCreateTagProtectionForbidden with default headers values
func NewRepoCreateTagProtectionForbidden() *RepoCreateTagProtectionForbidden {
return &RepoCreateTagProtectionForbidden{}
}
/*
RepoCreateTagProtectionForbidden describes a response with status code 403, with default header values.
APIForbiddenError is a forbidden error response
*/
type RepoCreateTagProtectionForbidden struct {
Message string
URL string
}
// IsSuccess returns true when this repo create tag protection forbidden response has a 2xx status code
func (o *RepoCreateTagProtectionForbidden) IsSuccess() bool {
return false
}
// IsRedirect returns true when this repo create tag protection forbidden response has a 3xx status code
func (o *RepoCreateTagProtectionForbidden) IsRedirect() bool {
return false
}
// IsClientError returns true when this repo create tag protection forbidden response has a 4xx status code
func (o *RepoCreateTagProtectionForbidden) IsClientError() bool {
return true
}
// IsServerError returns true when this repo create tag protection forbidden response has a 5xx status code
func (o *RepoCreateTagProtectionForbidden) IsServerError() bool {
return false
}
// IsCode returns true when this repo create tag protection forbidden response a status code equal to that given
func (o *RepoCreateTagProtectionForbidden) IsCode(code int) bool {
return code == 403
}
// Code gets the status code for the repo create tag protection forbidden response
func (o *RepoCreateTagProtectionForbidden) Code() int {
return 403
}
func (o *RepoCreateTagProtectionForbidden) Error() string {
return fmt.Sprintf("[POST /repos/{owner}/{repo}/tag_protections][%d] repoCreateTagProtectionForbidden", 403)
}
func (o *RepoCreateTagProtectionForbidden) String() string {
return fmt.Sprintf("[POST /repos/{owner}/{repo}/tag_protections][%d] repoCreateTagProtectionForbidden", 403)
}
func (o *RepoCreateTagProtectionForbidden) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
// hydrates response header message
hdrMessage := response.GetHeader("message")
if hdrMessage != "" {
o.Message = hdrMessage
}
// hydrates response header url
hdrURL := response.GetHeader("url")
if hdrURL != "" {
o.URL = hdrURL
}
return nil
}
// NewRepoCreateTagProtectionNotFound creates a RepoCreateTagProtectionNotFound with default headers values
func NewRepoCreateTagProtectionNotFound() *RepoCreateTagProtectionNotFound {
return &RepoCreateTagProtectionNotFound{}
}
/*
RepoCreateTagProtectionNotFound describes a response with status code 404, with default header values.
APINotFound is a not found empty response
*/
type RepoCreateTagProtectionNotFound struct {
}
// IsSuccess returns true when this repo create tag protection not found response has a 2xx status code
func (o *RepoCreateTagProtectionNotFound) IsSuccess() bool {
return false
}
// IsRedirect returns true when this repo create tag protection not found response has a 3xx status code
func (o *RepoCreateTagProtectionNotFound) IsRedirect() bool {
return false
}
// IsClientError returns true when this repo create tag protection not found response has a 4xx status code
func (o *RepoCreateTagProtectionNotFound) IsClientError() bool {
return true
}
// IsServerError returns true when this repo create tag protection not found response has a 5xx status code
func (o *RepoCreateTagProtectionNotFound) IsServerError() bool {
return false
}
// IsCode returns true when this repo create tag protection not found response a status code equal to that given
func (o *RepoCreateTagProtectionNotFound) IsCode(code int) bool {
return code == 404
}
// Code gets the status code for the repo create tag protection not found response
func (o *RepoCreateTagProtectionNotFound) Code() int {
return 404
}
func (o *RepoCreateTagProtectionNotFound) Error() string {
return fmt.Sprintf("[POST /repos/{owner}/{repo}/tag_protections][%d] repoCreateTagProtectionNotFound", 404)
}
func (o *RepoCreateTagProtectionNotFound) String() string {
return fmt.Sprintf("[POST /repos/{owner}/{repo}/tag_protections][%d] repoCreateTagProtectionNotFound", 404)
}
func (o *RepoCreateTagProtectionNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
return nil
}
// NewRepoCreateTagProtectionUnprocessableEntity creates a RepoCreateTagProtectionUnprocessableEntity with default headers values
func NewRepoCreateTagProtectionUnprocessableEntity() *RepoCreateTagProtectionUnprocessableEntity {
return &RepoCreateTagProtectionUnprocessableEntity{}
}
/*
RepoCreateTagProtectionUnprocessableEntity describes a response with status code 422, with default header values.
APIValidationError is error format response related to input validation
*/
type RepoCreateTagProtectionUnprocessableEntity struct {
Message string
URL string
}
// IsSuccess returns true when this repo create tag protection unprocessable entity response has a 2xx status code
func (o *RepoCreateTagProtectionUnprocessableEntity) IsSuccess() bool {
return false
}
// IsRedirect returns true when this repo create tag protection unprocessable entity response has a 3xx status code
func (o *RepoCreateTagProtectionUnprocessableEntity) IsRedirect() bool {
return false
}
// IsClientError returns true when this repo create tag protection unprocessable entity response has a 4xx status code
func (o *RepoCreateTagProtectionUnprocessableEntity) IsClientError() bool {
return true
}
// IsServerError returns true when this repo create tag protection unprocessable entity response has a 5xx status code
func (o *RepoCreateTagProtectionUnprocessableEntity) IsServerError() bool {
return false
}
// IsCode returns true when this repo create tag protection unprocessable entity response a status code equal to that given
func (o *RepoCreateTagProtectionUnprocessableEntity) IsCode(code int) bool {
return code == 422
}
// Code gets the status code for the repo create tag protection unprocessable entity response
func (o *RepoCreateTagProtectionUnprocessableEntity) Code() int {
return 422
}
func (o *RepoCreateTagProtectionUnprocessableEntity) Error() string {
return fmt.Sprintf("[POST /repos/{owner}/{repo}/tag_protections][%d] repoCreateTagProtectionUnprocessableEntity", 422)
}
func (o *RepoCreateTagProtectionUnprocessableEntity) String() string {
return fmt.Sprintf("[POST /repos/{owner}/{repo}/tag_protections][%d] repoCreateTagProtectionUnprocessableEntity", 422)
}
func (o *RepoCreateTagProtectionUnprocessableEntity) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
// hydrates response header message
hdrMessage := response.GetHeader("message")
if hdrMessage != "" {
o.Message = hdrMessage
}
// hydrates response header url
hdrURL := response.GetHeader("url")
if hdrURL != "" {
o.URL = hdrURL
}
return nil
}
// NewRepoCreateTagProtectionLocked creates a RepoCreateTagProtectionLocked with default headers values
func NewRepoCreateTagProtectionLocked() *RepoCreateTagProtectionLocked {
return &RepoCreateTagProtectionLocked{}
}
/*
RepoCreateTagProtectionLocked describes a response with status code 423, with default header values.
APIRepoArchivedError is an error that is raised when an archived repo should be modified
*/
type RepoCreateTagProtectionLocked struct {
Message string
URL string
}
// IsSuccess returns true when this repo create tag protection locked response has a 2xx status code
func (o *RepoCreateTagProtectionLocked) IsSuccess() bool {
return false
}
// IsRedirect returns true when this repo create tag protection locked response has a 3xx status code
func (o *RepoCreateTagProtectionLocked) IsRedirect() bool {
return false
}
// IsClientError returns true when this repo create tag protection locked response has a 4xx status code
func (o *RepoCreateTagProtectionLocked) IsClientError() bool {
return true
}
// IsServerError returns true when this repo create tag protection locked response has a 5xx status code
func (o *RepoCreateTagProtectionLocked) IsServerError() bool {
return false
}
// IsCode returns true when this repo create tag protection locked response a status code equal to that given
func (o *RepoCreateTagProtectionLocked) IsCode(code int) bool {
return code == 423
}
// Code gets the status code for the repo create tag protection locked response
func (o *RepoCreateTagProtectionLocked) Code() int {
return 423
}
func (o *RepoCreateTagProtectionLocked) Error() string {
return fmt.Sprintf("[POST /repos/{owner}/{repo}/tag_protections][%d] repoCreateTagProtectionLocked", 423)
}
func (o *RepoCreateTagProtectionLocked) String() string {
return fmt.Sprintf("[POST /repos/{owner}/{repo}/tag_protections][%d] repoCreateTagProtectionLocked", 423)
}
func (o *RepoCreateTagProtectionLocked) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
// hydrates response header message
hdrMessage := response.GetHeader("message")
if hdrMessage != "" {
o.Message = hdrMessage
}
// hydrates response header url
hdrURL := response.GetHeader("url")
if hdrURL != "" {
o.URL = hdrURL
}
return nil
}

View File

@@ -1,196 +0,0 @@
// Code generated by go-swagger; DO NOT EDIT.
package repository
// This file was generated by the swagger tool.
// Editing this file might prove futile when you re-run the swagger generate command
import (
"context"
"net/http"
"time"
"github.com/go-openapi/errors"
"github.com/go-openapi/runtime"
cr "github.com/go-openapi/runtime/client"
"github.com/go-openapi/strfmt"
"github.com/go-openapi/swag"
)
// NewRepoDeleteTagProtectionParams creates a new RepoDeleteTagProtectionParams object,
// with the default timeout for this client.
//
// Default values are not hydrated, since defaults are normally applied by the API server side.
//
// To enforce default values in parameter, use SetDefaults or WithDefaults.
func NewRepoDeleteTagProtectionParams() *RepoDeleteTagProtectionParams {
return &RepoDeleteTagProtectionParams{
timeout: cr.DefaultTimeout,
}
}
// NewRepoDeleteTagProtectionParamsWithTimeout creates a new RepoDeleteTagProtectionParams object
// with the ability to set a timeout on a request.
func NewRepoDeleteTagProtectionParamsWithTimeout(timeout time.Duration) *RepoDeleteTagProtectionParams {
return &RepoDeleteTagProtectionParams{
timeout: timeout,
}
}
// NewRepoDeleteTagProtectionParamsWithContext creates a new RepoDeleteTagProtectionParams object
// with the ability to set a context for a request.
func NewRepoDeleteTagProtectionParamsWithContext(ctx context.Context) *RepoDeleteTagProtectionParams {
return &RepoDeleteTagProtectionParams{
Context: ctx,
}
}
// NewRepoDeleteTagProtectionParamsWithHTTPClient creates a new RepoDeleteTagProtectionParams object
// with the ability to set a custom HTTPClient for a request.
func NewRepoDeleteTagProtectionParamsWithHTTPClient(client *http.Client) *RepoDeleteTagProtectionParams {
return &RepoDeleteTagProtectionParams{
HTTPClient: client,
}
}
/*
RepoDeleteTagProtectionParams contains all the parameters to send to the API endpoint
for the repo delete tag protection operation.
Typically these are written to a http.Request.
*/
type RepoDeleteTagProtectionParams struct {
/* ID.
id of protected tag
*/
ID int64
/* Owner.
owner of the repo
*/
Owner string
/* Repo.
name of the repo
*/
Repo string
timeout time.Duration
Context context.Context
HTTPClient *http.Client
}
// WithDefaults hydrates default values in the repo delete tag protection params (not the query body).
//
// All values with no default are reset to their zero value.
func (o *RepoDeleteTagProtectionParams) WithDefaults() *RepoDeleteTagProtectionParams {
o.SetDefaults()
return o
}
// SetDefaults hydrates default values in the repo delete tag protection params (not the query body).
//
// All values with no default are reset to their zero value.
func (o *RepoDeleteTagProtectionParams) SetDefaults() {
// no default values defined for this parameter
}
// WithTimeout adds the timeout to the repo delete tag protection params
func (o *RepoDeleteTagProtectionParams) WithTimeout(timeout time.Duration) *RepoDeleteTagProtectionParams {
o.SetTimeout(timeout)
return o
}
// SetTimeout adds the timeout to the repo delete tag protection params
func (o *RepoDeleteTagProtectionParams) SetTimeout(timeout time.Duration) {
o.timeout = timeout
}
// WithContext adds the context to the repo delete tag protection params
func (o *RepoDeleteTagProtectionParams) WithContext(ctx context.Context) *RepoDeleteTagProtectionParams {
o.SetContext(ctx)
return o
}
// SetContext adds the context to the repo delete tag protection params
func (o *RepoDeleteTagProtectionParams) SetContext(ctx context.Context) {
o.Context = ctx
}
// WithHTTPClient adds the HTTPClient to the repo delete tag protection params
func (o *RepoDeleteTagProtectionParams) WithHTTPClient(client *http.Client) *RepoDeleteTagProtectionParams {
o.SetHTTPClient(client)
return o
}
// SetHTTPClient adds the HTTPClient to the repo delete tag protection params
func (o *RepoDeleteTagProtectionParams) SetHTTPClient(client *http.Client) {
o.HTTPClient = client
}
// WithID adds the id to the repo delete tag protection params
func (o *RepoDeleteTagProtectionParams) WithID(id int64) *RepoDeleteTagProtectionParams {
o.SetID(id)
return o
}
// SetID adds the id to the repo delete tag protection params
func (o *RepoDeleteTagProtectionParams) SetID(id int64) {
o.ID = id
}
// WithOwner adds the owner to the repo delete tag protection params
func (o *RepoDeleteTagProtectionParams) WithOwner(owner string) *RepoDeleteTagProtectionParams {
o.SetOwner(owner)
return o
}
// SetOwner adds the owner to the repo delete tag protection params
func (o *RepoDeleteTagProtectionParams) SetOwner(owner string) {
o.Owner = owner
}
// WithRepo adds the repo to the repo delete tag protection params
func (o *RepoDeleteTagProtectionParams) WithRepo(repo string) *RepoDeleteTagProtectionParams {
o.SetRepo(repo)
return o
}
// SetRepo adds the repo to the repo delete tag protection params
func (o *RepoDeleteTagProtectionParams) SetRepo(repo string) {
o.Repo = repo
}
// WriteToRequest writes these params to a swagger request
func (o *RepoDeleteTagProtectionParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
if err := r.SetTimeout(o.timeout); err != nil {
return err
}
var res []error
// path param id
if err := r.SetPathParam("id", swag.FormatInt64(o.ID)); err != nil {
return err
}
// path param owner
if err := r.SetPathParam("owner", o.Owner); err != nil {
return err
}
// path param repo
if err := r.SetPathParam("repo", o.Repo); err != nil {
return err
}
if len(res) > 0 {
return errors.CompositeValidationError(res...)
}
return nil
}

View File

@@ -1,150 +0,0 @@
// Code generated by go-swagger; DO NOT EDIT.
package repository
// This file was generated by the swagger tool.
// Editing this file might prove futile when you re-run the swagger generate command
import (
"fmt"
"github.com/go-openapi/runtime"
"github.com/go-openapi/strfmt"
)
// RepoDeleteTagProtectionReader is a Reader for the RepoDeleteTagProtection structure.
type RepoDeleteTagProtectionReader struct {
formats strfmt.Registry
}
// ReadResponse reads a server response into the received o.
func (o *RepoDeleteTagProtectionReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
switch response.Code() {
case 204:
result := NewRepoDeleteTagProtectionNoContent()
if err := result.readResponse(response, consumer, o.formats); err != nil {
return nil, err
}
return result, nil
case 404:
result := NewRepoDeleteTagProtectionNotFound()
if err := result.readResponse(response, consumer, o.formats); err != nil {
return nil, err
}
return nil, result
default:
return nil, runtime.NewAPIError("[DELETE /repos/{owner}/{repo}/tag_protections/{id}] repoDeleteTagProtection", response, response.Code())
}
}
// NewRepoDeleteTagProtectionNoContent creates a RepoDeleteTagProtectionNoContent with default headers values
func NewRepoDeleteTagProtectionNoContent() *RepoDeleteTagProtectionNoContent {
return &RepoDeleteTagProtectionNoContent{}
}
/*
RepoDeleteTagProtectionNoContent describes a response with status code 204, with default header values.
APIEmpty is an empty response
*/
type RepoDeleteTagProtectionNoContent struct {
}
// IsSuccess returns true when this repo delete tag protection no content response has a 2xx status code
func (o *RepoDeleteTagProtectionNoContent) IsSuccess() bool {
return true
}
// IsRedirect returns true when this repo delete tag protection no content response has a 3xx status code
func (o *RepoDeleteTagProtectionNoContent) IsRedirect() bool {
return false
}
// IsClientError returns true when this repo delete tag protection no content response has a 4xx status code
func (o *RepoDeleteTagProtectionNoContent) IsClientError() bool {
return false
}
// IsServerError returns true when this repo delete tag protection no content response has a 5xx status code
func (o *RepoDeleteTagProtectionNoContent) IsServerError() bool {
return false
}
// IsCode returns true when this repo delete tag protection no content response a status code equal to that given
func (o *RepoDeleteTagProtectionNoContent) IsCode(code int) bool {
return code == 204
}
// Code gets the status code for the repo delete tag protection no content response
func (o *RepoDeleteTagProtectionNoContent) Code() int {
return 204
}
func (o *RepoDeleteTagProtectionNoContent) Error() string {
return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/tag_protections/{id}][%d] repoDeleteTagProtectionNoContent", 204)
}
func (o *RepoDeleteTagProtectionNoContent) String() string {
return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/tag_protections/{id}][%d] repoDeleteTagProtectionNoContent", 204)
}
func (o *RepoDeleteTagProtectionNoContent) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
return nil
}
// NewRepoDeleteTagProtectionNotFound creates a RepoDeleteTagProtectionNotFound with default headers values
func NewRepoDeleteTagProtectionNotFound() *RepoDeleteTagProtectionNotFound {
return &RepoDeleteTagProtectionNotFound{}
}
/*
RepoDeleteTagProtectionNotFound describes a response with status code 404, with default header values.
APINotFound is a not found empty response
*/
type RepoDeleteTagProtectionNotFound struct {
}
// IsSuccess returns true when this repo delete tag protection not found response has a 2xx status code
func (o *RepoDeleteTagProtectionNotFound) IsSuccess() bool {
return false
}
// IsRedirect returns true when this repo delete tag protection not found response has a 3xx status code
func (o *RepoDeleteTagProtectionNotFound) IsRedirect() bool {
return false
}
// IsClientError returns true when this repo delete tag protection not found response has a 4xx status code
func (o *RepoDeleteTagProtectionNotFound) IsClientError() bool {
return true
}
// IsServerError returns true when this repo delete tag protection not found response has a 5xx status code
func (o *RepoDeleteTagProtectionNotFound) IsServerError() bool {
return false
}
// IsCode returns true when this repo delete tag protection not found response a status code equal to that given
func (o *RepoDeleteTagProtectionNotFound) IsCode(code int) bool {
return code == 404
}
// Code gets the status code for the repo delete tag protection not found response
func (o *RepoDeleteTagProtectionNotFound) Code() int {
return 404
}
func (o *RepoDeleteTagProtectionNotFound) Error() string {
return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/tag_protections/{id}][%d] repoDeleteTagProtectionNotFound", 404)
}
func (o *RepoDeleteTagProtectionNotFound) String() string {
return fmt.Sprintf("[DELETE /repos/{owner}/{repo}/tag_protections/{id}][%d] repoDeleteTagProtectionNotFound", 404)
}
func (o *RepoDeleteTagProtectionNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
return nil
}

View File

@@ -36,12 +36,6 @@ func (o *RepoEditReleaseAttachmentReader) ReadResponse(response runtime.ClientRe
return nil, err return nil, err
} }
return nil, result return nil, result
case 422:
result := NewRepoEditReleaseAttachmentUnprocessableEntity()
if err := result.readResponse(response, consumer, o.formats); err != nil {
return nil, err
}
return nil, result
default: default:
return nil, runtime.NewAPIError("[PATCH /repos/{owner}/{repo}/releases/{id}/assets/{attachment_id}] repoEditReleaseAttachment", response, response.Code()) return nil, runtime.NewAPIError("[PATCH /repos/{owner}/{repo}/releases/{id}/assets/{attachment_id}] repoEditReleaseAttachment", response, response.Code())
} }
@@ -172,75 +166,3 @@ func (o *RepoEditReleaseAttachmentNotFound) readResponse(response runtime.Client
return nil return nil
} }
// NewRepoEditReleaseAttachmentUnprocessableEntity creates a RepoEditReleaseAttachmentUnprocessableEntity with default headers values
func NewRepoEditReleaseAttachmentUnprocessableEntity() *RepoEditReleaseAttachmentUnprocessableEntity {
return &RepoEditReleaseAttachmentUnprocessableEntity{}
}
/*
RepoEditReleaseAttachmentUnprocessableEntity describes a response with status code 422, with default header values.
APIValidationError is error format response related to input validation
*/
type RepoEditReleaseAttachmentUnprocessableEntity struct {
Message string
URL string
}
// IsSuccess returns true when this repo edit release attachment unprocessable entity response has a 2xx status code
func (o *RepoEditReleaseAttachmentUnprocessableEntity) IsSuccess() bool {
return false
}
// IsRedirect returns true when this repo edit release attachment unprocessable entity response has a 3xx status code
func (o *RepoEditReleaseAttachmentUnprocessableEntity) IsRedirect() bool {
return false
}
// IsClientError returns true when this repo edit release attachment unprocessable entity response has a 4xx status code
func (o *RepoEditReleaseAttachmentUnprocessableEntity) IsClientError() bool {
return true
}
// IsServerError returns true when this repo edit release attachment unprocessable entity response has a 5xx status code
func (o *RepoEditReleaseAttachmentUnprocessableEntity) IsServerError() bool {
return false
}
// IsCode returns true when this repo edit release attachment unprocessable entity response a status code equal to that given
func (o *RepoEditReleaseAttachmentUnprocessableEntity) IsCode(code int) bool {
return code == 422
}
// Code gets the status code for the repo edit release attachment unprocessable entity response
func (o *RepoEditReleaseAttachmentUnprocessableEntity) Code() int {
return 422
}
func (o *RepoEditReleaseAttachmentUnprocessableEntity) Error() string {
return fmt.Sprintf("[PATCH /repos/{owner}/{repo}/releases/{id}/assets/{attachment_id}][%d] repoEditReleaseAttachmentUnprocessableEntity", 422)
}
func (o *RepoEditReleaseAttachmentUnprocessableEntity) String() string {
return fmt.Sprintf("[PATCH /repos/{owner}/{repo}/releases/{id}/assets/{attachment_id}][%d] repoEditReleaseAttachmentUnprocessableEntity", 422)
}
func (o *RepoEditReleaseAttachmentUnprocessableEntity) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
// hydrates response header message
hdrMessage := response.GetHeader("message")
if hdrMessage != "" {
o.Message = hdrMessage
}
// hydrates response header url
hdrURL := response.GetHeader("url")
if hdrURL != "" {
o.URL = hdrURL
}
return nil
}

View File

@@ -1,217 +0,0 @@
// Code generated by go-swagger; DO NOT EDIT.
package repository
// This file was generated by the swagger tool.
// Editing this file might prove futile when you re-run the swagger generate command
import (
"context"
"net/http"
"time"
"github.com/go-openapi/errors"
"github.com/go-openapi/runtime"
cr "github.com/go-openapi/runtime/client"
"github.com/go-openapi/strfmt"
"github.com/go-openapi/swag"
"src.opensuse.org/autogits/common/gitea-generated/models"
)
// NewRepoEditTagProtectionParams creates a new RepoEditTagProtectionParams object,
// with the default timeout for this client.
//
// Default values are not hydrated, since defaults are normally applied by the API server side.
//
// To enforce default values in parameter, use SetDefaults or WithDefaults.
func NewRepoEditTagProtectionParams() *RepoEditTagProtectionParams {
return &RepoEditTagProtectionParams{
timeout: cr.DefaultTimeout,
}
}
// NewRepoEditTagProtectionParamsWithTimeout creates a new RepoEditTagProtectionParams object
// with the ability to set a timeout on a request.
func NewRepoEditTagProtectionParamsWithTimeout(timeout time.Duration) *RepoEditTagProtectionParams {
return &RepoEditTagProtectionParams{
timeout: timeout,
}
}
// NewRepoEditTagProtectionParamsWithContext creates a new RepoEditTagProtectionParams object
// with the ability to set a context for a request.
func NewRepoEditTagProtectionParamsWithContext(ctx context.Context) *RepoEditTagProtectionParams {
return &RepoEditTagProtectionParams{
Context: ctx,
}
}
// NewRepoEditTagProtectionParamsWithHTTPClient creates a new RepoEditTagProtectionParams object
// with the ability to set a custom HTTPClient for a request.
func NewRepoEditTagProtectionParamsWithHTTPClient(client *http.Client) *RepoEditTagProtectionParams {
return &RepoEditTagProtectionParams{
HTTPClient: client,
}
}
/*
RepoEditTagProtectionParams contains all the parameters to send to the API endpoint
for the repo edit tag protection operation.
Typically these are written to a http.Request.
*/
type RepoEditTagProtectionParams struct {
// Body.
Body *models.EditTagProtectionOption
/* ID.
id of protected tag
*/
ID int64
/* Owner.
owner of the repo
*/
Owner string
/* Repo.
name of the repo
*/
Repo string
timeout time.Duration
Context context.Context
HTTPClient *http.Client
}
// WithDefaults hydrates default values in the repo edit tag protection params (not the query body).
//
// All values with no default are reset to their zero value.
func (o *RepoEditTagProtectionParams) WithDefaults() *RepoEditTagProtectionParams {
o.SetDefaults()
return o
}
// SetDefaults hydrates default values in the repo edit tag protection params (not the query body).
//
// All values with no default are reset to their zero value.
func (o *RepoEditTagProtectionParams) SetDefaults() {
// no default values defined for this parameter
}
// WithTimeout adds the timeout to the repo edit tag protection params
func (o *RepoEditTagProtectionParams) WithTimeout(timeout time.Duration) *RepoEditTagProtectionParams {
o.SetTimeout(timeout)
return o
}
// SetTimeout adds the timeout to the repo edit tag protection params
func (o *RepoEditTagProtectionParams) SetTimeout(timeout time.Duration) {
o.timeout = timeout
}
// WithContext adds the context to the repo edit tag protection params
func (o *RepoEditTagProtectionParams) WithContext(ctx context.Context) *RepoEditTagProtectionParams {
o.SetContext(ctx)
return o
}
// SetContext adds the context to the repo edit tag protection params
func (o *RepoEditTagProtectionParams) SetContext(ctx context.Context) {
o.Context = ctx
}
// WithHTTPClient adds the HTTPClient to the repo edit tag protection params
func (o *RepoEditTagProtectionParams) WithHTTPClient(client *http.Client) *RepoEditTagProtectionParams {
o.SetHTTPClient(client)
return o
}
// SetHTTPClient adds the HTTPClient to the repo edit tag protection params
func (o *RepoEditTagProtectionParams) SetHTTPClient(client *http.Client) {
o.HTTPClient = client
}
// WithBody adds the body to the repo edit tag protection params
func (o *RepoEditTagProtectionParams) WithBody(body *models.EditTagProtectionOption) *RepoEditTagProtectionParams {
o.SetBody(body)
return o
}
// SetBody adds the body to the repo edit tag protection params
func (o *RepoEditTagProtectionParams) SetBody(body *models.EditTagProtectionOption) {
o.Body = body
}
// WithID adds the id to the repo edit tag protection params
func (o *RepoEditTagProtectionParams) WithID(id int64) *RepoEditTagProtectionParams {
o.SetID(id)
return o
}
// SetID adds the id to the repo edit tag protection params
func (o *RepoEditTagProtectionParams) SetID(id int64) {
o.ID = id
}
// WithOwner adds the owner to the repo edit tag protection params
func (o *RepoEditTagProtectionParams) WithOwner(owner string) *RepoEditTagProtectionParams {
o.SetOwner(owner)
return o
}
// SetOwner adds the owner to the repo edit tag protection params
func (o *RepoEditTagProtectionParams) SetOwner(owner string) {
o.Owner = owner
}
// WithRepo adds the repo to the repo edit tag protection params
func (o *RepoEditTagProtectionParams) WithRepo(repo string) *RepoEditTagProtectionParams {
o.SetRepo(repo)
return o
}
// SetRepo adds the repo to the repo edit tag protection params
func (o *RepoEditTagProtectionParams) SetRepo(repo string) {
o.Repo = repo
}
// WriteToRequest writes these params to a swagger request
func (o *RepoEditTagProtectionParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
if err := r.SetTimeout(o.timeout); err != nil {
return err
}
var res []error
if o.Body != nil {
if err := r.SetBodyParam(o.Body); err != nil {
return err
}
}
// path param id
if err := r.SetPathParam("id", swag.FormatInt64(o.ID)); err != nil {
return err
}
// path param owner
if err := r.SetPathParam("owner", o.Owner); err != nil {
return err
}
// path param repo
if err := r.SetPathParam("repo", o.Repo); err != nil {
return err
}
if len(res) > 0 {
return errors.CompositeValidationError(res...)
}
return nil
}

View File

@@ -1,324 +0,0 @@
// Code generated by go-swagger; DO NOT EDIT.
package repository
// This file was generated by the swagger tool.
// Editing this file might prove futile when you re-run the swagger generate command
import (
"encoding/json"
"fmt"
"io"
"github.com/go-openapi/runtime"
"github.com/go-openapi/strfmt"
"src.opensuse.org/autogits/common/gitea-generated/models"
)
// RepoEditTagProtectionReader is a Reader for the RepoEditTagProtection structure.
type RepoEditTagProtectionReader struct {
formats strfmt.Registry
}
// ReadResponse reads a server response into the received o.
func (o *RepoEditTagProtectionReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
switch response.Code() {
case 200:
result := NewRepoEditTagProtectionOK()
if err := result.readResponse(response, consumer, o.formats); err != nil {
return nil, err
}
return result, nil
case 404:
result := NewRepoEditTagProtectionNotFound()
if err := result.readResponse(response, consumer, o.formats); err != nil {
return nil, err
}
return nil, result
case 422:
result := NewRepoEditTagProtectionUnprocessableEntity()
if err := result.readResponse(response, consumer, o.formats); err != nil {
return nil, err
}
return nil, result
case 423:
result := NewRepoEditTagProtectionLocked()
if err := result.readResponse(response, consumer, o.formats); err != nil {
return nil, err
}
return nil, result
default:
return nil, runtime.NewAPIError("[PATCH /repos/{owner}/{repo}/tag_protections/{id}] repoEditTagProtection", response, response.Code())
}
}
// NewRepoEditTagProtectionOK creates a RepoEditTagProtectionOK with default headers values
func NewRepoEditTagProtectionOK() *RepoEditTagProtectionOK {
return &RepoEditTagProtectionOK{}
}
/*
RepoEditTagProtectionOK describes a response with status code 200, with default header values.
TagProtection
*/
type RepoEditTagProtectionOK struct {
Payload *models.TagProtection
}
// IsSuccess returns true when this repo edit tag protection o k response has a 2xx status code
func (o *RepoEditTagProtectionOK) IsSuccess() bool {
return true
}
// IsRedirect returns true when this repo edit tag protection o k response has a 3xx status code
func (o *RepoEditTagProtectionOK) IsRedirect() bool {
return false
}
// IsClientError returns true when this repo edit tag protection o k response has a 4xx status code
func (o *RepoEditTagProtectionOK) IsClientError() bool {
return false
}
// IsServerError returns true when this repo edit tag protection o k response has a 5xx status code
func (o *RepoEditTagProtectionOK) IsServerError() bool {
return false
}
// IsCode returns true when this repo edit tag protection o k response a status code equal to that given
func (o *RepoEditTagProtectionOK) IsCode(code int) bool {
return code == 200
}
// Code gets the status code for the repo edit tag protection o k response
func (o *RepoEditTagProtectionOK) Code() int {
return 200
}
func (o *RepoEditTagProtectionOK) Error() string {
payload, _ := json.Marshal(o.Payload)
return fmt.Sprintf("[PATCH /repos/{owner}/{repo}/tag_protections/{id}][%d] repoEditTagProtectionOK %s", 200, payload)
}
func (o *RepoEditTagProtectionOK) String() string {
payload, _ := json.Marshal(o.Payload)
return fmt.Sprintf("[PATCH /repos/{owner}/{repo}/tag_protections/{id}][%d] repoEditTagProtectionOK %s", 200, payload)
}
func (o *RepoEditTagProtectionOK) GetPayload() *models.TagProtection {
return o.Payload
}
func (o *RepoEditTagProtectionOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
o.Payload = new(models.TagProtection)
// response payload
if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
return err
}
return nil
}
// NewRepoEditTagProtectionNotFound creates a RepoEditTagProtectionNotFound with default headers values
func NewRepoEditTagProtectionNotFound() *RepoEditTagProtectionNotFound {
return &RepoEditTagProtectionNotFound{}
}
/*
RepoEditTagProtectionNotFound describes a response with status code 404, with default header values.
APINotFound is a not found empty response
*/
type RepoEditTagProtectionNotFound struct {
}
// IsSuccess returns true when this repo edit tag protection not found response has a 2xx status code
func (o *RepoEditTagProtectionNotFound) IsSuccess() bool {
return false
}
// IsRedirect returns true when this repo edit tag protection not found response has a 3xx status code
func (o *RepoEditTagProtectionNotFound) IsRedirect() bool {
return false
}
// IsClientError returns true when this repo edit tag protection not found response has a 4xx status code
func (o *RepoEditTagProtectionNotFound) IsClientError() bool {
return true
}
// IsServerError returns true when this repo edit tag protection not found response has a 5xx status code
func (o *RepoEditTagProtectionNotFound) IsServerError() bool {
return false
}
// IsCode returns true when this repo edit tag protection not found response a status code equal to that given
func (o *RepoEditTagProtectionNotFound) IsCode(code int) bool {
return code == 404
}
// Code gets the status code for the repo edit tag protection not found response
func (o *RepoEditTagProtectionNotFound) Code() int {
return 404
}
func (o *RepoEditTagProtectionNotFound) Error() string {
return fmt.Sprintf("[PATCH /repos/{owner}/{repo}/tag_protections/{id}][%d] repoEditTagProtectionNotFound", 404)
}
func (o *RepoEditTagProtectionNotFound) String() string {
return fmt.Sprintf("[PATCH /repos/{owner}/{repo}/tag_protections/{id}][%d] repoEditTagProtectionNotFound", 404)
}
func (o *RepoEditTagProtectionNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
return nil
}
// NewRepoEditTagProtectionUnprocessableEntity creates a RepoEditTagProtectionUnprocessableEntity with default headers values
func NewRepoEditTagProtectionUnprocessableEntity() *RepoEditTagProtectionUnprocessableEntity {
return &RepoEditTagProtectionUnprocessableEntity{}
}
/*
RepoEditTagProtectionUnprocessableEntity describes a response with status code 422, with default header values.
APIValidationError is error format response related to input validation
*/
type RepoEditTagProtectionUnprocessableEntity struct {
Message string
URL string
}
// IsSuccess returns true when this repo edit tag protection unprocessable entity response has a 2xx status code
func (o *RepoEditTagProtectionUnprocessableEntity) IsSuccess() bool {
return false
}
// IsRedirect returns true when this repo edit tag protection unprocessable entity response has a 3xx status code
func (o *RepoEditTagProtectionUnprocessableEntity) IsRedirect() bool {
return false
}
// IsClientError returns true when this repo edit tag protection unprocessable entity response has a 4xx status code
func (o *RepoEditTagProtectionUnprocessableEntity) IsClientError() bool {
return true
}
// IsServerError returns true when this repo edit tag protection unprocessable entity response has a 5xx status code
func (o *RepoEditTagProtectionUnprocessableEntity) IsServerError() bool {
return false
}
// IsCode returns true when this repo edit tag protection unprocessable entity response a status code equal to that given
func (o *RepoEditTagProtectionUnprocessableEntity) IsCode(code int) bool {
return code == 422
}
// Code gets the status code for the repo edit tag protection unprocessable entity response
func (o *RepoEditTagProtectionUnprocessableEntity) Code() int {
return 422
}
func (o *RepoEditTagProtectionUnprocessableEntity) Error() string {
return fmt.Sprintf("[PATCH /repos/{owner}/{repo}/tag_protections/{id}][%d] repoEditTagProtectionUnprocessableEntity", 422)
}
func (o *RepoEditTagProtectionUnprocessableEntity) String() string {
return fmt.Sprintf("[PATCH /repos/{owner}/{repo}/tag_protections/{id}][%d] repoEditTagProtectionUnprocessableEntity", 422)
}
func (o *RepoEditTagProtectionUnprocessableEntity) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
// hydrates response header message
hdrMessage := response.GetHeader("message")
if hdrMessage != "" {
o.Message = hdrMessage
}
// hydrates response header url
hdrURL := response.GetHeader("url")
if hdrURL != "" {
o.URL = hdrURL
}
return nil
}
// NewRepoEditTagProtectionLocked creates a RepoEditTagProtectionLocked with default headers values
func NewRepoEditTagProtectionLocked() *RepoEditTagProtectionLocked {
return &RepoEditTagProtectionLocked{}
}
/*
RepoEditTagProtectionLocked describes a response with status code 423, with default header values.
APIRepoArchivedError is an error that is raised when an archived repo should be modified
*/
type RepoEditTagProtectionLocked struct {
Message string
URL string
}
// IsSuccess returns true when this repo edit tag protection locked response has a 2xx status code
func (o *RepoEditTagProtectionLocked) IsSuccess() bool {
return false
}
// IsRedirect returns true when this repo edit tag protection locked response has a 3xx status code
func (o *RepoEditTagProtectionLocked) IsRedirect() bool {
return false
}
// IsClientError returns true when this repo edit tag protection locked response has a 4xx status code
func (o *RepoEditTagProtectionLocked) IsClientError() bool {
return true
}
// IsServerError returns true when this repo edit tag protection locked response has a 5xx status code
func (o *RepoEditTagProtectionLocked) IsServerError() bool {
return false
}
// IsCode returns true when this repo edit tag protection locked response a status code equal to that given
func (o *RepoEditTagProtectionLocked) IsCode(code int) bool {
return code == 423
}
// Code gets the status code for the repo edit tag protection locked response
func (o *RepoEditTagProtectionLocked) Code() int {
return 423
}
func (o *RepoEditTagProtectionLocked) Error() string {
return fmt.Sprintf("[PATCH /repos/{owner}/{repo}/tag_protections/{id}][%d] repoEditTagProtectionLocked", 423)
}
func (o *RepoEditTagProtectionLocked) String() string {
return fmt.Sprintf("[PATCH /repos/{owner}/{repo}/tag_protections/{id}][%d] repoEditTagProtectionLocked", 423)
}
func (o *RepoEditTagProtectionLocked) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
// hydrates response header message
hdrMessage := response.GetHeader("message")
if hdrMessage != "" {
o.Message = hdrMessage
}
// hydrates response header url
hdrURL := response.GetHeader("url")
if hdrURL != "" {
o.URL = hdrURL
}
return nil
}

View File

@@ -1,173 +0,0 @@
// Code generated by go-swagger; DO NOT EDIT.
package repository
// This file was generated by the swagger tool.
// Editing this file might prove futile when you re-run the swagger generate command
import (
"context"
"net/http"
"time"
"github.com/go-openapi/errors"
"github.com/go-openapi/runtime"
cr "github.com/go-openapi/runtime/client"
"github.com/go-openapi/strfmt"
)
// NewRepoGetLicensesParams creates a new RepoGetLicensesParams object,
// with the default timeout for this client.
//
// Default values are not hydrated, since defaults are normally applied by the API server side.
//
// To enforce default values in parameter, use SetDefaults or WithDefaults.
func NewRepoGetLicensesParams() *RepoGetLicensesParams {
return &RepoGetLicensesParams{
timeout: cr.DefaultTimeout,
}
}
// NewRepoGetLicensesParamsWithTimeout creates a new RepoGetLicensesParams object
// with the ability to set a timeout on a request.
func NewRepoGetLicensesParamsWithTimeout(timeout time.Duration) *RepoGetLicensesParams {
return &RepoGetLicensesParams{
timeout: timeout,
}
}
// NewRepoGetLicensesParamsWithContext creates a new RepoGetLicensesParams object
// with the ability to set a context for a request.
func NewRepoGetLicensesParamsWithContext(ctx context.Context) *RepoGetLicensesParams {
return &RepoGetLicensesParams{
Context: ctx,
}
}
// NewRepoGetLicensesParamsWithHTTPClient creates a new RepoGetLicensesParams object
// with the ability to set a custom HTTPClient for a request.
func NewRepoGetLicensesParamsWithHTTPClient(client *http.Client) *RepoGetLicensesParams {
return &RepoGetLicensesParams{
HTTPClient: client,
}
}
/*
RepoGetLicensesParams contains all the parameters to send to the API endpoint
for the repo get licenses operation.
Typically these are written to a http.Request.
*/
type RepoGetLicensesParams struct {
/* Owner.
owner of the repo
*/
Owner string
/* Repo.
name of the repo
*/
Repo string
timeout time.Duration
Context context.Context
HTTPClient *http.Client
}
// WithDefaults hydrates default values in the repo get licenses params (not the query body).
//
// All values with no default are reset to their zero value.
func (o *RepoGetLicensesParams) WithDefaults() *RepoGetLicensesParams {
o.SetDefaults()
return o
}
// SetDefaults hydrates default values in the repo get licenses params (not the query body).
//
// All values with no default are reset to their zero value.
func (o *RepoGetLicensesParams) SetDefaults() {
// no default values defined for this parameter
}
// WithTimeout adds the timeout to the repo get licenses params
func (o *RepoGetLicensesParams) WithTimeout(timeout time.Duration) *RepoGetLicensesParams {
o.SetTimeout(timeout)
return o
}
// SetTimeout adds the timeout to the repo get licenses params
func (o *RepoGetLicensesParams) SetTimeout(timeout time.Duration) {
o.timeout = timeout
}
// WithContext adds the context to the repo get licenses params
func (o *RepoGetLicensesParams) WithContext(ctx context.Context) *RepoGetLicensesParams {
o.SetContext(ctx)
return o
}
// SetContext adds the context to the repo get licenses params
func (o *RepoGetLicensesParams) SetContext(ctx context.Context) {
o.Context = ctx
}
// WithHTTPClient adds the HTTPClient to the repo get licenses params
func (o *RepoGetLicensesParams) WithHTTPClient(client *http.Client) *RepoGetLicensesParams {
o.SetHTTPClient(client)
return o
}
// SetHTTPClient adds the HTTPClient to the repo get licenses params
func (o *RepoGetLicensesParams) SetHTTPClient(client *http.Client) {
o.HTTPClient = client
}
// WithOwner adds the owner to the repo get licenses params
func (o *RepoGetLicensesParams) WithOwner(owner string) *RepoGetLicensesParams {
o.SetOwner(owner)
return o
}
// SetOwner adds the owner to the repo get licenses params
func (o *RepoGetLicensesParams) SetOwner(owner string) {
o.Owner = owner
}
// WithRepo adds the repo to the repo get licenses params
func (o *RepoGetLicensesParams) WithRepo(repo string) *RepoGetLicensesParams {
o.SetRepo(repo)
return o
}
// SetRepo adds the repo to the repo get licenses params
func (o *RepoGetLicensesParams) SetRepo(repo string) {
o.Repo = repo
}
// WriteToRequest writes these params to a swagger request
func (o *RepoGetLicensesParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
if err := r.SetTimeout(o.timeout); err != nil {
return err
}
var res []error
// path param owner
if err := r.SetPathParam("owner", o.Owner); err != nil {
return err
}
// path param repo
if err := r.SetPathParam("repo", o.Repo); err != nil {
return err
}
if len(res) > 0 {
return errors.CompositeValidationError(res...)
}
return nil
}

View File

@@ -1,164 +0,0 @@
// Code generated by go-swagger; DO NOT EDIT.
package repository
// This file was generated by the swagger tool.
// Editing this file might prove futile when you re-run the swagger generate command
import (
"encoding/json"
"fmt"
"io"
"github.com/go-openapi/runtime"
"github.com/go-openapi/strfmt"
)
// RepoGetLicensesReader is a Reader for the RepoGetLicenses structure.
type RepoGetLicensesReader struct {
formats strfmt.Registry
}
// ReadResponse reads a server response into the received o.
func (o *RepoGetLicensesReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
switch response.Code() {
case 200:
result := NewRepoGetLicensesOK()
if err := result.readResponse(response, consumer, o.formats); err != nil {
return nil, err
}
return result, nil
case 404:
result := NewRepoGetLicensesNotFound()
if err := result.readResponse(response, consumer, o.formats); err != nil {
return nil, err
}
return nil, result
default:
return nil, runtime.NewAPIError("[GET /repos/{owner}/{repo}/licenses] repoGetLicenses", response, response.Code())
}
}
// NewRepoGetLicensesOK creates a RepoGetLicensesOK with default headers values
func NewRepoGetLicensesOK() *RepoGetLicensesOK {
return &RepoGetLicensesOK{}
}
/*
RepoGetLicensesOK describes a response with status code 200, with default header values.
LicensesList
*/
type RepoGetLicensesOK struct {
Payload []string
}
// IsSuccess returns true when this repo get licenses o k response has a 2xx status code
func (o *RepoGetLicensesOK) IsSuccess() bool {
return true
}
// IsRedirect returns true when this repo get licenses o k response has a 3xx status code
func (o *RepoGetLicensesOK) IsRedirect() bool {
return false
}
// IsClientError returns true when this repo get licenses o k response has a 4xx status code
func (o *RepoGetLicensesOK) IsClientError() bool {
return false
}
// IsServerError returns true when this repo get licenses o k response has a 5xx status code
func (o *RepoGetLicensesOK) IsServerError() bool {
return false
}
// IsCode returns true when this repo get licenses o k response a status code equal to that given
func (o *RepoGetLicensesOK) IsCode(code int) bool {
return code == 200
}
// Code gets the status code for the repo get licenses o k response
func (o *RepoGetLicensesOK) Code() int {
return 200
}
func (o *RepoGetLicensesOK) Error() string {
payload, _ := json.Marshal(o.Payload)
return fmt.Sprintf("[GET /repos/{owner}/{repo}/licenses][%d] repoGetLicensesOK %s", 200, payload)
}
func (o *RepoGetLicensesOK) String() string {
payload, _ := json.Marshal(o.Payload)
return fmt.Sprintf("[GET /repos/{owner}/{repo}/licenses][%d] repoGetLicensesOK %s", 200, payload)
}
func (o *RepoGetLicensesOK) GetPayload() []string {
return o.Payload
}
func (o *RepoGetLicensesOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
// response payload
if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {
return err
}
return nil
}
// NewRepoGetLicensesNotFound creates a RepoGetLicensesNotFound with default headers values
func NewRepoGetLicensesNotFound() *RepoGetLicensesNotFound {
return &RepoGetLicensesNotFound{}
}
/*
RepoGetLicensesNotFound describes a response with status code 404, with default header values.
APINotFound is a not found empty response
*/
type RepoGetLicensesNotFound struct {
}
// IsSuccess returns true when this repo get licenses not found response has a 2xx status code
func (o *RepoGetLicensesNotFound) IsSuccess() bool {
return false
}
// IsRedirect returns true when this repo get licenses not found response has a 3xx status code
func (o *RepoGetLicensesNotFound) IsRedirect() bool {
return false
}
// IsClientError returns true when this repo get licenses not found response has a 4xx status code
func (o *RepoGetLicensesNotFound) IsClientError() bool {
return true
}
// IsServerError returns true when this repo get licenses not found response has a 5xx status code
func (o *RepoGetLicensesNotFound) IsServerError() bool {
return false
}
// IsCode returns true when this repo get licenses not found response a status code equal to that given
func (o *RepoGetLicensesNotFound) IsCode(code int) bool {
return code == 404
}
// Code gets the status code for the repo get licenses not found response
func (o *RepoGetLicensesNotFound) Code() int {
return 404
}
func (o *RepoGetLicensesNotFound) Error() string {
return fmt.Sprintf("[GET /repos/{owner}/{repo}/licenses][%d] repoGetLicensesNotFound", 404)
}
func (o *RepoGetLicensesNotFound) String() string {
return fmt.Sprintf("[GET /repos/{owner}/{repo}/licenses][%d] repoGetLicensesNotFound", 404)
}
func (o *RepoGetLicensesNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
return nil
}

View File

@@ -63,7 +63,7 @@ type RepoGetRawFileOrLFSParams struct {
/* Filepath. /* Filepath.
path of the file to get, it should be "{ref}/{filepath}". If there is no ref could be inferred, it will be treated as the default branch filepath of the file to get
*/ */
Filepath string Filepath string
@@ -75,7 +75,7 @@ type RepoGetRawFileOrLFSParams struct {
/* Ref. /* Ref.
The name of the commit/branch/tag. Default the repositorys default branch The name of the commit/branch/tag. Default the repositorys default branch (usually master)
*/ */
Ref *string Ref *string

View File

@@ -63,7 +63,7 @@ type RepoGetRawFileParams struct {
/* Filepath. /* Filepath.
path of the file to get, it should be "{ref}/{filepath}". If there is no ref could be inferred, it will be treated as the default branch filepath of the file to get
*/ */
Filepath string Filepath string
@@ -75,7 +75,7 @@ type RepoGetRawFileParams struct {
/* Ref. /* Ref.
The name of the commit/branch/tag. Default the repositorys default branch The name of the commit/branch/tag. Default the repositorys default branch (usually master)
*/ */
Ref *string Ref *string

View File

@@ -27,7 +27,7 @@ func (o *RepoGetRunnerRegistrationTokenReader) ReadResponse(response runtime.Cli
} }
return result, nil return result, nil
default: default:
return nil, runtime.NewAPIError("[GET /repos/{owner}/{repo}/actions/runners/registration-token] repoGetRunnerRegistrationToken", response, response.Code()) return nil, runtime.NewAPIError("[GET /repos/{owner}/{repo}/runners/registration-token] repoGetRunnerRegistrationToken", response, response.Code())
} }
} }
@@ -76,11 +76,11 @@ func (o *RepoGetRunnerRegistrationTokenOK) Code() int {
} }
func (o *RepoGetRunnerRegistrationTokenOK) Error() string { func (o *RepoGetRunnerRegistrationTokenOK) Error() string {
return fmt.Sprintf("[GET /repos/{owner}/{repo}/actions/runners/registration-token][%d] repoGetRunnerRegistrationTokenOK", 200) return fmt.Sprintf("[GET /repos/{owner}/{repo}/runners/registration-token][%d] repoGetRunnerRegistrationTokenOK", 200)
} }
func (o *RepoGetRunnerRegistrationTokenOK) String() string { func (o *RepoGetRunnerRegistrationTokenOK) String() string {
return fmt.Sprintf("[GET /repos/{owner}/{repo}/actions/runners/registration-token][%d] repoGetRunnerRegistrationTokenOK", 200) return fmt.Sprintf("[GET /repos/{owner}/{repo}/runners/registration-token][%d] repoGetRunnerRegistrationTokenOK", 200)
} }
func (o *RepoGetRunnerRegistrationTokenOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { func (o *RepoGetRunnerRegistrationTokenOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {

View File

@@ -1,196 +0,0 @@
// Code generated by go-swagger; DO NOT EDIT.
package repository
// This file was generated by the swagger tool.
// Editing this file might prove futile when you re-run the swagger generate command
import (
"context"
"net/http"
"time"
"github.com/go-openapi/errors"
"github.com/go-openapi/runtime"
cr "github.com/go-openapi/runtime/client"
"github.com/go-openapi/strfmt"
"github.com/go-openapi/swag"
)
// NewRepoGetTagProtectionParams creates a new RepoGetTagProtectionParams object,
// with the default timeout for this client.
//
// Default values are not hydrated, since defaults are normally applied by the API server side.
//
// To enforce default values in parameter, use SetDefaults or WithDefaults.
func NewRepoGetTagProtectionParams() *RepoGetTagProtectionParams {
return &RepoGetTagProtectionParams{
timeout: cr.DefaultTimeout,
}
}
// NewRepoGetTagProtectionParamsWithTimeout creates a new RepoGetTagProtectionParams object
// with the ability to set a timeout on a request.
func NewRepoGetTagProtectionParamsWithTimeout(timeout time.Duration) *RepoGetTagProtectionParams {
return &RepoGetTagProtectionParams{
timeout: timeout,
}
}
// NewRepoGetTagProtectionParamsWithContext creates a new RepoGetTagProtectionParams object
// with the ability to set a context for a request.
func NewRepoGetTagProtectionParamsWithContext(ctx context.Context) *RepoGetTagProtectionParams {
return &RepoGetTagProtectionParams{
Context: ctx,
}
}
// NewRepoGetTagProtectionParamsWithHTTPClient creates a new RepoGetTagProtectionParams object
// with the ability to set a custom HTTPClient for a request.
func NewRepoGetTagProtectionParamsWithHTTPClient(client *http.Client) *RepoGetTagProtectionParams {
return &RepoGetTagProtectionParams{
HTTPClient: client,
}
}
/*
RepoGetTagProtectionParams contains all the parameters to send to the API endpoint
for the repo get tag protection operation.
Typically these are written to a http.Request.
*/
type RepoGetTagProtectionParams struct {
/* ID.
id of the tag protect to get
*/
ID int64
/* Owner.
owner of the repo
*/
Owner string
/* Repo.
name of the repo
*/
Repo string
timeout time.Duration
Context context.Context
HTTPClient *http.Client
}
// WithDefaults hydrates default values in the repo get tag protection params (not the query body).
//
// All values with no default are reset to their zero value.
func (o *RepoGetTagProtectionParams) WithDefaults() *RepoGetTagProtectionParams {
o.SetDefaults()
return o
}
// SetDefaults hydrates default values in the repo get tag protection params (not the query body).
//
// All values with no default are reset to their zero value.
func (o *RepoGetTagProtectionParams) SetDefaults() {
// no default values defined for this parameter
}
// WithTimeout adds the timeout to the repo get tag protection params
func (o *RepoGetTagProtectionParams) WithTimeout(timeout time.Duration) *RepoGetTagProtectionParams {
o.SetTimeout(timeout)
return o
}
// SetTimeout adds the timeout to the repo get tag protection params
func (o *RepoGetTagProtectionParams) SetTimeout(timeout time.Duration) {
o.timeout = timeout
}
// WithContext adds the context to the repo get tag protection params
func (o *RepoGetTagProtectionParams) WithContext(ctx context.Context) *RepoGetTagProtectionParams {
o.SetContext(ctx)
return o
}
// SetContext adds the context to the repo get tag protection params
func (o *RepoGetTagProtectionParams) SetContext(ctx context.Context) {
o.Context = ctx
}
// WithHTTPClient adds the HTTPClient to the repo get tag protection params
func (o *RepoGetTagProtectionParams) WithHTTPClient(client *http.Client) *RepoGetTagProtectionParams {
o.SetHTTPClient(client)
return o
}
// SetHTTPClient adds the HTTPClient to the repo get tag protection params
func (o *RepoGetTagProtectionParams) SetHTTPClient(client *http.Client) {
o.HTTPClient = client
}
// WithID adds the id to the repo get tag protection params
func (o *RepoGetTagProtectionParams) WithID(id int64) *RepoGetTagProtectionParams {
o.SetID(id)
return o
}
// SetID adds the id to the repo get tag protection params
func (o *RepoGetTagProtectionParams) SetID(id int64) {
o.ID = id
}
// WithOwner adds the owner to the repo get tag protection params
func (o *RepoGetTagProtectionParams) WithOwner(owner string) *RepoGetTagProtectionParams {
o.SetOwner(owner)
return o
}
// SetOwner adds the owner to the repo get tag protection params
func (o *RepoGetTagProtectionParams) SetOwner(owner string) {
o.Owner = owner
}
// WithRepo adds the repo to the repo get tag protection params
func (o *RepoGetTagProtectionParams) WithRepo(repo string) *RepoGetTagProtectionParams {
o.SetRepo(repo)
return o
}
// SetRepo adds the repo to the repo get tag protection params
func (o *RepoGetTagProtectionParams) SetRepo(repo string) {
o.Repo = repo
}
// WriteToRequest writes these params to a swagger request
func (o *RepoGetTagProtectionParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
if err := r.SetTimeout(o.timeout); err != nil {
return err
}
var res []error
// path param id
if err := r.SetPathParam("id", swag.FormatInt64(o.ID)); err != nil {
return err
}
// path param owner
if err := r.SetPathParam("owner", o.Owner); err != nil {
return err
}
// path param repo
if err := r.SetPathParam("repo", o.Repo); err != nil {
return err
}
if len(res) > 0 {
return errors.CompositeValidationError(res...)
}
return nil
}

View File

@@ -1,168 +0,0 @@
// Code generated by go-swagger; DO NOT EDIT.
package repository
// This file was generated by the swagger tool.
// Editing this file might prove futile when you re-run the swagger generate command
import (
"encoding/json"
"fmt"
"io"
"github.com/go-openapi/runtime"
"github.com/go-openapi/strfmt"
"src.opensuse.org/autogits/common/gitea-generated/models"
)
// RepoGetTagProtectionReader is a Reader for the RepoGetTagProtection structure.
type RepoGetTagProtectionReader struct {
formats strfmt.Registry
}
// ReadResponse reads a server response into the received o.
func (o *RepoGetTagProtectionReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
switch response.Code() {
case 200:
result := NewRepoGetTagProtectionOK()
if err := result.readResponse(response, consumer, o.formats); err != nil {
return nil, err
}
return result, nil
case 404:
result := NewRepoGetTagProtectionNotFound()
if err := result.readResponse(response, consumer, o.formats); err != nil {
return nil, err
}
return nil, result
default:
return nil, runtime.NewAPIError("[GET /repos/{owner}/{repo}/tag_protections/{id}] repoGetTagProtection", response, response.Code())
}
}
// NewRepoGetTagProtectionOK creates a RepoGetTagProtectionOK with default headers values
func NewRepoGetTagProtectionOK() *RepoGetTagProtectionOK {
return &RepoGetTagProtectionOK{}
}
/*
RepoGetTagProtectionOK describes a response with status code 200, with default header values.
TagProtection
*/
type RepoGetTagProtectionOK struct {
Payload *models.TagProtection
}
// IsSuccess returns true when this repo get tag protection o k response has a 2xx status code
func (o *RepoGetTagProtectionOK) IsSuccess() bool {
return true
}
// IsRedirect returns true when this repo get tag protection o k response has a 3xx status code
func (o *RepoGetTagProtectionOK) IsRedirect() bool {
return false
}
// IsClientError returns true when this repo get tag protection o k response has a 4xx status code
func (o *RepoGetTagProtectionOK) IsClientError() bool {
return false
}
// IsServerError returns true when this repo get tag protection o k response has a 5xx status code
func (o *RepoGetTagProtectionOK) IsServerError() bool {
return false
}
// IsCode returns true when this repo get tag protection o k response a status code equal to that given
func (o *RepoGetTagProtectionOK) IsCode(code int) bool {
return code == 200
}
// Code gets the status code for the repo get tag protection o k response
func (o *RepoGetTagProtectionOK) Code() int {
return 200
}
func (o *RepoGetTagProtectionOK) Error() string {
payload, _ := json.Marshal(o.Payload)
return fmt.Sprintf("[GET /repos/{owner}/{repo}/tag_protections/{id}][%d] repoGetTagProtectionOK %s", 200, payload)
}
func (o *RepoGetTagProtectionOK) String() string {
payload, _ := json.Marshal(o.Payload)
return fmt.Sprintf("[GET /repos/{owner}/{repo}/tag_protections/{id}][%d] repoGetTagProtectionOK %s", 200, payload)
}
func (o *RepoGetTagProtectionOK) GetPayload() *models.TagProtection {
return o.Payload
}
func (o *RepoGetTagProtectionOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
o.Payload = new(models.TagProtection)
// response payload
if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
return err
}
return nil
}
// NewRepoGetTagProtectionNotFound creates a RepoGetTagProtectionNotFound with default headers values
func NewRepoGetTagProtectionNotFound() *RepoGetTagProtectionNotFound {
return &RepoGetTagProtectionNotFound{}
}
/*
RepoGetTagProtectionNotFound describes a response with status code 404, with default header values.
APINotFound is a not found empty response
*/
type RepoGetTagProtectionNotFound struct {
}
// IsSuccess returns true when this repo get tag protection not found response has a 2xx status code
func (o *RepoGetTagProtectionNotFound) IsSuccess() bool {
return false
}
// IsRedirect returns true when this repo get tag protection not found response has a 3xx status code
func (o *RepoGetTagProtectionNotFound) IsRedirect() bool {
return false
}
// IsClientError returns true when this repo get tag protection not found response has a 4xx status code
func (o *RepoGetTagProtectionNotFound) IsClientError() bool {
return true
}
// IsServerError returns true when this repo get tag protection not found response has a 5xx status code
func (o *RepoGetTagProtectionNotFound) IsServerError() bool {
return false
}
// IsCode returns true when this repo get tag protection not found response a status code equal to that given
func (o *RepoGetTagProtectionNotFound) IsCode(code int) bool {
return code == 404
}
// Code gets the status code for the repo get tag protection not found response
func (o *RepoGetTagProtectionNotFound) Code() int {
return 404
}
func (o *RepoGetTagProtectionNotFound) Error() string {
return fmt.Sprintf("[GET /repos/{owner}/{repo}/tag_protections/{id}][%d] repoGetTagProtectionNotFound", 404)
}
func (o *RepoGetTagProtectionNotFound) String() string {
return fmt.Sprintf("[GET /repos/{owner}/{repo}/tag_protections/{id}][%d] repoGetTagProtectionNotFound", 404)
}
func (o *RepoGetTagProtectionNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
return nil
}

View File

@@ -70,7 +70,7 @@ type RepoListPullRequestsParams struct {
/* Limit. /* Limit.
Page size of results page size of results
*/ */
Limit *int64 Limit *int64
@@ -84,27 +84,19 @@ type RepoListPullRequestsParams struct {
/* Owner. /* Owner.
Owner of the repo owner of the repo
*/ */
Owner string Owner string
/* Page. /* Page.
Page number of results to return (1-based) page number of results to return (1-based)
Default: 1
*/ */
Page *int64 Page *int64
/* Poster.
Filter by pull request author
*/
Poster *string
/* Repo. /* Repo.
Name of the repo name of the repo
*/ */
Repo string Repo string
@@ -116,9 +108,7 @@ type RepoListPullRequestsParams struct {
/* State. /* State.
State of pull request State of pull request: open or closed (optional)
Default: "open"
*/ */
State *string State *string
@@ -139,21 +129,7 @@ func (o *RepoListPullRequestsParams) WithDefaults() *RepoListPullRequestsParams
// //
// All values with no default are reset to their zero value. // All values with no default are reset to their zero value.
func (o *RepoListPullRequestsParams) SetDefaults() { func (o *RepoListPullRequestsParams) SetDefaults() {
var ( // no default values defined for this parameter
pageDefault = int64(1)
stateDefault = string("open")
)
val := RepoListPullRequestsParams{
Page: &pageDefault,
State: &stateDefault,
}
val.timeout = o.timeout
val.Context = o.Context
val.HTTPClient = o.HTTPClient
*o = val
} }
// WithTimeout adds the timeout to the repo list pull requests params // WithTimeout adds the timeout to the repo list pull requests params
@@ -244,17 +220,6 @@ func (o *RepoListPullRequestsParams) SetPage(page *int64) {
o.Page = page o.Page = page
} }
// WithPoster adds the poster to the repo list pull requests params
func (o *RepoListPullRequestsParams) WithPoster(poster *string) *RepoListPullRequestsParams {
o.SetPoster(poster)
return o
}
// SetPoster adds the poster to the repo list pull requests params
func (o *RepoListPullRequestsParams) SetPoster(poster *string) {
o.Poster = poster
}
// WithRepo adds the repo to the repo list pull requests params // WithRepo adds the repo to the repo list pull requests params
func (o *RepoListPullRequestsParams) WithRepo(repo string) *RepoListPullRequestsParams { func (o *RepoListPullRequestsParams) WithRepo(repo string) *RepoListPullRequestsParams {
o.SetRepo(repo) o.SetRepo(repo)
@@ -363,23 +328,6 @@ func (o *RepoListPullRequestsParams) WriteToRequest(r runtime.ClientRequest, reg
} }
} }
if o.Poster != nil {
// query param poster
var qrPoster string
if o.Poster != nil {
qrPoster = *o.Poster
}
qPoster := qrPoster
if qPoster != "" {
if err := r.SetQueryParam("poster", qPoster); err != nil {
return err
}
}
}
// path param repo // path param repo
if err := r.SetPathParam("repo", o.Repo); err != nil { if err := r.SetPathParam("repo", o.Repo); err != nil {
return err return err

View File

@@ -36,12 +36,6 @@ func (o *RepoListPullRequestsReader) ReadResponse(response runtime.ClientRespons
return nil, err return nil, err
} }
return nil, result return nil, result
case 500:
result := NewRepoListPullRequestsInternalServerError()
if err := result.readResponse(response, consumer, o.formats); err != nil {
return nil, err
}
return nil, result
default: default:
return nil, runtime.NewAPIError("[GET /repos/{owner}/{repo}/pulls] repoListPullRequests", response, response.Code()) return nil, runtime.NewAPIError("[GET /repos/{owner}/{repo}/pulls] repoListPullRequests", response, response.Code())
} }
@@ -170,75 +164,3 @@ func (o *RepoListPullRequestsNotFound) readResponse(response runtime.ClientRespo
return nil return nil
} }
// NewRepoListPullRequestsInternalServerError creates a RepoListPullRequestsInternalServerError with default headers values
func NewRepoListPullRequestsInternalServerError() *RepoListPullRequestsInternalServerError {
return &RepoListPullRequestsInternalServerError{}
}
/*
RepoListPullRequestsInternalServerError describes a response with status code 500, with default header values.
APIError is error format response
*/
type RepoListPullRequestsInternalServerError struct {
Message string
URL string
}
// IsSuccess returns true when this repo list pull requests internal server error response has a 2xx status code
func (o *RepoListPullRequestsInternalServerError) IsSuccess() bool {
return false
}
// IsRedirect returns true when this repo list pull requests internal server error response has a 3xx status code
func (o *RepoListPullRequestsInternalServerError) IsRedirect() bool {
return false
}
// IsClientError returns true when this repo list pull requests internal server error response has a 4xx status code
func (o *RepoListPullRequestsInternalServerError) IsClientError() bool {
return false
}
// IsServerError returns true when this repo list pull requests internal server error response has a 5xx status code
func (o *RepoListPullRequestsInternalServerError) IsServerError() bool {
return true
}
// IsCode returns true when this repo list pull requests internal server error response a status code equal to that given
func (o *RepoListPullRequestsInternalServerError) IsCode(code int) bool {
return code == 500
}
// Code gets the status code for the repo list pull requests internal server error response
func (o *RepoListPullRequestsInternalServerError) Code() int {
return 500
}
func (o *RepoListPullRequestsInternalServerError) Error() string {
return fmt.Sprintf("[GET /repos/{owner}/{repo}/pulls][%d] repoListPullRequestsInternalServerError", 500)
}
func (o *RepoListPullRequestsInternalServerError) String() string {
return fmt.Sprintf("[GET /repos/{owner}/{repo}/pulls][%d] repoListPullRequestsInternalServerError", 500)
}
func (o *RepoListPullRequestsInternalServerError) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
// hydrates response header message
hdrMessage := response.GetHeader("message")
if hdrMessage != "" {
o.Message = hdrMessage
}
// hydrates response header url
hdrURL := response.GetHeader("url")
if hdrURL != "" {
o.URL = hdrURL
}
return nil
}

View File

@@ -1,173 +0,0 @@
// Code generated by go-swagger; DO NOT EDIT.
package repository
// This file was generated by the swagger tool.
// Editing this file might prove futile when you re-run the swagger generate command
import (
"context"
"net/http"
"time"
"github.com/go-openapi/errors"
"github.com/go-openapi/runtime"
cr "github.com/go-openapi/runtime/client"
"github.com/go-openapi/strfmt"
)
// NewRepoListTagProtectionParams creates a new RepoListTagProtectionParams object,
// with the default timeout for this client.
//
// Default values are not hydrated, since defaults are normally applied by the API server side.
//
// To enforce default values in parameter, use SetDefaults or WithDefaults.
func NewRepoListTagProtectionParams() *RepoListTagProtectionParams {
return &RepoListTagProtectionParams{
timeout: cr.DefaultTimeout,
}
}
// NewRepoListTagProtectionParamsWithTimeout creates a new RepoListTagProtectionParams object
// with the ability to set a timeout on a request.
func NewRepoListTagProtectionParamsWithTimeout(timeout time.Duration) *RepoListTagProtectionParams {
return &RepoListTagProtectionParams{
timeout: timeout,
}
}
// NewRepoListTagProtectionParamsWithContext creates a new RepoListTagProtectionParams object
// with the ability to set a context for a request.
func NewRepoListTagProtectionParamsWithContext(ctx context.Context) *RepoListTagProtectionParams {
return &RepoListTagProtectionParams{
Context: ctx,
}
}
// NewRepoListTagProtectionParamsWithHTTPClient creates a new RepoListTagProtectionParams object
// with the ability to set a custom HTTPClient for a request.
func NewRepoListTagProtectionParamsWithHTTPClient(client *http.Client) *RepoListTagProtectionParams {
return &RepoListTagProtectionParams{
HTTPClient: client,
}
}
/*
RepoListTagProtectionParams contains all the parameters to send to the API endpoint
for the repo list tag protection operation.
Typically these are written to a http.Request.
*/
type RepoListTagProtectionParams struct {
/* Owner.
owner of the repo
*/
Owner string
/* Repo.
name of the repo
*/
Repo string
timeout time.Duration
Context context.Context
HTTPClient *http.Client
}
// WithDefaults hydrates default values in the repo list tag protection params (not the query body).
//
// All values with no default are reset to their zero value.
func (o *RepoListTagProtectionParams) WithDefaults() *RepoListTagProtectionParams {
o.SetDefaults()
return o
}
// SetDefaults hydrates default values in the repo list tag protection params (not the query body).
//
// All values with no default are reset to their zero value.
func (o *RepoListTagProtectionParams) SetDefaults() {
// no default values defined for this parameter
}
// WithTimeout adds the timeout to the repo list tag protection params
func (o *RepoListTagProtectionParams) WithTimeout(timeout time.Duration) *RepoListTagProtectionParams {
o.SetTimeout(timeout)
return o
}
// SetTimeout adds the timeout to the repo list tag protection params
func (o *RepoListTagProtectionParams) SetTimeout(timeout time.Duration) {
o.timeout = timeout
}
// WithContext adds the context to the repo list tag protection params
func (o *RepoListTagProtectionParams) WithContext(ctx context.Context) *RepoListTagProtectionParams {
o.SetContext(ctx)
return o
}
// SetContext adds the context to the repo list tag protection params
func (o *RepoListTagProtectionParams) SetContext(ctx context.Context) {
o.Context = ctx
}
// WithHTTPClient adds the HTTPClient to the repo list tag protection params
func (o *RepoListTagProtectionParams) WithHTTPClient(client *http.Client) *RepoListTagProtectionParams {
o.SetHTTPClient(client)
return o
}
// SetHTTPClient adds the HTTPClient to the repo list tag protection params
func (o *RepoListTagProtectionParams) SetHTTPClient(client *http.Client) {
o.HTTPClient = client
}
// WithOwner adds the owner to the repo list tag protection params
func (o *RepoListTagProtectionParams) WithOwner(owner string) *RepoListTagProtectionParams {
o.SetOwner(owner)
return o
}
// SetOwner adds the owner to the repo list tag protection params
func (o *RepoListTagProtectionParams) SetOwner(owner string) {
o.Owner = owner
}
// WithRepo adds the repo to the repo list tag protection params
func (o *RepoListTagProtectionParams) WithRepo(repo string) *RepoListTagProtectionParams {
o.SetRepo(repo)
return o
}
// SetRepo adds the repo to the repo list tag protection params
func (o *RepoListTagProtectionParams) SetRepo(repo string) {
o.Repo = repo
}
// WriteToRequest writes these params to a swagger request
func (o *RepoListTagProtectionParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
if err := r.SetTimeout(o.timeout); err != nil {
return err
}
var res []error
// path param owner
if err := r.SetPathParam("owner", o.Owner); err != nil {
return err
}
// path param repo
if err := r.SetPathParam("repo", o.Repo); err != nil {
return err
}
if len(res) > 0 {
return errors.CompositeValidationError(res...)
}
return nil
}

View File

@@ -1,104 +0,0 @@
// Code generated by go-swagger; DO NOT EDIT.
package repository
// This file was generated by the swagger tool.
// Editing this file might prove futile when you re-run the swagger generate command
import (
"encoding/json"
"fmt"
"io"
"github.com/go-openapi/runtime"
"github.com/go-openapi/strfmt"
"src.opensuse.org/autogits/common/gitea-generated/models"
)
// RepoListTagProtectionReader is a Reader for the RepoListTagProtection structure.
type RepoListTagProtectionReader struct {
formats strfmt.Registry
}
// ReadResponse reads a server response into the received o.
func (o *RepoListTagProtectionReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
switch response.Code() {
case 200:
result := NewRepoListTagProtectionOK()
if err := result.readResponse(response, consumer, o.formats); err != nil {
return nil, err
}
return result, nil
default:
return nil, runtime.NewAPIError("[GET /repos/{owner}/{repo}/tag_protections] repoListTagProtection", response, response.Code())
}
}
// NewRepoListTagProtectionOK creates a RepoListTagProtectionOK with default headers values
func NewRepoListTagProtectionOK() *RepoListTagProtectionOK {
return &RepoListTagProtectionOK{}
}
/*
RepoListTagProtectionOK describes a response with status code 200, with default header values.
TagProtectionList
*/
type RepoListTagProtectionOK struct {
Payload []*models.TagProtection
}
// IsSuccess returns true when this repo list tag protection o k response has a 2xx status code
func (o *RepoListTagProtectionOK) IsSuccess() bool {
return true
}
// IsRedirect returns true when this repo list tag protection o k response has a 3xx status code
func (o *RepoListTagProtectionOK) IsRedirect() bool {
return false
}
// IsClientError returns true when this repo list tag protection o k response has a 4xx status code
func (o *RepoListTagProtectionOK) IsClientError() bool {
return false
}
// IsServerError returns true when this repo list tag protection o k response has a 5xx status code
func (o *RepoListTagProtectionOK) IsServerError() bool {
return false
}
// IsCode returns true when this repo list tag protection o k response a status code equal to that given
func (o *RepoListTagProtectionOK) IsCode(code int) bool {
return code == 200
}
// Code gets the status code for the repo list tag protection o k response
func (o *RepoListTagProtectionOK) Code() int {
return 200
}
func (o *RepoListTagProtectionOK) Error() string {
payload, _ := json.Marshal(o.Payload)
return fmt.Sprintf("[GET /repos/{owner}/{repo}/tag_protections][%d] repoListTagProtectionOK %s", 200, payload)
}
func (o *RepoListTagProtectionOK) String() string {
payload, _ := json.Marshal(o.Payload)
return fmt.Sprintf("[GET /repos/{owner}/{repo}/tag_protections][%d] repoListTagProtectionOK %s", 200, payload)
}
func (o *RepoListTagProtectionOK) GetPayload() []*models.TagProtection {
return o.Payload
}
func (o *RepoListTagProtectionOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
// response payload
if err := consumer.Consume(response.Body(), &o.Payload); err != nil && err != io.EOF {
return err
}
return nil
}

View File

@@ -1,194 +0,0 @@
// Code generated by go-swagger; DO NOT EDIT.
package repository
// This file was generated by the swagger tool.
// Editing this file might prove futile when you re-run the swagger generate command
import (
"context"
"net/http"
"time"
"github.com/go-openapi/errors"
"github.com/go-openapi/runtime"
cr "github.com/go-openapi/runtime/client"
"github.com/go-openapi/strfmt"
"src.opensuse.org/autogits/common/gitea-generated/models"
)
// NewRepoMergeUpstreamParams creates a new RepoMergeUpstreamParams object,
// with the default timeout for this client.
//
// Default values are not hydrated, since defaults are normally applied by the API server side.
//
// To enforce default values in parameter, use SetDefaults or WithDefaults.
func NewRepoMergeUpstreamParams() *RepoMergeUpstreamParams {
return &RepoMergeUpstreamParams{
timeout: cr.DefaultTimeout,
}
}
// NewRepoMergeUpstreamParamsWithTimeout creates a new RepoMergeUpstreamParams object
// with the ability to set a timeout on a request.
func NewRepoMergeUpstreamParamsWithTimeout(timeout time.Duration) *RepoMergeUpstreamParams {
return &RepoMergeUpstreamParams{
timeout: timeout,
}
}
// NewRepoMergeUpstreamParamsWithContext creates a new RepoMergeUpstreamParams object
// with the ability to set a context for a request.
func NewRepoMergeUpstreamParamsWithContext(ctx context.Context) *RepoMergeUpstreamParams {
return &RepoMergeUpstreamParams{
Context: ctx,
}
}
// NewRepoMergeUpstreamParamsWithHTTPClient creates a new RepoMergeUpstreamParams object
// with the ability to set a custom HTTPClient for a request.
func NewRepoMergeUpstreamParamsWithHTTPClient(client *http.Client) *RepoMergeUpstreamParams {
return &RepoMergeUpstreamParams{
HTTPClient: client,
}
}
/*
RepoMergeUpstreamParams contains all the parameters to send to the API endpoint
for the repo merge upstream operation.
Typically these are written to a http.Request.
*/
type RepoMergeUpstreamParams struct {
// Body.
Body *models.MergeUpstreamRequest
/* Owner.
owner of the repo
*/
Owner string
/* Repo.
name of the repo
*/
Repo string
timeout time.Duration
Context context.Context
HTTPClient *http.Client
}
// WithDefaults hydrates default values in the repo merge upstream params (not the query body).
//
// All values with no default are reset to their zero value.
func (o *RepoMergeUpstreamParams) WithDefaults() *RepoMergeUpstreamParams {
o.SetDefaults()
return o
}
// SetDefaults hydrates default values in the repo merge upstream params (not the query body).
//
// All values with no default are reset to their zero value.
func (o *RepoMergeUpstreamParams) SetDefaults() {
// no default values defined for this parameter
}
// WithTimeout adds the timeout to the repo merge upstream params
func (o *RepoMergeUpstreamParams) WithTimeout(timeout time.Duration) *RepoMergeUpstreamParams {
o.SetTimeout(timeout)
return o
}
// SetTimeout adds the timeout to the repo merge upstream params
func (o *RepoMergeUpstreamParams) SetTimeout(timeout time.Duration) {
o.timeout = timeout
}
// WithContext adds the context to the repo merge upstream params
func (o *RepoMergeUpstreamParams) WithContext(ctx context.Context) *RepoMergeUpstreamParams {
o.SetContext(ctx)
return o
}
// SetContext adds the context to the repo merge upstream params
func (o *RepoMergeUpstreamParams) SetContext(ctx context.Context) {
o.Context = ctx
}
// WithHTTPClient adds the HTTPClient to the repo merge upstream params
func (o *RepoMergeUpstreamParams) WithHTTPClient(client *http.Client) *RepoMergeUpstreamParams {
o.SetHTTPClient(client)
return o
}
// SetHTTPClient adds the HTTPClient to the repo merge upstream params
func (o *RepoMergeUpstreamParams) SetHTTPClient(client *http.Client) {
o.HTTPClient = client
}
// WithBody adds the body to the repo merge upstream params
func (o *RepoMergeUpstreamParams) WithBody(body *models.MergeUpstreamRequest) *RepoMergeUpstreamParams {
o.SetBody(body)
return o
}
// SetBody adds the body to the repo merge upstream params
func (o *RepoMergeUpstreamParams) SetBody(body *models.MergeUpstreamRequest) {
o.Body = body
}
// WithOwner adds the owner to the repo merge upstream params
func (o *RepoMergeUpstreamParams) WithOwner(owner string) *RepoMergeUpstreamParams {
o.SetOwner(owner)
return o
}
// SetOwner adds the owner to the repo merge upstream params
func (o *RepoMergeUpstreamParams) SetOwner(owner string) {
o.Owner = owner
}
// WithRepo adds the repo to the repo merge upstream params
func (o *RepoMergeUpstreamParams) WithRepo(repo string) *RepoMergeUpstreamParams {
o.SetRepo(repo)
return o
}
// SetRepo adds the repo to the repo merge upstream params
func (o *RepoMergeUpstreamParams) SetRepo(repo string) {
o.Repo = repo
}
// WriteToRequest writes these params to a swagger request
func (o *RepoMergeUpstreamParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
if err := r.SetTimeout(o.timeout); err != nil {
return err
}
var res []error
if o.Body != nil {
if err := r.SetBodyParam(o.Body); err != nil {
return err
}
}
// path param owner
if err := r.SetPathParam("owner", o.Owner); err != nil {
return err
}
// path param repo
if err := r.SetPathParam("repo", o.Repo); err != nil {
return err
}
if len(res) > 0 {
return errors.CompositeValidationError(res...)
}
return nil
}

View File

@@ -1,246 +0,0 @@
// Code generated by go-swagger; DO NOT EDIT.
package repository
// This file was generated by the swagger tool.
// Editing this file might prove futile when you re-run the swagger generate command
import (
"encoding/json"
"fmt"
"io"
"github.com/go-openapi/runtime"
"github.com/go-openapi/strfmt"
"src.opensuse.org/autogits/common/gitea-generated/models"
)
// RepoMergeUpstreamReader is a Reader for the RepoMergeUpstream structure.
type RepoMergeUpstreamReader struct {
formats strfmt.Registry
}
// ReadResponse reads a server response into the received o.
func (o *RepoMergeUpstreamReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
switch response.Code() {
case 200:
result := NewRepoMergeUpstreamOK()
if err := result.readResponse(response, consumer, o.formats); err != nil {
return nil, err
}
return result, nil
case 400:
result := NewRepoMergeUpstreamBadRequest()
if err := result.readResponse(response, consumer, o.formats); err != nil {
return nil, err
}
return nil, result
case 404:
result := NewRepoMergeUpstreamNotFound()
if err := result.readResponse(response, consumer, o.formats); err != nil {
return nil, err
}
return nil, result
default:
return nil, runtime.NewAPIError("[POST /repos/{owner}/{repo}/merge-upstream] repoMergeUpstream", response, response.Code())
}
}
// NewRepoMergeUpstreamOK creates a RepoMergeUpstreamOK with default headers values
func NewRepoMergeUpstreamOK() *RepoMergeUpstreamOK {
return &RepoMergeUpstreamOK{}
}
/*
RepoMergeUpstreamOK describes a response with status code 200, with default header values.
RepoMergeUpstreamOK repo merge upstream o k
*/
type RepoMergeUpstreamOK struct {
Payload *models.MergeUpstreamResponse
}
// IsSuccess returns true when this repo merge upstream o k response has a 2xx status code
func (o *RepoMergeUpstreamOK) IsSuccess() bool {
return true
}
// IsRedirect returns true when this repo merge upstream o k response has a 3xx status code
func (o *RepoMergeUpstreamOK) IsRedirect() bool {
return false
}
// IsClientError returns true when this repo merge upstream o k response has a 4xx status code
func (o *RepoMergeUpstreamOK) IsClientError() bool {
return false
}
// IsServerError returns true when this repo merge upstream o k response has a 5xx status code
func (o *RepoMergeUpstreamOK) IsServerError() bool {
return false
}
// IsCode returns true when this repo merge upstream o k response a status code equal to that given
func (o *RepoMergeUpstreamOK) IsCode(code int) bool {
return code == 200
}
// Code gets the status code for the repo merge upstream o k response
func (o *RepoMergeUpstreamOK) Code() int {
return 200
}
func (o *RepoMergeUpstreamOK) Error() string {
payload, _ := json.Marshal(o.Payload)
return fmt.Sprintf("[POST /repos/{owner}/{repo}/merge-upstream][%d] repoMergeUpstreamOK %s", 200, payload)
}
func (o *RepoMergeUpstreamOK) String() string {
payload, _ := json.Marshal(o.Payload)
return fmt.Sprintf("[POST /repos/{owner}/{repo}/merge-upstream][%d] repoMergeUpstreamOK %s", 200, payload)
}
func (o *RepoMergeUpstreamOK) GetPayload() *models.MergeUpstreamResponse {
return o.Payload
}
func (o *RepoMergeUpstreamOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
o.Payload = new(models.MergeUpstreamResponse)
// response payload
if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF {
return err
}
return nil
}
// NewRepoMergeUpstreamBadRequest creates a RepoMergeUpstreamBadRequest with default headers values
func NewRepoMergeUpstreamBadRequest() *RepoMergeUpstreamBadRequest {
return &RepoMergeUpstreamBadRequest{}
}
/*
RepoMergeUpstreamBadRequest describes a response with status code 400, with default header values.
APIError is error format response
*/
type RepoMergeUpstreamBadRequest struct {
Message string
URL string
}
// IsSuccess returns true when this repo merge upstream bad request response has a 2xx status code
func (o *RepoMergeUpstreamBadRequest) IsSuccess() bool {
return false
}
// IsRedirect returns true when this repo merge upstream bad request response has a 3xx status code
func (o *RepoMergeUpstreamBadRequest) IsRedirect() bool {
return false
}
// IsClientError returns true when this repo merge upstream bad request response has a 4xx status code
func (o *RepoMergeUpstreamBadRequest) IsClientError() bool {
return true
}
// IsServerError returns true when this repo merge upstream bad request response has a 5xx status code
func (o *RepoMergeUpstreamBadRequest) IsServerError() bool {
return false
}
// IsCode returns true when this repo merge upstream bad request response a status code equal to that given
func (o *RepoMergeUpstreamBadRequest) IsCode(code int) bool {
return code == 400
}
// Code gets the status code for the repo merge upstream bad request response
func (o *RepoMergeUpstreamBadRequest) Code() int {
return 400
}
func (o *RepoMergeUpstreamBadRequest) Error() string {
return fmt.Sprintf("[POST /repos/{owner}/{repo}/merge-upstream][%d] repoMergeUpstreamBadRequest", 400)
}
func (o *RepoMergeUpstreamBadRequest) String() string {
return fmt.Sprintf("[POST /repos/{owner}/{repo}/merge-upstream][%d] repoMergeUpstreamBadRequest", 400)
}
func (o *RepoMergeUpstreamBadRequest) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
// hydrates response header message
hdrMessage := response.GetHeader("message")
if hdrMessage != "" {
o.Message = hdrMessage
}
// hydrates response header url
hdrURL := response.GetHeader("url")
if hdrURL != "" {
o.URL = hdrURL
}
return nil
}
// NewRepoMergeUpstreamNotFound creates a RepoMergeUpstreamNotFound with default headers values
func NewRepoMergeUpstreamNotFound() *RepoMergeUpstreamNotFound {
return &RepoMergeUpstreamNotFound{}
}
/*
RepoMergeUpstreamNotFound describes a response with status code 404, with default header values.
APINotFound is a not found empty response
*/
type RepoMergeUpstreamNotFound struct {
}
// IsSuccess returns true when this repo merge upstream not found response has a 2xx status code
func (o *RepoMergeUpstreamNotFound) IsSuccess() bool {
return false
}
// IsRedirect returns true when this repo merge upstream not found response has a 3xx status code
func (o *RepoMergeUpstreamNotFound) IsRedirect() bool {
return false
}
// IsClientError returns true when this repo merge upstream not found response has a 4xx status code
func (o *RepoMergeUpstreamNotFound) IsClientError() bool {
return true
}
// IsServerError returns true when this repo merge upstream not found response has a 5xx status code
func (o *RepoMergeUpstreamNotFound) IsServerError() bool {
return false
}
// IsCode returns true when this repo merge upstream not found response a status code equal to that given
func (o *RepoMergeUpstreamNotFound) IsCode(code int) bool {
return code == 404
}
// Code gets the status code for the repo merge upstream not found response
func (o *RepoMergeUpstreamNotFound) Code() int {
return 404
}
func (o *RepoMergeUpstreamNotFound) Error() string {
return fmt.Sprintf("[POST /repos/{owner}/{repo}/merge-upstream][%d] repoMergeUpstreamNotFound", 404)
}
func (o *RepoMergeUpstreamNotFound) String() string {
return fmt.Sprintf("[POST /repos/{owner}/{repo}/merge-upstream][%d] repoMergeUpstreamNotFound", 404)
}
func (o *RepoMergeUpstreamNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
return nil
}

View File

@@ -132,7 +132,7 @@ type RepoSearchParams struct {
/* Sort. /* Sort.
sort repos by attribute. Supported values are "alpha", "created", "updated", "size", "git_size", "lfs_size", "stars", "forks" and "id". Default is "alpha" sort repos by attribute. Supported values are "alpha", "created", "updated", "size", and "id". Default is "alpha"
*/ */
Sort *string Sort *string

View File

@@ -1,216 +0,0 @@
// Code generated by go-swagger; DO NOT EDIT.
package repository
// This file was generated by the swagger tool.
// Editing this file might prove futile when you re-run the swagger generate command
import (
"context"
"net/http"
"time"
"github.com/go-openapi/errors"
"github.com/go-openapi/runtime"
cr "github.com/go-openapi/runtime/client"
"github.com/go-openapi/strfmt"
"src.opensuse.org/autogits/common/gitea-generated/models"
)
// NewRepoUpdateBranchParams creates a new RepoUpdateBranchParams object,
// with the default timeout for this client.
//
// Default values are not hydrated, since defaults are normally applied by the API server side.
//
// To enforce default values in parameter, use SetDefaults or WithDefaults.
func NewRepoUpdateBranchParams() *RepoUpdateBranchParams {
return &RepoUpdateBranchParams{
timeout: cr.DefaultTimeout,
}
}
// NewRepoUpdateBranchParamsWithTimeout creates a new RepoUpdateBranchParams object
// with the ability to set a timeout on a request.
func NewRepoUpdateBranchParamsWithTimeout(timeout time.Duration) *RepoUpdateBranchParams {
return &RepoUpdateBranchParams{
timeout: timeout,
}
}
// NewRepoUpdateBranchParamsWithContext creates a new RepoUpdateBranchParams object
// with the ability to set a context for a request.
func NewRepoUpdateBranchParamsWithContext(ctx context.Context) *RepoUpdateBranchParams {
return &RepoUpdateBranchParams{
Context: ctx,
}
}
// NewRepoUpdateBranchParamsWithHTTPClient creates a new RepoUpdateBranchParams object
// with the ability to set a custom HTTPClient for a request.
func NewRepoUpdateBranchParamsWithHTTPClient(client *http.Client) *RepoUpdateBranchParams {
return &RepoUpdateBranchParams{
HTTPClient: client,
}
}
/*
RepoUpdateBranchParams contains all the parameters to send to the API endpoint
for the repo update branch operation.
Typically these are written to a http.Request.
*/
type RepoUpdateBranchParams struct {
// Body.
Body *models.UpdateBranchRepoOption
/* Branch.
name of the branch
*/
Branch string
/* Owner.
owner of the repo
*/
Owner string
/* Repo.
name of the repo
*/
Repo string
timeout time.Duration
Context context.Context
HTTPClient *http.Client
}
// WithDefaults hydrates default values in the repo update branch params (not the query body).
//
// All values with no default are reset to their zero value.
func (o *RepoUpdateBranchParams) WithDefaults() *RepoUpdateBranchParams {
o.SetDefaults()
return o
}
// SetDefaults hydrates default values in the repo update branch params (not the query body).
//
// All values with no default are reset to their zero value.
func (o *RepoUpdateBranchParams) SetDefaults() {
// no default values defined for this parameter
}
// WithTimeout adds the timeout to the repo update branch params
func (o *RepoUpdateBranchParams) WithTimeout(timeout time.Duration) *RepoUpdateBranchParams {
o.SetTimeout(timeout)
return o
}
// SetTimeout adds the timeout to the repo update branch params
func (o *RepoUpdateBranchParams) SetTimeout(timeout time.Duration) {
o.timeout = timeout
}
// WithContext adds the context to the repo update branch params
func (o *RepoUpdateBranchParams) WithContext(ctx context.Context) *RepoUpdateBranchParams {
o.SetContext(ctx)
return o
}
// SetContext adds the context to the repo update branch params
func (o *RepoUpdateBranchParams) SetContext(ctx context.Context) {
o.Context = ctx
}
// WithHTTPClient adds the HTTPClient to the repo update branch params
func (o *RepoUpdateBranchParams) WithHTTPClient(client *http.Client) *RepoUpdateBranchParams {
o.SetHTTPClient(client)
return o
}
// SetHTTPClient adds the HTTPClient to the repo update branch params
func (o *RepoUpdateBranchParams) SetHTTPClient(client *http.Client) {
o.HTTPClient = client
}
// WithBody adds the body to the repo update branch params
func (o *RepoUpdateBranchParams) WithBody(body *models.UpdateBranchRepoOption) *RepoUpdateBranchParams {
o.SetBody(body)
return o
}
// SetBody adds the body to the repo update branch params
func (o *RepoUpdateBranchParams) SetBody(body *models.UpdateBranchRepoOption) {
o.Body = body
}
// WithBranch adds the branch to the repo update branch params
func (o *RepoUpdateBranchParams) WithBranch(branch string) *RepoUpdateBranchParams {
o.SetBranch(branch)
return o
}
// SetBranch adds the branch to the repo update branch params
func (o *RepoUpdateBranchParams) SetBranch(branch string) {
o.Branch = branch
}
// WithOwner adds the owner to the repo update branch params
func (o *RepoUpdateBranchParams) WithOwner(owner string) *RepoUpdateBranchParams {
o.SetOwner(owner)
return o
}
// SetOwner adds the owner to the repo update branch params
func (o *RepoUpdateBranchParams) SetOwner(owner string) {
o.Owner = owner
}
// WithRepo adds the repo to the repo update branch params
func (o *RepoUpdateBranchParams) WithRepo(repo string) *RepoUpdateBranchParams {
o.SetRepo(repo)
return o
}
// SetRepo adds the repo to the repo update branch params
func (o *RepoUpdateBranchParams) SetRepo(repo string) {
o.Repo = repo
}
// WriteToRequest writes these params to a swagger request
func (o *RepoUpdateBranchParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
if err := r.SetTimeout(o.timeout); err != nil {
return err
}
var res []error
if o.Body != nil {
if err := r.SetBodyParam(o.Body); err != nil {
return err
}
}
// path param branch
if err := r.SetPathParam("branch", o.Branch); err != nil {
return err
}
// path param owner
if err := r.SetPathParam("owner", o.Owner); err != nil {
return err
}
// path param repo
if err := r.SetPathParam("repo", o.Repo); err != nil {
return err
}
if len(res) > 0 {
return errors.CompositeValidationError(res...)
}
return nil
}

View File

@@ -1,194 +0,0 @@
// Code generated by go-swagger; DO NOT EDIT.
package repository
// This file was generated by the swagger tool.
// Editing this file might prove futile when you re-run the swagger generate command
import (
"context"
"net/http"
"time"
"github.com/go-openapi/errors"
"github.com/go-openapi/runtime"
cr "github.com/go-openapi/runtime/client"
"github.com/go-openapi/strfmt"
"src.opensuse.org/autogits/common/gitea-generated/models"
)
// NewRepoUpdateBranchProtectionPrioriesParams creates a new RepoUpdateBranchProtectionPrioriesParams object,
// with the default timeout for this client.
//
// Default values are not hydrated, since defaults are normally applied by the API server side.
//
// To enforce default values in parameter, use SetDefaults or WithDefaults.
func NewRepoUpdateBranchProtectionPrioriesParams() *RepoUpdateBranchProtectionPrioriesParams {
return &RepoUpdateBranchProtectionPrioriesParams{
timeout: cr.DefaultTimeout,
}
}
// NewRepoUpdateBranchProtectionPrioriesParamsWithTimeout creates a new RepoUpdateBranchProtectionPrioriesParams object
// with the ability to set a timeout on a request.
func NewRepoUpdateBranchProtectionPrioriesParamsWithTimeout(timeout time.Duration) *RepoUpdateBranchProtectionPrioriesParams {
return &RepoUpdateBranchProtectionPrioriesParams{
timeout: timeout,
}
}
// NewRepoUpdateBranchProtectionPrioriesParamsWithContext creates a new RepoUpdateBranchProtectionPrioriesParams object
// with the ability to set a context for a request.
func NewRepoUpdateBranchProtectionPrioriesParamsWithContext(ctx context.Context) *RepoUpdateBranchProtectionPrioriesParams {
return &RepoUpdateBranchProtectionPrioriesParams{
Context: ctx,
}
}
// NewRepoUpdateBranchProtectionPrioriesParamsWithHTTPClient creates a new RepoUpdateBranchProtectionPrioriesParams object
// with the ability to set a custom HTTPClient for a request.
func NewRepoUpdateBranchProtectionPrioriesParamsWithHTTPClient(client *http.Client) *RepoUpdateBranchProtectionPrioriesParams {
return &RepoUpdateBranchProtectionPrioriesParams{
HTTPClient: client,
}
}
/*
RepoUpdateBranchProtectionPrioriesParams contains all the parameters to send to the API endpoint
for the repo update branch protection priories operation.
Typically these are written to a http.Request.
*/
type RepoUpdateBranchProtectionPrioriesParams struct {
// Body.
Body *models.UpdateBranchProtectionPriories
/* Owner.
owner of the repo
*/
Owner string
/* Repo.
name of the repo
*/
Repo string
timeout time.Duration
Context context.Context
HTTPClient *http.Client
}
// WithDefaults hydrates default values in the repo update branch protection priories params (not the query body).
//
// All values with no default are reset to their zero value.
func (o *RepoUpdateBranchProtectionPrioriesParams) WithDefaults() *RepoUpdateBranchProtectionPrioriesParams {
o.SetDefaults()
return o
}
// SetDefaults hydrates default values in the repo update branch protection priories params (not the query body).
//
// All values with no default are reset to their zero value.
func (o *RepoUpdateBranchProtectionPrioriesParams) SetDefaults() {
// no default values defined for this parameter
}
// WithTimeout adds the timeout to the repo update branch protection priories params
func (o *RepoUpdateBranchProtectionPrioriesParams) WithTimeout(timeout time.Duration) *RepoUpdateBranchProtectionPrioriesParams {
o.SetTimeout(timeout)
return o
}
// SetTimeout adds the timeout to the repo update branch protection priories params
func (o *RepoUpdateBranchProtectionPrioriesParams) SetTimeout(timeout time.Duration) {
o.timeout = timeout
}
// WithContext adds the context to the repo update branch protection priories params
func (o *RepoUpdateBranchProtectionPrioriesParams) WithContext(ctx context.Context) *RepoUpdateBranchProtectionPrioriesParams {
o.SetContext(ctx)
return o
}
// SetContext adds the context to the repo update branch protection priories params
func (o *RepoUpdateBranchProtectionPrioriesParams) SetContext(ctx context.Context) {
o.Context = ctx
}
// WithHTTPClient adds the HTTPClient to the repo update branch protection priories params
func (o *RepoUpdateBranchProtectionPrioriesParams) WithHTTPClient(client *http.Client) *RepoUpdateBranchProtectionPrioriesParams {
o.SetHTTPClient(client)
return o
}
// SetHTTPClient adds the HTTPClient to the repo update branch protection priories params
func (o *RepoUpdateBranchProtectionPrioriesParams) SetHTTPClient(client *http.Client) {
o.HTTPClient = client
}
// WithBody adds the body to the repo update branch protection priories params
func (o *RepoUpdateBranchProtectionPrioriesParams) WithBody(body *models.UpdateBranchProtectionPriories) *RepoUpdateBranchProtectionPrioriesParams {
o.SetBody(body)
return o
}
// SetBody adds the body to the repo update branch protection priories params
func (o *RepoUpdateBranchProtectionPrioriesParams) SetBody(body *models.UpdateBranchProtectionPriories) {
o.Body = body
}
// WithOwner adds the owner to the repo update branch protection priories params
func (o *RepoUpdateBranchProtectionPrioriesParams) WithOwner(owner string) *RepoUpdateBranchProtectionPrioriesParams {
o.SetOwner(owner)
return o
}
// SetOwner adds the owner to the repo update branch protection priories params
func (o *RepoUpdateBranchProtectionPrioriesParams) SetOwner(owner string) {
o.Owner = owner
}
// WithRepo adds the repo to the repo update branch protection priories params
func (o *RepoUpdateBranchProtectionPrioriesParams) WithRepo(repo string) *RepoUpdateBranchProtectionPrioriesParams {
o.SetRepo(repo)
return o
}
// SetRepo adds the repo to the repo update branch protection priories params
func (o *RepoUpdateBranchProtectionPrioriesParams) SetRepo(repo string) {
o.Repo = repo
}
// WriteToRequest writes these params to a swagger request
func (o *RepoUpdateBranchProtectionPrioriesParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error {
if err := r.SetTimeout(o.timeout); err != nil {
return err
}
var res []error
if o.Body != nil {
if err := r.SetBodyParam(o.Body); err != nil {
return err
}
}
// path param owner
if err := r.SetPathParam("owner", o.Owner); err != nil {
return err
}
// path param repo
if err := r.SetPathParam("repo", o.Repo); err != nil {
return err
}
if len(res) > 0 {
return errors.CompositeValidationError(res...)
}
return nil
}

View File

@@ -1,306 +0,0 @@
// Code generated by go-swagger; DO NOT EDIT.
package repository
// This file was generated by the swagger tool.
// Editing this file might prove futile when you re-run the swagger generate command
import (
"fmt"
"github.com/go-openapi/runtime"
"github.com/go-openapi/strfmt"
)
// RepoUpdateBranchProtectionPrioriesReader is a Reader for the RepoUpdateBranchProtectionPriories structure.
type RepoUpdateBranchProtectionPrioriesReader struct {
formats strfmt.Registry
}
// ReadResponse reads a server response into the received o.
func (o *RepoUpdateBranchProtectionPrioriesReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
switch response.Code() {
case 204:
result := NewRepoUpdateBranchProtectionPrioriesNoContent()
if err := result.readResponse(response, consumer, o.formats); err != nil {
return nil, err
}
return result, nil
case 404:
result := NewRepoUpdateBranchProtectionPrioriesNotFound()
if err := result.readResponse(response, consumer, o.formats); err != nil {
return nil, err
}
return nil, result
case 422:
result := NewRepoUpdateBranchProtectionPrioriesUnprocessableEntity()
if err := result.readResponse(response, consumer, o.formats); err != nil {
return nil, err
}
return nil, result
case 423:
result := NewRepoUpdateBranchProtectionPrioriesLocked()
if err := result.readResponse(response, consumer, o.formats); err != nil {
return nil, err
}
return nil, result
default:
return nil, runtime.NewAPIError("[POST /repos/{owner}/{repo}/branch_protections/priority] repoUpdateBranchProtectionPriories", response, response.Code())
}
}
// NewRepoUpdateBranchProtectionPrioriesNoContent creates a RepoUpdateBranchProtectionPrioriesNoContent with default headers values
func NewRepoUpdateBranchProtectionPrioriesNoContent() *RepoUpdateBranchProtectionPrioriesNoContent {
return &RepoUpdateBranchProtectionPrioriesNoContent{}
}
/*
RepoUpdateBranchProtectionPrioriesNoContent describes a response with status code 204, with default header values.
APIEmpty is an empty response
*/
type RepoUpdateBranchProtectionPrioriesNoContent struct {
}
// IsSuccess returns true when this repo update branch protection priories no content response has a 2xx status code
func (o *RepoUpdateBranchProtectionPrioriesNoContent) IsSuccess() bool {
return true
}
// IsRedirect returns true when this repo update branch protection priories no content response has a 3xx status code
func (o *RepoUpdateBranchProtectionPrioriesNoContent) IsRedirect() bool {
return false
}
// IsClientError returns true when this repo update branch protection priories no content response has a 4xx status code
func (o *RepoUpdateBranchProtectionPrioriesNoContent) IsClientError() bool {
return false
}
// IsServerError returns true when this repo update branch protection priories no content response has a 5xx status code
func (o *RepoUpdateBranchProtectionPrioriesNoContent) IsServerError() bool {
return false
}
// IsCode returns true when this repo update branch protection priories no content response a status code equal to that given
func (o *RepoUpdateBranchProtectionPrioriesNoContent) IsCode(code int) bool {
return code == 204
}
// Code gets the status code for the repo update branch protection priories no content response
func (o *RepoUpdateBranchProtectionPrioriesNoContent) Code() int {
return 204
}
func (o *RepoUpdateBranchProtectionPrioriesNoContent) Error() string {
return fmt.Sprintf("[POST /repos/{owner}/{repo}/branch_protections/priority][%d] repoUpdateBranchProtectionPrioriesNoContent", 204)
}
func (o *RepoUpdateBranchProtectionPrioriesNoContent) String() string {
return fmt.Sprintf("[POST /repos/{owner}/{repo}/branch_protections/priority][%d] repoUpdateBranchProtectionPrioriesNoContent", 204)
}
func (o *RepoUpdateBranchProtectionPrioriesNoContent) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
return nil
}
// NewRepoUpdateBranchProtectionPrioriesNotFound creates a RepoUpdateBranchProtectionPrioriesNotFound with default headers values
func NewRepoUpdateBranchProtectionPrioriesNotFound() *RepoUpdateBranchProtectionPrioriesNotFound {
return &RepoUpdateBranchProtectionPrioriesNotFound{}
}
/*
RepoUpdateBranchProtectionPrioriesNotFound describes a response with status code 404, with default header values.
APINotFound is a not found empty response
*/
type RepoUpdateBranchProtectionPrioriesNotFound struct {
}
// IsSuccess returns true when this repo update branch protection priories not found response has a 2xx status code
func (o *RepoUpdateBranchProtectionPrioriesNotFound) IsSuccess() bool {
return false
}
// IsRedirect returns true when this repo update branch protection priories not found response has a 3xx status code
func (o *RepoUpdateBranchProtectionPrioriesNotFound) IsRedirect() bool {
return false
}
// IsClientError returns true when this repo update branch protection priories not found response has a 4xx status code
func (o *RepoUpdateBranchProtectionPrioriesNotFound) IsClientError() bool {
return true
}
// IsServerError returns true when this repo update branch protection priories not found response has a 5xx status code
func (o *RepoUpdateBranchProtectionPrioriesNotFound) IsServerError() bool {
return false
}
// IsCode returns true when this repo update branch protection priories not found response a status code equal to that given
func (o *RepoUpdateBranchProtectionPrioriesNotFound) IsCode(code int) bool {
return code == 404
}
// Code gets the status code for the repo update branch protection priories not found response
func (o *RepoUpdateBranchProtectionPrioriesNotFound) Code() int {
return 404
}
func (o *RepoUpdateBranchProtectionPrioriesNotFound) Error() string {
return fmt.Sprintf("[POST /repos/{owner}/{repo}/branch_protections/priority][%d] repoUpdateBranchProtectionPrioriesNotFound", 404)
}
func (o *RepoUpdateBranchProtectionPrioriesNotFound) String() string {
return fmt.Sprintf("[POST /repos/{owner}/{repo}/branch_protections/priority][%d] repoUpdateBranchProtectionPrioriesNotFound", 404)
}
func (o *RepoUpdateBranchProtectionPrioriesNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
return nil
}
// NewRepoUpdateBranchProtectionPrioriesUnprocessableEntity creates a RepoUpdateBranchProtectionPrioriesUnprocessableEntity with default headers values
func NewRepoUpdateBranchProtectionPrioriesUnprocessableEntity() *RepoUpdateBranchProtectionPrioriesUnprocessableEntity {
return &RepoUpdateBranchProtectionPrioriesUnprocessableEntity{}
}
/*
RepoUpdateBranchProtectionPrioriesUnprocessableEntity describes a response with status code 422, with default header values.
APIValidationError is error format response related to input validation
*/
type RepoUpdateBranchProtectionPrioriesUnprocessableEntity struct {
Message string
URL string
}
// IsSuccess returns true when this repo update branch protection priories unprocessable entity response has a 2xx status code
func (o *RepoUpdateBranchProtectionPrioriesUnprocessableEntity) IsSuccess() bool {
return false
}
// IsRedirect returns true when this repo update branch protection priories unprocessable entity response has a 3xx status code
func (o *RepoUpdateBranchProtectionPrioriesUnprocessableEntity) IsRedirect() bool {
return false
}
// IsClientError returns true when this repo update branch protection priories unprocessable entity response has a 4xx status code
func (o *RepoUpdateBranchProtectionPrioriesUnprocessableEntity) IsClientError() bool {
return true
}
// IsServerError returns true when this repo update branch protection priories unprocessable entity response has a 5xx status code
func (o *RepoUpdateBranchProtectionPrioriesUnprocessableEntity) IsServerError() bool {
return false
}
// IsCode returns true when this repo update branch protection priories unprocessable entity response a status code equal to that given
func (o *RepoUpdateBranchProtectionPrioriesUnprocessableEntity) IsCode(code int) bool {
return code == 422
}
// Code gets the status code for the repo update branch protection priories unprocessable entity response
func (o *RepoUpdateBranchProtectionPrioriesUnprocessableEntity) Code() int {
return 422
}
func (o *RepoUpdateBranchProtectionPrioriesUnprocessableEntity) Error() string {
return fmt.Sprintf("[POST /repos/{owner}/{repo}/branch_protections/priority][%d] repoUpdateBranchProtectionPrioriesUnprocessableEntity", 422)
}
func (o *RepoUpdateBranchProtectionPrioriesUnprocessableEntity) String() string {
return fmt.Sprintf("[POST /repos/{owner}/{repo}/branch_protections/priority][%d] repoUpdateBranchProtectionPrioriesUnprocessableEntity", 422)
}
func (o *RepoUpdateBranchProtectionPrioriesUnprocessableEntity) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
// hydrates response header message
hdrMessage := response.GetHeader("message")
if hdrMessage != "" {
o.Message = hdrMessage
}
// hydrates response header url
hdrURL := response.GetHeader("url")
if hdrURL != "" {
o.URL = hdrURL
}
return nil
}
// NewRepoUpdateBranchProtectionPrioriesLocked creates a RepoUpdateBranchProtectionPrioriesLocked with default headers values
func NewRepoUpdateBranchProtectionPrioriesLocked() *RepoUpdateBranchProtectionPrioriesLocked {
return &RepoUpdateBranchProtectionPrioriesLocked{}
}
/*
RepoUpdateBranchProtectionPrioriesLocked describes a response with status code 423, with default header values.
APIRepoArchivedError is an error that is raised when an archived repo should be modified
*/
type RepoUpdateBranchProtectionPrioriesLocked struct {
Message string
URL string
}
// IsSuccess returns true when this repo update branch protection priories locked response has a 2xx status code
func (o *RepoUpdateBranchProtectionPrioriesLocked) IsSuccess() bool {
return false
}
// IsRedirect returns true when this repo update branch protection priories locked response has a 3xx status code
func (o *RepoUpdateBranchProtectionPrioriesLocked) IsRedirect() bool {
return false
}
// IsClientError returns true when this repo update branch protection priories locked response has a 4xx status code
func (o *RepoUpdateBranchProtectionPrioriesLocked) IsClientError() bool {
return true
}
// IsServerError returns true when this repo update branch protection priories locked response has a 5xx status code
func (o *RepoUpdateBranchProtectionPrioriesLocked) IsServerError() bool {
return false
}
// IsCode returns true when this repo update branch protection priories locked response a status code equal to that given
func (o *RepoUpdateBranchProtectionPrioriesLocked) IsCode(code int) bool {
return code == 423
}
// Code gets the status code for the repo update branch protection priories locked response
func (o *RepoUpdateBranchProtectionPrioriesLocked) Code() int {
return 423
}
func (o *RepoUpdateBranchProtectionPrioriesLocked) Error() string {
return fmt.Sprintf("[POST /repos/{owner}/{repo}/branch_protections/priority][%d] repoUpdateBranchProtectionPrioriesLocked", 423)
}
func (o *RepoUpdateBranchProtectionPrioriesLocked) String() string {
return fmt.Sprintf("[POST /repos/{owner}/{repo}/branch_protections/priority][%d] repoUpdateBranchProtectionPrioriesLocked", 423)
}
func (o *RepoUpdateBranchProtectionPrioriesLocked) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
// hydrates response header message
hdrMessage := response.GetHeader("message")
if hdrMessage != "" {
o.Message = hdrMessage
}
// hydrates response header url
hdrURL := response.GetHeader("url")
if hdrURL != "" {
o.URL = hdrURL
}
return nil
}

View File

@@ -1,306 +0,0 @@
// Code generated by go-swagger; DO NOT EDIT.
package repository
// This file was generated by the swagger tool.
// Editing this file might prove futile when you re-run the swagger generate command
import (
"fmt"
"github.com/go-openapi/runtime"
"github.com/go-openapi/strfmt"
)
// RepoUpdateBranchReader is a Reader for the RepoUpdateBranch structure.
type RepoUpdateBranchReader struct {
formats strfmt.Registry
}
// ReadResponse reads a server response into the received o.
func (o *RepoUpdateBranchReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
switch response.Code() {
case 204:
result := NewRepoUpdateBranchNoContent()
if err := result.readResponse(response, consumer, o.formats); err != nil {
return nil, err
}
return result, nil
case 403:
result := NewRepoUpdateBranchForbidden()
if err := result.readResponse(response, consumer, o.formats); err != nil {
return nil, err
}
return nil, result
case 404:
result := NewRepoUpdateBranchNotFound()
if err := result.readResponse(response, consumer, o.formats); err != nil {
return nil, err
}
return nil, result
case 422:
result := NewRepoUpdateBranchUnprocessableEntity()
if err := result.readResponse(response, consumer, o.formats); err != nil {
return nil, err
}
return nil, result
default:
return nil, runtime.NewAPIError("[PATCH /repos/{owner}/{repo}/branches/{branch}] repoUpdateBranch", response, response.Code())
}
}
// NewRepoUpdateBranchNoContent creates a RepoUpdateBranchNoContent with default headers values
func NewRepoUpdateBranchNoContent() *RepoUpdateBranchNoContent {
return &RepoUpdateBranchNoContent{}
}
/*
RepoUpdateBranchNoContent describes a response with status code 204, with default header values.
APIEmpty is an empty response
*/
type RepoUpdateBranchNoContent struct {
}
// IsSuccess returns true when this repo update branch no content response has a 2xx status code
func (o *RepoUpdateBranchNoContent) IsSuccess() bool {
return true
}
// IsRedirect returns true when this repo update branch no content response has a 3xx status code
func (o *RepoUpdateBranchNoContent) IsRedirect() bool {
return false
}
// IsClientError returns true when this repo update branch no content response has a 4xx status code
func (o *RepoUpdateBranchNoContent) IsClientError() bool {
return false
}
// IsServerError returns true when this repo update branch no content response has a 5xx status code
func (o *RepoUpdateBranchNoContent) IsServerError() bool {
return false
}
// IsCode returns true when this repo update branch no content response a status code equal to that given
func (o *RepoUpdateBranchNoContent) IsCode(code int) bool {
return code == 204
}
// Code gets the status code for the repo update branch no content response
func (o *RepoUpdateBranchNoContent) Code() int {
return 204
}
func (o *RepoUpdateBranchNoContent) Error() string {
return fmt.Sprintf("[PATCH /repos/{owner}/{repo}/branches/{branch}][%d] repoUpdateBranchNoContent", 204)
}
func (o *RepoUpdateBranchNoContent) String() string {
return fmt.Sprintf("[PATCH /repos/{owner}/{repo}/branches/{branch}][%d] repoUpdateBranchNoContent", 204)
}
func (o *RepoUpdateBranchNoContent) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
return nil
}
// NewRepoUpdateBranchForbidden creates a RepoUpdateBranchForbidden with default headers values
func NewRepoUpdateBranchForbidden() *RepoUpdateBranchForbidden {
return &RepoUpdateBranchForbidden{}
}
/*
RepoUpdateBranchForbidden describes a response with status code 403, with default header values.
APIForbiddenError is a forbidden error response
*/
type RepoUpdateBranchForbidden struct {
Message string
URL string
}
// IsSuccess returns true when this repo update branch forbidden response has a 2xx status code
func (o *RepoUpdateBranchForbidden) IsSuccess() bool {
return false
}
// IsRedirect returns true when this repo update branch forbidden response has a 3xx status code
func (o *RepoUpdateBranchForbidden) IsRedirect() bool {
return false
}
// IsClientError returns true when this repo update branch forbidden response has a 4xx status code
func (o *RepoUpdateBranchForbidden) IsClientError() bool {
return true
}
// IsServerError returns true when this repo update branch forbidden response has a 5xx status code
func (o *RepoUpdateBranchForbidden) IsServerError() bool {
return false
}
// IsCode returns true when this repo update branch forbidden response a status code equal to that given
func (o *RepoUpdateBranchForbidden) IsCode(code int) bool {
return code == 403
}
// Code gets the status code for the repo update branch forbidden response
func (o *RepoUpdateBranchForbidden) Code() int {
return 403
}
func (o *RepoUpdateBranchForbidden) Error() string {
return fmt.Sprintf("[PATCH /repos/{owner}/{repo}/branches/{branch}][%d] repoUpdateBranchForbidden", 403)
}
func (o *RepoUpdateBranchForbidden) String() string {
return fmt.Sprintf("[PATCH /repos/{owner}/{repo}/branches/{branch}][%d] repoUpdateBranchForbidden", 403)
}
func (o *RepoUpdateBranchForbidden) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
// hydrates response header message
hdrMessage := response.GetHeader("message")
if hdrMessage != "" {
o.Message = hdrMessage
}
// hydrates response header url
hdrURL := response.GetHeader("url")
if hdrURL != "" {
o.URL = hdrURL
}
return nil
}
// NewRepoUpdateBranchNotFound creates a RepoUpdateBranchNotFound with default headers values
func NewRepoUpdateBranchNotFound() *RepoUpdateBranchNotFound {
return &RepoUpdateBranchNotFound{}
}
/*
RepoUpdateBranchNotFound describes a response with status code 404, with default header values.
APINotFound is a not found empty response
*/
type RepoUpdateBranchNotFound struct {
}
// IsSuccess returns true when this repo update branch not found response has a 2xx status code
func (o *RepoUpdateBranchNotFound) IsSuccess() bool {
return false
}
// IsRedirect returns true when this repo update branch not found response has a 3xx status code
func (o *RepoUpdateBranchNotFound) IsRedirect() bool {
return false
}
// IsClientError returns true when this repo update branch not found response has a 4xx status code
func (o *RepoUpdateBranchNotFound) IsClientError() bool {
return true
}
// IsServerError returns true when this repo update branch not found response has a 5xx status code
func (o *RepoUpdateBranchNotFound) IsServerError() bool {
return false
}
// IsCode returns true when this repo update branch not found response a status code equal to that given
func (o *RepoUpdateBranchNotFound) IsCode(code int) bool {
return code == 404
}
// Code gets the status code for the repo update branch not found response
func (o *RepoUpdateBranchNotFound) Code() int {
return 404
}
func (o *RepoUpdateBranchNotFound) Error() string {
return fmt.Sprintf("[PATCH /repos/{owner}/{repo}/branches/{branch}][%d] repoUpdateBranchNotFound", 404)
}
func (o *RepoUpdateBranchNotFound) String() string {
return fmt.Sprintf("[PATCH /repos/{owner}/{repo}/branches/{branch}][%d] repoUpdateBranchNotFound", 404)
}
func (o *RepoUpdateBranchNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
return nil
}
// NewRepoUpdateBranchUnprocessableEntity creates a RepoUpdateBranchUnprocessableEntity with default headers values
func NewRepoUpdateBranchUnprocessableEntity() *RepoUpdateBranchUnprocessableEntity {
return &RepoUpdateBranchUnprocessableEntity{}
}
/*
RepoUpdateBranchUnprocessableEntity describes a response with status code 422, with default header values.
APIValidationError is error format response related to input validation
*/
type RepoUpdateBranchUnprocessableEntity struct {
Message string
URL string
}
// IsSuccess returns true when this repo update branch unprocessable entity response has a 2xx status code
func (o *RepoUpdateBranchUnprocessableEntity) IsSuccess() bool {
return false
}
// IsRedirect returns true when this repo update branch unprocessable entity response has a 3xx status code
func (o *RepoUpdateBranchUnprocessableEntity) IsRedirect() bool {
return false
}
// IsClientError returns true when this repo update branch unprocessable entity response has a 4xx status code
func (o *RepoUpdateBranchUnprocessableEntity) IsClientError() bool {
return true
}
// IsServerError returns true when this repo update branch unprocessable entity response has a 5xx status code
func (o *RepoUpdateBranchUnprocessableEntity) IsServerError() bool {
return false
}
// IsCode returns true when this repo update branch unprocessable entity response a status code equal to that given
func (o *RepoUpdateBranchUnprocessableEntity) IsCode(code int) bool {
return code == 422
}
// Code gets the status code for the repo update branch unprocessable entity response
func (o *RepoUpdateBranchUnprocessableEntity) Code() int {
return 422
}
func (o *RepoUpdateBranchUnprocessableEntity) Error() string {
return fmt.Sprintf("[PATCH /repos/{owner}/{repo}/branches/{branch}][%d] repoUpdateBranchUnprocessableEntity", 422)
}
func (o *RepoUpdateBranchUnprocessableEntity) String() string {
return fmt.Sprintf("[PATCH /repos/{owner}/{repo}/branches/{branch}][%d] repoUpdateBranchUnprocessableEntity", 422)
}
func (o *RepoUpdateBranchUnprocessableEntity) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error {
// hydrates response header message
hdrMessage := response.GetHeader("message")
if hdrMessage != "" {
o.Message = hdrMessage
}
// hydrates response header url
hdrURL := response.GetHeader("url")
if hdrURL != "" {
o.URL = hdrURL
}
return nil
}

View File

@@ -127,8 +127,6 @@ type ClientService interface {
GetTree(params *GetTreeParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*GetTreeOK, error) GetTree(params *GetTreeParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*GetTreeOK, error)
ListActionTasks(params *ListActionTasksParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*ListActionTasksOK, error)
AcceptRepoTransfer(params *AcceptRepoTransferParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*AcceptRepoTransferAccepted, error) AcceptRepoTransfer(params *AcceptRepoTransferParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*AcceptRepoTransferAccepted, error)
CreateCurrentUserRepo(params *CreateCurrentUserRepoParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*CreateCurrentUserRepoCreated, error) CreateCurrentUserRepo(params *CreateCurrentUserRepoParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*CreateCurrentUserRepoCreated, error)
@@ -195,8 +193,6 @@ type ClientService interface {
RepoCreateTag(params *RepoCreateTagParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoCreateTagOK, error) RepoCreateTag(params *RepoCreateTagParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoCreateTagOK, error)
RepoCreateTagProtection(params *RepoCreateTagProtectionParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoCreateTagProtectionCreated, error)
RepoCreateWikiPage(params *RepoCreateWikiPageParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoCreateWikiPageCreated, error) RepoCreateWikiPage(params *RepoCreateWikiPageParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoCreateWikiPageCreated, error)
RepoDelete(params *RepoDeleteParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoDeleteNoContent, error) RepoDelete(params *RepoDeleteParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoDeleteNoContent, error)
@@ -231,8 +227,6 @@ type ClientService interface {
RepoDeleteTag(params *RepoDeleteTagParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoDeleteTagNoContent, error) RepoDeleteTag(params *RepoDeleteTagParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoDeleteTagNoContent, error)
RepoDeleteTagProtection(params *RepoDeleteTagProtectionParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoDeleteTagProtectionNoContent, error)
RepoDeleteTeam(params *RepoDeleteTeamParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoDeleteTeamNoContent, error) RepoDeleteTeam(params *RepoDeleteTeamParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoDeleteTeamNoContent, error)
RepoDeleteTopic(params *RepoDeleteTopicParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoDeleteTopicNoContent, error) RepoDeleteTopic(params *RepoDeleteTopicParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoDeleteTopicNoContent, error)
@@ -259,8 +253,6 @@ type ClientService interface {
RepoEditReleaseAttachment(params *RepoEditReleaseAttachmentParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoEditReleaseAttachmentCreated, error) RepoEditReleaseAttachment(params *RepoEditReleaseAttachmentParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoEditReleaseAttachmentCreated, error)
RepoEditTagProtection(params *RepoEditTagProtectionParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoEditTagProtectionOK, error)
RepoEditWikiPage(params *RepoEditWikiPageParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoEditWikiPageOK, error) RepoEditWikiPage(params *RepoEditWikiPageParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoEditWikiPageOK, error)
RepoGet(params *RepoGetParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoGetOK, error) RepoGet(params *RepoGetParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoGetOK, error)
@@ -301,8 +293,6 @@ type ClientService interface {
RepoGetLatestRelease(params *RepoGetLatestReleaseParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoGetLatestReleaseOK, error) RepoGetLatestRelease(params *RepoGetLatestReleaseParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoGetLatestReleaseOK, error)
RepoGetLicenses(params *RepoGetLicensesParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoGetLicensesOK, error)
RepoGetNote(params *RepoGetNoteParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoGetNoteOK, error) RepoGetNote(params *RepoGetNoteParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoGetNoteOK, error)
RepoGetPullRequest(params *RepoGetPullRequestParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoGetPullRequestOK, error) RepoGetPullRequest(params *RepoGetPullRequestParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoGetPullRequestOK, error)
@@ -339,8 +329,6 @@ type ClientService interface {
RepoGetTag(params *RepoGetTagParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoGetTagOK, error) RepoGetTag(params *RepoGetTagParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoGetTagOK, error)
RepoGetTagProtection(params *RepoGetTagProtectionParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoGetTagProtectionOK, error)
RepoGetWikiPage(params *RepoGetWikiPageParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoGetWikiPageOK, error) RepoGetWikiPage(params *RepoGetWikiPageParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoGetWikiPageOK, error)
RepoGetWikiPageRevisions(params *RepoGetWikiPageRevisionsParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoGetWikiPageRevisionsOK, error) RepoGetWikiPageRevisions(params *RepoGetWikiPageRevisionsParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoGetWikiPageRevisionsOK, error)
@@ -389,8 +377,6 @@ type ClientService interface {
RepoListSubscribers(params *RepoListSubscribersParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoListSubscribersOK, error) RepoListSubscribers(params *RepoListSubscribersParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoListSubscribersOK, error)
RepoListTagProtection(params *RepoListTagProtectionParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoListTagProtectionOK, error)
RepoListTags(params *RepoListTagsParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoListTagsOK, error) RepoListTags(params *RepoListTagsParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoListTagsOK, error)
RepoListTeams(params *RepoListTeamsParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoListTeamsOK, error) RepoListTeams(params *RepoListTeamsParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoListTeamsOK, error)
@@ -399,8 +385,6 @@ type ClientService interface {
RepoMergePullRequest(params *RepoMergePullRequestParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoMergePullRequestOK, error) RepoMergePullRequest(params *RepoMergePullRequestParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoMergePullRequestOK, error)
RepoMergeUpstream(params *RepoMergeUpstreamParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoMergeUpstreamOK, error)
RepoMigrate(params *RepoMigrateParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoMigrateCreated, error) RepoMigrate(params *RepoMigrateParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoMigrateCreated, error)
RepoMirrorSync(params *RepoMirrorSyncParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoMirrorSyncOK, error) RepoMirrorSync(params *RepoMirrorSyncParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoMirrorSyncOK, error)
@@ -427,10 +411,6 @@ type ClientService interface {
RepoUpdateAvatar(params *RepoUpdateAvatarParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoUpdateAvatarNoContent, error) RepoUpdateAvatar(params *RepoUpdateAvatarParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoUpdateAvatarNoContent, error)
RepoUpdateBranch(params *RepoUpdateBranchParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoUpdateBranchNoContent, error)
RepoUpdateBranchProtectionPriories(params *RepoUpdateBranchProtectionPrioriesParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoUpdateBranchProtectionPrioriesNoContent, error)
RepoUpdateFile(params *RepoUpdateFileParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoUpdateFileOK, error) RepoUpdateFile(params *RepoUpdateFileParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoUpdateFileOK, error)
RepoUpdatePullRequest(params *RepoUpdatePullRequestParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoUpdatePullRequestOK, error) RepoUpdatePullRequest(params *RepoUpdatePullRequestParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoUpdatePullRequestOK, error)
@@ -573,45 +553,6 @@ func (a *Client) GetTree(params *GetTreeParams, authInfo runtime.ClientAuthInfoW
panic(msg) panic(msg)
} }
/*
ListActionTasks lists a repository s action tasks
*/
func (a *Client) ListActionTasks(params *ListActionTasksParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*ListActionTasksOK, error) {
// TODO: Validate the params before sending
if params == nil {
params = NewListActionTasksParams()
}
op := &runtime.ClientOperation{
ID: "ListActionTasks",
Method: "GET",
PathPattern: "/repos/{owner}/{repo}/actions/tasks",
ProducesMediaTypes: []string{"application/json"},
ConsumesMediaTypes: []string{"application/json", "text/plain"},
Schemes: []string{"http", "https"},
Params: params,
Reader: &ListActionTasksReader{formats: a.formats},
AuthInfo: authInfo,
Context: params.Context,
Client: params.HTTPClient,
}
for _, opt := range opts {
opt(op)
}
result, err := a.transport.Submit(op)
if err != nil {
return nil, err
}
success, ok := result.(*ListActionTasksOK)
if ok {
return success, nil
}
// unexpected success response
// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
msg := fmt.Sprintf("unexpected success response for ListActionTasks: API contract not enforced by server. Client expected to get an error, but got: %T", result)
panic(msg)
}
/* /*
AcceptRepoTransfer accepts a repo transfer AcceptRepoTransfer accepts a repo transfer
*/ */
@@ -1046,7 +987,7 @@ func (a *Client) RejectRepoTransfer(params *RejectRepoTransferParams, authInfo r
} }
/* /*
RepoAddCollaborator adds or update a collaborator to a repository RepoAddCollaborator adds a collaborator to a repository
*/ */
func (a *Client) RepoAddCollaborator(params *RepoAddCollaboratorParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoAddCollaboratorNoContent, error) { func (a *Client) RepoAddCollaborator(params *RepoAddCollaboratorParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoAddCollaboratorNoContent, error) {
// TODO: Validate the params before sending // TODO: Validate the params before sending
@@ -1903,45 +1844,6 @@ func (a *Client) RepoCreateTag(params *RepoCreateTagParams, authInfo runtime.Cli
panic(msg) panic(msg)
} }
/*
RepoCreateTagProtection creates a tag protections for a repository
*/
func (a *Client) RepoCreateTagProtection(params *RepoCreateTagProtectionParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoCreateTagProtectionCreated, error) {
// TODO: Validate the params before sending
if params == nil {
params = NewRepoCreateTagProtectionParams()
}
op := &runtime.ClientOperation{
ID: "repoCreateTagProtection",
Method: "POST",
PathPattern: "/repos/{owner}/{repo}/tag_protections",
ProducesMediaTypes: []string{"application/json"},
ConsumesMediaTypes: []string{"application/json"},
Schemes: []string{"http", "https"},
Params: params,
Reader: &RepoCreateTagProtectionReader{formats: a.formats},
AuthInfo: authInfo,
Context: params.Context,
Client: params.HTTPClient,
}
for _, opt := range opts {
opt(op)
}
result, err := a.transport.Submit(op)
if err != nil {
return nil, err
}
success, ok := result.(*RepoCreateTagProtectionCreated)
if ok {
return success, nil
}
// unexpected success response
// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
msg := fmt.Sprintf("unexpected success response for repoCreateTagProtection: API contract not enforced by server. Client expected to get an error, but got: %T", result)
panic(msg)
}
/* /*
RepoCreateWikiPage creates a wiki page RepoCreateWikiPage creates a wiki page
*/ */
@@ -2605,45 +2507,6 @@ func (a *Client) RepoDeleteTag(params *RepoDeleteTagParams, authInfo runtime.Cli
panic(msg) panic(msg)
} }
/*
RepoDeleteTagProtection deletes a specific tag protection for the repository
*/
func (a *Client) RepoDeleteTagProtection(params *RepoDeleteTagProtectionParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoDeleteTagProtectionNoContent, error) {
// TODO: Validate the params before sending
if params == nil {
params = NewRepoDeleteTagProtectionParams()
}
op := &runtime.ClientOperation{
ID: "repoDeleteTagProtection",
Method: "DELETE",
PathPattern: "/repos/{owner}/{repo}/tag_protections/{id}",
ProducesMediaTypes: []string{"application/json"},
ConsumesMediaTypes: []string{"application/json", "text/plain"},
Schemes: []string{"http", "https"},
Params: params,
Reader: &RepoDeleteTagProtectionReader{formats: a.formats},
AuthInfo: authInfo,
Context: params.Context,
Client: params.HTTPClient,
}
for _, opt := range opts {
opt(op)
}
result, err := a.transport.Submit(op)
if err != nil {
return nil, err
}
success, ok := result.(*RepoDeleteTagProtectionNoContent)
if ok {
return success, nil
}
// unexpected success response
// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
msg := fmt.Sprintf("unexpected success response for repoDeleteTagProtection: API contract not enforced by server. Client expected to get an error, but got: %T", result)
panic(msg)
}
/* /*
RepoDeleteTeam deletes a team from a repository RepoDeleteTeam deletes a team from a repository
*/ */
@@ -3151,45 +3014,6 @@ func (a *Client) RepoEditReleaseAttachment(params *RepoEditReleaseAttachmentPara
panic(msg) panic(msg)
} }
/*
RepoEditTagProtection edits a tag protections for a repository only fields that are set will be changed
*/
func (a *Client) RepoEditTagProtection(params *RepoEditTagProtectionParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoEditTagProtectionOK, error) {
// TODO: Validate the params before sending
if params == nil {
params = NewRepoEditTagProtectionParams()
}
op := &runtime.ClientOperation{
ID: "repoEditTagProtection",
Method: "PATCH",
PathPattern: "/repos/{owner}/{repo}/tag_protections/{id}",
ProducesMediaTypes: []string{"application/json"},
ConsumesMediaTypes: []string{"application/json"},
Schemes: []string{"http", "https"},
Params: params,
Reader: &RepoEditTagProtectionReader{formats: a.formats},
AuthInfo: authInfo,
Context: params.Context,
Client: params.HTTPClient,
}
for _, opt := range opts {
opt(op)
}
result, err := a.transport.Submit(op)
if err != nil {
return nil, err
}
success, ok := result.(*RepoEditTagProtectionOK)
if ok {
return success, nil
}
// unexpected success response
// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
msg := fmt.Sprintf("unexpected success response for repoEditTagProtection: API contract not enforced by server. Client expected to get an error, but got: %T", result)
panic(msg)
}
/* /*
RepoEditWikiPage edits a wiki page RepoEditWikiPage edits a wiki page
*/ */
@@ -3542,7 +3366,7 @@ func (a *Client) RepoGetCombinedStatusByRef(params *RepoGetCombinedStatusByRefPa
} }
/* /*
RepoGetCommitPullRequest gets the merged pull request of the commit RepoGetCommitPullRequest gets the pull request of the commit
*/ */
func (a *Client) RepoGetCommitPullRequest(params *RepoGetCommitPullRequestParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoGetCommitPullRequestOK, error) { func (a *Client) RepoGetCommitPullRequest(params *RepoGetCommitPullRequestParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoGetCommitPullRequestOK, error) {
// TODO: Validate the params before sending // TODO: Validate the params before sending
@@ -3970,45 +3794,6 @@ func (a *Client) RepoGetLatestRelease(params *RepoGetLatestReleaseParams, authIn
panic(msg) panic(msg)
} }
/*
RepoGetLicenses gets repo licenses
*/
func (a *Client) RepoGetLicenses(params *RepoGetLicensesParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoGetLicensesOK, error) {
// TODO: Validate the params before sending
if params == nil {
params = NewRepoGetLicensesParams()
}
op := &runtime.ClientOperation{
ID: "repoGetLicenses",
Method: "GET",
PathPattern: "/repos/{owner}/{repo}/licenses",
ProducesMediaTypes: []string{"application/json"},
ConsumesMediaTypes: []string{"application/json", "text/plain"},
Schemes: []string{"http", "https"},
Params: params,
Reader: &RepoGetLicensesReader{formats: a.formats},
AuthInfo: authInfo,
Context: params.Context,
Client: params.HTTPClient,
}
for _, opt := range opts {
opt(op)
}
result, err := a.transport.Submit(op)
if err != nil {
return nil, err
}
success, ok := result.(*RepoGetLicensesOK)
if ok {
return success, nil
}
// unexpected success response
// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
msg := fmt.Sprintf("unexpected success response for repoGetLicenses: API contract not enforced by server. Client expected to get an error, but got: %T", result)
panic(msg)
}
/* /*
RepoGetNote gets a note corresponding to a single commit from a repository RepoGetNote gets a note corresponding to a single commit from a repository
*/ */
@@ -4334,7 +4119,7 @@ func (a *Client) RepoGetRawFile(params *RepoGetRawFileParams, authInfo runtime.C
Method: "GET", Method: "GET",
PathPattern: "/repos/{owner}/{repo}/raw/{filepath}", PathPattern: "/repos/{owner}/{repo}/raw/{filepath}",
ProducesMediaTypes: []string{"application/octet-stream"}, ProducesMediaTypes: []string{"application/octet-stream"},
ConsumesMediaTypes: []string{"application/json", "text/plain"}, ConsumesMediaTypes: []string{"application/octet-stream"},
Schemes: []string{"http", "https"}, Schemes: []string{"http", "https"},
Params: params, Params: params,
Reader: &RepoGetRawFileReader{formats: a.formats, writer: writer}, Reader: &RepoGetRawFileReader{formats: a.formats, writer: writer},
@@ -4605,7 +4390,7 @@ func (a *Client) RepoGetRunnerRegistrationToken(params *RepoGetRunnerRegistratio
op := &runtime.ClientOperation{ op := &runtime.ClientOperation{
ID: "repoGetRunnerRegistrationToken", ID: "repoGetRunnerRegistrationToken",
Method: "GET", Method: "GET",
PathPattern: "/repos/{owner}/{repo}/actions/runners/registration-token", PathPattern: "/repos/{owner}/{repo}/runners/registration-token",
ProducesMediaTypes: []string{"application/json"}, ProducesMediaTypes: []string{"application/json"},
ConsumesMediaTypes: []string{"application/json", "text/plain"}, ConsumesMediaTypes: []string{"application/json", "text/plain"},
Schemes: []string{"http", "https"}, Schemes: []string{"http", "https"},
@@ -4711,45 +4496,6 @@ func (a *Client) RepoGetTag(params *RepoGetTagParams, authInfo runtime.ClientAut
panic(msg) panic(msg)
} }
/*
RepoGetTagProtection gets a specific tag protection for the repository
*/
func (a *Client) RepoGetTagProtection(params *RepoGetTagProtectionParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoGetTagProtectionOK, error) {
// TODO: Validate the params before sending
if params == nil {
params = NewRepoGetTagProtectionParams()
}
op := &runtime.ClientOperation{
ID: "repoGetTagProtection",
Method: "GET",
PathPattern: "/repos/{owner}/{repo}/tag_protections/{id}",
ProducesMediaTypes: []string{"application/json"},
ConsumesMediaTypes: []string{"application/json", "text/plain"},
Schemes: []string{"http", "https"},
Params: params,
Reader: &RepoGetTagProtectionReader{formats: a.formats},
AuthInfo: authInfo,
Context: params.Context,
Client: params.HTTPClient,
}
for _, opt := range opts {
opt(op)
}
result, err := a.transport.Submit(op)
if err != nil {
return nil, err
}
success, ok := result.(*RepoGetTagProtectionOK)
if ok {
return success, nil
}
// unexpected success response
// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
msg := fmt.Sprintf("unexpected success response for repoGetTagProtection: API contract not enforced by server. Client expected to get an error, but got: %T", result)
panic(msg)
}
/* /*
RepoGetWikiPage gets a wiki page RepoGetWikiPage gets a wiki page
*/ */
@@ -5686,45 +5432,6 @@ func (a *Client) RepoListSubscribers(params *RepoListSubscribersParams, authInfo
panic(msg) panic(msg)
} }
/*
RepoListTagProtection lists tag protections for a repository
*/
func (a *Client) RepoListTagProtection(params *RepoListTagProtectionParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoListTagProtectionOK, error) {
// TODO: Validate the params before sending
if params == nil {
params = NewRepoListTagProtectionParams()
}
op := &runtime.ClientOperation{
ID: "repoListTagProtection",
Method: "GET",
PathPattern: "/repos/{owner}/{repo}/tag_protections",
ProducesMediaTypes: []string{"application/json"},
ConsumesMediaTypes: []string{"application/json", "text/plain"},
Schemes: []string{"http", "https"},
Params: params,
Reader: &RepoListTagProtectionReader{formats: a.formats},
AuthInfo: authInfo,
Context: params.Context,
Client: params.HTTPClient,
}
for _, opt := range opts {
opt(op)
}
result, err := a.transport.Submit(op)
if err != nil {
return nil, err
}
success, ok := result.(*RepoListTagProtectionOK)
if ok {
return success, nil
}
// unexpected success response
// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
msg := fmt.Sprintf("unexpected success response for repoListTagProtection: API contract not enforced by server. Client expected to get an error, but got: %T", result)
panic(msg)
}
/* /*
RepoListTags lists a repository s tags RepoListTags lists a repository s tags
*/ */
@@ -5881,45 +5588,6 @@ func (a *Client) RepoMergePullRequest(params *RepoMergePullRequestParams, authIn
panic(msg) panic(msg)
} }
/*
RepoMergeUpstream merges a branch from upstream
*/
func (a *Client) RepoMergeUpstream(params *RepoMergeUpstreamParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoMergeUpstreamOK, error) {
// TODO: Validate the params before sending
if params == nil {
params = NewRepoMergeUpstreamParams()
}
op := &runtime.ClientOperation{
ID: "repoMergeUpstream",
Method: "POST",
PathPattern: "/repos/{owner}/{repo}/merge-upstream",
ProducesMediaTypes: []string{"application/json"},
ConsumesMediaTypes: []string{"application/json", "text/plain"},
Schemes: []string{"http", "https"},
Params: params,
Reader: &RepoMergeUpstreamReader{formats: a.formats},
AuthInfo: authInfo,
Context: params.Context,
Client: params.HTTPClient,
}
for _, opt := range opts {
opt(op)
}
result, err := a.transport.Submit(op)
if err != nil {
return nil, err
}
success, ok := result.(*RepoMergeUpstreamOK)
if ok {
return success, nil
}
// unexpected success response
// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
msg := fmt.Sprintf("unexpected success response for repoMergeUpstream: API contract not enforced by server. Client expected to get an error, but got: %T", result)
panic(msg)
}
/* /*
RepoMigrate migrates a remote git repository RepoMigrate migrates a remote git repository
*/ */
@@ -6427,84 +6095,6 @@ func (a *Client) RepoUpdateAvatar(params *RepoUpdateAvatarParams, authInfo runti
panic(msg) panic(msg)
} }
/*
RepoUpdateBranch updates a branch
*/
func (a *Client) RepoUpdateBranch(params *RepoUpdateBranchParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoUpdateBranchNoContent, error) {
// TODO: Validate the params before sending
if params == nil {
params = NewRepoUpdateBranchParams()
}
op := &runtime.ClientOperation{
ID: "repoUpdateBranch",
Method: "PATCH",
PathPattern: "/repos/{owner}/{repo}/branches/{branch}",
ProducesMediaTypes: []string{"application/json"},
ConsumesMediaTypes: []string{"application/json"},
Schemes: []string{"http", "https"},
Params: params,
Reader: &RepoUpdateBranchReader{formats: a.formats},
AuthInfo: authInfo,
Context: params.Context,
Client: params.HTTPClient,
}
for _, opt := range opts {
opt(op)
}
result, err := a.transport.Submit(op)
if err != nil {
return nil, err
}
success, ok := result.(*RepoUpdateBranchNoContent)
if ok {
return success, nil
}
// unexpected success response
// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
msg := fmt.Sprintf("unexpected success response for repoUpdateBranch: API contract not enforced by server. Client expected to get an error, but got: %T", result)
panic(msg)
}
/*
RepoUpdateBranchProtectionPriories updates the priorities of branch protections for a repository
*/
func (a *Client) RepoUpdateBranchProtectionPriories(params *RepoUpdateBranchProtectionPrioriesParams, authInfo runtime.ClientAuthInfoWriter, opts ...ClientOption) (*RepoUpdateBranchProtectionPrioriesNoContent, error) {
// TODO: Validate the params before sending
if params == nil {
params = NewRepoUpdateBranchProtectionPrioriesParams()
}
op := &runtime.ClientOperation{
ID: "repoUpdateBranchProtectionPriories",
Method: "POST",
PathPattern: "/repos/{owner}/{repo}/branch_protections/priority",
ProducesMediaTypes: []string{"application/json"},
ConsumesMediaTypes: []string{"application/json"},
Schemes: []string{"http", "https"},
Params: params,
Reader: &RepoUpdateBranchProtectionPrioriesReader{formats: a.formats},
AuthInfo: authInfo,
Context: params.Context,
Client: params.HTTPClient,
}
for _, opt := range opts {
opt(op)
}
result, err := a.transport.Submit(op)
if err != nil {
return nil, err
}
success, ok := result.(*RepoUpdateBranchProtectionPrioriesNoContent)
if ok {
return success, nil
}
// unexpected success response
// safeguard: normally, absent a default response, unknown success responses return an error above: so this is a codegen issue
msg := fmt.Sprintf("unexpected success response for repoUpdateBranchProtectionPriories: API contract not enforced by server. Client expected to get an error, but got: %T", result)
panic(msg)
}
/* /*
RepoUpdateFile updates a file in a repository RepoUpdateFile updates a file in a repository
*/ */

View File

@@ -1,144 +0,0 @@
// Code generated by go-swagger; DO NOT EDIT.
package models
// This file was generated by the swagger tool.
// Editing this file might prove futile when you re-run the swagger generate command
import (
"context"
"github.com/go-openapi/errors"
"github.com/go-openapi/strfmt"
"github.com/go-openapi/swag"
"github.com/go-openapi/validate"
)
// ActionTask ActionTask represents a ActionTask
//
// swagger:model ActionTask
type ActionTask struct {
// created at
// Format: date-time
CreatedAt strfmt.DateTime `json:"created_at,omitempty"`
// display title
DisplayTitle string `json:"display_title,omitempty"`
// event
Event string `json:"event,omitempty"`
// head branch
HeadBranch string `json:"head_branch,omitempty"`
// head s h a
HeadSHA string `json:"head_sha,omitempty"`
// ID
ID int64 `json:"id,omitempty"`
// name
Name string `json:"name,omitempty"`
// run number
RunNumber int64 `json:"run_number,omitempty"`
// run started at
// Format: date-time
RunStartedAt strfmt.DateTime `json:"run_started_at,omitempty"`
// status
Status string `json:"status,omitempty"`
// URL
URL string `json:"url,omitempty"`
// updated at
// Format: date-time
UpdatedAt strfmt.DateTime `json:"updated_at,omitempty"`
// workflow ID
WorkflowID string `json:"workflow_id,omitempty"`
}
// Validate validates this action task
func (m *ActionTask) Validate(formats strfmt.Registry) error {
var res []error
if err := m.validateCreatedAt(formats); err != nil {
res = append(res, err)
}
if err := m.validateRunStartedAt(formats); err != nil {
res = append(res, err)
}
if err := m.validateUpdatedAt(formats); err != nil {
res = append(res, err)
}
if len(res) > 0 {
return errors.CompositeValidationError(res...)
}
return nil
}
func (m *ActionTask) validateCreatedAt(formats strfmt.Registry) error {
if swag.IsZero(m.CreatedAt) { // not required
return nil
}
if err := validate.FormatOf("created_at", "body", "date-time", m.CreatedAt.String(), formats); err != nil {
return err
}
return nil
}
func (m *ActionTask) validateRunStartedAt(formats strfmt.Registry) error {
if swag.IsZero(m.RunStartedAt) { // not required
return nil
}
if err := validate.FormatOf("run_started_at", "body", "date-time", m.RunStartedAt.String(), formats); err != nil {
return err
}
return nil
}
func (m *ActionTask) validateUpdatedAt(formats strfmt.Registry) error {
if swag.IsZero(m.UpdatedAt) { // not required
return nil
}
if err := validate.FormatOf("updated_at", "body", "date-time", m.UpdatedAt.String(), formats); err != nil {
return err
}
return nil
}
// ContextValidate validates this action task based on context it is used
func (m *ActionTask) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
return nil
}
// MarshalBinary interface implementation
func (m *ActionTask) MarshalBinary() ([]byte, error) {
if m == nil {
return nil, nil
}
return swag.WriteJSON(m)
}
// UnmarshalBinary interface implementation
func (m *ActionTask) UnmarshalBinary(b []byte) error {
var res ActionTask
if err := swag.ReadJSON(b, &res); err != nil {
return err
}
*m = res
return nil
}

View File

@@ -1,124 +0,0 @@
// Code generated by go-swagger; DO NOT EDIT.
package models
// This file was generated by the swagger tool.
// Editing this file might prove futile when you re-run the swagger generate command
import (
"context"
"strconv"
"github.com/go-openapi/errors"
"github.com/go-openapi/strfmt"
"github.com/go-openapi/swag"
)
// ActionTaskResponse ActionTaskResponse returns a ActionTask
//
// swagger:model ActionTaskResponse
type ActionTaskResponse struct {
// entries
Entries []*ActionTask `json:"workflow_runs"`
// total count
TotalCount int64 `json:"total_count,omitempty"`
}
// Validate validates this action task response
func (m *ActionTaskResponse) Validate(formats strfmt.Registry) error {
var res []error
if err := m.validateEntries(formats); err != nil {
res = append(res, err)
}
if len(res) > 0 {
return errors.CompositeValidationError(res...)
}
return nil
}
func (m *ActionTaskResponse) validateEntries(formats strfmt.Registry) error {
if swag.IsZero(m.Entries) { // not required
return nil
}
for i := 0; i < len(m.Entries); i++ {
if swag.IsZero(m.Entries[i]) { // not required
continue
}
if m.Entries[i] != nil {
if err := m.Entries[i].Validate(formats); err != nil {
if ve, ok := err.(*errors.Validation); ok {
return ve.ValidateName("workflow_runs" + "." + strconv.Itoa(i))
} else if ce, ok := err.(*errors.CompositeError); ok {
return ce.ValidateName("workflow_runs" + "." + strconv.Itoa(i))
}
return err
}
}
}
return nil
}
// ContextValidate validate this action task response based on the context it is used
func (m *ActionTaskResponse) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
var res []error
if err := m.contextValidateEntries(ctx, formats); err != nil {
res = append(res, err)
}
if len(res) > 0 {
return errors.CompositeValidationError(res...)
}
return nil
}
func (m *ActionTaskResponse) contextValidateEntries(ctx context.Context, formats strfmt.Registry) error {
for i := 0; i < len(m.Entries); i++ {
if m.Entries[i] != nil {
if swag.IsZero(m.Entries[i]) { // not required
return nil
}
if err := m.Entries[i].ContextValidate(ctx, formats); err != nil {
if ve, ok := err.(*errors.Validation); ok {
return ve.ValidateName("workflow_runs" + "." + strconv.Itoa(i))
} else if ce, ok := err.(*errors.CompositeError); ok {
return ce.ValidateName("workflow_runs" + "." + strconv.Itoa(i))
}
return err
}
}
}
return nil
}
// MarshalBinary interface implementation
func (m *ActionTaskResponse) MarshalBinary() ([]byte, error) {
if m == nil {
return nil, nil
}
return swag.WriteJSON(m)
}
// UnmarshalBinary interface implementation
func (m *ActionTaskResponse) UnmarshalBinary(b []byte) error {
var res ActionTaskResponse
if err := swag.ReadJSON(b, &res); err != nil {
return err
}
*m = res
return nil
}

View File

@@ -7,7 +7,6 @@ package models
import ( import (
"context" "context"
"encoding/json"
"github.com/go-openapi/errors" "github.com/go-openapi/errors"
"github.com/go-openapi/strfmt" "github.com/go-openapi/strfmt"
@@ -39,8 +38,7 @@ type Activity struct {
// is private // is private
IsPrivate bool `json:"is_private,omitempty"` IsPrivate bool `json:"is_private,omitempty"`
// the type of action // op type
// Enum: ["create_repo","rename_repo","star_repo","watch_repo","commit_repo","create_issue","create_pull_request","transfer_repo","push_tag","comment_issue","merge_pull_request","close_issue","reopen_issue","close_pull_request","reopen_pull_request","delete_tag","delete_branch","mirror_sync_push","mirror_sync_create","mirror_sync_delete","approve_pull_request","reject_pull_request","comment_pull","publish_release","pull_review_dismissed","pull_request_ready_for_review","auto_merge_pull_request"]
OpType string `json:"op_type,omitempty"` OpType string `json:"op_type,omitempty"`
// ref name // ref name
@@ -70,10 +68,6 @@ func (m *Activity) Validate(formats strfmt.Registry) error {
res = append(res, err) res = append(res, err)
} }
if err := m.validateOpType(formats); err != nil {
res = append(res, err)
}
if err := m.validateActUser(formats); err != nil { if err := m.validateActUser(formats); err != nil {
res = append(res, err) res = append(res, err)
} }
@@ -104,123 +98,6 @@ func (m *Activity) validateCreated(formats strfmt.Registry) error {
return nil return nil
} }
var activityTypeOpTypePropEnum []interface{}
func init() {
var res []string
if err := json.Unmarshal([]byte(`["create_repo","rename_repo","star_repo","watch_repo","commit_repo","create_issue","create_pull_request","transfer_repo","push_tag","comment_issue","merge_pull_request","close_issue","reopen_issue","close_pull_request","reopen_pull_request","delete_tag","delete_branch","mirror_sync_push","mirror_sync_create","mirror_sync_delete","approve_pull_request","reject_pull_request","comment_pull","publish_release","pull_review_dismissed","pull_request_ready_for_review","auto_merge_pull_request"]`), &res); err != nil {
panic(err)
}
for _, v := range res {
activityTypeOpTypePropEnum = append(activityTypeOpTypePropEnum, v)
}
}
const (
// ActivityOpTypeCreateRepo captures enum value "create_repo"
ActivityOpTypeCreateRepo string = "create_repo"
// ActivityOpTypeRenameRepo captures enum value "rename_repo"
ActivityOpTypeRenameRepo string = "rename_repo"
// ActivityOpTypeStarRepo captures enum value "star_repo"
ActivityOpTypeStarRepo string = "star_repo"
// ActivityOpTypeWatchRepo captures enum value "watch_repo"
ActivityOpTypeWatchRepo string = "watch_repo"
// ActivityOpTypeCommitRepo captures enum value "commit_repo"
ActivityOpTypeCommitRepo string = "commit_repo"
// ActivityOpTypeCreateIssue captures enum value "create_issue"
ActivityOpTypeCreateIssue string = "create_issue"
// ActivityOpTypeCreatePullRequest captures enum value "create_pull_request"
ActivityOpTypeCreatePullRequest string = "create_pull_request"
// ActivityOpTypeTransferRepo captures enum value "transfer_repo"
ActivityOpTypeTransferRepo string = "transfer_repo"
// ActivityOpTypePushTag captures enum value "push_tag"
ActivityOpTypePushTag string = "push_tag"
// ActivityOpTypeCommentIssue captures enum value "comment_issue"
ActivityOpTypeCommentIssue string = "comment_issue"
// ActivityOpTypeMergePullRequest captures enum value "merge_pull_request"
ActivityOpTypeMergePullRequest string = "merge_pull_request"
// ActivityOpTypeCloseIssue captures enum value "close_issue"
ActivityOpTypeCloseIssue string = "close_issue"
// ActivityOpTypeReopenIssue captures enum value "reopen_issue"
ActivityOpTypeReopenIssue string = "reopen_issue"
// ActivityOpTypeClosePullRequest captures enum value "close_pull_request"
ActivityOpTypeClosePullRequest string = "close_pull_request"
// ActivityOpTypeReopenPullRequest captures enum value "reopen_pull_request"
ActivityOpTypeReopenPullRequest string = "reopen_pull_request"
// ActivityOpTypeDeleteTag captures enum value "delete_tag"
ActivityOpTypeDeleteTag string = "delete_tag"
// ActivityOpTypeDeleteBranch captures enum value "delete_branch"
ActivityOpTypeDeleteBranch string = "delete_branch"
// ActivityOpTypeMirrorSyncPush captures enum value "mirror_sync_push"
ActivityOpTypeMirrorSyncPush string = "mirror_sync_push"
// ActivityOpTypeMirrorSyncCreate captures enum value "mirror_sync_create"
ActivityOpTypeMirrorSyncCreate string = "mirror_sync_create"
// ActivityOpTypeMirrorSyncDelete captures enum value "mirror_sync_delete"
ActivityOpTypeMirrorSyncDelete string = "mirror_sync_delete"
// ActivityOpTypeApprovePullRequest captures enum value "approve_pull_request"
ActivityOpTypeApprovePullRequest string = "approve_pull_request"
// ActivityOpTypeRejectPullRequest captures enum value "reject_pull_request"
ActivityOpTypeRejectPullRequest string = "reject_pull_request"
// ActivityOpTypeCommentPull captures enum value "comment_pull"
ActivityOpTypeCommentPull string = "comment_pull"
// ActivityOpTypePublishRelease captures enum value "publish_release"
ActivityOpTypePublishRelease string = "publish_release"
// ActivityOpTypePullReviewDismissed captures enum value "pull_review_dismissed"
ActivityOpTypePullReviewDismissed string = "pull_review_dismissed"
// ActivityOpTypePullRequestReadyForReview captures enum value "pull_request_ready_for_review"
ActivityOpTypePullRequestReadyForReview string = "pull_request_ready_for_review"
// ActivityOpTypeAutoMergePullRequest captures enum value "auto_merge_pull_request"
ActivityOpTypeAutoMergePullRequest string = "auto_merge_pull_request"
)
// prop value enum
func (m *Activity) validateOpTypeEnum(path, location string, value string) error {
if err := validate.EnumCase(path, location, value, activityTypeOpTypePropEnum, true); err != nil {
return err
}
return nil
}
func (m *Activity) validateOpType(formats strfmt.Registry) error {
if swag.IsZero(m.OpType) { // not required
return nil
}
// value enum
if err := m.validateOpTypeEnum("op_type", "body", m.OpType); err != nil {
return err
}
return nil
}
func (m *Activity) validateActUser(formats strfmt.Registry) error { func (m *Activity) validateActUser(formats strfmt.Registry) error {
if swag.IsZero(m.ActUser) { // not required if swag.IsZero(m.ActUser) { // not required
return nil return nil

View File

@@ -7,12 +7,9 @@ package models
import ( import (
"context" "context"
"encoding/json"
"github.com/go-openapi/errors"
"github.com/go-openapi/strfmt" "github.com/go-openapi/strfmt"
"github.com/go-openapi/swag" "github.com/go-openapi/swag"
"github.com/go-openapi/validate"
) )
// AddCollaboratorOption AddCollaboratorOption options when adding a user as a collaborator of a repository // AddCollaboratorOption AddCollaboratorOption options when adding a user as a collaborator of a repository
@@ -21,66 +18,11 @@ import (
type AddCollaboratorOption struct { type AddCollaboratorOption struct {
// permission // permission
// Enum: ["read","write","admin"]
Permission string `json:"permission,omitempty"` Permission string `json:"permission,omitempty"`
} }
// Validate validates this add collaborator option // Validate validates this add collaborator option
func (m *AddCollaboratorOption) Validate(formats strfmt.Registry) error { func (m *AddCollaboratorOption) Validate(formats strfmt.Registry) error {
var res []error
if err := m.validatePermission(formats); err != nil {
res = append(res, err)
}
if len(res) > 0 {
return errors.CompositeValidationError(res...)
}
return nil
}
var addCollaboratorOptionTypePermissionPropEnum []interface{}
func init() {
var res []string
if err := json.Unmarshal([]byte(`["read","write","admin"]`), &res); err != nil {
panic(err)
}
for _, v := range res {
addCollaboratorOptionTypePermissionPropEnum = append(addCollaboratorOptionTypePermissionPropEnum, v)
}
}
const (
// AddCollaboratorOptionPermissionRead captures enum value "read"
AddCollaboratorOptionPermissionRead string = "read"
// AddCollaboratorOptionPermissionWrite captures enum value "write"
AddCollaboratorOptionPermissionWrite string = "write"
// AddCollaboratorOptionPermissionAdmin captures enum value "admin"
AddCollaboratorOptionPermissionAdmin string = "admin"
)
// prop value enum
func (m *AddCollaboratorOption) validatePermissionEnum(path, location string, value string) error {
if err := validate.EnumCase(path, location, value, addCollaboratorOptionTypePermissionPropEnum, true); err != nil {
return err
}
return nil
}
func (m *AddCollaboratorOption) validatePermission(formats strfmt.Registry) error {
if swag.IsZero(m.Permission) { // not required
return nil
}
// value enum
if err := m.validatePermissionEnum("permission", "body", m.Permission); err != nil {
return err
}
return nil return nil
} }

View File

@@ -25,9 +25,6 @@ type BranchProtection struct {
// approvals whitelist usernames // approvals whitelist usernames
ApprovalsWhitelistUsernames []string `json:"approvals_whitelist_username"` ApprovalsWhitelistUsernames []string `json:"approvals_whitelist_username"`
// block admin merge override
BlockAdminMergeOverride bool `json:"block_admin_merge_override,omitempty"`
// block on official review requests // block on official review requests
BlockOnOfficialReviewRequests bool `json:"block_on_official_review_requests,omitempty"` BlockOnOfficialReviewRequests bool `json:"block_on_official_review_requests,omitempty"`
@@ -50,12 +47,6 @@ type BranchProtection struct {
// enable approvals whitelist // enable approvals whitelist
EnableApprovalsWhitelist bool `json:"enable_approvals_whitelist,omitempty"` EnableApprovalsWhitelist bool `json:"enable_approvals_whitelist,omitempty"`
// enable force push
EnableForcePush bool `json:"enable_force_push,omitempty"`
// enable force push allowlist
EnableForcePushAllowlist bool `json:"enable_force_push_allowlist,omitempty"`
// enable merge whitelist // enable merge whitelist
EnableMergeWhitelist bool `json:"enable_merge_whitelist,omitempty"` EnableMergeWhitelist bool `json:"enable_merge_whitelist,omitempty"`
@@ -68,15 +59,6 @@ type BranchProtection struct {
// enable status check // enable status check
EnableStatusCheck bool `json:"enable_status_check,omitempty"` EnableStatusCheck bool `json:"enable_status_check,omitempty"`
// force push allowlist deploy keys
ForcePushAllowlistDeployKeys bool `json:"force_push_allowlist_deploy_keys,omitempty"`
// force push allowlist teams
ForcePushAllowlistTeams []string `json:"force_push_allowlist_teams"`
// force push allowlist usernames
ForcePushAllowlistUsernames []string `json:"force_push_allowlist_usernames"`
// ignore stale approvals // ignore stale approvals
IgnoreStaleApprovals bool `json:"ignore_stale_approvals,omitempty"` IgnoreStaleApprovals bool `json:"ignore_stale_approvals,omitempty"`
@@ -86,9 +68,6 @@ type BranchProtection struct {
// merge whitelist usernames // merge whitelist usernames
MergeWhitelistUsernames []string `json:"merge_whitelist_usernames"` MergeWhitelistUsernames []string `json:"merge_whitelist_usernames"`
// priority
Priority int64 `json:"priority,omitempty"`
// protected file patterns // protected file patterns
ProtectedFilePatterns string `json:"protected_file_patterns,omitempty"` ProtectedFilePatterns string `json:"protected_file_patterns,omitempty"`

View File

@@ -24,7 +24,6 @@ type CreateAccessTokenOption struct {
Name *string `json:"name"` Name *string `json:"name"`
// scopes // scopes
// Example: ["all","read:activitypub","read:issue","write:misc","read:notification","read:organization","read:package","read:repository","read:user"]
Scopes []string `json:"scopes"` Scopes []string `json:"scopes"`
} }

View File

@@ -23,9 +23,6 @@ type CreateBranchProtectionOption struct {
// approvals whitelist usernames // approvals whitelist usernames
ApprovalsWhitelistUsernames []string `json:"approvals_whitelist_username"` ApprovalsWhitelistUsernames []string `json:"approvals_whitelist_username"`
// block admin merge override
BlockAdminMergeOverride bool `json:"block_admin_merge_override,omitempty"`
// block on official review requests // block on official review requests
BlockOnOfficialReviewRequests bool `json:"block_on_official_review_requests,omitempty"` BlockOnOfficialReviewRequests bool `json:"block_on_official_review_requests,omitempty"`
@@ -44,12 +41,6 @@ type CreateBranchProtectionOption struct {
// enable approvals whitelist // enable approvals whitelist
EnableApprovalsWhitelist bool `json:"enable_approvals_whitelist,omitempty"` EnableApprovalsWhitelist bool `json:"enable_approvals_whitelist,omitempty"`
// enable force push
EnableForcePush bool `json:"enable_force_push,omitempty"`
// enable force push allowlist
EnableForcePushAllowlist bool `json:"enable_force_push_allowlist,omitempty"`
// enable merge whitelist // enable merge whitelist
EnableMergeWhitelist bool `json:"enable_merge_whitelist,omitempty"` EnableMergeWhitelist bool `json:"enable_merge_whitelist,omitempty"`
@@ -62,15 +53,6 @@ type CreateBranchProtectionOption struct {
// enable status check // enable status check
EnableStatusCheck bool `json:"enable_status_check,omitempty"` EnableStatusCheck bool `json:"enable_status_check,omitempty"`
// force push allowlist deploy keys
ForcePushAllowlistDeployKeys bool `json:"force_push_allowlist_deploy_keys,omitempty"`
// force push allowlist teams
ForcePushAllowlistTeams []string `json:"force_push_allowlist_teams"`
// force push allowlist usernames
ForcePushAllowlistUsernames []string `json:"force_push_allowlist_usernames"`
// ignore stale approvals // ignore stale approvals
IgnoreStaleApprovals bool `json:"ignore_stale_approvals,omitempty"` IgnoreStaleApprovals bool `json:"ignore_stale_approvals,omitempty"`
@@ -80,9 +62,6 @@ type CreateBranchProtectionOption struct {
// merge whitelist usernames // merge whitelist usernames
MergeWhitelistUsernames []string `json:"merge_whitelist_usernames"` MergeWhitelistUsernames []string `json:"merge_whitelist_usernames"`
// priority
Priority int64 `json:"priority,omitempty"`
// protected file patterns // protected file patterns
ProtectedFilePatterns string `json:"protected_file_patterns,omitempty"` ProtectedFilePatterns string `json:"protected_file_patterns,omitempty"`

View File

@@ -25,9 +25,6 @@ type CreateOAuth2ApplicationOptions struct {
// redirect u r is // redirect u r is
RedirectURIs []string `json:"redirect_uris"` RedirectURIs []string `json:"redirect_uris"`
// skip secondary authorization
SkipSecondaryAuthorization bool `json:"skip_secondary_authorization,omitempty"`
} }
// Validate validates this create o auth2 application options // Validate validates this create o auth2 application options

View File

@@ -44,12 +44,6 @@ type CreatePullRequestOption struct {
// milestone // milestone
Milestone int64 `json:"milestone,omitempty"` Milestone int64 `json:"milestone,omitempty"`
// reviewers
Reviewers []string `json:"reviewers"`
// team reviewers
TeamReviewers []string `json:"team_reviewers"`
// title // title
Title string `json:"title,omitempty"` Title string `json:"title,omitempty"`
} }

View File

@@ -1,56 +0,0 @@
// Code generated by go-swagger; DO NOT EDIT.
package models
// This file was generated by the swagger tool.
// Editing this file might prove futile when you re-run the swagger generate command
import (
"context"
"github.com/go-openapi/strfmt"
"github.com/go-openapi/swag"
)
// CreateTagProtectionOption CreateTagProtectionOption options for creating a tag protection
//
// swagger:model CreateTagProtectionOption
type CreateTagProtectionOption struct {
// name pattern
NamePattern string `json:"name_pattern,omitempty"`
// whitelist teams
WhitelistTeams []string `json:"whitelist_teams"`
// whitelist usernames
WhitelistUsernames []string `json:"whitelist_usernames"`
}
// Validate validates this create tag protection option
func (m *CreateTagProtectionOption) Validate(formats strfmt.Registry) error {
return nil
}
// ContextValidate validates this create tag protection option based on context it is used
func (m *CreateTagProtectionOption) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
return nil
}
// MarshalBinary interface implementation
func (m *CreateTagProtectionOption) MarshalBinary() ([]byte, error) {
if m == nil {
return nil, nil
}
return swag.WriteJSON(m)
}
// UnmarshalBinary interface implementation
func (m *CreateTagProtectionOption) UnmarshalBinary(b []byte) error {
var res CreateTagProtectionOption
if err := swag.ReadJSON(b, &res); err != nil {
return err
}
*m = res
return nil
}

View File

@@ -23,9 +23,6 @@ type EditBranchProtectionOption struct {
// approvals whitelist usernames // approvals whitelist usernames
ApprovalsWhitelistUsernames []string `json:"approvals_whitelist_username"` ApprovalsWhitelistUsernames []string `json:"approvals_whitelist_username"`
// block admin merge override
BlockAdminMergeOverride bool `json:"block_admin_merge_override,omitempty"`
// block on official review requests // block on official review requests
BlockOnOfficialReviewRequests bool `json:"block_on_official_review_requests,omitempty"` BlockOnOfficialReviewRequests bool `json:"block_on_official_review_requests,omitempty"`
@@ -41,12 +38,6 @@ type EditBranchProtectionOption struct {
// enable approvals whitelist // enable approvals whitelist
EnableApprovalsWhitelist bool `json:"enable_approvals_whitelist,omitempty"` EnableApprovalsWhitelist bool `json:"enable_approvals_whitelist,omitempty"`
// enable force push
EnableForcePush bool `json:"enable_force_push,omitempty"`
// enable force push allowlist
EnableForcePushAllowlist bool `json:"enable_force_push_allowlist,omitempty"`
// enable merge whitelist // enable merge whitelist
EnableMergeWhitelist bool `json:"enable_merge_whitelist,omitempty"` EnableMergeWhitelist bool `json:"enable_merge_whitelist,omitempty"`
@@ -59,15 +50,6 @@ type EditBranchProtectionOption struct {
// enable status check // enable status check
EnableStatusCheck bool `json:"enable_status_check,omitempty"` EnableStatusCheck bool `json:"enable_status_check,omitempty"`
// force push allowlist deploy keys
ForcePushAllowlistDeployKeys bool `json:"force_push_allowlist_deploy_keys,omitempty"`
// force push allowlist teams
ForcePushAllowlistTeams []string `json:"force_push_allowlist_teams"`
// force push allowlist usernames
ForcePushAllowlistUsernames []string `json:"force_push_allowlist_usernames"`
// ignore stale approvals // ignore stale approvals
IgnoreStaleApprovals bool `json:"ignore_stale_approvals,omitempty"` IgnoreStaleApprovals bool `json:"ignore_stale_approvals,omitempty"`
@@ -77,9 +59,6 @@ type EditBranchProtectionOption struct {
// merge whitelist usernames // merge whitelist usernames
MergeWhitelistUsernames []string `json:"merge_whitelist_usernames"` MergeWhitelistUsernames []string `json:"merge_whitelist_usernames"`
// priority
Priority int64 `json:"priority,omitempty"`
// protected file patterns // protected file patterns
ProtectedFilePatterns string `json:"protected_file_patterns,omitempty"` ProtectedFilePatterns string `json:"protected_file_patterns,omitempty"`

View File

@@ -1,56 +0,0 @@
// Code generated by go-swagger; DO NOT EDIT.
package models
// This file was generated by the swagger tool.
// Editing this file might prove futile when you re-run the swagger generate command
import (
"context"
"github.com/go-openapi/strfmt"
"github.com/go-openapi/swag"
)
// EditTagProtectionOption EditTagProtectionOption options for editing a tag protection
//
// swagger:model EditTagProtectionOption
type EditTagProtectionOption struct {
// name pattern
NamePattern string `json:"name_pattern,omitempty"`
// whitelist teams
WhitelistTeams []string `json:"whitelist_teams"`
// whitelist usernames
WhitelistUsernames []string `json:"whitelist_usernames"`
}
// Validate validates this edit tag protection option
func (m *EditTagProtectionOption) Validate(formats strfmt.Registry) error {
return nil
}
// ContextValidate validates this edit tag protection option based on context it is used
func (m *EditTagProtectionOption) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
return nil
}
// MarshalBinary interface implementation
func (m *EditTagProtectionOption) MarshalBinary() ([]byte, error) {
if m == nil {
return nil, nil
}
return swag.WriteJSON(m)
}
// UnmarshalBinary interface implementation
func (m *EditTagProtectionOption) UnmarshalBinary(b []byte) error {
var res EditTagProtectionOption
if err := swag.ReadJSON(b, &res); err != nil {
return err
}
*m = res
return nil
}

View File

@@ -40,11 +40,8 @@ type IssueTemplate struct {
// title // title
Title string `json:"title,omitempty"` Title string `json:"title,omitempty"`
// assignees
Assignees IssueTemplateStringSlice `json:"assignees,omitempty"`
// labels // labels
Labels IssueTemplateStringSlice `json:"labels,omitempty"` Labels IssueTemplateLabels `json:"labels,omitempty"`
} }
// Validate validates this issue template // Validate validates this issue template
@@ -55,10 +52,6 @@ func (m *IssueTemplate) Validate(formats strfmt.Registry) error {
res = append(res, err) res = append(res, err)
} }
if err := m.validateAssignees(formats); err != nil {
res = append(res, err)
}
if err := m.validateLabels(formats); err != nil { if err := m.validateLabels(formats); err != nil {
res = append(res, err) res = append(res, err)
} }
@@ -95,23 +88,6 @@ func (m *IssueTemplate) validateFields(formats strfmt.Registry) error {
return nil return nil
} }
func (m *IssueTemplate) validateAssignees(formats strfmt.Registry) error {
if swag.IsZero(m.Assignees) { // not required
return nil
}
if err := m.Assignees.Validate(formats); err != nil {
if ve, ok := err.(*errors.Validation); ok {
return ve.ValidateName("assignees")
} else if ce, ok := err.(*errors.CompositeError); ok {
return ce.ValidateName("assignees")
}
return err
}
return nil
}
func (m *IssueTemplate) validateLabels(formats strfmt.Registry) error { func (m *IssueTemplate) validateLabels(formats strfmt.Registry) error {
if swag.IsZero(m.Labels) { // not required if swag.IsZero(m.Labels) { // not required
return nil return nil
@@ -137,10 +113,6 @@ func (m *IssueTemplate) ContextValidate(ctx context.Context, formats strfmt.Regi
res = append(res, err) res = append(res, err)
} }
if err := m.contextValidateAssignees(ctx, formats); err != nil {
res = append(res, err)
}
if err := m.contextValidateLabels(ctx, formats); err != nil { if err := m.contextValidateLabels(ctx, formats); err != nil {
res = append(res, err) res = append(res, err)
} }
@@ -176,20 +148,6 @@ func (m *IssueTemplate) contextValidateFields(ctx context.Context, formats strfm
return nil return nil
} }
func (m *IssueTemplate) contextValidateAssignees(ctx context.Context, formats strfmt.Registry) error {
if err := m.Assignees.ContextValidate(ctx, formats); err != nil {
if ve, ok := err.(*errors.Validation); ok {
return ve.ValidateName("assignees")
} else if ce, ok := err.(*errors.CompositeError); ok {
return ce.ValidateName("assignees")
}
return err
}
return nil
}
func (m *IssueTemplate) contextValidateLabels(ctx context.Context, formats strfmt.Registry) error { func (m *IssueTemplate) contextValidateLabels(ctx context.Context, formats strfmt.Registry) error {
if err := m.Labels.ContextValidate(ctx, formats); err != nil { if err := m.Labels.ContextValidate(ctx, formats); err != nil {

View File

@@ -1,27 +0,0 @@
// Code generated by go-swagger; DO NOT EDIT.
package models
// This file was generated by the swagger tool.
// Editing this file might prove futile when you re-run the swagger generate command
import (
"context"
"github.com/go-openapi/strfmt"
)
// IssueTemplateStringSlice issue template string slice
//
// swagger:model IssueTemplateStringSlice
type IssueTemplateStringSlice []string
// Validate validates this issue template string slice
func (m IssueTemplateStringSlice) Validate(formats strfmt.Registry) error {
return nil
}
// ContextValidate validates this issue template string slice based on context it is used
func (m IssueTemplateStringSlice) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
return nil
}

View File

@@ -23,7 +23,7 @@ type MarkdownOption struct {
// in: body // in: body
Context string `json:"Context,omitempty"` Context string `json:"Context,omitempty"`
// Mode to render (markdown, comment, wiki, file) // Mode to render (comment, gfm, markdown)
// //
// in: body // in: body
Mode string `json:"Mode,omitempty"` Mode string `json:"Mode,omitempty"`
@@ -33,9 +33,8 @@ type MarkdownOption struct {
// in: body // in: body
Text string `json:"Text,omitempty"` Text string `json:"Text,omitempty"`
// Is it a wiki page? (use mode=wiki instead) // Is it a wiki page ?
// //
// Deprecated: true
// in: body // in: body
Wiki bool `json:"Wiki,omitempty"` Wiki bool `json:"Wiki,omitempty"`
} }

View File

@@ -28,7 +28,7 @@ type MarkupOption struct {
// in: body // in: body
FilePath string `json:"FilePath,omitempty"` FilePath string `json:"FilePath,omitempty"`
// Mode to render (markdown, comment, wiki, file) // Mode to render (comment, gfm, markdown, file)
// //
// in: body // in: body
Mode string `json:"Mode,omitempty"` Mode string `json:"Mode,omitempty"`
@@ -38,9 +38,8 @@ type MarkupOption struct {
// in: body // in: body
Text string `json:"Text,omitempty"` Text string `json:"Text,omitempty"`
// Is it a wiki page? (use mode=wiki instead) // Is it a wiki page ?
// //
// Deprecated: true
// in: body // in: body
Wiki bool `json:"Wiki,omitempty"` Wiki bool `json:"Wiki,omitempty"`
} }

View File

@@ -1,50 +0,0 @@
// Code generated by go-swagger; DO NOT EDIT.
package models
// This file was generated by the swagger tool.
// Editing this file might prove futile when you re-run the swagger generate command
import (
"context"
"github.com/go-openapi/strfmt"
"github.com/go-openapi/swag"
)
// MergeUpstreamRequest merge upstream request
//
// swagger:model MergeUpstreamRequest
type MergeUpstreamRequest struct {
// branch
Branch string `json:"branch,omitempty"`
}
// Validate validates this merge upstream request
func (m *MergeUpstreamRequest) Validate(formats strfmt.Registry) error {
return nil
}
// ContextValidate validates this merge upstream request based on context it is used
func (m *MergeUpstreamRequest) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
return nil
}
// MarshalBinary interface implementation
func (m *MergeUpstreamRequest) MarshalBinary() ([]byte, error) {
if m == nil {
return nil, nil
}
return swag.WriteJSON(m)
}
// UnmarshalBinary interface implementation
func (m *MergeUpstreamRequest) UnmarshalBinary(b []byte) error {
var res MergeUpstreamRequest
if err := swag.ReadJSON(b, &res); err != nil {
return err
}
*m = res
return nil
}

View File

@@ -1,50 +0,0 @@
// Code generated by go-swagger; DO NOT EDIT.
package models
// This file was generated by the swagger tool.
// Editing this file might prove futile when you re-run the swagger generate command
import (
"context"
"github.com/go-openapi/strfmt"
"github.com/go-openapi/swag"
)
// MergeUpstreamResponse merge upstream response
//
// swagger:model MergeUpstreamResponse
type MergeUpstreamResponse struct {
// merge style
MergeStyle string `json:"merge_type,omitempty"`
}
// Validate validates this merge upstream response
func (m *MergeUpstreamResponse) Validate(formats strfmt.Registry) error {
return nil
}
// ContextValidate validates this merge upstream response based on context it is used
func (m *MergeUpstreamResponse) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
return nil
}
// MarshalBinary interface implementation
func (m *MergeUpstreamResponse) MarshalBinary() ([]byte, error) {
if m == nil {
return nil, nil
}
return swag.WriteJSON(m)
}
// UnmarshalBinary interface implementation
func (m *MergeUpstreamResponse) UnmarshalBinary(b []byte) error {
var res MergeUpstreamResponse
if err := swag.ReadJSON(b, &res); err != nil {
return err
}
*m = res
return nil
}

View File

@@ -21,12 +21,6 @@ import (
// swagger:model MigrateRepoOptions // swagger:model MigrateRepoOptions
type MigrateRepoOptions struct { type MigrateRepoOptions struct {
// a w s access key ID
AWSAccessKeyID string `json:"aws_access_key_id,omitempty"`
// a w s secret access key
AWSSecretAccessKey string `json:"aws_secret_access_key,omitempty"`
// auth password // auth password
AuthPassword string `json:"auth_password,omitempty"` AuthPassword string `json:"auth_password,omitempty"`

View File

@@ -40,9 +40,6 @@ type OAuth2Application struct {
// redirect u r is // redirect u r is
RedirectURIs []string `json:"redirect_uris"` RedirectURIs []string `json:"redirect_uris"`
// skip secondary authorization
SkipSecondaryAuthorization bool `json:"skip_secondary_authorization,omitempty"`
} }
// Validate validates this o auth2 application // Validate validates this o auth2 application

View File

@@ -99,9 +99,6 @@ type PullRequest struct {
// requested reviewers // requested reviewers
RequestedReviewers []*User `json:"requested_reviewers"` RequestedReviewers []*User `json:"requested_reviewers"`
// requested reviewers teams
RequestedReviewersTeams []*Team `json:"requested_reviewers_teams"`
// number of review comments made on the diff of a PR review (not including comments on commits or issues in a PR) // number of review comments made on the diff of a PR review (not including comments on commits or issues in a PR)
ReviewComments int64 `json:"review_comments,omitempty"` ReviewComments int64 `json:"review_comments,omitempty"`
@@ -169,10 +166,6 @@ func (m *PullRequest) Validate(formats strfmt.Registry) error {
res = append(res, err) res = append(res, err)
} }
if err := m.validateRequestedReviewersTeams(formats); err != nil {
res = append(res, err)
}
if err := m.validateUpdated(formats); err != nil { if err := m.validateUpdated(formats); err != nil {
res = append(res, err) res = append(res, err)
} }
@@ -337,32 +330,6 @@ func (m *PullRequest) validateRequestedReviewers(formats strfmt.Registry) error
return nil return nil
} }
func (m *PullRequest) validateRequestedReviewersTeams(formats strfmt.Registry) error {
if swag.IsZero(m.RequestedReviewersTeams) { // not required
return nil
}
for i := 0; i < len(m.RequestedReviewersTeams); i++ {
if swag.IsZero(m.RequestedReviewersTeams[i]) { // not required
continue
}
if m.RequestedReviewersTeams[i] != nil {
if err := m.RequestedReviewersTeams[i].Validate(formats); err != nil {
if ve, ok := err.(*errors.Validation); ok {
return ve.ValidateName("requested_reviewers_teams" + "." + strconv.Itoa(i))
} else if ce, ok := err.(*errors.CompositeError); ok {
return ce.ValidateName("requested_reviewers_teams" + "." + strconv.Itoa(i))
}
return err
}
}
}
return nil
}
func (m *PullRequest) validateUpdated(formats strfmt.Registry) error { func (m *PullRequest) validateUpdated(formats strfmt.Registry) error {
if swag.IsZero(m.Updated) { // not required if swag.IsZero(m.Updated) { // not required
return nil return nil
@@ -522,10 +489,6 @@ func (m *PullRequest) ContextValidate(ctx context.Context, formats strfmt.Regist
res = append(res, err) res = append(res, err)
} }
if err := m.contextValidateRequestedReviewersTeams(ctx, formats); err != nil {
res = append(res, err)
}
if err := m.contextValidateAssignee(ctx, formats); err != nil { if err := m.contextValidateAssignee(ctx, formats); err != nil {
res = append(res, err) res = append(res, err)
} }
@@ -635,31 +598,6 @@ func (m *PullRequest) contextValidateRequestedReviewers(ctx context.Context, for
return nil return nil
} }
func (m *PullRequest) contextValidateRequestedReviewersTeams(ctx context.Context, formats strfmt.Registry) error {
for i := 0; i < len(m.RequestedReviewersTeams); i++ {
if m.RequestedReviewersTeams[i] != nil {
if swag.IsZero(m.RequestedReviewersTeams[i]) { // not required
return nil
}
if err := m.RequestedReviewersTeams[i].ContextValidate(ctx, formats); err != nil {
if ve, ok := err.(*errors.Validation); ok {
return ve.ValidateName("requested_reviewers_teams" + "." + strconv.Itoa(i))
} else if ce, ok := err.(*errors.CompositeError); ok {
return ce.ValidateName("requested_reviewers_teams" + "." + strconv.Itoa(i))
}
return err
}
}
}
return nil
}
func (m *PullRequest) contextValidateAssignee(ctx context.Context, formats strfmt.Registry) error { func (m *PullRequest) contextValidateAssignee(ctx context.Context, formats strfmt.Registry) error {
if m.Assignee != nil { if m.Assignee != nil {

View File

@@ -23,9 +23,6 @@ type Repository struct {
// allow fast forward only // allow fast forward only
AllowFastForwardOnly bool `json:"allow_fast_forward_only_merge,omitempty"` AllowFastForwardOnly bool `json:"allow_fast_forward_only_merge,omitempty"`
// allow manual merge
AllowManualMerge bool `json:"allow_manual_merge,omitempty"`
// allow merge // allow merge
AllowMerge bool `json:"allow_merge_commits,omitempty"` AllowMerge bool `json:"allow_merge_commits,omitempty"`
@@ -48,9 +45,6 @@ type Repository struct {
// Format: date-time // Format: date-time
ArchivedAt strfmt.DateTime `json:"archived_at,omitempty"` ArchivedAt strfmt.DateTime `json:"archived_at,omitempty"`
// autodetect manual merge
AutodetectManualMerge bool `json:"autodetect_manual_merge,omitempty"`
// avatar URL // avatar URL
AvatarURL string `json:"avatar_url,omitempty"` AvatarURL string `json:"avatar_url,omitempty"`
@@ -127,9 +121,6 @@ type Repository struct {
// languages URL // languages URL
LanguagesURL string `json:"languages_url,omitempty"` LanguagesURL string `json:"languages_url,omitempty"`
// licenses
Licenses []string `json:"licenses"`
// link // link
Link string `json:"link,omitempty"` Link string `json:"link,omitempty"`
@@ -180,9 +171,6 @@ type Repository struct {
// template // template
Template bool `json:"template,omitempty"` Template bool `json:"template,omitempty"`
// topics
Topics []string `json:"topics"`
// URL // URL
URL string `json:"url,omitempty"` URL string `json:"url,omitempty"`

View File

@@ -1,106 +0,0 @@
// Code generated by go-swagger; DO NOT EDIT.
package models
// This file was generated by the swagger tool.
// Editing this file might prove futile when you re-run the swagger generate command
import (
"context"
"github.com/go-openapi/errors"
"github.com/go-openapi/strfmt"
"github.com/go-openapi/swag"
"github.com/go-openapi/validate"
)
// TagProtection TagProtection represents a tag protection
//
// swagger:model TagProtection
type TagProtection struct {
// created
// Format: date-time
Created strfmt.DateTime `json:"created_at,omitempty"`
// ID
ID int64 `json:"id,omitempty"`
// name pattern
NamePattern string `json:"name_pattern,omitempty"`
// updated
// Format: date-time
Updated strfmt.DateTime `json:"updated_at,omitempty"`
// whitelist teams
WhitelistTeams []string `json:"whitelist_teams"`
// whitelist usernames
WhitelistUsernames []string `json:"whitelist_usernames"`
}
// Validate validates this tag protection
func (m *TagProtection) Validate(formats strfmt.Registry) error {
var res []error
if err := m.validateCreated(formats); err != nil {
res = append(res, err)
}
if err := m.validateUpdated(formats); err != nil {
res = append(res, err)
}
if len(res) > 0 {
return errors.CompositeValidationError(res...)
}
return nil
}
func (m *TagProtection) validateCreated(formats strfmt.Registry) error {
if swag.IsZero(m.Created) { // not required
return nil
}
if err := validate.FormatOf("created_at", "body", "date-time", m.Created.String(), formats); err != nil {
return err
}
return nil
}
func (m *TagProtection) validateUpdated(formats strfmt.Registry) error {
if swag.IsZero(m.Updated) { // not required
return nil
}
if err := validate.FormatOf("updated_at", "body", "date-time", m.Updated.String(), formats); err != nil {
return err
}
return nil
}
// ContextValidate validates this tag protection based on context it is used
func (m *TagProtection) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
return nil
}
// MarshalBinary interface implementation
func (m *TagProtection) MarshalBinary() ([]byte, error) {
if m == nil {
return nil, nil
}
return swag.WriteJSON(m)
}
// UnmarshalBinary interface implementation
func (m *TagProtection) UnmarshalBinary(b []byte) error {
var res TagProtection
if err := swag.ReadJSON(b, &res); err != nil {
return err
}
*m = res
return nil
}

View File

@@ -1,50 +0,0 @@
// Code generated by go-swagger; DO NOT EDIT.
package models
// This file was generated by the swagger tool.
// Editing this file might prove futile when you re-run the swagger generate command
import (
"context"
"github.com/go-openapi/strfmt"
"github.com/go-openapi/swag"
)
// UpdateBranchProtectionPriories UpdateBranchProtectionPriories a list to update the branch protection rule priorities
//
// swagger:model UpdateBranchProtectionPriories
type UpdateBranchProtectionPriories struct {
// i ds
IDs []int64 `json:"ids"`
}
// Validate validates this update branch protection priories
func (m *UpdateBranchProtectionPriories) Validate(formats strfmt.Registry) error {
return nil
}
// ContextValidate validates this update branch protection priories based on context it is used
func (m *UpdateBranchProtectionPriories) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
return nil
}
// MarshalBinary interface implementation
func (m *UpdateBranchProtectionPriories) MarshalBinary() ([]byte, error) {
if m == nil {
return nil, nil
}
return swag.WriteJSON(m)
}
// UnmarshalBinary interface implementation
func (m *UpdateBranchProtectionPriories) UnmarshalBinary(b []byte) error {
var res UpdateBranchProtectionPriories
if err := swag.ReadJSON(b, &res); err != nil {
return err
}
*m = res
return nil
}

View File

@@ -1,71 +0,0 @@
// Code generated by go-swagger; DO NOT EDIT.
package models
// This file was generated by the swagger tool.
// Editing this file might prove futile when you re-run the swagger generate command
import (
"context"
"github.com/go-openapi/errors"
"github.com/go-openapi/strfmt"
"github.com/go-openapi/swag"
"github.com/go-openapi/validate"
)
// UpdateBranchRepoOption UpdateBranchRepoOption options when updating a branch in a repository
//
// swagger:model UpdateBranchRepoOption
type UpdateBranchRepoOption struct {
// New branch name
// Required: true
Name *string `json:"name"`
}
// Validate validates this update branch repo option
func (m *UpdateBranchRepoOption) Validate(formats strfmt.Registry) error {
var res []error
if err := m.validateName(formats); err != nil {
res = append(res, err)
}
if len(res) > 0 {
return errors.CompositeValidationError(res...)
}
return nil
}
func (m *UpdateBranchRepoOption) validateName(formats strfmt.Registry) error {
if err := validate.Required("name", "body", m.Name); err != nil {
return err
}
return nil
}
// ContextValidate validates this update branch repo option based on context it is used
func (m *UpdateBranchRepoOption) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
return nil
}
// MarshalBinary interface implementation
func (m *UpdateBranchRepoOption) MarshalBinary() ([]byte, error) {
if m == nil {
return nil, nil
}
return swag.WriteJSON(m)
}
// UnmarshalBinary interface implementation
func (m *UpdateBranchRepoOption) UnmarshalBinary(b []byte) error {
var res UpdateBranchRepoOption
if err := swag.ReadJSON(b, &res); err != nil {
return err
}
*m = res
return nil
}

View File

@@ -29,6 +29,7 @@ import (
"path" "path"
"path/filepath" "path/filepath"
"slices" "slices"
"strings"
"time" "time"
transport "github.com/go-openapi/runtime/client" transport "github.com/go-openapi/runtime/client"
@@ -66,18 +67,10 @@ const (
ReviewStateUnknown models.ReviewStateType = "" ReviewStateUnknown models.ReviewStateType = ""
) )
type GiteaTimelineFetcher interface {
GetTimeline(org, repo string, idx int64) ([]*models.TimelineComment, error)
}
type GiteaComment interface { type GiteaComment interface {
AddComment(pr *models.PullRequest, comment string) error AddComment(pr *models.PullRequest, comment string) error
} }
type GiteaSetRepoOptions interface {
SetRepoOptions(owner, repo string, manual_merge bool) (*models.Repository, error)
}
type GiteaMaintainershipReader interface { type GiteaMaintainershipReader interface {
FetchMaintainershipFile(org, prjGit, branch string) ([]byte, string, error) FetchMaintainershipFile(org, prjGit, branch string) ([]byte, string, error)
FetchMaintainershipDirFile(org, prjGit, branch, pkg string) ([]byte, string, error) FetchMaintainershipDirFile(org, prjGit, branch, pkg string) ([]byte, string, error)
@@ -85,19 +78,7 @@ type GiteaMaintainershipReader interface {
type GiteaPRFetcher interface { type GiteaPRFetcher interface {
GetPullRequest(org, project string, num int64) (*models.PullRequest, error) GetPullRequest(org, project string, num int64) (*models.PullRequest, error)
} GetAssociatedPrjGitPR(prjGitOrg, prjGitRepo, refOrg, refRepo string, Index int64) (*models.PullRequest, error)
type GiteaPRUpdater interface {
UpdatePullRequest(org, repo string, num int64, options *models.EditPullRequestOption) (*models.PullRequest, error)
}
type GiteaPRTimelineFetcher interface {
GiteaPRFetcher
GiteaTimelineFetcher
}
type GiteaCommitFetcher interface {
GetCommit(org, repo, sha string) (*models.Commit, error)
} }
type GiteaReviewFetcher interface { type GiteaReviewFetcher interface {
@@ -108,19 +89,14 @@ type GiteaCommentFetcher interface {
GetIssueComments(org, project string, issueNo int64) ([]*models.Comment, error) GetIssueComments(org, project string, issueNo int64) ([]*models.Comment, error)
} }
type GiteaReviewTimelineFetcher interface {
GiteaReviewFetcher
GiteaTimelineFetcher
}
type GiteaPRChecker interface { type GiteaPRChecker interface {
GiteaReviewTimelineFetcher GiteaReviewFetcher
GiteaCommentFetcher GiteaCommentFetcher
GiteaMaintainershipReader GiteaMaintainershipReader
} }
type GiteaReviewFetcherAndRequester interface { type GiteaReviewFetcherAndRequester interface {
GiteaReviewTimelineFetcher GiteaReviewFetcher
GiteaCommentFetcher GiteaCommentFetcher
GiteaReviewRequester GiteaReviewRequester
} }
@@ -129,10 +105,6 @@ type GiteaReviewRequester interface {
RequestReviews(pr *models.PullRequest, reviewer ...string) ([]*models.PullReview, error) RequestReviews(pr *models.PullRequest, reviewer ...string) ([]*models.PullReview, error)
} }
type GiteaReviewUnrequester interface {
UnrequestReview(org, repo string, id int64, reviwers ...string) error
}
type GiteaReviewer interface { type GiteaReviewer interface {
AddReviewComment(pr *models.PullRequest, state models.ReviewStateType, comment string) (*models.PullReview, error) AddReviewComment(pr *models.PullRequest, state models.ReviewStateType, comment string) (*models.PullReview, error)
} }
@@ -152,49 +124,41 @@ const (
CommitStatus_Error = "error" CommitStatus_Error = "error"
) )
type CommitStatus struct {
Context string
Description string
CommitStatus string
}
type GiteaCommitStatusSetter interface { type GiteaCommitStatusSetter interface {
SetCommitStatus(org, repo, hash string, status *models.CommitStatus) (*models.CommitStatus, error) SetCommitStatus(org, repo, hash string, status *CommitStatus) error
} }
type GiteaCommitStatusGetter interface { type GiteaCommitStatusGetter interface {
GetCommitStatus(org, repo, hash string) ([]*models.CommitStatus, error) GetCommitStatus(org, repo, hash string) ([]*CommitStatus, error)
}
type GiteaMerger interface {
ManualMergePR(org, repo string, id int64, commitid string, delBranch bool) error
} }
type Gitea interface { type Gitea interface {
GiteaComment GiteaComment
GiteaRepoFetcher GiteaRepoFetcher
GiteaReviewRequester GiteaReviewRequester
GiteaReviewUnrequester
GiteaReviewer GiteaReviewer
GiteaPRFetcher GiteaPRFetcher
GiteaPRUpdater
GiteaMerger
GiteaCommitFetcher
GiteaReviewFetcher GiteaReviewFetcher
GiteaCommentFetcher GiteaCommentFetcher
GiteaTimelineFetcher
GiteaMaintainershipReader GiteaMaintainershipReader
GiteaFileContentReader GiteaFileContentReader
GiteaCommitStatusGetter
GiteaCommitStatusSetter
GiteaSetRepoOptions
GiteaTimelineFetcher
GetNotifications(Type string, since *time.Time) ([]*models.NotificationThread, error) GetPullNotifications(since *time.Time) ([]*models.NotificationThread, error)
GetDoneNotifications(Type string, page int64) ([]*models.NotificationThread, error)
SetNotificationRead(notificationId int64) error SetNotificationRead(notificationId int64) error
GetOrganization(orgName string) (*models.Organization, error) GetOrganization(orgName string) (*models.Organization, error)
GetOrganizationRepositories(orgName string) ([]*models.Repository, error) GetOrganizationRepositories(orgName string) ([]*models.Repository, error)
CreateRepositoryIfNotExist(git Git, org, repoName string) (*models.Repository, error) CreateRepositoryIfNotExist(git Git, org, repoName string) (*models.Repository, error)
CreatePullRequestIfNotExist(repo *models.Repository, srcId, targetId, title, body string) (*models.PullRequest, error) CreatePullRequestIfNotExist(repo *models.Repository, srcId, targetId, title, body string) (*models.PullRequest, error)
GetAssociatedPrjGitPR(prjGitOrg, prjGitRepo, refOrg, refRepo string, Index int64) (*models.PullRequest, error)
GetPullRequestFileContent(pr *models.PullRequest, path string) ([]byte, string, error) GetPullRequestFileContent(pr *models.PullRequest, path string) ([]byte, string, error)
GetRecentPullRequests(org, repo, branch string) ([]*models.PullRequest, error) GetRecentPullRequests(org, repo, branch string) ([]*models.PullRequest, error)
GetRecentCommits(org, repo, branch string, commitNo int64) ([]*models.Commit, error) GetRecentCommits(org, repo, branch string, commitNo int64) ([]*models.Commit, error)
GetPullRequests(org, project string) ([]*models.PullRequest, error)
GetCurrentUser() (*models.User, error) GetCurrentUser() (*models.User, error)
} }
@@ -238,131 +202,9 @@ func (gitea *GiteaTransport) GetPullRequest(org, project string, num int64) (*mo
gitea.transport.DefaultAuthentication, gitea.transport.DefaultAuthentication,
) )
if err != nil {
LogError(err)
return nil, err
}
return pr.Payload, err return pr.Payload, err
} }
func (gitea *GiteaTransport) UpdatePullRequest(org, repo string, num int64, options *models.EditPullRequestOption) (*models.PullRequest, error) {
pr, err := gitea.client.Repository.RepoEditPullRequest(
repository.NewRepoEditPullRequestParams().
WithOwner(org).
WithRepo(repo).
WithIndex(num).
WithBody(options),
gitea.transport.DefaultAuthentication,
)
if err != nil {
LogError(err)
return nil, err
}
return pr.Payload, err
}
func (gitea *GiteaTransport) ManualMergePR(org, repo string, num int64, commitid string, delBranch bool) error {
manual_merge := "manually-merged"
_, err := gitea.client.Repository.RepoMergePullRequest(
repository.NewRepoMergePullRequestParams().
WithOwner(org).
WithRepo(repo).
WithIndex(num).
WithBody(&models.MergePullRequestForm{
Do: &manual_merge,
DeleteBranchAfterMerge: delBranch,
HeadCommitID: commitid,
}), gitea.transport.DefaultAuthentication,
)
if err != nil {
LogError(err)
return err
}
return nil
}
func (gitea *GiteaTransport) GetPullRequests(org, repo string) ([]*models.PullRequest, error) {
var page, limit int64
prs := make([]*models.PullRequest, 0)
limit = 20
state := "open"
for {
page++
req, err := gitea.client.Repository.RepoListPullRequests(
repository.
NewRepoListPullRequestsParams().
WithDefaults().
WithOwner(org).
WithRepo(repo).
WithState(&state).
WithPage(&page).
WithLimit(&limit),
gitea.transport.DefaultAuthentication)
if err != nil {
return nil, fmt.Errorf("cannot fetch PR list for %s / %s : %w", org, repo, err)
}
prs = slices.Concat(prs, req.Payload)
if len(req.Payload) < int(limit) {
break
}
}
return prs, nil
}
func (gitea *GiteaTransport) GetCommitStatus(org, repo, hash string) ([]*models.CommitStatus, error) {
page := int64(1)
limit := int64(10)
var res []*models.CommitStatus
for {
r, err := gitea.client.Repository.RepoListStatuses(
repository.NewRepoListStatusesParams().WithDefaults().WithOwner(org).WithRepo(repo).WithSha(hash).WithPage(&page).WithLimit(&limit),
gitea.transport.DefaultAuthentication)
if err != nil {
return res, err
}
res = append(res, r.Payload...)
if len(r.Payload) < int(limit) {
break
}
}
return res, nil
}
func (gitea *GiteaTransport) SetCommitStatus(org, repo, hash string, status *models.CommitStatus) (*models.CommitStatus, error) {
res, err := gitea.client.Repository.RepoCreateStatus(
repository.NewRepoCreateStatusParams().
WithDefaults().
WithOwner(org).
WithRepo(repo).
WithSha(hash).
WithBody(&models.CreateStatusOption{
TargetURL: status.TargetURL,
Description: status.Description,
Context: status.Context,
State: models.CommitStatusState(status.Status),
}),
gitea.transport.DefaultAuthentication,
)
if err != nil {
return nil, err
}
return res.Payload, err
}
func (gitea *GiteaTransport) GetRepository(org, pkg string) (*models.Repository, error) { func (gitea *GiteaTransport) GetRepository(org, pkg string) (*models.Repository, error) {
repo, err := gitea.client.Repository.RepoGet(repository.NewRepoGetParams().WithDefaults().WithOwner(org).WithRepo(pkg), gitea.transport.DefaultAuthentication) repo, err := gitea.client.Repository.RepoGet(repository.NewRepoGetParams().WithDefaults().WithOwner(org).WithRepo(pkg), gitea.transport.DefaultAuthentication)
if err != nil { if err != nil {
@@ -407,25 +249,6 @@ func (gitea *GiteaTransport) GetPullRequestReviews(org, project string, PRnum in
return allReviews, nil return allReviews, nil
} }
func (gitea *GiteaTransport) GetCommit(org, repo, sha string) (*models.Commit, error) {
f := false
r, err := gitea.client.Repository.RepoGetSingleCommit(
repository.NewRepoGetSingleCommitParams().
WithOwner(org).
WithRepo(repo).
WithSha(sha).
WithStat(&f).
WithFiles(&f).
WithVerification(&f),
gitea.transport.DefaultAuthentication)
if err != nil {
return nil, err
}
return r.Payload, nil
}
func (gitea *GiteaTransport) GetIssueComments(org, project string, issueNo int64) ([]*models.Comment, error) { func (gitea *GiteaTransport) GetIssueComments(org, project string, issueNo int64) ([]*models.Comment, error) {
// limit := int64(20) // limit := int64(20)
// var page int64 // var page int64
@@ -450,73 +273,25 @@ func (gitea *GiteaTransport) GetIssueComments(org, project string, issueNo int64
} }
func (gitea *GiteaTransport) SetRepoOptions(owner, repo string, manual_merge bool) (*models.Repository, error) { func (gitea *GiteaTransport) GetPullNotifications(since *time.Time) ([]*models.NotificationThread, error) {
ok, err := gitea.client.Repository.RepoEdit(repository.NewRepoEditParams().WithOwner(owner).WithRepo(repo).WithBody( bigLimit := int64(100000)
&models.EditRepoOption{
AllowManualMerge: manual_merge,
AutodetectManualMerge: manual_merge,
}), gitea.transport.DefaultAuthentication)
params := notification.NewNotifyGetListParams().
WithDefaults().
WithSubjectType([]string{"Pull"}).
WithStatusTypes([]string{"unread"}).
WithLimit(&bigLimit)
if since != nil {
s := strfmt.DateTime(*since)
params.SetSince(&s)
}
list, err := gitea.client.Notification.NotifyGetList(params, gitea.transport.DefaultAuthentication)
if err != nil { if err != nil {
return nil, err return nil, err
} }
return ok.Payload, err
}
const (
GiteaNotificationType_Pull = "Pull"
)
func (gitea *GiteaTransport) GetNotifications(Type string, since *time.Time) ([]*models.NotificationThread, error) {
bigLimit := int64(20)
ret := make([]*models.NotificationThread, 0, 100)
for page := int64(1); ; page++ {
params := notification.NewNotifyGetListParams().
WithDefaults().
WithSubjectType([]string{Type}).
WithStatusTypes([]string{"unread"}).
WithLimit(&bigLimit).
WithPage(&page)
if since != nil {
s := strfmt.DateTime(*since)
params.SetSince(&s)
}
list, err := gitea.client.Notification.NotifyGetList(params, gitea.transport.DefaultAuthentication)
if err != nil {
return nil, err
}
ret = slices.Concat(ret, list.Payload)
if len(list.Payload) < int(bigLimit) {
break
}
}
return ret, nil
}
func (gitea *GiteaTransport) GetDoneNotifications(Type string, page int64) ([]*models.NotificationThread, error) {
limit := int64(20)
t := true
if page <= 0 {
return nil, fmt.Errorf("Page is 1-base positive int...")
}
list, err := gitea.client.Notification.NotifyGetList(
notification.NewNotifyGetListParams().
WithAll(&t).
WithSubjectType([]string{Type}).
WithStatusTypes([]string{"read"}).
WithLimit(&limit).
WithPage(&page),
gitea.transport.DefaultAuthentication)
if err != nil {
return nil, err
}
return list.Payload, nil return list.Payload, nil
} }
@@ -640,18 +415,14 @@ func (gitea *GiteaTransport) CreateRepositoryIfNotExist(git Git, org, repoName s
func (gitea *GiteaTransport) CreatePullRequestIfNotExist(repo *models.Repository, srcId, targetId, title, body string) (*models.PullRequest, error) { func (gitea *GiteaTransport) CreatePullRequestIfNotExist(repo *models.Repository, srcId, targetId, title, body string) (*models.PullRequest, error) {
prOptions := models.CreatePullRequestOption{ prOptions := models.CreatePullRequestOption{
Base: targetId, Base: repo.DefaultBranch,
Head: srcId, Head: srcId,
Title: title, Title: title,
Body: body, Body: body,
} }
if pr, err := gitea.client.Repository.RepoGetPullRequestByBaseHead( if pr, err := gitea.client.Repository.RepoGetPullRequestByBaseHead(
repository.NewRepoGetPullRequestByBaseHeadParams(). repository.NewRepoGetPullRequestByBaseHeadParams().WithOwner(repo.Owner.UserName).WithRepo(repo.Name).WithBase(repo.DefaultBranch).WithHead(srcId),
WithOwner(repo.Owner.UserName).
WithRepo(repo.Name).
WithBase(targetId).
WithHead(srcId),
gitea.transport.DefaultAuthentication, gitea.transport.DefaultAuthentication,
); err == nil { ); err == nil {
return pr.Payload, nil return pr.Payload, nil
@@ -674,6 +445,46 @@ func (gitea *GiteaTransport) CreatePullRequestIfNotExist(repo *models.Repository
return pr.GetPayload(), nil return pr.GetPayload(), nil
} }
func (gitea *GiteaTransport) GetAssociatedPrjGitPR(prjGitOrg, prjGitRepo, refOrg, refRepo string, Index int64) (*models.PullRequest, error) {
var page int64
state := "open"
for {
page++
prs, err := gitea.client.Repository.RepoListPullRequests(
repository.
NewRepoListPullRequestsParams().
WithDefaults().
WithOwner(prjGitOrg).
WithRepo(prjGitRepo).
WithState(&state).
WithPage(&page),
gitea.transport.DefaultAuthentication)
if err != nil {
return nil, fmt.Errorf("cannot fetch PR list for %s / %s : %w", prjGitOrg, prjGitRepo, err)
}
prLine := fmt.Sprintf(PrPattern, refOrg, refRepo, Index)
// payload_processing:
for _, pr := range prs.Payload {
lines := strings.Split(pr.Body, "\n")
for _, line := range lines {
if strings.TrimSpace(line) == prLine {
return pr, nil
}
}
}
if len(prs.Payload) < 10 {
break
}
}
return nil, nil
}
func (gitea *GiteaTransport) RequestReviews(pr *models.PullRequest, reviewers ...string) ([]*models.PullReview, error) { func (gitea *GiteaTransport) RequestReviews(pr *models.PullRequest, reviewers ...string) ([]*models.PullReview, error) {
reviewOptions := models.PullReviewRequestOptions{ reviewOptions := models.PullReviewRequestOptions{
Reviewers: reviewers, Reviewers: reviewers,
@@ -696,14 +507,6 @@ func (gitea *GiteaTransport) RequestReviews(pr *models.PullRequest, reviewers ..
return review.GetPayload(), nil return review.GetPayload(), nil
} }
func (gitea *GiteaTransport) UnrequestReview(org, repo string, id int64, reviwers ...string) error {
_, err := gitea.client.Repository.RepoDeletePullReviewRequests(
repository.NewRepoDeletePullReviewRequestsParams().WithOwner(org).WithRepo(repo).WithIndex(id).WithBody(&models.PullReviewRequestOptions{
Reviewers: reviwers,
}), gitea.transport.DefaultAuthentication)
return err
}
func (gitea *GiteaTransport) AddReviewComment(pr *models.PullRequest, state models.ReviewStateType, comment string) (*models.PullReview, error) { func (gitea *GiteaTransport) AddReviewComment(pr *models.PullRequest, state models.ReviewStateType, comment string) (*models.PullReview, error) {
c, err := gitea.client.Repository.RepoCreatePullReview( c, err := gitea.client.Repository.RepoCreatePullReview(
repository.NewRepoCreatePullReviewParams(). repository.NewRepoCreatePullReviewParams().
@@ -758,44 +561,6 @@ func (gitea *GiteaTransport) AddComment(pr *models.PullRequest, comment string)
return nil return nil
} }
func (gitea *GiteaTransport) GetTimeline(org, repo string, idx int64) ([]*models.TimelineComment, error) {
page := int64(1)
resCount := 1
retData := []*models.TimelineComment{}
for resCount > 0 {
res, err := gitea.client.Issue.IssueGetCommentsAndTimeline(
issue.NewIssueGetCommentsAndTimelineParams().
WithOwner(org).
WithRepo(repo).
WithIndex(idx).
WithPage(&page),
gitea.transport.DefaultAuthentication,
)
if err != nil {
return nil, err
}
resCount = len(res.Payload)
LogDebug("page:", page, "len:", resCount)
page++
for _, d := range res.Payload {
if d != nil {
retData = append(retData, d)
}
}
}
LogDebug("total results:", len(retData))
slices.SortFunc(retData, func(a, b *models.TimelineComment) int {
return time.Time(b.Created).Compare(time.Time(a.Created))
})
return retData, nil
}
func (gitea *GiteaTransport) GetRepositoryFileContent(org, repo, hash, path string) ([]byte, string, error) { func (gitea *GiteaTransport) GetRepositoryFileContent(org, repo, hash, path string) ([]byte, string, error) {
params := repository.NewRepoGetContentsParams().WithOwner(org).WithRepo(repo).WithFilepath(path) params := repository.NewRepoGetContentsParams().WithOwner(org).WithRepo(repo).WithFilepath(path)
if len(hash) > 0 { if len(hash) > 0 {
@@ -867,7 +632,7 @@ endPrs:
} }
// if pr is closed for more than a week, assume that we are done too // if pr is closed for more than a week, assume that we are done too
if pr.State == "closed" && time.Since(time.Time(pr.Updated)) > 7*24*time.Hour { if time.Since(time.Time(pr.Updated)) > 7*24*time.Hour {
break endPrs break endPrs
} }

317
common/listen.go Normal file
View File

@@ -0,0 +1,317 @@
package common
/*
* This file is part of Autogits.
*
* Copyright © 2024 SUSE LLC
*
* Autogits is free software: you can redistribute it and/or modify it under
* the terms of the GNU General Public License as published by the Free Software
* Foundation, either version 2 of the License, or (at your option) any later
* version.
*
* Autogits is distributed in the hope that it will be useful, but WITHOUT ANY
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
* PARTICULAR PURPOSE. See the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along with
* Foobar. If not, see <https://www.gnu.org/licenses/>.
*/
import (
"crypto/tls"
"fmt"
"net/url"
"runtime/debug"
"slices"
"strings"
"time"
rabbitmq "github.com/rabbitmq/amqp091-go"
)
const RequestType_CreateBrachTag = "create"
const RequestType_DeleteBranchTag = "delete"
const RequestType_Fork = "fork"
const RequestType_Issue = "issues"
const RequestType_IssueAssign = "issue_assign"
const RequestType_IssueComment = "issue_comment"
const RequestType_IssueLabel = "issue_label"
const RequestType_IssueMilestone = "issue_milestone"
const RequestType_Push = "push"
const RequestType_Repository = "repository"
const RequestType_Release = "release"
const RequestType_PR = "pull_request"
const RequestType_PRAssign = "pull_request_assign"
const RequestType_PRLabel = "pull_request_label"
const RequestType_PRComment = "pull_request_comment"
const RequestType_PRMilestone = "pull_request_milestone"
const RequestType_PRSync = "pull_request_sync"
const RequestType_PRReviewAccepted = "pull_request_review_approved"
const RequestType_PRReviewRejected = "pull_request_review_rejected"
const RequestType_PRReviewRequest = "pull_request_review_request"
const RequestType_PRReviewComment = "pull_request_review_comment"
const RequestType_Wiki = "wiki"
type RequestProcessor interface {
ProcessFunc(*Request) error
}
type ListenDefinitions struct {
RabbitURL *url.URL // amqps://user:password@host/queue
GitAuthor string
Handlers map[string]RequestProcessor
Orgs []string
topics []string
topicSubChanges chan string // +topic = subscribe, -topic = unsubscribe
}
type RabbitMessage rabbitmq.Delivery
func (l *ListenDefinitions) processTopicChanges(ch *rabbitmq.Channel, queueName string) {
for {
topic, ok := <-l.topicSubChanges
if !ok {
return
}
LogDebug(" topic change:", topic)
switch topic[0] {
case '+':
if err := ch.QueueBind(queueName, topic[1:], "pubsub", false, nil); err != nil {
LogError(err)
}
case '-':
if err := ch.QueueUnbind(queueName, topic[1:], "pubsub", nil); err != nil {
LogError(err)
}
default:
LogInfo("Ignoring unknown topic change:", topic)
}
}
}
func (l *ListenDefinitions) processRabbitMQ(msgCh chan<- RabbitMessage) error {
queueName := l.RabbitURL.Path
l.RabbitURL.Path = ""
if len(queueName) > 0 && queueName[0] == '/' {
queueName = queueName[1:]
}
connection, err := rabbitmq.DialTLS(l.RabbitURL.String(), &tls.Config{
ServerName: l.RabbitURL.Hostname(),
})
if err != nil {
return fmt.Errorf("Cannot connect to %s . Err: %w", l.RabbitURL.Hostname(), err)
}
defer connection.Close()
ch, err := connection.Channel()
if err != nil {
return fmt.Errorf("Cannot create a channel. Err: %w", err)
}
defer ch.Close()
if err = ch.ExchangeDeclarePassive("pubsub", "topic", true, false, false, false, nil); err != nil {
return fmt.Errorf("Cannot find pubsub exchange? Err: %w", err)
}
var q rabbitmq.Queue
if len(queueName) == 0 {
q, err = ch.QueueDeclare("", false, true, true, false, nil)
} else {
q, err = ch.QueueDeclarePassive(queueName, true, false, true, false, nil)
if err != nil {
LogInfo("queue not found .. trying to create it:", err)
if ch.IsClosed() {
ch, err = connection.Channel()
if err != nil {
return fmt.Errorf("Channel cannot be re-opened. Err: %w", err)
}
}
q, err = ch.QueueDeclare(queueName, true, false, true, false, nil)
if err != nil {
LogInfo("can't create persistent queue ... falling back to temporaty queue:", err)
if ch.IsClosed() {
ch, err = connection.Channel()
return fmt.Errorf("Channel cannot be re-opened. Err: %w", err)
}
q, err = ch.QueueDeclare("", false, true, true, false, nil)
}
}
}
if err != nil {
return fmt.Errorf("Cannot declare queue. Err: %w", err)
}
// log.Printf("queue: %s:%d", q.Name, q.Consumers)
LogInfo(" -- listening to topics:")
l.topicSubChanges = make(chan string)
defer close(l.topicSubChanges)
go l.processTopicChanges(ch, q.Name)
for _, topic := range l.topics {
l.topicSubChanges <- "+" + topic
}
msgs, err := ch.Consume(q.Name, "", true, true, false, false, nil)
if err != nil {
return fmt.Errorf("Cannot start consumer. Err: %w", err)
}
// log.Printf("queue: %s:%d", q.Name, q.Consumers)
for {
msg, ok := <-msgs
if !ok {
return fmt.Errorf("channel/connection closed?\n")
}
msgCh <- RabbitMessage(msg)
}
}
func (l *ListenDefinitions) connectAndProcessRabbitMQ(ch chan<- RabbitMessage) {
defer func() {
if r := recover(); r != nil {
LogError(r)
LogError("'crash' RabbitMQ worker. Recovering... reconnecting...")
time.Sleep(5 * time.Second)
go l.connectAndProcessRabbitMQ(ch)
}
}()
for {
err := l.processRabbitMQ(ch)
if err != nil {
LogError("Error in RabbitMQ connection. %#v", err)
LogInfo("Reconnecting in 2 seconds...")
time.Sleep(2 * time.Second)
}
}
}
func (l *ListenDefinitions) connectToRabbitMQ() chan RabbitMessage {
ch := make(chan RabbitMessage, 100)
go l.connectAndProcessRabbitMQ(ch)
return ch
}
func ProcessEvent(f RequestProcessor, request *Request) {
defer func() {
if r := recover(); r != nil {
LogError("panic caught")
if err, ok := r.(error); !ok {
LogError(err)
}
LogError(string(debug.Stack()))
}
}()
if err := f.ProcessFunc(request); err != nil {
LogError(err)
}
}
func (l *ListenDefinitions) generateTopics() []string {
topics := make([]string, 0, len(l.Handlers)*len(l.Orgs))
scope := "suse"
if l.RabbitURL.Hostname() == "rabbit.opensuse.org" {
scope = "opensuse"
}
for _, org := range l.Orgs {
for requestType, _ := range l.Handlers {
topics = append(topics, fmt.Sprintf("%s.src.%s.%s.#", scope, org, requestType))
}
}
slices.Sort(topics)
return slices.Compact(topics)
}
func (l *ListenDefinitions) UpdateTopics() {
newTopics := l.generateTopics()
j := 0
next_new_topic:
for i := 0; i < len(newTopics); i++ {
topic := newTopics[i]
for j < len(l.topics) {
cmp := strings.Compare(topic, l.topics[j])
if cmp == 0 {
j++
continue next_new_topic
}
if cmp < 0 {
l.topicSubChanges <- "+" + topic
break
}
l.topicSubChanges <- "-" + l.topics[j]
j++
}
if j == len(l.topics) {
l.topicSubChanges <- "+" + topic
}
}
}
func (l *ListenDefinitions) ProcessRabbitMQEvents() error {
LogInfo("RabbitMQ connection:", l.RabbitURL.String())
LogDebug("# Handlers:", len(l.Handlers))
LogDebug("# Orgs:", len(l.Orgs))
l.RabbitURL.User = url.UserPassword(rabbitUser, rabbitPassword)
l.topics = l.generateTopics()
ch := l.connectToRabbitMQ()
for {
msg, ok := <-ch
if !ok {
return nil
}
LogDebug("event:", msg.RoutingKey)
route := strings.Split(msg.RoutingKey, ".")
if len(route) > 3 {
reqType := route[3]
org := route[2]
if !slices.Contains(l.Orgs, org) {
LogInfo("Got event for unhandeled org:", org)
continue
}
LogDebug("org:", org, "type:", reqType)
if handler, found := l.Handlers[reqType]; found {
/* h, err := CreateRequestHandler()
if err != nil {
log.Println("Cannot create request handler", err)
continue
}
*/
req, err := ParseRequestJSON(reqType, msg.Body)
if err != nil {
LogError("Error parsing request JSON:", err)
continue
} else {
LogDebug("processing req", req.Type)
// h.Request = req
ProcessEvent(handler, req)
}
}
}
}
}

48
common/listen_test.go Normal file
View File

@@ -0,0 +1,48 @@
package common
import (
"net/url"
"testing"
)
func TestListenDefinitionsTopicUpdate(t *testing.T) {
tests := []struct {
name string
handlers []string
orgs1, orgs2 []string
topicDelta []string
}{
{
name: "no handlers, no orgs",
},
{
name: "adding one org",
handlers: []string{"foo"},
orgs2: []string{"newOrg"},
topicDelta: []string{"+suse"},
},
}
u, _ := url.Parse("amqps://rabbit.example.com")
for _, test := range tests {
t.Run(test.name, func(t *testing.T) {
l := ListenDefinitions{
Orgs: test.orgs1,
Handlers: make(map[string]RequestProcessor),
topicSubChanges: make(chan string, len(test.topicDelta)*10),
RabbitURL: u,
}
for _, r := range test.handlers {
l.Handlers[r] = nil
}
l.UpdateTopics()
if len(l.topicSubChanges) != len(test.topicDelta) {
t.Fatal("topicSubChanges", len(l.topicSubChanges), " != topicDelta", len(test.topicDelta))
}
})
}
}

View File

@@ -36,14 +36,13 @@ func CreateStdoutLogger(stdout, stderr io.Writer) (*log.Logger, *log.Logger) {
func PanicOnError(err error) { func PanicOnError(err error) {
if err != nil { if err != nil {
LogError(err)
panic(err) panic(err)
} }
} }
func PanicOnErrorWithMsg(err error, msg ...any) { func PanicOnErrorWithMsg(err error, msg string) {
if err != nil { if err != nil {
LogError(msg...) LogError(msg)
panic(err) panic(err)
} }
} }
@@ -52,42 +51,18 @@ type LogLevel int
const ( const (
LogLevelNone = 0 LogLevelNone = 0
LogLevelError = 2
LogLevelInfo = 5 LogLevelInfo = 5
LogLevelDebug = 10 LogLevelDebug = 10
) )
var logLevel LogLevel = LogLevelInfo var logLevel LogLevel
func SetLoggingLevel(ll LogLevel) { func SetLoggingLevel(ll LogLevel) {
logLevel = ll logLevel = ll
} }
func GetLoggingLevel() LogLevel {
return logLevel
}
func SetLoggingLevelFromString(ll string) error {
switch ll {
case "info":
SetLoggingLevel(LogLevelInfo)
case "debug":
SetLoggingLevel(LogLevelDebug)
case "error":
SetLoggingLevel(LogLevelError)
case "none":
SetLoggingLevel(LogLevelNone)
default:
return fmt.Errorf("Unknown logging level: %s", ll)
}
return nil
}
func LogError(params ...any) { func LogError(params ...any) {
if logLevel >= LogLevelError { log.Println(append([]any{"[E]"}, params...)...)
log.Println(append([]any{"[E]"}, params...)...)
}
} }
func LogDebug(params ...any) { func LogDebug(params ...any) {

View File

@@ -16,7 +16,7 @@ type MaintainershipData interface {
ListProjectMaintainers() []string ListProjectMaintainers() []string
ListPackageMaintainers(pkg string) []string ListPackageMaintainers(pkg string) []string
IsApproved(pkg string, reviews []*models.PullReview, submitter string) bool IsApproved(pkg string, reviews []*models.PullReview) bool
} }
const ProjectKey = "" const ProjectKey = ""
@@ -44,13 +44,12 @@ func FetchProjectMaintainershipData(gitea GiteaMaintainershipReader, org, prjGit
dir := true dir := true
if err != nil || data == nil { if err != nil || data == nil {
dir = false dir = false
if _, notFound := err.(*repository.RepoGetContentsNotFound); !notFound { if _, notFound := err.(*repository.RepoGetRawFileNotFound); !notFound {
return nil, err return nil, err
} }
LogDebug("Falling back to maintainership file")
data, _, err = gitea.FetchMaintainershipFile(org, prjGit, branch) data, _, err = gitea.FetchMaintainershipFile(org, prjGit, branch)
if err != nil || data == nil { if err != nil || data == nil {
if _, notFound := err.(*repository.RepoGetContentsNotFound); !notFound { if _, notFound := err.(*repository.RepoGetRawFileNotFound); !notFound {
return nil, err return nil, err
} }
@@ -63,7 +62,7 @@ func FetchProjectMaintainershipData(gitea GiteaMaintainershipReader, org, prjGit
if m != nil { if m != nil {
m.IsDir = dir m.IsDir = dir
m.FetchPackage = func(pkg string) ([]byte, error) { m.FetchPackage = func(pkg string) ([]byte, error) {
data, _, err := gitea.FetchMaintainershipDirFile(org, prjGit, branch, pkg) data , _, err := gitea.FetchMaintainershipDirFile(org, prjGit, branch, pkg)
return data, err return data, err
} }
} }
@@ -126,27 +125,27 @@ prjMaintainer:
return pkgMaintainers return pkgMaintainers
} }
func (data *MaintainershipMap) IsApproved(pkg string, reviews []*models.PullReview, submitter string) bool { func (data *MaintainershipMap) IsApproved(pkg string, reviews []*models.PullReview) bool {
var reviewers []string reviewers, found := data.Data[pkg]
if pkg != ProjectKey { if !found {
reviewers = data.ListPackageMaintainers(pkg) if pkg != ProjectKey && data.IsDir {
} else { r, err := data.FetchPackage(pkg)
reviewers = data.ListProjectMaintainers() if err != nil {
return false
}
reviewers = parsePkgDirData(pkg, r)
data.Data[pkg] = reviewers
} else {
return true
}
} }
if len(reviewers) == 0 { if len(reviewers) == 0 {
return true return true
} }
LogDebug("Looking for review by:", reviewers)
if slices.Contains(reviewers, submitter) {
LogDebug("Submitter is maintainer. Approving.")
return true
}
for _, review := range reviews { for _, review := range reviews {
if !review.Stale && review.State == ReviewStateApproved && slices.Contains(reviewers, review.User.UserName) { if !review.Stale && review.State == ReviewStateApproved && slices.Contains(reviewers, review.User.UserName) {
LogDebug("Reviewed by", review.User.UserName)
return true return true
} }
@@ -184,7 +183,7 @@ func (data *MaintainershipMap) WriteMaintainershipFile(writer io.StringWriter) e
keys = slices.Delete(keys, i, len(keys)) keys = slices.Delete(keys, i, len(keys))
} }
slices.Sort(keys) slices.Sort(keys)
for i, pkg := range keys { for i, pkg := range(keys) {
eol := "," eol := ","
if i == len(keys)-1 { if i == len(keys)-1 {
eol = "" eol = ""

View File

@@ -120,7 +120,7 @@ func TestMaintainership(t *testing.T) {
}, },
} }
notFoundError := repository.NewRepoGetContentsNotFound() notFoundError := repository.NewRepoGetRawFileNotFound()
for _, test := range packageTests { for _, test := range packageTests {
runTests := func(t *testing.T, mi common.GiteaMaintainershipReader) { runTests := func(t *testing.T, mi common.GiteaMaintainershipReader) {
maintainers, err := common.FetchProjectMaintainershipData(mi, config.Organization, config.GitProjectName, config.Branch) maintainers, err := common.FetchProjectMaintainershipData(mi, config.Organization, config.GitProjectName, config.Branch)

View File

@@ -1,56 +0,0 @@
package common
import (
"os"
"path"
"strings"
"gopkg.in/yaml.v3"
)
type Manifest struct {
Subdirectories []string
}
func (m *Manifest) SubdirForPackage(pkg string) string {
if m == nil {
return pkg
}
idx := -1
matchLen := 0
basePkg := path.Base(pkg)
lowercasePkg := strings.ToLower(basePkg)
for i, sub := range m.Subdirectories {
basename := strings.ToLower(path.Base(sub))
if strings.HasPrefix(lowercasePkg, basename) && matchLen < len(basename) {
idx = i
matchLen = len(basename)
}
}
if idx > -1 {
return path.Join(m.Subdirectories[idx], basePkg)
}
return pkg
}
func ReadManifestFile(filename string) (*Manifest, error) {
data, err := os.ReadFile(filename)
if err != nil {
return nil, err
}
return ParseManifestFile(data)
}
func ParseManifestFile(data []byte) (*Manifest, error) {
ret := &Manifest{}
err := yaml.Unmarshal(data, ret)
if err != nil {
return nil, err
}
return ret, nil
}

View File

@@ -1,56 +0,0 @@
package common_test
import (
"testing"
"src.opensuse.org/autogits/common"
)
func TestManifestSubdirAssignments(t *testing.T) {
tests := []struct {
Name string
ManifestContent string
Packages []string
ManifestLocations []string
}{
{
Name: "empty manifest",
Packages: []string{"atom", "blarg", "Foobar", "X-Ray", "boost", "NodeJS"},
ManifestLocations: []string{"atom", "blarg", "Foobar", "X-Ray", "boost", "NodeJS"},
},
{
Name: "only few subdirs manifest",
ManifestContent: "subdirectories:\n - a\n - b",
Packages: []string{"atom", "blarg", "Foobar", "X-Ray", "Boost", "NodeJS"},
ManifestLocations: []string{"a/atom", "b/blarg", "Foobar", "X-Ray", "b/Boost", "NodeJS"},
},
{
Name: "multilayer subdirs manifest",
ManifestContent: "subdirectories:\n - a\n - b\n - libs/boo",
Packages: []string{"atom", "blarg", "Foobar", "X-Ray", "Boost", "NodeJS"},
ManifestLocations: []string{"a/atom", "b/blarg", "Foobar", "X-Ray", "libs/boo/Boost", "NodeJS"},
},
{
Name: "multilayer subdirs manifest with trailing /",
ManifestContent: "subdirectories:\n - a\n - b\n - libs/boo/\n - somedir/Node/",
Packages: []string{"atom", "blarg", "Foobar", "X-Ray", "Boost", "NodeJS", "foobar/node2"},
ManifestLocations: []string{"a/atom", "b/blarg", "Foobar", "X-Ray", "libs/boo/Boost", "somedir/Node/NodeJS", "somedir/Node/node2"},
},
}
for _, test := range tests {
t.Run(test.Name, func(t *testing.T) {
m, err := common.ParseManifestFile([]byte(test.ManifestContent))
if err != nil {
t.Fatal(err)
}
for i, pkg := range test.Packages {
expected := test.ManifestLocations[i]
if l := m.SubdirForPackage(pkg); l != expected {
t.Error("Expected:", expected, "but got:", l)
}
}
})
}
}

View File

@@ -25,6 +25,7 @@ import (
"errors" "errors"
"fmt" "fmt"
"io" "io"
"log"
"net/http" "net/http"
"net/url" "net/url"
"os/exec" "os/exec"
@@ -58,7 +59,7 @@ type ObsClient struct {
} }
func NewObsClient(host string) (*ObsClient, error) { func NewObsClient(host string) (*ObsClient, error) {
baseUrl, err := url.Parse(host) baseUrl, err := url.Parse("https://" + host)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@@ -156,34 +157,6 @@ type GroupMeta struct {
Persons PersonGroup `xml:"person"` Persons PersonGroup `xml:"person"`
} }
type RequestStateMeta struct {
XMLName xml.Name `xml:"state"`
State string `xml:"name,attr"`
}
type RequestActionTarget struct {
XMLName xml.Name
Project string `xml:"project,attr"`
Package string `xml:"package,attr"`
Revision *string `xml:"rev,attr,optional"`
}
type RequestActionMeta struct {
XMLName xml.Name `xml:"action"`
Type string `xml:"type,attr"`
Source *RequestActionTarget `xml:"source,optional"`
Target *RequestActionTarget `xml:"target,optional"`
}
type RequestMeta struct {
XMLName xml.Name `xml:"request"`
Id int `xml:"id,attr"`
Creator string `xml:"creator,attr"`
Action *RequestActionMeta `xml:"action"`
State RequestStateMeta `xml:"state"`
}
func parseProjectMeta(data []byte) (*ProjectMeta, error) { func parseProjectMeta(data []byte) (*ProjectMeta, error) {
var meta ProjectMeta var meta ProjectMeta
err := xml.Unmarshal(data, &meta) err := xml.Unmarshal(data, &meta)
@@ -194,83 +167,8 @@ func parseProjectMeta(data []byte) (*ProjectMeta, error) {
return &meta, nil return &meta, nil
} }
const (
RequestStatus_Unknown = "unknown"
RequestStatus_Accepted = "accepted"
RequestStatus_Superseded = "superseded"
RequestStatus_Declined = "declined"
RequestStatus_Revoked = "revoked"
RequestStatus_New = "new"
RequestStatus_Review = "review"
)
func (status *RequestStateMeta) IsFinal() bool {
switch status.State {
case RequestStatus_Declined, RequestStatus_Revoked, RequestStatus_Accepted, RequestStatus_Superseded:
return true
}
return false
}
func parseRequestXml(data []byte) (*RequestMeta, error) {
ret := RequestMeta{}
LogDebug("parsing: ", string(data))
if err := xml.Unmarshal(data, &ret); err != nil {
return nil, err
}
return &ret, nil
}
func (c *ObsClient) CreateSubmitRequest(sourcePrj, sourcePkg, targetPrj string) (*RequestMeta, error) {
url := c.baseUrl.JoinPath("request")
query := url.Query()
query.Add("cmd", "create")
url.RawQuery = query.Encode()
request := `<request>
<action type="submit">
<source project="` + sourcePrj + `" package="` + sourcePkg + `">
</source>
<target project="` + targetPrj + `" package="` + sourcePkg + `">
</target>
</action>
</request>`
res, err := c.ObsRequestRaw("POST", url.String(), strings.NewReader(request))
if err != nil {
return nil, err
} else if res.StatusCode != 200 {
return nil, fmt.Errorf("Unexpected return code: %d", res.StatusCode)
}
data, err := io.ReadAll(res.Body)
if err != nil {
return nil, err
}
return parseRequestXml(data)
}
func (c *ObsClient) RequestStatus(requestID int) (*RequestMeta, error) {
res, err := c.ObsRequest("GET", []string{"request", fmt.Sprint(requestID)}, nil)
if err != nil {
return nil, err
}
if res.StatusCode != 200 {
return nil, fmt.Errorf("Unexpected return code: %d", res.StatusCode)
}
data, err := io.ReadAll(res.Body)
if err != nil {
return nil, err
}
return parseRequestXml(data)
}
func (c *ObsClient) GetGroupMeta(gid string) (*GroupMeta, error) { func (c *ObsClient) GetGroupMeta(gid string) (*GroupMeta, error) {
res, err := c.ObsRequest("GET", []string{"group", gid}, nil) res, err := c.ObsRequest("GET", c.baseUrl.JoinPath("group", gid).String(), nil)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@@ -288,7 +186,6 @@ func (c *ObsClient) GetGroupMeta(gid string) (*GroupMeta, error) {
if err != nil { if err != nil {
return nil, err return nil, err
} }
defer res.Body.Close()
var meta GroupMeta var meta GroupMeta
err = xml.Unmarshal(data, &meta) err = xml.Unmarshal(data, &meta)
@@ -300,7 +197,7 @@ func (c *ObsClient) GetGroupMeta(gid string) (*GroupMeta, error) {
} }
func (c *ObsClient) GetUserMeta(uid string) (*UserMeta, error) { func (c *ObsClient) GetUserMeta(uid string) (*UserMeta, error) {
res, err := c.ObsRequest("GET", []string{"person", uid}, nil) res, err := c.ObsRequest("GET", c.baseUrl.JoinPath("person", uid).String(), nil)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@@ -318,7 +215,6 @@ func (c *ObsClient) GetUserMeta(uid string) (*UserMeta, error) {
if err != nil { if err != nil {
return nil, err return nil, err
} }
defer res.Body.Close()
var meta UserMeta var meta UserMeta
err = xml.Unmarshal(data, &meta) err = xml.Unmarshal(data, &meta)
@@ -329,11 +225,7 @@ func (c *ObsClient) GetUserMeta(uid string) (*UserMeta, error) {
return &meta, nil return &meta, nil
} }
func (c *ObsClient) ObsRequest(method string, url_path []string, body io.Reader) (*http.Response, error) { func (c *ObsClient) ObsRequest(method string, url string, body io.Reader) (*http.Response, error) {
return c.ObsRequestRaw(method, c.baseUrl.JoinPath(url_path...).String(), body)
}
func (c *ObsClient) ObsRequestRaw(method string, url string, body io.Reader) (*http.Response, error) {
req, err := http.NewRequest(method, url, body) req, err := http.NewRequest(method, url, body)
if err != nil { if err != nil {
@@ -346,12 +238,6 @@ func (c *ObsClient) ObsRequestRaw(method string, url string, body io.Reader) (*h
req.Header.Add("cookie", c.cookie) req.Header.Add("cookie", c.cookie)
} }
res, err := c.client.Do(req) res, err := c.client.Do(req)
if err != nil && res == nil {
LogDebug("No res headers:", err)
return res, err
}
if err == nil && res.StatusCode == 200 { if err == nil && res.StatusCode == 200 {
auth_cookie := res.Header.Get("set-cookie") auth_cookie := res.Header.Get("set-cookie")
if auth_cookie != "" { if auth_cookie != "" {
@@ -362,7 +248,6 @@ func (c *ObsClient) ObsRequestRaw(method string, url string, body io.Reader) (*h
if res.StatusCode == 401 { if res.StatusCode == 401 {
if c.sshkey == "" { if c.sshkey == "" {
LogDebug("setting basic auth")
req.SetBasicAuth(c.user, c.password) req.SetBasicAuth(c.user, c.password)
} else { } else {
www := res.Header.Get("www-authenticate") www := res.Header.Get("www-authenticate")
@@ -405,57 +290,52 @@ func (c *ObsClient) ObsRequestRaw(method string, url string, body io.Reader) (*h
// log.Printf("Add Authorization Signature ", authorization) // log.Printf("Add Authorization Signature ", authorization)
req.Header.Add("Authorization", "Signature "+authorization) req.Header.Add("Authorization", "Signature "+authorization)
} }
// Another time with authentification header
LogDebug("Trying again with authorization for", req.URL.String())
res, err = c.client.Do(req)
if err != nil {
if res != nil {
LogError("Authentification failed:", res.StatusCode)
}
return nil, err
}
} }
if err == nil { // Another time with authentification header
// Store the cookie for next call // log.Printf("Trying again with authorization: %s", req.Header.Get("Authorization"))
auth_cookie := res.Header.Get("set-cookie")
if auth_cookie != "" { res, err = c.client.Do(req)
c.cookie = auth_cookie if err != nil {
} log.Println("Authentification failed:", res.StatusCode)
return nil, err
}
// Store the cookie for next call
auth_cookie := res.Header.Get("set-cookie")
if auth_cookie != "" {
c.cookie = auth_cookie
} }
return res, err return res, err
} }
func (c *ObsClient) GetProjectMeta(project string) (*ProjectMeta, error) { func (c *ObsClient) GetProjectMeta(project string) (*ProjectMeta, error) {
req := []string{"source", project, "_meta"} res, err := c.ObsRequest("GET", c.baseUrl.JoinPath("source", project, "_meta").String(), nil)
res, err := c.ObsRequest("GET", req, nil)
if err != nil {
if err != nil { return nil, err
return nil, err }
}
switch res.StatusCode {
switch res.StatusCode { case 200:
case 200: break
break case 404:
case 404: return nil, nil
return nil, nil default:
default: return nil, fmt.Errorf("Unexpected return code: %d", res.StatusCode)
return nil, fmt.Errorf("Unexpected return code: %d %s %w", res.StatusCode, req, err) }
}
data, err := io.ReadAll(res.Body)
data, err := io.ReadAll(res.Body) if err != nil {
if err != nil { return nil, err
return nil, err }
}
return parseProjectMeta(data)
defer res.Body.Close() }
return parseProjectMeta(data)
} func (c *ObsClient) GetPackageMeta(project, pkg string) (*PackageMeta, error) {
res, err := c.ObsRequest("GET", c.baseUrl.JoinPath("source", project, pkg, "_meta").String(), nil)
func (c *ObsClient) GetPackageMeta(project, pkg string) (*PackageMeta, error) {
res, err := c.ObsRequest("GET", []string{"source", project, pkg, "_meta"}, nil)
if err != nil { if err != nil {
return nil, err return nil, err
@@ -474,7 +354,6 @@ func (c *ObsClient) GetPackageMeta(project, pkg string) (*PackageMeta, error) {
if err != nil { if err != nil {
return nil, err return nil, err
} }
defer res.Body.Close()
var meta PackageMeta var meta PackageMeta
err = xml.Unmarshal(data, &meta) err = xml.Unmarshal(data, &meta)
@@ -529,11 +408,10 @@ func (c *ObsClient) SetProjectMeta(meta *ProjectMeta) error {
return err return err
} }
res, err := c.ObsRequest("PUT", []string{"source", meta.Name, "_meta"}, io.NopCloser(bytes.NewReader(xml))) res, err := c.ObsRequest("PUT", c.baseUrl.JoinPath("source", meta.Name, "_meta").String(), io.NopCloser(bytes.NewReader(xml)))
if err != nil { if err != nil {
return err return err
} }
defer res.Body.Close()
switch res.StatusCode { switch res.StatusCode {
case 200: case 200:
@@ -546,73 +424,35 @@ func (c *ObsClient) SetProjectMeta(meta *ProjectMeta) error {
} }
func (c *ObsClient) DeleteProject(project string) error { func (c *ObsClient) DeleteProject(project string) error {
url := c.baseUrl.JoinPath("source", project) res, err := c.ObsRequest("DELETE", c.baseUrl.JoinPath("source", project).String(), nil)
query := url.Query()
query.Add("force", "1")
url.RawQuery = query.Encode()
res, err := c.ObsRequestRaw("DELETE", url.String(), nil)
if err != nil { if err != nil {
return err return err
} }
defer res.Body.Close()
if res.StatusCode != 200 { if res.StatusCode != 200 {
return fmt.Errorf("Unexpected return code: %d", res.StatusCode) return fmt.Errorf("Unexpected return code: %d", res.StatusCode)
} }
return nil return nil
}
func (c *ObsClient) BuildLog(prj, pkg, repo, arch string) (io.ReadCloser, error) {
url := c.baseUrl.JoinPath("build", prj, repo, arch, pkg, "_log")
query := url.Query()
query.Add("nostream", "1")
query.Add("start", "0")
url.RawQuery = query.Encode()
res, err := c.ObsRequestRaw("GET", url.String(), nil)
if err != nil {
return nil, err
}
return res.Body, nil
} }
type PackageBuildStatus struct { type PackageBuildStatus struct {
Package string `xml:"package,attr"` Package string `xml:"package,attr"`
Code string `xml:"code,attr"` Code string `xml:"code,attr"`
Details string `xml:"details"` Details string `xml:"details"`
LastUpdate time.Time
}
func PackageBuildStatusComp(A, B *PackageBuildStatus) int {
return strings.Compare(A.Package, B.Package)
} }
type BuildResult struct { type BuildResult struct {
Project string `xml:"project,attr"` Project string `xml:"project,attr"`
Repository string `xml:"repository,attr"` Repository string `xml:"repository,attr"`
Arch string `xml:"arch,attr"` Arch string `xml:"arch,attr"`
Code string `xml:"code,attr"` Code string `xml:"code,attr"`
Dirty bool `xml:"dirty,attr"` Dirty bool `xml:"dirty,attr"`
ScmSync string `xml:"scmsync"` ScmSync string `xml:"scmsync"`
ScmInfo string `xml:"scminfo"` ScmInfo string `xml:"scminfo"`
Status []*PackageBuildStatus `xml:"status"` Status []PackageBuildStatus `xml:"status"`
Binaries []BinaryList `xml:"binarylist"` Binaries []BinaryList `xml:"binarylist"`
LastUpdate time.Time
}
func BuildResultComp(A, B *BuildResult) int {
if cmp := strings.Compare(A.Project, B.Project); cmp != 0 {
return cmp
}
if cmp := strings.Compare(A.Repository, B.Repository); cmp != 0 {
return cmp
}
return strings.Compare(A.Arch, B.Arch)
} }
type Binary struct { type Binary struct {
@@ -629,9 +469,7 @@ type BinaryList struct {
type BuildResultList struct { type BuildResultList struct {
XMLName xml.Name `xml:"resultlist"` XMLName xml.Name `xml:"resultlist"`
State string `xml:"state,attr"` State string `xml:"state,attr"`
Result []*BuildResult `xml:"result"` Result []BuildResult `xml:"result"`
isLastBuild bool
} }
func (r *BuildResultList) GetPackageList() []string { func (r *BuildResultList) GetPackageList() []string {
@@ -656,7 +494,7 @@ func (r *BuildResultList) GetPackageList() []string {
func (r *BuildResultList) BuildResultSummary() (success, finished bool) { func (r *BuildResultList) BuildResultSummary() (success, finished bool) {
if r == nil { if r == nil {
return false, false return true, true
} }
finished = len(r.Result) > 0 && len(r.Result[0].Status) > 0 finished = len(r.Result) > 0 && len(r.Result[0].Status) > 0
@@ -669,7 +507,7 @@ func (r *BuildResultList) BuildResultSummary() (success, finished bool) {
panic("Unknown repo result code: " + resultSet.Code) panic("Unknown repo result code: " + resultSet.Code)
} }
finished = r.isLastBuild || repoDetail.Finished finished = repoDetail.Finished
if !finished || resultSet.Dirty { if !finished || resultSet.Dirty {
return return
} }
@@ -680,11 +518,6 @@ func (r *BuildResultList) BuildResultSummary() (success, finished bool) {
if !ok { if !ok {
panic("Unknown result code: " + result.Code) panic("Unknown result code: " + result.Code)
} }
if r.isLastBuild && result.Code == "unknown" {
// it means the package has never build yet,
// but we don't know the reason
detail.Finished = true
}
finished = finished && detail.Finished finished = finished && detail.Finished
success = success && detail.Success success = success && detail.Success
@@ -780,7 +613,7 @@ var ObsBuildStatusDetails map[string]ObsBuildStatusDetail = map[string]ObsBuildS
}, },
"unknown": ObsBuildStatusDetail{ "unknown": ObsBuildStatusDetail{
Code: "unknown", Code: "unknown",
Description: "The scheduler has not yet evaluated this package. Should be a short intermediate state for new packages. When used for lastbuild state it means it was never possible to attempt a build", Description: "The scheduler has not yet evaluated this package. Should be a short intermediate state for new packages.",
Finished: false, Finished: false,
}, },
@@ -857,13 +690,14 @@ func (obs ObsProjectNotFound) Error() string {
} }
func (c *ObsClient) ProjectConfig(project string) (string, error) { func (c *ObsClient) ProjectConfig(project string) (string, error) {
res, err := c.ObsRequest("GET", []string{"source", project, "_config"}, nil) u := c.baseUrl.JoinPath("source", project, "_config")
res, err := c.ObsRequest("GET", u.String(), nil)
if err != nil { if err != nil {
return "", err return "", err
} }
if data, err := io.ReadAll(res.Body); err == nil { if data, err := io.ReadAll(res.Body); err == nil {
defer res.Body.Close()
return string(data), nil return string(data), nil
} else { } else {
return "", err return "", err
@@ -898,7 +732,7 @@ func (c *ObsClient) BuildStatusWithState(project string, opts *BuildResultOption
} }
} }
u.RawQuery = query.Encode() u.RawQuery = query.Encode()
res, err := c.ObsRequestRaw("GET", u.String(), nil) res, err := c.ObsRequest("GET", u.String(), nil)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@@ -916,10 +750,5 @@ func (c *ObsClient) BuildStatusWithState(project string, opts *BuildResultOption
if err != nil { if err != nil {
return nil, err return nil, err
} }
defer res.Body.Close() return parseBuildResults(data)
ret, err := parseBuildResults(data)
if ret != nil {
ret.isLastBuild = opts.LastBuild
}
return ret, err
} }

View File

@@ -55,52 +55,6 @@ func TestParsingOfBuildResults(t *testing.T) {
} }
} }
func TestParsingRequestResults(t *testing.T) {
res, err := parseRequestXml([]byte(metaRequestData))
if err != nil {
t.Fatal(err)
}
if res.Id != 42 ||
res.Action.Source.Project != "home:foo-user" ||
res.Action.Source.Package != "obs-server" ||
*res.Action.Source.Revision != "521e" ||
res.Action.Target.Project != "OBS:Unstable" ||
res.Action.Target.Revision != nil {
t.Fatal(res)
}
}
const metaRequestData = `<?xml version="1.0" encoding="UTF-8"?>
<request id="42" creator="foo-user">
<action type="submit">
<source project="home:foo-user" package="obs-server" rev="521e">
</source>
<target project="OBS:Unstable" package="obs-server">
</target>
<options>
<sourceupdate>cleanup</sourceupdate>
</options>
</action>
<state name="accepted" who="bar-user" when="2021-01-15T13:39:43">
<comment>allright</comment>
</state>
<review state="accepted" when="2021-01-15T15:49:32" who="obs-maintainer" by_user="obs-maintainer">
</review>
<review state="accepted" when="2021-01-15T15:49:32" who="obs-maintainer" by_group="obs-group">
</review>
<review state="accepted" when="2021-01-15T15:49:32" who="obs-maintainer" by_project="OBS:Unstable">
</review>
<review state="accepted" when="2021-01-15T15:49:32" who="obs-maintainer" by_package="obs-server">
</review>
<history who="foo" when="2021-01-15T13:39:43">
<description>Request created</description>
<comment>Please review sources</comment>
</history>
<description>A little version update</description>
</request>`
const metaPrjData = ` const metaPrjData = `
<project name="home:adamm"> <project name="home:adamm">
<title>Adam's Home Projects</title> <title>Adam's Home Projects</title>

View File

@@ -4,6 +4,8 @@ import (
"bufio" "bufio"
"errors" "errors"
"fmt" "fmt"
"os"
"path"
"slices" "slices"
"strings" "strings"
@@ -11,36 +13,25 @@ import (
) )
type PRInfo struct { type PRInfo struct {
PR *models.PullRequest PR *models.PullRequest
Reviews *PRReviews Reviews *PRReviews
RemoteName string
} }
type PRSet struct { type PRSet struct {
PRs []*PRInfo PRs []PRInfo
Config *AutogitConfig Config *AutogitConfig
BotUser string
} }
func (prinfo *PRInfo) PRComponents() (org string, repo string, idx int64) { func readPRData(gitea GiteaPRFetcher, pr *models.PullRequest, currentSet []PRInfo, config *AutogitConfig) ([]PRInfo, error) {
org = prinfo.PR.Base.Repo.Owner.UserName
repo = prinfo.PR.Base.Repo.Name
idx = prinfo.PR.Index
return
}
func readPRData(gitea GiteaPRFetcher, pr *models.PullRequest, currentSet []*PRInfo, config *AutogitConfig) ([]*PRInfo, error) {
for _, p := range currentSet { for _, p := range currentSet {
if pr.Index == p.PR.Index && pr.Base.Repo.Name == p.PR.Base.Repo.Name && pr.Base.Repo.Owner.UserName == p.PR.Base.Repo.Owner.UserName { if pr.Index == p.PR.Index && pr.Base.Repo.Name == p.PR.Base.Repo.Name && pr.Base.Repo.Owner.UserName == p.PR.Base.Repo.Owner.UserName {
return nil, nil return nil, nil
} }
} }
retSet := []*PRInfo{&PRInfo{PR: pr}} retSet := []PRInfo{PRInfo{PR: pr}}
// only need to extact there on PrjGit PR // only need to extact there on PrjGit PR
org, repo, _ := config.GetPrjGit() if pr.Base.Repo.Name == config.GitProjectName && pr.Base.Repo.Owner.UserName == config.Organization {
if pr.Base.Repo.Name == repo && pr.Base.Repo.Owner.UserName == org {
_, refPRs := ExtractDescriptionAndPRs(bufio.NewScanner(strings.NewReader(pr.Body))) _, refPRs := ExtractDescriptionAndPRs(bufio.NewScanner(strings.NewReader(pr.Body)))
for _, prdata := range refPRs { for _, prdata := range refPRs {
pr, err := gitea.GetPullRequest(prdata.Org, prdata.Repo, prdata.Num) pr, err := gitea.GetPullRequest(prdata.Org, prdata.Repo, prdata.Num)
@@ -58,51 +49,13 @@ func readPRData(gitea GiteaPRFetcher, pr *models.PullRequest, currentSet []*PRIn
return retSet, nil return retSet, nil
} }
var Timeline_RefIssueNotFound error = errors.New("RefIssue not found on the timeline") func FetchPRSet(gitea GiteaPRFetcher, org, repo string, num int64, config *AutogitConfig) (*PRSet, error) {
func LastPrjGitRefOnTimeline(gitea GiteaPRTimelineFetcher, org, repo string, num int64, prjGitOrg, prjGitRepo string) (*models.PullRequest, error) {
timeline, err := gitea.GetTimeline(org, repo, num)
if err != nil {
LogError("Failed to fetch timeline for", org, repo, "#", num, err)
return nil, err
}
for idx := len(timeline) - 1; idx >= 0; idx-- {
item := timeline[idx]
issue := item.RefIssue
if item.Type == TimelineCommentType_PullRequestRef &&
issue != nil &&
issue.Repository != nil &&
issue.Repository.Owner == prjGitOrg &&
issue.Repository.Name == prjGitRepo {
_, prs := ExtractDescriptionAndPRs(bufio.NewScanner(strings.NewReader(item.RefIssue.Body)))
for _, pr := range prs {
if pr.Org == org && pr.Repo == repo && pr.Num == num {
LogDebug("Found PrjGit PR in Timeline:", issue.Index)
// found prjgit PR in timeline. Return it
return gitea.GetPullRequest(prjGitOrg, prjGitRepo, issue.Index)
}
}
}
}
LogDebug("PrjGit RefIssue not found on timeline in", org, repo, num)
return nil, Timeline_RefIssueNotFound
}
func FetchPRSet(user string, gitea GiteaPRTimelineFetcher, org, repo string, num int64, config *AutogitConfig) (*PRSet, error) {
var pr *models.PullRequest var pr *models.PullRequest
var err error var err error
prjGitOrg, prjGitRepo, _ := config.GetPrjGit() prjGitOrg, prjGitRepo, _ := config.GetPrjGit()
if prjGitOrg == org && prjGitRepo == repo { if prjGitOrg != org || prjGitRepo != config.GitProjectName {
if pr, err = gitea.GetPullRequest(org, repo, num); err != nil { if pr, err = gitea.GetAssociatedPrjGitPR(prjGitOrg, prjGitRepo, org, repo, num); err != nil {
return nil, err
}
} else {
if pr, err = LastPrjGitRefOnTimeline(gitea, org, repo, num, prjGitOrg, prjGitRepo); err != nil && err != Timeline_RefIssueNotFound {
return nil, err return nil, err
} }
@@ -111,6 +64,10 @@ func FetchPRSet(user string, gitea GiteaPRTimelineFetcher, org, repo string, num
return nil, err return nil, err
} }
} }
} else {
if pr, err = gitea.GetPullRequest(org, repo, num); err != nil {
return nil, err
}
} }
prs, err := readPRData(gitea, pr, nil, config) prs, err := readPRData(gitea, pr, nil, config)
@@ -118,54 +75,22 @@ func FetchPRSet(user string, gitea GiteaPRTimelineFetcher, org, repo string, num
return nil, err return nil, err
} }
return &PRSet{ return &PRSet{PRs: prs, Config: config}, nil
PRs: prs,
Config: config,
BotUser: user,
}, nil
}
func (rs *PRSet) Find(pr *models.PullRequest) (*PRInfo, bool) {
for _, p := range rs.PRs {
if p.PR.Base.RepoID == pr.Base.RepoID &&
p.PR.Head.Sha == pr.Head.Sha &&
p.PR.Base.Name == pr.Base.Name {
return p, true
}
}
return nil, false
}
func (rs *PRSet) AddPR(pr *models.PullRequest) *PRInfo {
if pr, found := rs.Find(pr); found {
return pr
}
prinfo := &PRInfo{
PR: pr,
}
rs.PRs = append(rs.PRs, prinfo)
return prinfo
} }
func (rs *PRSet) IsPrjGitPR(pr *models.PullRequest) bool { func (rs *PRSet) IsPrjGitPR(pr *models.PullRequest) bool {
org, repo, branch := rs.Config.GetPrjGit() return pr.Base.Repo.Name == rs.Config.GitProjectName && pr.Base.Repo.Owner.UserName == rs.Config.Organization
return pr.Base.Name == branch && pr.Base.Repo.Name == repo && pr.Base.Repo.Owner.UserName == org
} }
var PRSet_PrjGitMissing error = errors.New("No PrjGit PR found") func (rs *PRSet) GetPrjGitPR() (*models.PullRequest, error) {
var PRSet_MultiplePrjGit error = errors.New("Multiple PrjGit PRs in one review set") var ret *models.PullRequest
func (rs *PRSet) GetPrjGitPR() (*PRInfo, error) {
var ret *PRInfo
for _, prinfo := range rs.PRs { for _, prinfo := range rs.PRs {
if rs.IsPrjGitPR(prinfo.PR) { if rs.IsPrjGitPR(prinfo.PR) {
if ret == nil { if ret == nil {
ret = prinfo ret = prinfo.PR
} else { } else {
return nil, PRSet_MultiplePrjGit return nil, errors.New("Multiple PrjGit PRs in one review set")
} }
} }
} }
@@ -174,37 +99,21 @@ func (rs *PRSet) GetPrjGitPR() (*PRInfo, error) {
return ret, nil return ret, nil
} }
return nil, PRSet_PrjGitMissing return nil, errors.New("No PrjGit PR found")
}
func (rs *PRSet) NeedRecreatingPrjGit(currentBranchHash string) bool {
pr, err := rs.GetPrjGitPR()
if err != nil {
return true
}
return pr.PR.Base.Sha == currentBranchHash
} }
func (rs *PRSet) IsConsistent() bool { func (rs *PRSet) IsConsistent() bool {
prjpr_info, err := rs.GetPrjGitPR() prjpr, err := rs.GetPrjGitPR()
if err != nil { if err != nil {
return false return false
} }
prjpr := prjpr_info.PR
_, prjpr_set := ExtractDescriptionAndPRs(bufio.NewScanner(strings.NewReader(prjpr.Body))) _, prjpr_set := ExtractDescriptionAndPRs(bufio.NewScanner(strings.NewReader(prjpr.Body)))
if len(prjpr_set) != len(rs.PRs)-1 { // 1 to many mapping if len(prjpr_set) != len(rs.PRs)-1 { // 1 to many mapping
LogDebug("Number of PR from links:", len(prjpr_set), "is not what's expected", len(rs.PRs)-1)
return false return false
} }
next_rs: next_rs:
for _, prinfo := range rs.PRs { for _, prinfo := range rs.PRs {
if prinfo.PR.State != "open" {
return false
}
if prjpr == prinfo.PR { if prjpr == prinfo.PR {
continue continue
} }
@@ -224,33 +133,24 @@ func (rs *PRSet) AssignReviewers(gitea GiteaReviewFetcherAndRequester, maintaine
for _, pr := range rs.PRs { for _, pr := range rs.PRs {
reviewers := []string{} reviewers := []string{}
if rs.IsPrjGitPR(pr.PR) { if rs.IsPrjGitPR(pr.PR) {
reviewers = slices.Concat(configReviewers.Prj, configReviewers.PrjOptional) reviewers = configReviewers.Prj
LogDebug("PrjGit submitter:", pr.PR.User.UserName)
if len(rs.PRs) == 1 { if len(rs.PRs) == 1 {
reviewers = slices.Concat(reviewers, maintainers.ListProjectMaintainers()) reviewers = slices.Concat(reviewers, maintainers.ListProjectMaintainers())
} }
} else { } else {
pkg := pr.PR.Base.Repo.Name pkg := pr.PR.Base.Repo.Name
reviewers = slices.Concat(configReviewers.Pkg, maintainers.ListProjectMaintainers(), maintainers.ListPackageMaintainers(pkg), configReviewers.PkgOptional) reviewers = slices.Concat(configReviewers.Pkg, maintainers.ListProjectMaintainers(), maintainers.ListPackageMaintainers(pkg))
} }
slices.Sort(reviewers)
reviewers = slices.Compact(reviewers)
// submitters do not need to review their own work // submitters do not need to review their own work
if idx := slices.Index(reviewers, pr.PR.User.UserName); idx != -1 { if idx := slices.Index(reviewers, pr.PR.User.UserName); idx != -1 {
reviewers = slices.Delete(reviewers, idx, idx+1) reviewers = slices.Delete(reviewers, idx, idx+1)
} }
LogDebug("PR: ", pr.PR.Base.Repo.Name, pr.PR.Index)
LogDebug("reviewers for PR:", reviewers)
// remove reviewers that were already requested and are not stale // remove reviewers that were already requested and are not stale
reviews, err := FetchGiteaReviews(gitea, reviewers, pr.PR.Base.Repo.Owner.UserName, pr.PR.Base.Repo.Name, pr.PR.Index) reviews, err := FetchGiteaReviews(gitea, reviewers, pr.PR.Base.Repo.Owner.UserName, pr.PR.Base.Repo.Name, pr.PR.Index)
if err != nil { if err != nil {
LogError("Error fetching reviews:", err)
return err return err
} }
@@ -258,7 +158,6 @@ func (rs *PRSet) AssignReviewers(gitea GiteaReviewFetcherAndRequester, maintaine
user := reviewers[idx] user := reviewers[idx]
if reviews.HasPendingReviewBy(user) || reviews.IsReviewedBy(user) { if reviews.HasPendingReviewBy(user) || reviews.IsReviewedBy(user) {
reviewers = slices.Delete(reviewers, idx, idx+1) reviewers = slices.Delete(reviewers, idx, idx+1)
LogDebug("removing reviewer:", user)
} else { } else {
idx++ idx++
} }
@@ -266,76 +165,18 @@ func (rs *PRSet) AssignReviewers(gitea GiteaReviewFetcherAndRequester, maintaine
// get maintainers associated with the PR too // get maintainers associated with the PR too
if len(reviewers) > 0 { if len(reviewers) > 0 {
LogDebug("Requesting reviews from:", reviewers) if _, err := gitea.RequestReviews(pr.PR, reviewers...); err != nil {
if !IsDryRun { return fmt.Errorf("Cannot create reviews on %s/%s#%d for [%s]: %w", pr.PR.Base.Repo.Owner.UserName, pr.PR.Base.Repo.Name, pr.PR.Index, strings.Join(reviewers, ", "), err)
for _, r := range reviewers {
if _, err := gitea.RequestReviews(pr.PR, r); err != nil {
LogError("Cannot create reviews on", fmt.Sprintf("%s/%s!%d for [%s]", pr.PR.Base.Repo.Owner.UserName, pr.PR.Base.Repo.Name, pr.PR.Index, strings.Join(reviewers, ", ")), err)
}
}
} }
} }
} }
return nil return nil
} }
func (rs *PRSet) RemoveClosedPRs() {
rs.PRs = slices.DeleteFunc(rs.PRs, func(pr *PRInfo) bool {
return pr.PR.State != "open"
})
}
func (rs *PRSet) IsApproved(gitea GiteaPRChecker, maintainers MaintainershipData) bool { func (rs *PRSet) IsApproved(gitea GiteaPRChecker, maintainers MaintainershipData) bool {
configReviewers := ParseReviewers(rs.Config.Reviewers) configReviewers := ParseReviewers(rs.Config.Reviewers)
is_manually_reviewed_ok := false is_reviewed := false
if need_manual_review := rs.Config.ManualMergeOnly || rs.Config.ManualMergeProject; need_manual_review {
prjgit, err := rs.GetPrjGitPR()
if err == nil && prjgit != nil {
reviewers := slices.Concat(configReviewers.Prj, maintainers.ListProjectMaintainers())
LogDebug("Fetching reviews for", prjgit.PR.Base.Repo.Owner.UserName, prjgit.PR.Base.Repo.Name, prjgit.PR.Index)
r, err := FetchGiteaReviews(gitea, reviewers, prjgit.PR.Base.Repo.Owner.UserName, prjgit.PR.Base.Repo.Name, prjgit.PR.Index)
if err != nil {
LogError("Cannot fetch gita reaviews for PR:", err)
return false
}
prjgit.Reviews = r
if prjgit.Reviews.IsManualMergeOK() {
is_manually_reviewed_ok = true
}
}
if !is_manually_reviewed_ok && !rs.Config.ManualMergeProject {
for _, pr := range rs.PRs {
if rs.IsPrjGitPR(pr.PR) {
continue
}
pkg := pr.PR.Base.Repo.Name
reviewers := slices.Concat(configReviewers.Pkg, maintainers.ListPackageMaintainers(pkg))
LogDebug("Fetching reviews for", pr.PR.Base.Repo.Owner.UserName, pr.PR.Base.Repo.Name, pr.PR.Index)
r, err := FetchGiteaReviews(gitea, reviewers, pr.PR.Base.Repo.Owner.UserName, pr.PR.Base.Repo.Name, pr.PR.Index)
if err != nil {
LogError("Cannot fetch gita reaviews for PR:", err)
return false
}
pr.Reviews = r
if !pr.Reviews.IsManualMergeOK() {
LogInfo("Not approved manual merge. PR:", pr.PR.URL)
return false
}
}
is_manually_reviewed_ok = true
}
if !is_manually_reviewed_ok {
LogInfo("manual merge not ok")
return false
}
}
for _, pr := range rs.PRs { for _, pr := range rs.PRs {
var reviewers []string var reviewers []string
var pkg string var pkg string
@@ -347,123 +188,146 @@ func (rs *PRSet) IsApproved(gitea GiteaPRChecker, maintainers MaintainershipData
pkg = pr.PR.Base.Repo.Name pkg = pr.PR.Base.Repo.Name
} }
if strings.HasPrefix(pr.PR.Title, "WIP:") {
LogInfo("WIP PR. Ignoring")
return false
}
r, err := FetchGiteaReviews(gitea, reviewers, pr.PR.Base.Repo.Owner.UserName, pr.PR.Base.Repo.Name, pr.PR.Index) r, err := FetchGiteaReviews(gitea, reviewers, pr.PR.Base.Repo.Owner.UserName, pr.PR.Base.Repo.Name, pr.PR.Index)
if err != nil { if err != nil {
LogError("Cannot fetch gita reaviews for PR:", err) return false
}
is_reviewed = r.IsApproved()
if !is_reviewed {
return false return false
} }
is_manually_reviewed_ok = r.IsApproved() if is_reviewed = maintainers.IsApproved(pkg, r.reviews); !is_reviewed {
LogDebug(pr.PR.Base.Repo.Name, is_manually_reviewed_ok)
if !is_manually_reviewed_ok {
return false return false
} }
if need_maintainer_review := !rs.IsPrjGitPR(pr.PR) || pr.PR.User.UserName != rs.BotUser; need_maintainer_review {
if is_manually_reviewed_ok = maintainers.IsApproved(pkg, r.reviews, pr.PR.User.UserName); !is_manually_reviewed_ok {
LogDebug(" not approved?", pkg)
return false
}
} else {
LogDebug("PrjGit PR -- bot created, no need for review")
}
} }
return is_manually_reviewed_ok return is_reviewed
} }
func (rs *PRSet) Merge(gitea GiteaReviewUnrequester, git Git) error { func (rs *PRSet) Merge(gh GitHandlerGenerator) error {
prjgit_info, err := rs.GetPrjGitPR() prjgit, err := rs.GetPrjGitPR()
if err != nil { if err != nil {
return err return err
} }
prjgit := prjgit_info.PR
_, _, prjgitBranch := rs.Config.GetPrjGit() git, err := gh.CreateGitHandler(rs.Config.Organization)
remote, err := git.GitClone(DefaultGitPrj, prjgitBranch, prjgit.Base.Repo.SSHURL) defer git.Close()
PanicOnError(err) if err != nil {
git.GitExecOrPanic(DefaultGitPrj, "fetch", remote, prjgit.Head.Sha) return err
}
git.GitExecOrPanic("", "clone", "--depth", "1", prjgit.Base.Repo.SSHURL, DefaultGitPrj)
git.GitExecOrPanic(DefaultGitPrj, "fetch", "origin", prjgit.Base.Sha, prjgit.Head.Sha)
// if other changes merged, check if we have conflicts // if other changes merged, check if we have conflicts
/* rev := strings.TrimSpace(git.GitExecWithOutputOrPanic(DefaultGitPrj, "merge-base", "HEAD", prjgit.Base.Sha, prjgit.Head.Sha))
rev := strings.TrimSpace(git.GitExecWithOutputOrPanic(DefaultGitPrj, "merge-base", "HEAD", prjgit.Base.Sha, prjgit.Head.Sha)) if rev != prjgit.Base.Sha {
if rev != prjgit.Base.Sha { return fmt.Errorf("Base.Sha (%s) not yet merged into project-git. Aborting merge.", prjgit.Base.Sha)
return fmt.Errorf("Base.Sha (%s) not yet merged into project-git. Aborting merge.", prjgit.Base.Sha) }
}
*/
/* /*
rev := git.GitExecWithOutputOrPanic(common.DefaultGitPrj, "rev-list", "-1", "HEAD") rev := git.GitExecWithOutputOrPanic(common.DefaultGitPrj, "rev-list", "-1", "HEAD")
if rev != prjgit.Base.Sha { if rev != prjgit.Base.Sha {
panic("FIXME") panic("FIXME")
} }
*/ */
msg := fmt.Sprintf("Merging\n\nPR: %s/%s!%d", prjgit.Base.Repo.Owner.UserName, prjgit.Base.Repo.Name, prjgit.Index) msg := "merging"
err = git.GitExec(DefaultGitPrj, "merge", "--no-ff", "-m", msg, prjgit.Head.Sha) err = git.GitExec(DefaultGitPrj, "merge", "--no-ff", "-m", msg, prjgit.Head.Sha)
if err != nil { if err != nil {
if resolveError := git.GitResolveSubmoduleFileConflict(DefaultGitPrj); resolveError != nil { status, statusErr := git.GitStatus(DefaultGitPrj)
return fmt.Errorf("Merge failed. (%w): %w", err, resolveError) if statusErr != nil {
return fmt.Errorf("Failed to merge: %w . Status also failed: %w", err, statusErr)
}
// we can only resolve conflicts with .gitmodules
for _, s := range status {
if s.Status == GitStatus_Unmerged {
if s.Path != ".gitmodules" {
return err
}
submodules, err := git.GitSubmoduleList(DefaultGitPrj, "MERGE_HEAD")
if err != nil {
return fmt.Errorf("Failed to fetch submodules during merge resolution: %w", err)
}
s1, err := git.GitExecWithOutput(DefaultGitPrj, "cat-file", "blob", s.States[0])
if err != nil {
return fmt.Errorf("Failed fetching data during .gitmodules merge resoulution: %w", err)
}
s2, err := git.GitExecWithOutput(DefaultGitPrj, "cat-file", "blob", s.States[1])
if err != nil {
return fmt.Errorf("Failed fetching data during .gitmodules merge resoulution: %w", err)
}
s3, err := git.GitExecWithOutput(DefaultGitPrj, "cat-file", "blob", s.States[2])
if err != nil {
return fmt.Errorf("Failed fetching data during .gitmodules merge resoulution: %w", err)
}
subs1, err := ParseSubmodulesFile(strings.NewReader(s1))
if err != nil {
return fmt.Errorf("Failed parsing submodule file [%s] in merge: %w", s.States[0], err)
}
subs2, err := ParseSubmodulesFile(strings.NewReader(s2))
if err != nil {
return fmt.Errorf("Failed parsing submodule file [%s] in merge: %w", s.States[0], err)
}
subs3, err := ParseSubmodulesFile(strings.NewReader(s3))
if err != nil {
return fmt.Errorf("Failed parsing submodule file [%s] in merge: %w", s.States[0], err)
}
// merge from subs3 (target), subs1 (orig), subs2 (2-nd base that is missing from target base)
// this will update submodules
mergedSubs := slices.Concat(subs1, subs2, subs3)
var filteredSubs []Submodule = make([]Submodule, 0, max(len(subs1), len(subs2), len(subs3)))
nextSub:
for subName := range submodules {
for i := range mergedSubs {
if path.Base(mergedSubs[i].Path) == subName {
filteredSubs = append(filteredSubs, mergedSubs[i])
continue nextSub
}
}
return fmt.Errorf("Cannot find submodule for path: %s", subName)
}
out, err := os.Create(path.Join(git.GetPath(), DefaultGitPrj, ".gitmodules"))
if err != nil {
return fmt.Errorf("Can't open .gitmodules for writing: %w", err)
}
if err = WriteSubmodules(filteredSubs, out); err != nil {
return fmt.Errorf("Can't write .gitmodules: %w", err)
}
if out.Close(); err != nil {
return fmt.Errorf("Can't close .gitmodules: %w", err)
}
os.CopyFS("/tmp/test", os.DirFS(git.GetPath()))
git.GitExecOrPanic(DefaultGitPrj, "add", ".gitmodules")
git.GitExecOrPanic(DefaultGitPrj, "-c", "core.editor=true", "merge", "--continue")
}
} }
} }
// FF all non-prj git and unrequest reviews. // FF all non-prj git
for _, prinfo := range rs.PRs { for _, prinfo := range rs.PRs {
// remove pending review requests
repo := prinfo.PR.Base.Repo
head := prinfo.PR.Head
id := prinfo.PR.Index
reviewers := make([]string, len(prinfo.PR.RequestedReviewers))
for idx := range prinfo.PR.RequestedReviewers {
r := prinfo.PR.RequestedReviewers[idx]
if r != nil {
reviewers[idx] = r.UserName
}
}
if err := gitea.UnrequestReview(repo.Owner.UserName, repo.Name, id, reviewers...); err != nil {
LogError("Cannot unrequest reviews in PR:", repo.Owner.UserName, repo.Name, id, reviewers, ": ", err)
}
// PrjGit already merged above, so skip here.
if rs.IsPrjGitPR(prinfo.PR) { if rs.IsPrjGitPR(prinfo.PR) {
continue continue
} }
br := rs.Config.Branch git.GitExecOrPanic("", "clone", prinfo.PR.Base.Repo.SSHURL, prinfo.PR.Base.Name)
if len(br) == 0 { git.GitExecOrPanic(prinfo.PR.Base.Name, "fetch", "origin", prinfo.PR.Head.Sha)
// if branch is unspecified, take it from the PR as it git.GitExecOrPanic(prinfo.PR.Base.Name, "merge", "--ff", prinfo.PR.Head.Sha)
// matches default branch already
br = prinfo.PR.Base.Name
} else if br != prinfo.PR.Base.Name {
panic(prinfo.PR.Base.Name + " is expected to match " + br)
}
prinfo.RemoteName, err = git.GitClone(repo.Name, br, repo.SSHURL)
PanicOnError(err)
git.GitExecOrPanic(repo.Name, "fetch", prinfo.RemoteName, head.Sha)
git.GitExecOrPanic(repo.Name, "merge", "--ff", head.Sha)
} }
// push changes // push changes
if !IsDryRun { git.GitExecOrPanic(DefaultGitPrj, "push", "origin")
git.GitExecOrPanic(DefaultGitPrj, "push", remote)
} else {
LogInfo("*** WOULD push", DefaultGitPrj, "changes to", remote)
}
for _, prinfo := range rs.PRs { for _, prinfo := range rs.PRs {
if rs.IsPrjGitPR(prinfo.PR) { if rs.IsPrjGitPR(prinfo.PR) {
continue continue
} }
repo := prinfo.PR.Base.Repo git.GitExecOrPanic(prinfo.PR.Base.Name, "push", "origin")
if !IsDryRun {
git.GitExecOrPanic(repo.Name, "push", prinfo.RemoteName)
} else {
LogInfo("*** WOULD push", repo.Name, "to", prinfo.RemoteName)
}
} }
return nil return nil

View File

@@ -6,7 +6,6 @@ import (
"os" "os"
"os/exec" "os/exec"
"path" "path"
"slices"
"strings" "strings"
"testing" "testing"
@@ -16,53 +15,18 @@ import (
mock_common "src.opensuse.org/autogits/common/mock" mock_common "src.opensuse.org/autogits/common/mock"
) )
/*
func TestCockpit(t *testing.T) {
common.SetLoggingLevel(common.LogLevelDebug)
gitea := common.AllocateGiteaTransport("https://src.opensuse.org")
tl, err := gitea.GetTimeline("cockpit", "cockpit", 29)
if err != nil {
t.Fatal("Fail to timeline", err)
}
t.Log(tl)
r, err := common.FetchGiteaReviews(gitea, []string{}, "cockpit", "cockpit", 29)
if err != nil {
t.Fatal("Error:", err)
}
t.Error(r)
}
*/
func reviewsToTimeline(reviews []*models.PullReview) []*models.TimelineComment {
timeline := make([]*models.TimelineComment, len(reviews))
for idx, review := range reviews {
if review.ID == 0 {
review.ID = int64(idx) + 100
}
timeline[idx] = &models.TimelineComment{
Type: common.TimelineCommentType_Review,
ReviewID: review.ID,
}
}
return timeline
}
func TestPR(t *testing.T) { func TestPR(t *testing.T) {
return
baseConfig := common.AutogitConfig{ baseConfig := common.AutogitConfig{
Reviewers: []string{"+super1", "*super2", "m1", "-m2"}, Reviewers: []string{"+super1", "*super2", "m1", "-m2"},
Branch: "branch", Branch: "branch",
Organization: "foo", Organization: "foo",
GitProjectName: "foo/barPrj#master", GitProjectName: "barPrj",
} }
type prdata struct { type prdata struct {
pr *models.PullRequest pr *models.PullRequest
pr_err error pr_err error
reviews []*models.PullReview reviews []*models.PullReview
timeline []*models.TimelineComment
review_error error review_error error
} }
@@ -76,26 +40,26 @@ func TestPR(t *testing.T) {
consistentSet bool consistentSet bool
prjGitPRIndex int prjGitPRIndex int
reviewSetFetcher func(*mock_common.MockGiteaPRTimelineFetcher) (*common.PRSet, error) reviewSetFetcher func(*mock_common.MockGiteaPRFetcher) (*common.PRSet, error)
}{ }{
{ {
name: "Error fetching PullRequest", name: "Error fetching PullRequest",
data: []prdata{ data: []prdata{
{pr: &models.PullRequest{Body: "", Index: 42, Base: &models.PRBranchInfo{Repo: &models.Repository{Name: "repo", Owner: &models.User{UserName: "test"}}}, State: "opened"}, pr_err: errors.New("Missing PR")}, {pr: &models.PullRequest{Body: "", Index: 42, Base: &models.PRBranchInfo{Repo: &models.Repository{Name: "repo", Owner: &models.User{UserName: "test"}}}}, pr_err: errors.New("Missing PR")},
}, },
prjGitPRIndex: -1, prjGitPRIndex: -1,
}, },
{ {
name: "Error fetching PullRequest in PrjGit", name: "Error fetching PullRequest in PrjGit",
data: []prdata{ data: []prdata{
{pr: &models.PullRequest{Body: "PR: foo/barPrj#22", Index: 42, Base: &models.PRBranchInfo{Repo: &models.Repository{Name: "repo", Owner: &models.User{UserName: "test"}}}, State: "opened"}, pr_err: errors.New("missing PR")}, {pr: &models.PullRequest{Body: "PR: foo/barPrj#22", Index: 42, Base: &models.PRBranchInfo{Repo: &models.Repository{Name: "repo", Owner: &models.User{UserName: "test"}}}}, pr_err: errors.New("missing PR")},
{pr: &models.PullRequest{Body: "", Index: 22, Base: &models.PRBranchInfo{Repo: &models.Repository{Name: "barPrj", Owner: &models.User{UserName: "foo"}}}, State: "opened"}}, {pr: &models.PullRequest{Body: "", Index: 22, Base: &models.PRBranchInfo{Repo: &models.Repository{Name: "barPrj", Owner: &models.User{UserName: "foo"}}}}},
}, },
}, },
{ {
name: "Error fetching prjgit", name: "Error fetching prjgit",
data: []prdata{ data: []prdata{
{pr: &models.PullRequest{Body: "", Index: 42, Base: &models.PRBranchInfo{Repo: &models.Repository{Name: "repo", Owner: &models.User{UserName: "test"}}}, State: "opened"}}, {pr: &models.PullRequest{Body: "", Index: 42, Base: &models.PRBranchInfo{Repo: &models.Repository{Name: "repo", Owner: &models.User{UserName: "test"}}}}},
}, },
resLen: 1, resLen: 1,
prjGitPRIndex: -1, prjGitPRIndex: -1,
@@ -103,8 +67,8 @@ func TestPR(t *testing.T) {
{ {
name: "Review set is consistent", name: "Review set is consistent",
data: []prdata{ data: []prdata{
{pr: &models.PullRequest{Body: "", Index: 42, Base: &models.PRBranchInfo{Repo: &models.Repository{Name: "repo", Owner: &models.User{UserName: "test"}}}, State: "opened"}}, {pr: &models.PullRequest{Body: "", Index: 42, Base: &models.PRBranchInfo{Repo: &models.Repository{Name: "repo", Owner: &models.User{UserName: "test"}}}}},
{pr: &models.PullRequest{Body: "PR: test/repo#42", Index: 22, Base: &models.PRBranchInfo{Repo: &models.Repository{Name: "barPrj", Owner: &models.User{UserName: "foo"}}}, State: "opened"}}, {pr: &models.PullRequest{Body: "PR: test/repo#42", Index: 22, Base: &models.PRBranchInfo{Repo: &models.Repository{Name: "barPrj", Owner: &models.User{UserName: "foo"}}}}},
}, },
resLen: 2, resLen: 2,
prjGitPRIndex: 1, prjGitPRIndex: 1,
@@ -114,8 +78,8 @@ func TestPR(t *testing.T) {
{ {
name: "Review set is consistent: 1pkg", name: "Review set is consistent: 1pkg",
data: []prdata{ data: []prdata{
{pr: &models.PullRequest{Body: "PR: foo/barPrj#22", Index: 42, Base: &models.PRBranchInfo{Repo: &models.Repository{Name: "repo", Owner: &models.User{UserName: "test"}}}, State: "opened"}}, {pr: &models.PullRequest{Body: "PR: foo/barPrj#22", Index: 42, Base: &models.PRBranchInfo{Repo: &models.Repository{Name: "repo", Owner: &models.User{UserName: "test"}}}}},
{pr: &models.PullRequest{Body: "PR: test/repo#42", Index: 22, Base: &models.PRBranchInfo{Repo: &models.Repository{Name: "barPrj", Owner: &models.User{UserName: "foo"}}}, State: "opened"}}, {pr: &models.PullRequest{Body: "PR: test/repo#42", Index: 22, Base: &models.PRBranchInfo{Repo: &models.Repository{Name: "barPrj", Owner: &models.User{UserName: "foo"}}}}},
}, },
resLen: 2, resLen: 2,
prjGitPRIndex: 1, prjGitPRIndex: 1,
@@ -124,9 +88,9 @@ func TestPR(t *testing.T) {
{ {
name: "Review set is consistent: 2pkg", name: "Review set is consistent: 2pkg",
data: []prdata{ data: []prdata{
{pr: &models.PullRequest{Body: "some desc", Index: 42, Base: &models.PRBranchInfo{Repo: &models.Repository{Name: "repo", Owner: &models.User{UserName: "test"}}}, State: "opened"}}, {pr: &models.PullRequest{Body: "some desc", Index: 42, Base: &models.PRBranchInfo{Repo: &models.Repository{Name: "repo", Owner: &models.User{UserName: "test"}}}}},
{pr: &models.PullRequest{Body: "PR: test/repo#42\nPR: test/repo2#41", Index: 22, Base: &models.PRBranchInfo{Repo: &models.Repository{Name: "barPrj", Owner: &models.User{UserName: "foo"}}}, State: "opened"}}, {pr: &models.PullRequest{Body: "PR: test/repo#42\nPR: test/repo2#41", Index: 22, Base: &models.PRBranchInfo{Repo: &models.Repository{Name: "barPrj", Owner: &models.User{UserName: "foo"}}}}},
{pr: &models.PullRequest{Body: "some other desc\nPR: foo/fer#33", Index: 41, Base: &models.PRBranchInfo{Repo: &models.Repository{Name: "repo2", Owner: &models.User{UserName: "test"}}}, State: "opened"}}, {pr: &models.PullRequest{Body: "some other desc\nPR: foo/fer#33", Index: 41, Base: &models.PRBranchInfo{Repo: &models.Repository{Name: "repo2", Owner: &models.User{UserName: "test"}}}}},
}, },
resLen: 3, resLen: 3,
prjGitPRIndex: 1, prjGitPRIndex: 1,
@@ -136,7 +100,7 @@ func TestPR(t *testing.T) {
name: "Review set of prjgit PR is consistent", name: "Review set of prjgit PR is consistent",
data: []prdata{ data: []prdata{
{ {
pr: &models.PullRequest{Body: "", Index: 42, Base: &models.PRBranchInfo{Repo: &models.Repository{Name: "barPrj", Owner: &models.User{UserName: "foo"}}}, User: &models.User{UserName: "submitter"}, State: "opened"}, pr: &models.PullRequest{Body: "", Index: 42, Base: &models.PRBranchInfo{Repo: &models.Repository{Name: "barPrj", Owner: &models.User{UserName: "foo"}}}},
reviews: []*models.PullReview{ reviews: []*models.PullReview{
{Body: "LGTM", User: &models.User{UserName: "m2"}, State: common.ReviewStateApproved}, {Body: "LGTM", User: &models.User{UserName: "m2"}, State: common.ReviewStateApproved},
{Body: "LGTM", User: &models.User{UserName: "super2"}, State: common.ReviewStateApproved}, {Body: "LGTM", User: &models.User{UserName: "super2"}, State: common.ReviewStateApproved},
@@ -148,385 +112,38 @@ func TestPR(t *testing.T) {
prjGitPRIndex: 0, prjGitPRIndex: 0,
consistentSet: true, consistentSet: true,
reviewed: true, reviewed: true,
reviewSetFetcher: func(mock *mock_common.MockGiteaPRTimelineFetcher) (*common.PRSet, error) { reviewSetFetcher: func(mock *mock_common.MockGiteaPRFetcher) (*common.PRSet, error) {
return common.FetchPRSet("test", mock, "foo", "barPrj", 42, &baseConfig) return common.FetchPRSet(mock, "foo", "barPrj", 42, &baseConfig)
}, },
}, },
{ {
name: "Review set is consistent: 2pkg", name: "Review set is consistent: 2pkg",
data: []prdata{ data: []prdata{
{pr: &models.PullRequest{Body: "PR: foo/barPrj#222", Index: 42, Base: &models.PRBranchInfo{Repo: &models.Repository{Name: "repo", Owner: &models.User{UserName: "test"}}}, State: "opened"}}, {pr: &models.PullRequest{Body: "PR: foo/barPrj#222", Index: 42, Base: &models.PRBranchInfo{Repo: &models.Repository{Name: "repo", Owner: &models.User{UserName: "test"}}}}},
{pr: &models.PullRequest{Body: "PR: test/repo2#41", Index: 20, Base: &models.PRBranchInfo{Repo: &models.Repository{Name: "barPrj", Owner: &models.User{UserName: "foo"}}}, State: "opened"}}, {pr: &models.PullRequest{Body: "PR: test/repo2#41", Index: 20, Base: &models.PRBranchInfo{Repo: &models.Repository{Name: "barPrj", Owner: &models.User{UserName: "foo"}}}}},
{pr: &models.PullRequest{Body: "PR: test/repo#42\nPR: test/repo2#41", Index: 22, Base: &models.PRBranchInfo{Repo: &models.Repository{Name: "barPrj", Owner: &models.User{UserName: "foo"}}}, State: "opened"}}, {pr: &models.PullRequest{Body: "PR: test/repo#42\nPR: test/repo2#41", Index: 22, Base: &models.PRBranchInfo{Repo: &models.Repository{Name: "barPrj", Owner: &models.User{UserName: "foo"}}}}},
{pr: &models.PullRequest{Body: "PR: foo/barPrj#20", Index: 41, Base: &models.PRBranchInfo{Repo: &models.Repository{Name: "repo2", Owner: &models.User{UserName: "test"}}}, State: "opened"}}, {pr: &models.PullRequest{Body: "PR: foo/barPrj#20", Index: 41, Base: &models.PRBranchInfo{Repo: &models.Repository{Name: "repo2", Owner: &models.User{UserName: "test"}}}}},
}, },
resLen: 3, resLen: 3,
prjGitPRIndex: 2, prjGitPRIndex: 2,
consistentSet: true, consistentSet: true,
}, },
{
name: "WIP PR is not approved",
data: []prdata{
{
pr: &models.PullRequest{Body: "", Title: "WIP: some title", Index: 42, Base: &models.PRBranchInfo{Repo: &models.Repository{Name: "barPrj", Owner: &models.User{UserName: "foo"}}}, User: &models.User{UserName: "submitter"}, State: "opened"},
reviews: []*models.PullReview{
{Body: "LGTM", User: &models.User{UserName: "m2"}, State: common.ReviewStateApproved},
{Body: "LGTM", User: &models.User{UserName: "super2"}, State: common.ReviewStateApproved},
{Body: "LGTM", User: &models.User{UserName: common.Bot_BuildReview}, State: common.ReviewStateApproved},
},
},
},
resLen: 1,
prjGitPRIndex: 0,
consistentSet: true,
reviewed: false,
reviewSetFetcher: func(mock *mock_common.MockGiteaPRTimelineFetcher) (*common.PRSet, error) {
return common.FetchPRSet("test", mock, "foo", "barPrj", 42, &baseConfig)
},
},
{
name: "Manual review is missing",
data: []prdata{
{
pr: &models.PullRequest{Body: "PR: foo/repo#20", Index: 42, Base: &models.PRBranchInfo{Repo: &models.Repository{Name: "barPrj", Owner: &models.User{UserName: "foo"}}}, User: &models.User{UserName: "submitter"}, State: "opened"},
reviews: []*models.PullReview{
{Body: "LGTM", User: &models.User{UserName: "m2"}, State: common.ReviewStateApproved},
{Body: "LGTM", User: &models.User{UserName: "super2"}, State: common.ReviewStateApproved},
{Body: "LGTM", User: &models.User{UserName: common.Bot_BuildReview}, State: common.ReviewStateApproved},
},
},
{
pr: &models.PullRequest{Body: "PR: foo/barPrj#42", Index: 20, Base: &models.PRBranchInfo{Repo: &models.Repository{Name: "repo", Owner: &models.User{UserName: "foo"}}}, User: &models.User{UserName: "submitter"}, State: "opened"},
reviews: []*models.PullReview{
{Body: "LGTM", User: &models.User{UserName: "m1"}, State: common.ReviewStateApproved},
{Body: "LGTM", User: &models.User{UserName: "super1"}, State: common.ReviewStateApproved},
{Body: "LGTM", User: &models.User{UserName: "super2"}, State: common.ReviewStateApproved},
},
},
},
resLen: 2,
prjGitPRIndex: 0,
consistentSet: true,
reviewed: false,
reviewSetFetcher: func(mock *mock_common.MockGiteaPRTimelineFetcher) (*common.PRSet, error) {
return common.FetchPRSet("test", mock, "foo", "barPrj", 42, &common.AutogitConfig{
Reviewers: []string{"+super1", "*super2", "m1", "-m2"},
Branch: "branch",
Organization: "foo",
GitProjectName: "barPrj",
ManualMergeOnly: true,
})
},
},
{
name: "Manual review is done, via PrjGit",
data: []prdata{
{
pr: &models.PullRequest{Body: "PR: foo/repo#20", Index: 42, Base: &models.PRBranchInfo{Repo: &models.Repository{Name: "barPrj", Owner: &models.User{UserName: "foo"}}}, User: &models.User{UserName: "submitter"}, State: "opened"},
reviews: []*models.PullReview{
{Body: "merge ok", User: &models.User{UserName: "m2"}, State: common.ReviewStateApproved},
{Body: "LGTM", User: &models.User{UserName: "super2"}, State: common.ReviewStateApproved},
{Body: "LGTM", User: &models.User{UserName: common.Bot_BuildReview}, State: common.ReviewStateApproved},
},
},
{
pr: &models.PullRequest{Body: "PR: foo/barPrj#42", Index: 20, Base: &models.PRBranchInfo{Repo: &models.Repository{Name: "repo", Owner: &models.User{UserName: "foo"}}}, User: &models.User{UserName: "submitter"}, State: "opened"},
reviews: []*models.PullReview{
{Body: "LGTM", User: &models.User{UserName: "m1"}, State: common.ReviewStateApproved},
{Body: "LGTM", User: &models.User{UserName: "super1"}, State: common.ReviewStateApproved},
{Body: "LGTM", User: &models.User{UserName: "super2"}, State: common.ReviewStateApproved},
},
},
},
resLen: 2,
prjGitPRIndex: 0,
consistentSet: true,
reviewed: true,
reviewSetFetcher: func(mock *mock_common.MockGiteaPRTimelineFetcher) (*common.PRSet, error) {
return common.FetchPRSet("test", mock, "foo", "barPrj", 42, &common.AutogitConfig{
Reviewers: []string{"+super1", "*super2", "m1", "-m2"},
Branch: "branch",
Organization: "foo",
GitProjectName: "barPrj",
ManualMergeOnly: true,
})
},
},
{
name: "Manual review is done, via PrjGit",
data: []prdata{
{
pr: &models.PullRequest{Body: "PR: foo/repo#20", Index: 42, Base: &models.PRBranchInfo{Repo: &models.Repository{Name: "barPrj", Owner: &models.User{UserName: "foo"}}}, User: &models.User{UserName: "submitter"}, State: "opened"},
reviews: []*models.PullReview{
{Body: "merge ok", User: &models.User{UserName: "m2"}, State: common.ReviewStateApproved},
{Body: "LGTM", User: &models.User{UserName: "super2"}, State: common.ReviewStateApproved},
{Body: "LGTM", User: &models.User{UserName: common.Bot_BuildReview}, State: common.ReviewStateApproved},
},
},
{
pr: &models.PullRequest{Body: "PR: foo/barPrj#42", Index: 20, Base: &models.PRBranchInfo{Repo: &models.Repository{Name: "repo", Owner: &models.User{UserName: "foo"}}}, User: &models.User{UserName: "submitter"}, State: "opened"},
reviews: []*models.PullReview{
{Body: "LGTM", User: &models.User{UserName: "m1"}, State: common.ReviewStateApproved},
{Body: "LGTM", User: &models.User{UserName: "super1"}, State: common.ReviewStateApproved},
{Body: "LGTM", User: &models.User{UserName: "super2"}, State: common.ReviewStateApproved},
},
},
},
resLen: 2,
prjGitPRIndex: 0,
consistentSet: true,
reviewed: true,
reviewSetFetcher: func(mock *mock_common.MockGiteaPRTimelineFetcher) (*common.PRSet, error) {
return common.FetchPRSet("test", mock, "foo", "barPrj", 42, &common.AutogitConfig{
Reviewers: []string{"+super1", "*super2", "m1", "-m2"},
Branch: "branch",
Organization: "foo",
GitProjectName: "barPrj",
ManualMergeOnly: true,
ManualMergeProject: true,
})
},
},
{
name: "Manual review is not done, via PrjGit",
data: []prdata{
{
pr: &models.PullRequest{Body: "PR: foo/repo#20", Index: 42, Base: &models.PRBranchInfo{Repo: &models.Repository{Name: "barPrj", Owner: &models.User{UserName: "foo"}}}, User: &models.User{UserName: "submitter"}, State: "opened"},
reviews: []*models.PullReview{
{Body: "merge ok", User: &models.User{UserName: "notm2"}, State: common.ReviewStateApproved},
{Body: "merge not ok", User: &models.User{UserName: "m2"}, State: common.ReviewStateApproved},
{Body: "LGTM", User: &models.User{UserName: "super2"}, State: common.ReviewStateApproved},
{Body: "LGTM", User: &models.User{UserName: common.Bot_BuildReview}, State: common.ReviewStateApproved},
},
},
{
pr: &models.PullRequest{Body: "PR: foo/barPrj#42", Index: 20, Base: &models.PRBranchInfo{Repo: &models.Repository{Name: "repo", Owner: &models.User{UserName: "foo"}}}, User: &models.User{UserName: "submitter"}, State: "opened"},
reviews: []*models.PullReview{
{Body: "LGTM", User: &models.User{UserName: "m1"}, State: common.ReviewStateApproved},
{Body: "LGTM", User: &models.User{UserName: "super1"}, State: common.ReviewStateApproved},
{Body: "LGTM", User: &models.User{UserName: "super2"}, State: common.ReviewStateApproved},
},
},
},
resLen: 2,
prjGitPRIndex: 0,
consistentSet: true,
reviewed: false,
reviewSetFetcher: func(mock *mock_common.MockGiteaPRTimelineFetcher) (*common.PRSet, error) {
return common.FetchPRSet("test", mock, "foo", "barPrj", 42, &common.AutogitConfig{
Reviewers: []string{"+super1", "*super2", "m1", "-m2"},
Branch: "branch",
Organization: "foo",
GitProjectName: "barPrj",
ManualMergeOnly: true,
ManualMergeProject: true,
})
},
},
{
name: "Manual review is done via PackageGit",
data: []prdata{
{
pr: &models.PullRequest{Body: "PR: foo/repo#20", Index: 42, Base: &models.PRBranchInfo{Repo: &models.Repository{Name: "barPrj", Owner: &models.User{UserName: "foo"}}}, User: &models.User{UserName: "submitter"}, State: "opened"},
reviews: []*models.PullReview{
{Body: "LGTM", User: &models.User{UserName: "m2"}, State: common.ReviewStateApproved},
{Body: "LGTM", User: &models.User{UserName: "super2"}, State: common.ReviewStateApproved},
{Body: "LGTM", User: &models.User{UserName: common.Bot_BuildReview}, State: common.ReviewStateApproved},
},
},
{
pr: &models.PullRequest{Body: "PR: foo/barPrj#42", Index: 20, Base: &models.PRBranchInfo{Repo: &models.Repository{Name: "repo", Owner: &models.User{UserName: "foo"}}}, User: &models.User{UserName: "submitter"}, State: "opened"},
reviews: []*models.PullReview{
{Body: "LGTM", User: &models.User{UserName: "m1"}, State: common.ReviewStateApproved},
{Body: "Merge ok", User: &models.User{UserName: "super1"}, State: common.ReviewStateApproved},
{Body: "LGTM", User: &models.User{UserName: "super2"}, State: common.ReviewStateApproved},
},
},
},
resLen: 2,
prjGitPRIndex: 0,
consistentSet: true,
reviewed: true,
reviewSetFetcher: func(mock *mock_common.MockGiteaPRTimelineFetcher) (*common.PRSet, error) {
return common.FetchPRSet("test", mock, "foo", "barPrj", 42, &common.AutogitConfig{
Reviewers: []string{"+super1", "*super2", "m1", "-m2"},
Branch: "branch",
Organization: "foo",
GitProjectName: "barPrj",
ManualMergeOnly: true,
})
},
},
{
name: "Manual review done via PkgGits",
data: []prdata{
{
pr: &models.PullRequest{Body: "PR: foo/repo#20\nPR: foo/repo#21", Index: 42, Base: &models.PRBranchInfo{Repo: &models.Repository{Name: "barPrj", Owner: &models.User{UserName: "foo"}}}, User: &models.User{UserName: "submitter"}, State: "opened"},
reviews: []*models.PullReview{
{Body: "LGTM", User: &models.User{UserName: "m2"}, State: common.ReviewStateApproved},
{Body: "LGTM", User: &models.User{UserName: "super2"}, State: common.ReviewStateApproved},
{Body: "LGTM", User: &models.User{UserName: common.Bot_BuildReview}, State: common.ReviewStateApproved},
},
},
{
pr: &models.PullRequest{Body: "PR: foo/barPrj#42", Index: 20, Base: &models.PRBranchInfo{Repo: &models.Repository{Name: "repo", Owner: &models.User{UserName: "foo"}}}, User: &models.User{UserName: "submitter"}, State: "opened"},
reviews: []*models.PullReview{
{Body: "LGTM", User: &models.User{UserName: "m1"}, State: common.ReviewStateApproved},
{Body: "Merge OK!", User: &models.User{UserName: "super1"}, State: common.ReviewStateApproved},
{Body: "LGTM", User: &models.User{UserName: "super2"}, State: common.ReviewStateApproved},
},
},
{
pr: &models.PullRequest{Body: "PR: foo/barPrj#42", Index: 21, Base: &models.PRBranchInfo{Repo: &models.Repository{Name: "repo", Owner: &models.User{UserName: "foo"}}}, User: &models.User{UserName: "submitter"}, State: "opened"},
reviews: []*models.PullReview{
{Body: "LGTM", User: &models.User{UserName: "m1"}, State: common.ReviewStateApproved},
{Body: "merge ok", User: &models.User{UserName: "super1"}, State: common.ReviewStateApproved},
{Body: "LGTM", User: &models.User{UserName: "super2"}, State: common.ReviewStateApproved},
},
},
},
resLen: 3,
prjGitPRIndex: 0,
consistentSet: true,
reviewed: true,
reviewSetFetcher: func(mock *mock_common.MockGiteaPRTimelineFetcher) (*common.PRSet, error) {
return common.FetchPRSet("test", mock, "foo", "barPrj", 42, &common.AutogitConfig{
Reviewers: []string{"+super1", "*super2", "m1", "-m2"},
Branch: "branch",
Organization: "foo",
GitProjectName: "barPrj",
ManualMergeOnly: true,
})
},
},
{
name: "Manual review done via PkgGits not allowed",
data: []prdata{
{
pr: &models.PullRequest{Body: "PR: foo/repo#20\nPR: foo/repo#21", Index: 42, Base: &models.PRBranchInfo{Repo: &models.Repository{Name: "barPrj", Owner: &models.User{UserName: "foo"}}}, User: &models.User{UserName: "submitter"}, State: "opened"},
reviews: []*models.PullReview{
{Body: "LGTM", User: &models.User{UserName: "m2"}, State: common.ReviewStateApproved},
{Body: "LGTM", User: &models.User{UserName: "super2"}, State: common.ReviewStateApproved},
{Body: "LGTM", User: &models.User{UserName: common.Bot_BuildReview}, State: common.ReviewStateApproved},
},
},
{
pr: &models.PullRequest{Body: "PR: foo/barPrj#42", Index: 20, Base: &models.PRBranchInfo{Repo: &models.Repository{Name: "repo", Owner: &models.User{UserName: "foo"}}}, User: &models.User{UserName: "submitter"}, State: "opened"},
reviews: []*models.PullReview{
{Body: "LGTM", User: &models.User{UserName: "m1"}, State: common.ReviewStateApproved},
{Body: "Merge OK!", User: &models.User{UserName: "super1"}, State: common.ReviewStateApproved},
{Body: "LGTM", User: &models.User{UserName: "super2"}, State: common.ReviewStateApproved},
},
},
{
pr: &models.PullRequest{Body: "PR: foo/barPrj#42", Index: 21, Base: &models.PRBranchInfo{Repo: &models.Repository{Name: "repo", Owner: &models.User{UserName: "foo"}}}, User: &models.User{UserName: "submitter"}, State: "opened"},
reviews: []*models.PullReview{
{Body: "LGTM", User: &models.User{UserName: "m1"}, State: common.ReviewStateApproved},
{Body: "merge ok", User: &models.User{UserName: "super1"}, State: common.ReviewStateApproved},
{Body: "LGTM", User: &models.User{UserName: "super2"}, State: common.ReviewStateApproved},
},
},
},
resLen: 3,
prjGitPRIndex: 0,
consistentSet: true,
reviewed: false,
reviewSetFetcher: func(mock *mock_common.MockGiteaPRTimelineFetcher) (*common.PRSet, error) {
return common.FetchPRSet("test", mock, "foo", "barPrj", 42, &common.AutogitConfig{
Reviewers: []string{"+super1", "*super2", "m1", "-m2"},
Branch: "branch",
Organization: "foo",
GitProjectName: "barPrj",
ManualMergeOnly: true,
ManualMergeProject: true,
})
},
},
{
name: "Manual review is is missing on one PR",
data: []prdata{
{
pr: &models.PullRequest{Body: "PR: foo/repo#20\nPR: foo/repo#21", Index: 42, Base: &models.PRBranchInfo{Repo: &models.Repository{Name: "barPrj", Owner: &models.User{UserName: "foo"}}}, User: &models.User{UserName: "submitter"}, State: "opened"},
reviews: []*models.PullReview{
{Body: "LGTM", User: &models.User{UserName: "m2"}, State: common.ReviewStateApproved},
{Body: "LGTM", User: &models.User{UserName: "super2"}, State: common.ReviewStateApproved},
{Body: "LGTM", User: &models.User{UserName: common.Bot_BuildReview}, State: common.ReviewStateApproved},
},
},
{
pr: &models.PullRequest{Body: "PR: foo/barPrj#42", Index: 20, Base: &models.PRBranchInfo{Repo: &models.Repository{Name: "repo", Owner: &models.User{UserName: "foo"}}}, User: &models.User{UserName: "submitter"}, State: "opened"},
reviews: []*models.PullReview{
{Body: "LGTM", User: &models.User{UserName: "m1"}, State: common.ReviewStateApproved},
{Body: "LGTM", User: &models.User{UserName: "super1"}, State: common.ReviewStateApproved},
{Body: "LGTM", User: &models.User{UserName: "super2"}, State: common.ReviewStateApproved},
},
},
{
pr: &models.PullRequest{Body: "PR: foo/barPrj#42", Index: 21, Base: &models.PRBranchInfo{Repo: &models.Repository{Name: "repo", Owner: &models.User{UserName: "foo"}}}, User: &models.User{UserName: "submitter"}, State: "opened"},
reviews: []*models.PullReview{
{Body: "LGTM", User: &models.User{UserName: "m1"}, State: common.ReviewStateApproved},
{Body: "LGTM", User: &models.User{UserName: "super1"}, State: common.ReviewStateApproved},
{Body: "LGTM", User: &models.User{UserName: "super2"}, State: common.ReviewStateApproved},
},
},
},
resLen: 3,
prjGitPRIndex: 0,
consistentSet: true,
reviewed: false,
reviewSetFetcher: func(mock *mock_common.MockGiteaPRTimelineFetcher) (*common.PRSet, error) {
return common.FetchPRSet("test", mock, "foo", "barPrj", 42, &common.AutogitConfig{
Reviewers: []string{"+super1", "*super2", "m1", "-m2"},
Branch: "branch",
Organization: "foo",
GitProjectName: "barPrj",
ManualMergeOnly: true,
})
},
},
{
name: "PR is approved with negative optional review",
data: []prdata{
{
pr: &models.PullRequest{Body: "", Index: 42, Base: &models.PRBranchInfo{Repo: &models.Repository{Name: "barPrj", Owner: &models.User{UserName: "foo"}}}, User: &models.User{UserName: "submitter"}, State: "opened"},
reviews: []*models.PullReview{
{Body: "LGTM", User: &models.User{UserName: "m2"}, State: common.ReviewStateApproved},
{Body: "LGTM", User: &models.User{UserName: "super2"}, State: common.ReviewStateApproved},
{Body: "LGTM", User: &models.User{UserName: common.Bot_BuildReview}, State: common.ReviewStateApproved},
{Body: "LGTM", User: &models.User{UserName: "bot"}, State: common.ReviewStateRequestChanges},
},
},
},
resLen: 1,
prjGitPRIndex: 0,
consistentSet: true,
reviewed: true,
reviewSetFetcher: func(mock *mock_common.MockGiteaPRTimelineFetcher) (*common.PRSet, error) {
config := common.AutogitConfig{
Reviewers: []string{"+super1", "*super2", "m1", "-m2", "~*bot"},
Branch: "branch",
Organization: "foo",
GitProjectName: "barPrj",
}
return common.FetchPRSet("test", mock, "foo", "barPrj", 42, &config)
},
},
} }
for _, test := range tests { for _, test := range tests {
t.Run(test.name, func(t *testing.T) { t.Run(test.name, func(t *testing.T) {
ctl := gomock.NewController(t) ctl := gomock.NewController(t)
pr_mock := mock_common.NewMockGiteaPRTimelineFetcher(ctl) pr_mock := mock_common.NewMockGiteaPRFetcher(ctl)
review_mock := mock_common.NewMockGiteaPRChecker(ctl) review_mock := mock_common.NewMockGiteaPRChecker(ctl)
// reviewer_mock := mock_common.NewMockGiteaReviewRequester(ctl) // reviewer_mock := mock_common.NewMockGiteaReviewRequester(ctl)
if test.reviewSetFetcher == nil { // if we are fetching the prjgit directly, the these mocks are not called if test.reviewSetFetcher == nil { // if we are fetching the prjgit directly, the these mocks are not called
if test.prjGitPRIndex >= 0 { if test.prjGitPRIndex >= 0 {
pr_mock.EXPECT().GetPullRequest(baseConfig.Organization, baseConfig.GitProjectName, test.prjGitPRIndex). pr_mock.EXPECT().GetAssociatedPrjGitPR(baseConfig.Organization, baseConfig.GitProjectName, test.data[0].pr.Base.Repo.Owner.UserName, test.data[0].pr.Base.Repo.Name, test.data[0].pr.Index).
Return(test.data[test.prjGitPRIndex].pr, test.data[test.prjGitPRIndex].pr_err) Return(test.data[test.prjGitPRIndex].pr, test.data[test.prjGitPRIndex].pr_err)
} else if test.prjGitPRIndex < 0 { } else if test.prjGitPRIndex < 0 {
// no prjgit PR // no prjgit PR
pr_mock.EXPECT().GetPullRequest(baseConfig.Organization, baseConfig.GitProjectName, gomock.Any()). pr_mock.EXPECT().GetAssociatedPrjGitPR(baseConfig.Organization, baseConfig.GitProjectName, test.data[0].pr.Base.Repo.Owner.UserName, test.data[0].pr.Base.Repo.Name, test.data[0].pr.Index).
Return(nil, nil) Return(nil, nil)
} }
} }
@@ -538,10 +155,6 @@ func TestPR(t *testing.T) {
test_err = data.pr_err test_err = data.pr_err
} }
review_mock.EXPECT().GetPullRequestReviews(data.pr.Base.Repo.Owner.UserName, data.pr.Base.Repo.Name, data.pr.Index).Return(data.reviews, data.review_error).AnyTimes() review_mock.EXPECT().GetPullRequestReviews(data.pr.Base.Repo.Owner.UserName, data.pr.Base.Repo.Name, data.pr.Index).Return(data.reviews, data.review_error).AnyTimes()
if data.timeline == nil {
data.timeline = reviewsToTimeline(data.reviews)
}
review_mock.EXPECT().GetTimeline(data.pr.Base.Repo.Owner.UserName, data.pr.Base.Repo.Name, data.pr.Index).Return(data.timeline, nil).AnyTimes()
} }
var res *common.PRSet var res *common.PRSet
@@ -550,7 +163,7 @@ func TestPR(t *testing.T) {
if test.reviewSetFetcher != nil { if test.reviewSetFetcher != nil {
res, err = test.reviewSetFetcher(pr_mock) res, err = test.reviewSetFetcher(pr_mock)
} else { } else {
res, err = common.FetchPRSet("test", pr_mock, "test", "repo", 42, &baseConfig) res, err = common.FetchPRSet(pr_mock, "test", "repo", 42, &baseConfig)
} }
if err == nil { if err == nil {
@@ -585,7 +198,7 @@ func TestPR(t *testing.T) {
pr_found := false pr_found := false
if test.prjGitPRIndex >= 0 { if test.prjGitPRIndex >= 0 {
for i := range test.data { for i := range test.data {
if PrjGitPR.PR == test.data[i].pr && i == test.prjGitPRIndex { if PrjGitPR == test.data[i].pr && i == test.prjGitPRIndex {
t.Log("found at index", i) t.Log("found at index", i)
pr_found = true pr_found = true
} }
@@ -609,9 +222,7 @@ func TestPR(t *testing.T) {
*/ */
maintainers := mock_common.NewMockMaintainershipData(ctl) maintainers := mock_common.NewMockMaintainershipData(ctl)
maintainers.EXPECT().ListPackageMaintainers(gomock.Any()).Return([]string{}).AnyTimes() maintainers.EXPECT().IsApproved(gomock.Any(), gomock.Any()).Return(true).AnyTimes()
maintainers.EXPECT().ListProjectMaintainers().Return([]string{}).AnyTimes()
maintainers.EXPECT().IsApproved(gomock.Any(), gomock.Any(), gomock.Any()).Return(true).AnyTimes()
if isApproved := res.IsApproved(review_mock, maintainers); isApproved != test.reviewed { if isApproved := res.IsApproved(review_mock, maintainers); isApproved != test.reviewed {
t.Error("expected reviewed to be NOT", isApproved) t.Error("expected reviewed to be NOT", isApproved)
@@ -631,17 +242,15 @@ func TestPRAssignReviewers(t *testing.T) {
reviewer string reviewer string
} }
pkgReviews []*models.PullReview pkgReviews []*models.PullReview
pkgTimeline []*models.TimelineComment prjReviews []*models.PullReview
prjReviews []*models.PullReview
prjTimeline []*models.TimelineComment
expectedReviewerCall [2][]string expectedReviewerCall [2][]string
}{ }{
{ {
name: "No reviewers", name: "No reviewers",
config: common.AutogitConfig{ config: common.AutogitConfig{
GitProjectName: "prg/repo#main", GitProjectName: "repo",
Organization: "org", Organization: "org",
Branch: "main", Branch: "main",
Reviewers: []string{}, Reviewers: []string{},
@@ -651,7 +260,7 @@ func TestPRAssignReviewers(t *testing.T) {
{ {
name: "One project reviewer only", name: "One project reviewer only",
config: common.AutogitConfig{ config: common.AutogitConfig{
GitProjectName: "prg/repo#main", GitProjectName: "repo",
Organization: "org", Organization: "org",
Branch: "main", Branch: "main",
Reviewers: []string{"-user1"}, Reviewers: []string{"-user1"},
@@ -661,7 +270,7 @@ func TestPRAssignReviewers(t *testing.T) {
{ {
name: "One project reviewer and one pkg reviewer only", name: "One project reviewer and one pkg reviewer only",
config: common.AutogitConfig{ config: common.AutogitConfig{
GitProjectName: "prg/repo#main", GitProjectName: "repo",
Organization: "org", Organization: "org",
Branch: "main", Branch: "main",
Reviewers: []string{"-user1", "user2"}, Reviewers: []string{"-user1", "user2"},
@@ -671,7 +280,7 @@ func TestPRAssignReviewers(t *testing.T) {
{ {
name: "No need to get reviews of submitter", name: "No need to get reviews of submitter",
config: common.AutogitConfig{ config: common.AutogitConfig{
GitProjectName: "prg/repo#main", GitProjectName: "repo",
Organization: "org", Organization: "org",
Branch: "main", Branch: "main",
Reviewers: []string{"-user1", "submitter"}, Reviewers: []string{"-user1", "submitter"},
@@ -681,7 +290,7 @@ func TestPRAssignReviewers(t *testing.T) {
{ {
name: "Reviews are done", name: "Reviews are done",
config: common.AutogitConfig{ config: common.AutogitConfig{
GitProjectName: "prg/repo#main", GitProjectName: "repo",
Organization: "org", Organization: "org",
Branch: "main", Branch: "main",
Reviewers: []string{"-user1", "user2"}, Reviewers: []string{"-user1", "user2"},
@@ -715,15 +324,15 @@ func TestPRAssignReviewers(t *testing.T) {
{ {
name: "Stale review is not done, re-request it", name: "Stale review is not done, re-request it",
config: common.AutogitConfig{ config: common.AutogitConfig{
GitProjectName: "org/repo#main", GitProjectName: "repo",
Organization: "org", Organization: "org",
Branch: "main", Branch: "main",
Reviewers: []string{"-user1", "user2"}, Reviewers: []string{"-user1", "user2"},
}, },
pkgReviews: []*models.PullReview{ pkgReviews: []*models.PullReview{
{ {
State: common.ReviewStateApproved, State: common.ReviewStateApproved,
User: &models.User{UserName: "user2"}, User: &models.User{UserName: "user2"},
}, },
{ {
State: common.ReviewStatePending, State: common.ReviewStatePending,
@@ -744,59 +353,15 @@ func TestPRAssignReviewers(t *testing.T) {
}, },
expectedReviewerCall: [2][]string{{"user1", "autogits_obs_staging_bot"}, {"pkgmaintainer"}}, expectedReviewerCall: [2][]string{{"user1", "autogits_obs_staging_bot"}, {"pkgmaintainer"}},
}, },
{
name: "Stale optional review is not done, re-request it",
config: common.AutogitConfig{
GitProjectName: "prg/repo#main",
Organization: "org",
Branch: "main",
Reviewers: []string{"-user1", "user2", "~bot"},
},
pkgReviews: []*models.PullReview{
{
State: common.ReviewStateApproved,
User: &models.User{UserName: "bot"},
Stale: true,
},
{
State: common.ReviewStateApproved,
User: &models.User{UserName: "user2"},
},
{
State: common.ReviewStatePending,
User: &models.User{UserName: "prjmaintainer"},
},
},
prjReviews: []*models.PullReview{
{
State: common.ReviewStateRequestChanges,
User: &models.User{UserName: "user1"},
Stale: true,
},
{
State: common.ReviewStateRequestReview,
Stale: true,
User: &models.User{UserName: "autogits_obs_staging_bot"},
},
},
expectedReviewerCall: [2][]string{{"user1", "autogits_obs_staging_bot"}, {"pkgmaintainer", "bot"}},
},
} }
for _, test := range tests { for _, test := range tests {
t.Run(test.name, func(t *testing.T) { t.Run(test.name, func(t *testing.T) {
ctl := gomock.NewController(t) ctl := gomock.NewController(t)
pr_mock := mock_common.NewMockGiteaPRTimelineFetcher(ctl) pr_mock := mock_common.NewMockGiteaPRFetcher(ctl)
review_mock := mock_common.NewMockGiteaReviewFetcherAndRequester(ctl) review_mock := mock_common.NewMockGiteaReviewFetcherAndRequester(ctl)
maintainership_mock := mock_common.NewMockMaintainershipData(ctl) maintainership_mock := mock_common.NewMockMaintainershipData(ctl)
if test.pkgTimeline == nil {
test.pkgTimeline = reviewsToTimeline(test.pkgReviews)
}
if test.prjTimeline == nil {
test.prjTimeline = reviewsToTimeline(test.prjReviews)
}
pr_mock.EXPECT().GetPullRequest("other", "pkgrepo", int64(1)).Return(&models.PullRequest{ pr_mock.EXPECT().GetPullRequest("other", "pkgrepo", int64(1)).Return(&models.PullRequest{
Body: "Some description is here", Body: "Some description is here",
User: &models.User{UserName: "submitter"}, User: &models.User{UserName: "submitter"},
@@ -806,8 +371,7 @@ func TestPRAssignReviewers(t *testing.T) {
Index: 1, Index: 1,
}, nil) }, nil)
review_mock.EXPECT().GetPullRequestReviews("other", "pkgrepo", int64(1)).Return(test.pkgReviews, nil) review_mock.EXPECT().GetPullRequestReviews("other", "pkgrepo", int64(1)).Return(test.pkgReviews, nil)
review_mock.EXPECT().GetTimeline("other", "pkgrepo", int64(1)).Return(test.pkgTimeline, nil) pr_mock.EXPECT().GetAssociatedPrjGitPR("org", "repo", "other", "pkgrepo", int64(1)).Return(&models.PullRequest{
pr_mock.EXPECT().GetPullRequest("org", "repo", int64(1)).Return(&models.PullRequest{
Body: fmt.Sprintf(common.PrPattern, "other", "pkgrepo", 1), Body: fmt.Sprintf(common.PrPattern, "other", "pkgrepo", 1),
User: &models.User{UserName: "bot1"}, User: &models.User{UserName: "bot1"},
RequestedReviewers: []*models.User{{UserName: "main_reviewer"}}, RequestedReviewers: []*models.User{{UserName: "main_reviewer"}},
@@ -816,12 +380,11 @@ func TestPRAssignReviewers(t *testing.T) {
Index: 42, Index: 42,
}, nil) }, nil)
review_mock.EXPECT().GetPullRequestReviews("org", "repo", int64(42)).Return(test.prjReviews, nil) review_mock.EXPECT().GetPullRequestReviews("org", "repo", int64(42)).Return(test.prjReviews, nil)
review_mock.EXPECT().GetTimeline("org", "repo", int64(42)).Return(test.prjTimeline, nil)
maintainership_mock.EXPECT().ListProjectMaintainers().Return([]string{"prjmaintainer"}).AnyTimes() maintainership_mock.EXPECT().ListProjectMaintainers().Return([]string{"prjmaintainer"}).AnyTimes()
maintainership_mock.EXPECT().ListPackageMaintainers("pkgrepo").Return([]string{"pkgmaintainer"}).AnyTimes() maintainership_mock.EXPECT().ListPackageMaintainers("pkgrepo").Return([]string{"pkgmaintainer"}).AnyTimes()
prs, _ := common.FetchPRSet("test", pr_mock, "other", "pkgrepo", int64(1), &test.config) prs, _ := common.FetchPRSet(pr_mock, "other", "pkgrepo", int64(1), &test.config)
if len(prs.PRs) != 2 { if len(prs.PRs) != 2 {
t.Fatal("PRs not fetched") t.Fatal("PRs not fetched")
} }
@@ -830,9 +393,8 @@ func TestPRAssignReviewers(t *testing.T) {
if !prs.IsPrjGitPR(pr.PR) { if !prs.IsPrjGitPR(pr.PR) {
r = test.expectedReviewerCall[1] r = test.expectedReviewerCall[1]
} }
slices.Sort(r) if len(r) > 0 {
for _, reviewer := range r { review_mock.EXPECT().RequestReviews(pr.PR, r).Return(nil, nil)
review_mock.EXPECT().RequestReviews(pr.PR, reviewer).Return(nil, nil)
} }
} }
prs.AssignReviewers(review_mock, maintainership_mock) prs.AssignReviewers(review_mock, maintainership_mock)
@@ -855,7 +417,7 @@ func TestPRAssignReviewers(t *testing.T) {
{ {
name: "PrjMaintainers in prjgit review when not part of pkg set", name: "PrjMaintainers in prjgit review when not part of pkg set",
config: common.AutogitConfig{ config: common.AutogitConfig{
GitProjectName: "org/repo#main", GitProjectName: "repo",
Organization: "org", Organization: "org",
Branch: "main", Branch: "main",
Reviewers: []string{}, Reviewers: []string{},
@@ -866,7 +428,7 @@ func TestPRAssignReviewers(t *testing.T) {
for _, test := range prjgit_tests { for _, test := range prjgit_tests {
t.Run(test.name, func(t *testing.T) { t.Run(test.name, func(t *testing.T) {
ctl := gomock.NewController(t) ctl := gomock.NewController(t)
pr_mock := mock_common.NewMockGiteaPRTimelineFetcher(ctl) pr_mock := mock_common.NewMockGiteaPRFetcher(ctl)
review_mock := mock_common.NewMockGiteaReviewFetcherAndRequester(ctl) review_mock := mock_common.NewMockGiteaReviewFetcherAndRequester(ctl)
maintainership_mock := mock_common.NewMockMaintainershipData(ctl) maintainership_mock := mock_common.NewMockMaintainershipData(ctl)
@@ -879,11 +441,10 @@ func TestPRAssignReviewers(t *testing.T) {
Index: 1, Index: 1,
}, nil) }, nil)
review_mock.EXPECT().GetPullRequestReviews("org", "repo", int64(1)).Return(test.prjReviews, nil) review_mock.EXPECT().GetPullRequestReviews("org", "repo", int64(1)).Return(test.prjReviews, nil)
review_mock.EXPECT().GetTimeline("org", "repo", int64(1)).Return(nil, nil)
maintainership_mock.EXPECT().ListProjectMaintainers().Return([]string{"prjmaintainer"}).AnyTimes() maintainership_mock.EXPECT().ListProjectMaintainers().Return([]string{"prjmaintainer"}).AnyTimes()
prs, _ := common.FetchPRSet("test", pr_mock, "org", "repo", int64(1), &test.config) prs, _ := common.FetchPRSet(pr_mock, "org", "repo", int64(1), &test.config)
if len(prs.PRs) != 1 { if len(prs.PRs) != 1 {
t.Fatal("PRs not fetched") t.Fatal("PRs not fetched")
} }
@@ -892,8 +453,8 @@ func TestPRAssignReviewers(t *testing.T) {
if !prs.IsPrjGitPR(pr.PR) { if !prs.IsPrjGitPR(pr.PR) {
t.Fatal("only prjgit pr here") t.Fatal("only prjgit pr here")
} }
for _, reviewer := range r { if len(r) > 0 {
review_mock.EXPECT().RequestReviews(pr.PR, reviewer).Return(nil, nil) review_mock.EXPECT().RequestReviews(pr.PR, r).Return(nil, nil)
} }
} }
prs.AssignReviewers(review_mock, maintainership_mock) prs.AssignReviewers(review_mock, maintainership_mock)
@@ -902,11 +463,9 @@ func TestPRAssignReviewers(t *testing.T) {
} }
func TestPRMerge(t *testing.T) { func TestPRMerge(t *testing.T) {
repoDir := t.TempDir()
cwd, _ := os.Getwd() cwd, _ := os.Getwd()
cmd := exec.Command(path.Join(cwd, "test_repo_setup.sh")) cmd := exec.Command("/usr/bin/bash", path.Join(cwd, "test_repo_setup.sh"))
cmd.Dir = repoDir cmd.Dir = t.TempDir()
if out, err := cmd.CombinedOutput(); err != nil { if out, err := cmd.CombinedOutput(); err != nil {
t.Fatal(string(out)) t.Fatal(string(out))
} }
@@ -926,7 +485,7 @@ func TestPRMerge(t *testing.T) {
config := &common.AutogitConfig{ config := &common.AutogitConfig{
Organization: "org", Organization: "org",
GitProjectName: "org/prj#master", GitProjectName: "prj",
} }
tests := []struct { tests := []struct {
@@ -940,13 +499,12 @@ func TestPRMerge(t *testing.T) {
pr: &models.PullRequest{ pr: &models.PullRequest{
Base: &models.PRBranchInfo{ Base: &models.PRBranchInfo{
Sha: "e8b0de43d757c96a9d2c7101f4bff404e322f53a1fa4041fb85d646110c38ad4", // "base_add_b1" Sha: "e8b0de43d757c96a9d2c7101f4bff404e322f53a1fa4041fb85d646110c38ad4", // "base_add_b1"
Name: "master",
Repo: &models.Repository{ Repo: &models.Repository{
Name: "prj", Name: "prj",
Owner: &models.User{ Owner: &models.User{
UserName: "org", UserName: "org",
}, },
SSHURL: "file://" + path.Join(repoDir, "prjgit"), SSHURL: path.Join(cmd.Dir, "prjgit"),
}, },
}, },
Head: &models.PRBranchInfo{ Head: &models.PRBranchInfo{
@@ -956,18 +514,17 @@ func TestPRMerge(t *testing.T) {
mergeError: "Aborting merge", mergeError: "Aborting merge",
}, },
{ {
name: "Merge conflict in modules, auto-resolved", name: "Merge conflict in modules",
pr: &models.PullRequest{ pr: &models.PullRequest{
Base: &models.PRBranchInfo{ Base: &models.PRBranchInfo{
Sha: "4fbd1026b2d7462ebe9229a49100c11f1ad6555520a21ba515122d8bc41328a8", Sha: "4fbd1026b2d7462ebe9229a49100c11f1ad6555520a21ba515122d8bc41328a8",
Name: "master",
Repo: &models.Repository{ Repo: &models.Repository{
Name: "prj", Name: "prj",
Owner: &models.User{ Owner: &models.User{
UserName: "org", UserName: "org",
}, },
SSHURL: "file://" + path.Join(cmd.Dir, "prjgit"), SSHURL: path.Join(cmd.Dir, "prjgit"),
}, },
}, },
Head: &models.PRBranchInfo{ Head: &models.PRBranchInfo{
@@ -980,80 +537,19 @@ func TestPRMerge(t *testing.T) {
for _, test := range tests { for _, test := range tests {
t.Run(test.name, func(t *testing.T) { t.Run(test.name, func(t *testing.T) {
ctl := gomock.NewController(t) ctl := gomock.NewController(t)
mock := mock_common.NewMockGiteaPRTimelineFetcher(ctl) mock := mock_common.NewMockGiteaPRFetcher(ctl)
reviewUnrequestMock := mock_common.NewMockGiteaReviewUnrequester(ctl)
reviewUnrequestMock.EXPECT().UnrequestReview(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return(nil)
testDir := t.TempDir()
t.Log("dir:", testDir)
mock.EXPECT().GetPullRequest("org", "prj", int64(1)).Return(test.pr, nil) mock.EXPECT().GetPullRequest("org", "prj", int64(1)).Return(test.pr, nil)
set, err := common.FetchPRSet("test", mock, "org", "prj", 1, config) set, err := common.FetchPRSet(mock, "org", "prj", 1, config)
if err != nil { if err != nil {
t.Fatal(err) t.Fatal(err)
} }
gh, _ := common.AllocateGitWorkTree(testDir, "", "") gh, _ := common.AllocateGitWorkTree("", "", "")
git, err := gh.CreateGitHandler("org") if err = set.Merge(gh); err != nil && (test.mergeError == "" || (len(test.mergeError) > 0 && !strings.Contains(err.Error(), test.mergeError))) {
err = set.Merge(reviewUnrequestMock, git)
if err != nil && (test.mergeError == "" || (len(test.mergeError) > 0 && !strings.Contains(err.Error(), test.mergeError))) {
os.CopyFS("/tmp/upstream", os.DirFS(repoDir))
os.CopyFS("/tmp/out", os.DirFS(testDir))
t.Fatal(err) t.Fatal(err)
} }
}) })
} }
} }
func TestPRChanges(t *testing.T) {
tests := []struct {
name string
PRs []*models.PullRequest
PrjPRs *models.PullRequest
}{
{
name: "Pkg PR is closed",
PRs: []*models.PullRequest{
{
Base: &models.PRBranchInfo{Repo: &models.Repository{Owner: &models.User{UserName: "org"}, Name: "repo"}},
Index: 42,
State: "merged",
},
},
PrjPRs: &models.PullRequest{
Title: "some PR",
Base: &models.PRBranchInfo{Repo: &models.Repository{Name: "prjgit", Owner: &models.User{UserName: "org"}}},
Body: "PR: org/repo#42",
State: "opened",
},
},
}
config := common.AutogitConfig{
Branch: "main",
GitProjectName: "org/prjgit#branch",
}
for _, test := range tests {
t.Run(test.name, func(t *testing.T) {
ctl := gomock.NewController(t)
mock_fetcher := mock_common.NewMockGiteaPRTimelineFetcher(ctl)
mock_fetcher.EXPECT().GetPullRequest("org", "prjgit", int64(42)).Return(test.PrjPRs, nil)
for _, pr := range test.PRs {
mock_fetcher.EXPECT().GetPullRequest(pr.Base.Repo.Owner.UserName, pr.Base.Repo.Name, pr.Index).Return(pr, nil)
}
PRs, err := common.FetchPRSet("user", mock_fetcher, "org", "repo", 42, &config)
if err != nil {
t.Fatal(err)
}
if PRs.IsConsistent() {
t.Fatal("Inconsistent set!")
}
})
}
}

View File

@@ -1,238 +0,0 @@
package common
/*
* This file is part of Autogits.
*
* Copyright © 2024 SUSE LLC
*
* Autogits is free software: you can redistribute it and/or modify it under
* the terms of the GNU General Public License as published by the Free Software
* Foundation, either version 2 of the License, or (at your option) any later
* version.
*
* Autogits is distributed in the hope that it will be useful, but WITHOUT ANY
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
* PARTICULAR PURPOSE. See the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along with
* Foobar. If not, see <https://www.gnu.org/licenses/>.
*/
import (
"crypto/tls"
"fmt"
"net/url"
"strings"
"time"
rabbitmq "github.com/rabbitmq/amqp091-go"
)
type RabbitConnection struct {
RabbitURL *url.URL // amqps://user:password@host/queue
queueName string
ch *rabbitmq.Channel
topics []string
topicSubChanges chan string // +topic = subscribe, -topic = unsubscribe
}
type RabbitProcessor interface {
GenerateTopics() []string
Connection() *RabbitConnection
ProcessRabbitMessage(msg RabbitMessage) error
}
type RabbitMessage rabbitmq.Delivery
func (l *RabbitConnection) ProcessTopicChanges() {
for {
topic, ok := <-l.topicSubChanges
if !ok {
return
}
LogDebug(" topic change:", topic)
switch topic[0] {
case '+':
if err := l.ch.QueueBind(l.queueName, topic[1:], "pubsub", false, nil); err != nil {
LogError(err)
}
case '-':
if err := l.ch.QueueUnbind(l.queueName, topic[1:], "pubsub", nil); err != nil {
LogError(err)
}
default:
LogInfo("Ignoring unknown topic change:", topic)
}
}
}
func (l *RabbitConnection) ProcessRabbitMQ(msgCh chan<- RabbitMessage) error {
queueName := l.RabbitURL.Path
l.RabbitURL.Path = ""
if len(queueName) > 0 && queueName[0] == '/' {
queueName = queueName[1:]
}
connection, err := rabbitmq.DialTLS(l.RabbitURL.String(), &tls.Config{
ServerName: l.RabbitURL.Hostname(),
})
if err != nil {
return fmt.Errorf("Cannot connect to %s . Err: %w", l.RabbitURL.Hostname(), err)
}
defer connection.Close()
l.ch, err = connection.Channel()
if err != nil {
return fmt.Errorf("Cannot create a channel. Err: %w", err)
}
defer l.ch.Close()
if err = l.ch.ExchangeDeclarePassive("pubsub", "topic", true, false, false, false, nil); err != nil {
return fmt.Errorf("Cannot find pubsub exchange? Err: %w", err)
}
var q rabbitmq.Queue
if len(queueName) == 0 {
q, err = l.ch.QueueDeclare("", false, true, true, false, nil)
} else {
q, err = l.ch.QueueDeclarePassive(queueName, true, false, true, false, nil)
if err != nil {
LogInfo("queue not found .. trying to create it:", err)
if l.ch.IsClosed() {
l.ch, err = connection.Channel()
if err != nil {
return fmt.Errorf("Channel cannot be re-opened. Err: %w", err)
}
}
q, err = l.ch.QueueDeclare(queueName, true, false, true, false, nil)
if err != nil {
LogInfo("can't create persistent queue ... falling back to temporaty queue:", err)
if l.ch.IsClosed() {
l.ch, err = connection.Channel()
return fmt.Errorf("Channel cannot be re-opened. Err: %w", err)
}
q, err = l.ch.QueueDeclare("", false, true, true, false, nil)
}
}
}
if err != nil {
return fmt.Errorf("Cannot declare queue. Err: %w", err)
}
// log.Printf("queue: %s:%d", q.Name, q.Consumers)
LogDebug(" -- listening to topics:")
l.topicSubChanges = make(chan string)
defer close(l.topicSubChanges)
go l.ProcessTopicChanges()
for _, topic := range l.topics {
l.topicSubChanges <- "+" + topic
}
msgs, err := l.ch.Consume(q.Name, "", true, true, false, false, nil)
if err != nil {
return fmt.Errorf("Cannot start consumer. Err: %w", err)
}
// log.Printf("queue: %s:%d", q.Name, q.Consumers)
for {
msg, ok := <-msgs
if !ok {
return fmt.Errorf("channel/connection closed?\n")
}
msgCh <- RabbitMessage(msg)
}
}
func (l *RabbitConnection) ConnectAndProcessRabbitMQ(ch chan<- RabbitMessage) {
defer func() {
if r := recover(); r != nil {
LogError(r)
LogError("'crash' RabbitMQ worker. Recovering... reconnecting...")
time.Sleep(5 * time.Second)
go l.ConnectAndProcessRabbitMQ(ch)
}
}()
for {
err := l.ProcessRabbitMQ(ch)
if err != nil {
LogError("Error in RabbitMQ connection:", err)
LogInfo("Reconnecting in 2 seconds...")
time.Sleep(2 * time.Second)
}
}
}
func (l *RabbitConnection) ConnectToRabbitMQ(processor RabbitProcessor) <-chan RabbitMessage {
LogInfo("RabbitMQ connection:", l.RabbitURL.String())
l.RabbitURL.User = url.UserPassword(rabbitUser, rabbitPassword)
l.topics = processor.GenerateTopics()
ch := make(chan RabbitMessage, 100)
go l.ConnectAndProcessRabbitMQ(ch)
return ch
}
func (l *RabbitConnection) UpdateTopics(processor RabbitProcessor) {
newTopics := processor.GenerateTopics()
j := 0
next_new_topic:
for i := 0; i < len(newTopics); i++ {
topic := newTopics[i]
for j < len(l.topics) {
cmp := strings.Compare(topic, l.topics[j])
if cmp == 0 {
j++
continue next_new_topic
}
if cmp < 0 {
l.topicSubChanges <- "+" + topic
break
}
l.topicSubChanges <- "-" + l.topics[j]
j++
}
if j == len(l.topics) {
l.topicSubChanges <- "+" + topic
}
}
for j < len(l.topics) {
l.topicSubChanges <- "-" + l.topics[j]
j++
}
l.topics = newTopics
}
func ProcessRabbitMQEvents(processor RabbitProcessor) error {
ch := processor.Connection().ConnectToRabbitMQ(processor)
for {
msg, ok := <-ch
if !ok {
return nil
}
LogDebug("event:", msg.RoutingKey)
if err := processor.ProcessRabbitMessage(msg); err != nil {
LogError("Error processing", msg.RoutingKey, err)
}
}
}

View File

@@ -1,128 +0,0 @@
package common
/*
* This file is part of Autogits.
*
* Copyright © 2024 SUSE LLC
*
* Autogits is free software: you can redistribute it and/or modify it under
* the terms of the GNU General Public License as published by the Free Software
* Foundation, either version 2 of the License, or (at your option) any later
* version.
*
* Autogits is distributed in the hope that it will be useful, but WITHOUT ANY
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
* PARTICULAR PURPOSE. See the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along with
* Foobar. If not, see <https://www.gnu.org/licenses/>.
*/
import (
"fmt"
"runtime/debug"
"slices"
"strings"
)
const RequestType_CreateBrachTag = "create"
const RequestType_DeleteBranchTag = "delete"
const RequestType_Fork = "fork"
const RequestType_Issue = "issues"
const RequestType_IssueAssign = "issue_assign"
const RequestType_IssueComment = "issue_comment"
const RequestType_IssueLabel = "issue_label"
const RequestType_IssueMilestone = "issue_milestone"
const RequestType_Push = "push"
const RequestType_Repository = "repository"
const RequestType_Release = "release"
const RequestType_PR = "pull_request"
const RequestType_PRAssign = "pull_request_assign"
const RequestType_PRLabel = "pull_request_label"
const RequestType_PRComment = "pull_request_comment"
const RequestType_PRMilestone = "pull_request_milestone"
const RequestType_PRSync = "pull_request_sync"
const RequestType_PRReviewAccepted = "pull_request_review_approved"
const RequestType_PRReviewRejected = "pull_request_review_rejected"
const RequestType_PRReviewRequest = "pull_request_review_request"
const RequestType_PRReviewComment = "pull_request_review_comment"
const RequestType_Wiki = "wiki"
type RequestProcessor interface {
ProcessFunc(*Request) error
}
type RabbitMQGiteaEventsProcessor struct {
Handlers map[string]RequestProcessor
Orgs []string
c *RabbitConnection
}
func (gitea *RabbitMQGiteaEventsProcessor) Connection() *RabbitConnection {
if gitea.c == nil {
gitea.c = &RabbitConnection{}
}
return gitea.c
}
func (gitea *RabbitMQGiteaEventsProcessor) GenerateTopics() []string {
topics := make([]string, 0, len(gitea.Handlers)*len(gitea.Orgs))
scope := "suse"
if gitea.c.RabbitURL.Hostname() == "rabbit.opensuse.org" {
scope = "opensuse"
}
for _, org := range gitea.Orgs {
for requestType, _ := range gitea.Handlers {
topics = append(topics, fmt.Sprintf("%s.src.%s.%s.#", scope, org, requestType))
}
}
slices.Sort(topics)
return slices.Compact(topics)
}
func (gitea *RabbitMQGiteaEventsProcessor) ProcessRabbitMessage(msg RabbitMessage) error {
route := strings.Split(msg.RoutingKey, ".")
if len(route) > 3 {
reqType := route[3]
org := route[2]
if !slices.Contains(gitea.Orgs, org) {
LogInfo("Got event for unhandeled org:", org)
return nil
}
LogDebug("org:", org, "type:", reqType)
if handler, found := gitea.Handlers[reqType]; found {
req, err := ParseRequestJSON(reqType, msg.Body)
if err != nil {
LogError("Error parsing request JSON:", err)
} else {
LogDebug("processing req", req.Type)
// h.Request = req
ProcessEvent(handler, req)
}
return nil
}
}
return fmt.Errorf("Invalid routing key: %s", route)
}
func ProcessEvent(f RequestProcessor, request *Request) {
defer func() {
if r := recover(); r != nil {
LogError("panic caught")
if err, ok := r.(error); !ok {
LogError(err)
}
LogError(string(debug.Stack()))
}
}()
if err := f.ProcessFunc(request); err != nil {
LogError(err)
}
}

View File

@@ -1,22 +0,0 @@
package common
type RabbitMQObsBuildStatusProcessor struct {
c *RabbitConnection
}
func (o *RabbitMQObsBuildStatusProcessor) GenerateTopics() []string {
return []string{}
}
func (o *RabbitMQObsBuildStatusProcessor) Connection() *RabbitConnection {
if o.c == nil {
o.c = &RabbitConnection{}
}
return o.c
}
func (o *RabbitMQObsBuildStatusProcessor) ProcessRabbitMessage(msg RabbitMessage) error {
return nil
}

View File

@@ -1,101 +0,0 @@
package common
import (
"net/url"
"slices"
"testing"
)
func TestListenDefinitionsTopicUpdate(t *testing.T) {
tests := []struct {
name string
handlers []string
orgs1, orgs2 []string
topicDelta []string
}{
{
name: "no handlers, no orgs",
},
{
name: "adding one org",
handlers: []string{"foo"},
orgs2: []string{"NewOrg"},
topicDelta: []string{"+suse.src.NewOrg.foo.#"},
},
{
name: "adding two orgs",
handlers: []string{"foo", "bar"},
orgs1: []string{"old"},
orgs2: []string{"old", "NewOrg", "NewOrg2"},
topicDelta: []string{"+suse.src.NewOrg.foo.#", "+suse.src.NewOrg2.foo.#", "+suse.src.NewOrg.bar.#", "+suse.src.NewOrg2.bar.#"},
},
{
name: "adding one org and removing old one",
handlers: []string{"foo", "bar"},
orgs1: []string{"old"},
orgs2: []string{"NewOrg"},
topicDelta: []string{"+suse.src.NewOrg.foo.#", "+suse.src.NewOrg.bar.#", "-suse.src.old.foo.#", "-suse.src.old.bar.#"},
},
{
name: "adding one org and removing old one",
handlers: []string{"foo", "bar"},
orgs1: []string{"NewOrg"},
orgs2: []string{"old"},
topicDelta: []string{"-suse.src.NewOrg.foo.#", "-suse.src.NewOrg.bar.#", "+suse.src.old.foo.#", "+suse.src.old.bar.#"},
},
}
u, _ := url.Parse("amqps://rabbit.example.com")
for _, test := range tests {
t.Run(test.name, func(t *testing.T) {
l := &RabbitMQGiteaEventsProcessor{
Orgs: test.orgs1,
Handlers: make(map[string]RequestProcessor),
c: &RabbitConnection{
RabbitURL: u,
topicSubChanges: make(chan string, len(test.topicDelta)*10),
},
}
slices.Sort(test.topicDelta)
for _, r := range test.handlers {
l.Handlers[r] = nil
}
changes := []string{}
l.c.UpdateTopics(l)
a:
for {
select {
case c := <-l.c.topicSubChanges:
changes = append(changes, c)
default:
changes = []string{}
break a
}
}
l.Orgs = test.orgs2
l.c.UpdateTopics(l)
changes = []string{}
b:
for {
select {
case c := <-l.c.topicSubChanges:
changes = append(changes, c)
default:
slices.Sort(changes)
break b
}
}
if !slices.Equal(changes, test.topicDelta) {
t.Error("got:", changes, " expected:", test.topicDelta)
}
})
}
}

View File

@@ -7,33 +7,21 @@ import (
type Reviewers struct { type Reviewers struct {
Prj []string Prj []string
Pkg []string Pkg []string
PrjOptional []string
PkgOptional []string
} }
func ParseReviewers(input []string) *Reviewers { func ParseReviewers(input []string) *Reviewers {
r := &Reviewers{} r := &Reviewers{}
for _, reviewer := range input { for _, reviewer := range input {
pkg := &r.Pkg
prj := &r.Prj
if reviewer[0] == '~' {
pkg = &r.PkgOptional
prj = &r.PrjOptional
reviewer = reviewer[1:]
}
switch reviewer[0] { switch reviewer[0] {
case '*': case '*':
*prj = append(*prj, reviewer[1:]) r.Prj = append(r.Prj, reviewer[1:])
*pkg = append(*pkg, reviewer[1:]) r.Pkg = append(r.Pkg, reviewer[1:])
case '-': case '-':
*prj = append(*prj, reviewer[1:]) r.Prj = append(r.Prj, reviewer[1:])
case '+': case '+':
*pkg = append(*pkg, reviewer[1:]) r.Pkg = append(r.Pkg, reviewer[1:])
default: default:
*pkg = append(*pkg, reviewer) r.Pkg = append(r.Pkg, reviewer)
} }
} }

View File

@@ -12,10 +12,8 @@ func TestReviewers(t *testing.T) {
name string name string
input []string input []string
prj []string prj []string
pkg []string pkg []string
pkg_optional []string
prj_optional []string
}{ }{
{ {
name: "project and package reviewers", name: "project and package reviewers",
@@ -24,15 +22,6 @@ func TestReviewers(t *testing.T) {
prj: []string{"5", "7", common.Bot_BuildReview}, prj: []string{"5", "7", common.Bot_BuildReview},
pkg: []string{"1", "2", "3", "5", "6"}, pkg: []string{"1", "2", "3", "5", "6"},
}, },
{
name: "optional project and package reviewers",
input: []string{"~1", "2", "3", "~*5", "+6", "-7"},
prj: []string{"7", common.Bot_BuildReview},
pkg: []string{"2", "3", "6"},
prj_optional: []string{"5"},
pkg_optional: []string{"1", "5"},
},
} }
for _, test := range tests { for _, test := range tests {
@@ -42,13 +31,7 @@ func TestReviewers(t *testing.T) {
t.Error("unexpected return of ForProject():", reviewers.Prj) t.Error("unexpected return of ForProject():", reviewers.Prj)
} }
if !slices.Equal(reviewers.Pkg, test.pkg) { if !slices.Equal(reviewers.Pkg, test.pkg) {
t.Error("unexpected return of ForPackage():", reviewers.Pkg) t.Error("unexpected return of ForProject():", reviewers.Pkg)
}
if !slices.Equal(reviewers.PrjOptional, test.prj_optional) {
t.Error("unexpected return of ForProjectOptional():", reviewers.Prj)
}
if !slices.Equal(reviewers.PkgOptional, test.pkg_optional) {
t.Error("unexpected return of ForPackageOptional():", reviewers.Pkg)
} }
}) })
} }

View File

@@ -1,9 +1,7 @@
package common package common
import ( import (
"regexp"
"slices" "slices"
"strings"
"src.opensuse.org/autogits/common/gitea-generated/models" "src.opensuse.org/autogits/common/gitea-generated/models"
) )
@@ -11,110 +9,27 @@ import (
type PRReviews struct { type PRReviews struct {
reviews []*models.PullReview reviews []*models.PullReview
reviewers []string reviewers []string
comments []*models.TimelineComment
} }
func FetchGiteaReviews(rf GiteaReviewTimelineFetcher, reviewers []string, org, repo string, no int64) (*PRReviews, error) { func FetchGiteaReviews(rf GiteaReviewFetcher, reviewers []string, org, repo string, no int64) (*PRReviews, error) {
timeline, err := rf.GetTimeline(org, repo, no) reviews, err := rf.GetPullRequestReviews(org, repo, no)
if err != nil { if err != nil {
return nil, err return nil, err
} }
rawReviews, err := rf.GetPullRequestReviews(org, repo, no)
if err != nil {
return nil, err
}
reviews := make([]*models.PullReview, 0, len(reviewers))
var comments []*models.TimelineComment
alreadyHaveUserReview := func(user string) bool {
for _, r := range reviews {
if r.User != nil && r.User.UserName == user {
return true
}
}
return false
}
for idx, item := range timeline {
if item.Type == TimelineCommentType_Review {
for _, r := range rawReviews {
if r.ID == item.ReviewID {
if !alreadyHaveUserReview(r.User.UserName) {
reviews = append(reviews, r)
}
break
}
}
} else if item.Type == TimelineCommentType_Comment {
comments = append(comments, item)
} else if item.Type == TimelineCommentType_PushPull {
LogDebug("cut-off", item.Created)
timeline = timeline[0:idx]
break
} else {
LogDebug("Unhandled timeline type:", item.Type)
}
}
LogDebug("num comments:", len(comments), "reviews:", len(reviews), len(timeline))
return &PRReviews{ return &PRReviews{
reviews: reviews, reviews: reviews,
reviewers: reviewers, reviewers: reviewers,
comments: comments,
}, nil }, nil
} }
const ManualMergeOK = "^merge\\s+ok(\\W|$)"
var merge_ok_regex *regexp.Regexp = regexp.MustCompile(ManualMergeOK)
func bodyCommandManualMergeOK(body string) bool {
lines := SplitLines(body)
for _, line := range lines {
if merge_ok_regex.MatchString(strings.ToLower(line)) {
return true
}
}
return false
}
func (r *PRReviews) IsManualMergeOK() bool {
for _, c := range r.comments {
if c.Updated != c.Created {
continue
}
LogDebug("comment:", c.User.UserName, c.Body)
if slices.Contains(r.reviewers, c.User.UserName) {
if bodyCommandManualMergeOK(c.Body) {
return true
}
}
}
for _, c := range r.reviews {
if c.Updated != c.Submitted {
continue
}
if slices.Contains(r.reviewers, c.User.UserName) {
if bodyCommandManualMergeOK(c.Body) {
return true
}
}
}
return false
}
func (r *PRReviews) IsApproved() bool { func (r *PRReviews) IsApproved() bool {
goodReview := true goodReview := false
for _, reviewer := range r.reviewers { for _, reviewer := range r.reviewers {
goodReview = false goodReview = false
for _, review := range r.reviews { for _, review := range r.reviews {
if review.User.UserName == reviewer && review.State == ReviewStateApproved && !review.Stale && !review.Dismissed { if review.User.UserName == reviewer && review.State == ReviewStateApproved && !review.Stale && !review.Dismissed {
LogDebug(" -- found review: ", review.User.UserName)
goodReview = true goodReview = true
break break
} }

View File

@@ -14,7 +14,6 @@ func TestReviews(t *testing.T) {
tests := []struct { tests := []struct {
name string name string
reviews []*models.PullReview reviews []*models.PullReview
timeline []*models.TimelineComment
reviewers []string reviewers []string
fetchErr error fetchErr error
isApproved bool isApproved bool
@@ -22,21 +21,21 @@ func TestReviews(t *testing.T) {
isPendingByTest1 bool isPendingByTest1 bool
}{ }{
{ {
name: "Reviews of PR with no review requirements", name: "Reviews of unreviews PR",
isApproved: true, isApproved: false,
}, },
{ {
name: "Single reviewer done", name: "Single reviewer done",
reviews: []*models.PullReview{&models.PullReview{State: common.ReviewStateApproved, User: &models.User{UserName: "user1"}}}, reviews: []*models.PullReview{&models.PullReview{State: common.ReviewStateApproved, User: &models.User{UserName: "user1"}}},
reviewers: []string{"user1"}, reviewers: []string{"user1"},
isApproved: true, isApproved: true,
isReviewedByTest1: true, isReviewedByTest1: true,
}, },
{ {
name: "Two reviewer, one not approved", name: "Two reviewer, one not approved",
reviews: []*models.PullReview{&models.PullReview{State: common.ReviewStateApproved, User: &models.User{UserName: "user1"}}}, reviews: []*models.PullReview{&models.PullReview{State: common.ReviewStateApproved, User: &models.User{UserName: "user1"}}},
reviewers: []string{"user1", "user2"}, reviewers: []string{"user1", "user2"},
isApproved: false, isApproved: false,
isReviewedByTest1: true, isReviewedByTest1: true,
}, },
{ {
@@ -45,8 +44,8 @@ func TestReviews(t *testing.T) {
&models.PullReview{State: common.ReviewStateApproved, User: &models.User{UserName: "user1"}}, &models.PullReview{State: common.ReviewStateApproved, User: &models.User{UserName: "user1"}},
&models.PullReview{State: common.ReviewStateApproved, User: &models.User{UserName: "user2"}, Stale: true}, &models.PullReview{State: common.ReviewStateApproved, User: &models.User{UserName: "user2"}, Stale: true},
}, },
reviewers: []string{"user1", "user2"}, reviewers: []string{"user1", "user2"},
isApproved: false, isApproved: false,
isReviewedByTest1: true, isReviewedByTest1: true,
}, },
{ {
@@ -55,8 +54,8 @@ func TestReviews(t *testing.T) {
&models.PullReview{State: common.ReviewStateRequestReview, User: &models.User{UserName: "user1"}}, &models.PullReview{State: common.ReviewStateRequestReview, User: &models.User{UserName: "user1"}},
&models.PullReview{State: common.ReviewStateApproved, User: &models.User{UserName: "user2"}}, &models.PullReview{State: common.ReviewStateApproved, User: &models.User{UserName: "user2"}},
}, },
reviewers: []string{"user1", "user2"}, reviewers: []string{"user1", "user2"},
isApproved: false, isApproved: false,
isPendingByTest1: true, isPendingByTest1: true,
}, },
{ {
@@ -64,9 +63,9 @@ func TestReviews(t *testing.T) {
reviews: []*models.PullReview{ reviews: []*models.PullReview{
&models.PullReview{State: common.ReviewStateRequestReview, User: &models.User{UserName: "user1"}, Stale: true}, &models.PullReview{State: common.ReviewStateRequestReview, User: &models.User{UserName: "user1"}, Stale: true},
}, },
reviewers: []string{"user1", "user2"}, reviewers: []string{"user1", "user2"},
isApproved: false, isApproved: false,
isPendingByTest1: false, isPendingByTest1: false,
isReviewedByTest1: false, isReviewedByTest1: false,
}, },
{ {
@@ -75,8 +74,8 @@ func TestReviews(t *testing.T) {
&models.PullReview{State: common.ReviewStateApproved, User: &models.User{UserName: "user1"}}, &models.PullReview{State: common.ReviewStateApproved, User: &models.User{UserName: "user1"}},
&models.PullReview{State: common.ReviewStateApproved, User: &models.User{UserName: "user2"}}, &models.PullReview{State: common.ReviewStateApproved, User: &models.User{UserName: "user2"}},
}, },
reviewers: []string{"user1", "user2"}, reviewers: []string{"user1", "user2"},
isApproved: true, isApproved: true,
isReviewedByTest1: true, isReviewedByTest1: true,
}, },
{ {
@@ -85,8 +84,8 @@ func TestReviews(t *testing.T) {
&models.PullReview{State: common.ReviewStateApproved, User: &models.User{UserName: "user1"}}, &models.PullReview{State: common.ReviewStateApproved, User: &models.User{UserName: "user1"}},
&models.PullReview{State: common.ReviewStateApproved, User: &models.User{UserName: "user2"}, Dismissed: true}, &models.PullReview{State: common.ReviewStateApproved, User: &models.User{UserName: "user2"}, Dismissed: true},
}, },
reviewers: []string{"user1", "user2"}, reviewers: []string{"user1", "user2"},
isApproved: false, isApproved: false,
isReviewedByTest1: true, isReviewedByTest1: true,
}, },
{ {
@@ -95,9 +94,9 @@ func TestReviews(t *testing.T) {
&models.PullReview{State: common.ReviewStateApproved, User: &models.User{UserName: "user1"}}, &models.PullReview{State: common.ReviewStateApproved, User: &models.User{UserName: "user1"}},
&models.PullReview{State: common.ReviewStateApproved, User: &models.User{UserName: "user2"}}, &models.PullReview{State: common.ReviewStateApproved, User: &models.User{UserName: "user2"}},
}, },
reviewers: []string{"user1", "user2"}, reviewers: []string{"user1", "user2"},
fetchErr: errors.New("System error fetching reviews."), fetchErr: errors.New("System error fetching reviews."),
isApproved: true, isApproved: true,
isReviewedByTest1: true, isReviewedByTest1: true,
}, },
{ {
@@ -107,23 +106,8 @@ func TestReviews(t *testing.T) {
&models.PullReview{State: common.ReviewStateApproved, User: &models.User{UserName: "user4"}}, &models.PullReview{State: common.ReviewStateApproved, User: &models.User{UserName: "user4"}},
&models.PullReview{State: common.ReviewStateApproved, User: &models.User{UserName: "user2"}}, &models.PullReview{State: common.ReviewStateApproved, User: &models.User{UserName: "user2"}},
}, },
reviewers: []string{"user1", "user2"}, reviewers: []string{"user1", "user2"},
isApproved: true, isApproved: true,
isReviewedByTest1: true,
},
{
name: "Review ignored before push",
reviews: []*models.PullReview{
&models.PullReview{State: common.ReviewStateApproved, User: &models.User{UserName: "user1"}, ID: 1001},
&models.PullReview{State: common.ReviewStateApproved, User: &models.User{UserName: "user2"}, ID: 1000},
},
timeline: []*models.TimelineComment{
&models.TimelineComment{Type: common.TimelineCommentType_Review, ReviewID: 1001},
&models.TimelineComment{Type: common.TimelineCommentType_PushPull},
&models.TimelineComment{Type: common.TimelineCommentType_Review, ReviewID: 1000},
},
reviewers: []string{"user1", "user2"},
isApproved: false,
isReviewedByTest1: true, isReviewedByTest1: true,
}, },
} }
@@ -131,12 +115,8 @@ func TestReviews(t *testing.T) {
for _, test := range tests { for _, test := range tests {
t.Run(test.name, func(t *testing.T) { t.Run(test.name, func(t *testing.T) {
ctl := gomock.NewController(t) ctl := gomock.NewController(t)
rf := mock_common.NewMockGiteaReviewTimelineFetcher(ctl) rf := mock_common.NewMockGiteaReviewFetcher(ctl)
if test.timeline == nil {
test.timeline = reviewsToTimeline(test.reviews)
}
rf.EXPECT().GetTimeline("test", "pr", int64(1)).Return(test.timeline, nil)
rf.EXPECT().GetPullRequestReviews("test", "pr", int64(1)).Return(test.reviews, test.fetchErr) rf.EXPECT().GetPullRequestReviews("test", "pr", int64(1)).Return(test.reviews, test.fetchErr)
reviews, err := common.FetchGiteaReviews(rf, test.reviewers, "test", "pr", 1) reviews, err := common.FetchGiteaReviews(rf, test.reviewers, "test", "pr", 1)

View File

@@ -113,10 +113,6 @@ func (s *Submodule) parseKeyValue(line string) error {
return nil return nil
} }
func (s *Submodule) ManifestSubmodulePath(manifest *Manifest) string {
return manifest.SubdirForPackage(s.Path)
}
func ParseSubmodulesFile(reader io.Reader) ([]Submodule, error) { func ParseSubmodulesFile(reader io.Reader) ([]Submodule, error) {
data, err := io.ReadAll(reader) data, err := io.ReadAll(reader)
if err != nil { if err != nil {

View File

@@ -1,63 +0,0 @@
package common
import (
"encoding/json"
"slices"
"src.opensuse.org/autogits/common/gitea-generated/models"
)
const (
TimelineCommentType_ReviewRequested = "review_request"
TimelineCommentType_Review = "review"
TimelineCommentType_PushPull = "pull_push"
TimelineCommentType_PullRequestRef = "pull_ref"
TimelineCommentType_DismissReview = "dismiss_review"
TimelineCommentType_Comment = "comment"
)
func FetchTimelineSinceLastPush(gitea GiteaTimelineFetcher, headSha, org, repo string, id int64) ([]*models.TimelineComment, error) {
timeline, err := gitea.GetTimeline(org, repo, id)
if err != nil {
return nil, err
}
//{"is_force_push":true,"commit_ids":["36e43509be1b13a1a8fc63a4361405de04cc621ab16935f88968c46193221bb6","732246a48fbc6bac9df16c0b0ca23ce0f6fbabd9990795863b6d1f0ef3f242c8"]}
type PullPushData struct {
IsForcePush bool `json:"is_force_push"`
CommitIds []string `json:"commit_ids"`
}
// trim timeline to last push update or last time review request was requested
for i, e := range timeline {
if e.Type == TimelineCommentType_PushPull {
var push PullPushData
if err := json.Unmarshal([]byte(e.Body), &push); err != nil {
LogError(err)
}
if slices.Contains(push.CommitIds, headSha) {
return timeline[0:i], nil
}
}
}
return timeline, nil
}
func FetchTimelineSinceReviewRequestOrPush(gitea GiteaTimelineFetcher, groupName, headSha, org, repo string, id int64) ([]*models.TimelineComment, error) {
timeline, err := FetchTimelineSinceLastPush(gitea, headSha, org, repo, id)
if err != nil {
return nil, err
}
// trim timeline to last push update or last time review request was requested
for i, e := range timeline {
if e.Type == TimelineCommentType_ReviewRequested && e.Assignee != nil && e.Assignee.UserName == groupName {
// review request is cut-off for reviews too
return timeline[0:i], nil
}
}
return timeline, nil
}

View File

@@ -19,16 +19,11 @@ package common
*/ */
import ( import (
"bufio"
"errors"
"fmt" "fmt"
"net/http"
"net/url" "net/url"
"regexp" "regexp"
"slices" "slices"
"strings" "strings"
"src.opensuse.org/autogits/common/gitea-generated/models"
) )
func SplitLines(str string) []string { func SplitLines(str string) []string {
@@ -89,11 +84,6 @@ var valid_schemas []string = []string{"https", "ssh", "http", "file"}
func ParseGitRemoteUrl(urlString string) (*GitUrl, error) { func ParseGitRemoteUrl(urlString string) (*GitUrl, error) {
url, err := url.Parse(urlString) url, err := url.Parse(urlString)
if url != nil && url.Scheme == "file" && err == nil {
return nil, nil
}
if err != nil || !slices.Contains(valid_schemas, url.Scheme) { if err != nil || !slices.Contains(valid_schemas, url.Scheme) {
u, err := TranslateSshNativeToUrl(urlString) u, err := TranslateSshNativeToUrl(urlString)
if err != nil { if err != nil {
@@ -108,7 +98,10 @@ func ParseGitRemoteUrl(urlString string) (*GitUrl, error) {
} }
org := e[0] org := e[0]
repo := strings.TrimSuffix(e[1], ".git") repo := e[1]
if len(repo) > 4 && repo[len(repo)-4:] == ".git" {
repo = repo[0 : len(repo)-4]
}
u := GitUrl{ u := GitUrl{
Org: org, Org: org,
@@ -126,51 +119,3 @@ func (giturl *GitUrl) RemoteName() string {
return strings.ToLower(giturl.Org) + "_" + strings.ToLower(giturl.Repo) return strings.ToLower(giturl.Org) + "_" + strings.ToLower(giturl.Repo)
} }
func PRtoString(pr *models.PullRequest) string {
if pr == nil {
return "(null)"
}
return fmt.Sprintf("%s/%s!%d", pr.Base.Repo.Owner.UserName, pr.Base.Repo.Name, pr.Index)
}
type DevelProject struct {
Project, Package string
}
type DevelProjects []*DevelProject
func FetchDevelProjects() (DevelProjects, error) {
res, err := http.Get("https://src.opensuse.org/openSUSE/Factory/raw/branch/main/pkgs/_meta/devel_packages")
if err != nil {
return nil, err
}
defer res.Body.Close()
scanner := bufio.NewScanner(res.Body)
ret := []*DevelProject{}
for scanner.Scan() {
d := SplitStringNoEmpty(scanner.Text(), " ")
if len(d) == 2 {
ret = append(ret, &DevelProject{
Project: d[1],
Package: d[0],
})
}
}
return ret, nil
}
var DevelProjectNotFound = errors.New("Devel project not found")
func (d DevelProjects) GetDevelProject(pkg string) (string, error) {
for _, item := range d {
if item.Package == pkg {
return item.Project, nil
}
}
return "", DevelProjectNotFound
}

View File

@@ -1,8 +0,0 @@
all: ../workflow-direct/workflow-direct
cp ../workflow-direct/workflow-direct workflow-direct
podman build --pull=always -t workflow-direct workflow-direct
pr:
cp ../workflow-pr/workflow-pr workflow-pr
podman build --pull=always -t workflow-pr workflow-pr

View File

@@ -1 +0,0 @@
workflow-direct

View File

@@ -1,14 +0,0 @@
FROM registry.suse.com/bci/bci-base
RUN zypper install -y openssh-clients git-core
RUN mkdir /root/.ssh
RUN mkdir /repos
RUN ln -s /data/workflow-direct.key /root/.ssh/id_ed25519
RUN ln -s /data/workflow-direct.key.pub /root/.ssh/id_ed25519.pub
ADD known_hosts /root/.ssh/known_hosts
ADD workflow-direct /srv/workflow-direct
ENV AMQP_USERNAME=opensuse
ENV AMQP_PASSWORD=opensuse
VOLUME /data
VOLUME /repos
ENTRYPOINT /srv/workflow-direct -config /data/config.json -repo-path /repos -debug -check-on-start

View File

@@ -1,4 +0,0 @@
src.opensuse.org,195.135.223.224 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBDJ8V51MVIFUkQqQOdHwC3SP9NPqp1ZWYoEbcjvZ7HhSFi2XF8ALo/h1Mk+q8kT2O75/goeTsKFbcU8zrYFeOh0=
src.opensuse.org,195.135.223.224 ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCkVeXePin0haffC085V2L0jvILfwbB2Mt1fpVe21QAOcWNM+/jOC5RwtWweV/LigHImB39/KvkuPa9yLoDf+eLhdZQckSSauRfDjxtlKeFLPrfJKSA0XeVJT3kJcOvDT/3ANFhYeBbAUBTAeQt5bi2hHC1twMPbaaEdJ2jiMaIBztFf6aE9K58uoS+7Y2tTv87Mv/7lqoBW6BFMoDmjQFWgjik6ZMCvIM/7bj7AgqHk/rjmr5zKS4ag5wtHtYLm1L3LBmHdj7d0VFsOpPQexIOEnnjzKqlwmAxT6eYJ/t3qgBlT8KRfshBFgEuUZ5GJOC7TOne4PfB0bboPMZzIRo3WE9dPGRR8kAIme8XqhFbmjdJ+WsTjg0Lj+415tIbyRQoNkLtawrJxozvevs6wFEFcA/YG6o03Z577tiLT3WxOguCcD5vrALH48SyZb8jDUtcVgTWMW0to/n63S8JGUNyF7Bkw9HQWUx+GO1cv2GNzKpk22KS5dlNUVGE9E/7Ydc=
src.opensuse.org,195.135.223.224 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIFKNThLRPznU5Io1KrAYHmYpaoLQEMGM9nwpKyYQCkPx

View File

@@ -1 +0,0 @@
workflow-pr

View File

@@ -1,14 +0,0 @@
FROM registry.suse.com/bci/bci-base
RUN zypper install -y openssh-clients git-core
RUN mkdir /root/.ssh
RUN mkdir /repos
RUN ln -s /data/workflow-pr.key /root/.ssh/id_ed25519
RUN ln -s /data/workflow-pr.key.pub /root/.ssh/id_ed25519.pub
ADD known_hosts /root/.ssh/known_hosts
ADD workflow-pr /srv/workflow-pr
ENV AMQP_USERNAME=opensuse
ENV AMQP_PASSWORD=opensuse
VOLUME /data
VOLUME /repos
ENTRYPOINT /srv/workflow-pr -config /data/config.json -repo-path /repos -debug -check-on-start

View File

@@ -1,4 +0,0 @@
src.opensuse.org,195.135.223.224 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBDJ8V51MVIFUkQqQOdHwC3SP9NPqp1ZWYoEbcjvZ7HhSFi2XF8ALo/h1Mk+q8kT2O75/goeTsKFbcU8zrYFeOh0=
src.opensuse.org,195.135.223.224 ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCkVeXePin0haffC085V2L0jvILfwbB2Mt1fpVe21QAOcWNM+/jOC5RwtWweV/LigHImB39/KvkuPa9yLoDf+eLhdZQckSSauRfDjxtlKeFLPrfJKSA0XeVJT3kJcOvDT/3ANFhYeBbAUBTAeQt5bi2hHC1twMPbaaEdJ2jiMaIBztFf6aE9K58uoS+7Y2tTv87Mv/7lqoBW6BFMoDmjQFWgjik6ZMCvIM/7bj7AgqHk/rjmr5zKS4ag5wtHtYLm1L3LBmHdj7d0VFsOpPQexIOEnnjzKqlwmAxT6eYJ/t3qgBlT8KRfshBFgEuUZ5GJOC7TOne4PfB0bboPMZzIRo3WE9dPGRR8kAIme8XqhFbmjdJ+WsTjg0Lj+415tIbyRQoNkLtawrJxozvevs6wFEFcA/YG6o03Z577tiLT3WxOguCcD5vrALH48SyZb8jDUtcVgTWMW0to/n63S8JGUNyF7Bkw9HQWUx+GO1cv2GNzKpk22KS5dlNUVGE9E/7Ydc=
src.opensuse.org,195.135.223.224 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIFKNThLRPznU5Io1KrAYHmYpaoLQEMGM9nwpKyYQCkPx

Some files were not shown because too many files have changed in this diff Show More