diff --git a/cli/exec/exec.go b/cli/exec/exec.go index babdb50b6..66273d3bc 100644 --- a/cli/exec/exec.go +++ b/cli/exec/exec.go @@ -240,10 +240,10 @@ func metadataFromContext(c *cli.Context, axis matrix.Axis) frontend.Metadata { return frontend.Metadata{ Repo: frontend.Repo{ - Name: c.String("repo-name"), - Link: c.String("repo-link"), - Remote: c.String("repo-remote-url"), - Private: c.Bool("repo-private"), + Name: c.String("repo-name"), + Link: c.String("repo-link"), + CloneURL: c.String("repo-clone-url"), + Private: c.Bool("repo-private"), }, Curr: frontend.Pipeline{ Number: c.Int64("pipeline-number"), diff --git a/cli/exec/flags.go b/cli/exec/flags.go index 51caca266..0d68e0fc8 100644 --- a/cli/exec/flags.go +++ b/cli/exec/flags.go @@ -123,8 +123,8 @@ var flags = []cli.Flag{ Name: "repo-link", }, &cli.StringFlag{ - EnvVars: []string{"CI_REPO_REMOTE"}, - Name: "repo-remote-url", + EnvVars: []string{"CI_REPO_CLONE_URL", "CI_REPO_REMOTE"}, + Name: "repo-clone-url", }, &cli.StringFlag{ EnvVars: []string{"CI_REPO_PRIVATE"}, diff --git a/cli/repo/repo_info.go b/cli/repo/repo_info.go index 961912a0c..a3fa7de5f 100644 --- a/cli/repo/repo_info.go +++ b/cli/repo/repo_info.go @@ -53,5 +53,5 @@ Visibility: {{ .Visibility }} Private: {{ .IsSCMPrivate }} Trusted: {{ .IsTrusted }} Gated: {{ .IsGated }} -Remote: {{ .Clone }} +Forge: {{ .Clone }} ` diff --git a/cmd/server/flags.go b/cmd/server/flags.go index c94b324e8..7b951af81 100644 --- a/cmd/server/flags.go +++ b/cmd/server/flags.go @@ -521,7 +521,7 @@ var flags = []cli.Flag{ &cli.BoolFlag{ EnvVars: []string{"WOODPECKER_FLAT_PERMISSIONS"}, Name: "flat-permissions", - Usage: "no remote call for permissions should be made", + Usage: "no forge call for permissions should be made", Hidden: true, // TODO(485) temporary workaround to not hit api rate limits }, diff --git a/cmd/server/server.go b/cmd/server/server.go index ffb566d2e..724165156 100644 --- a/cmd/server/server.go +++ b/cmd/server/server.go @@ -39,12 +39,12 @@ import ( "github.com/woodpecker-ci/woodpecker/pipeline/rpc/proto" "github.com/woodpecker-ci/woodpecker/server" "github.com/woodpecker-ci/woodpecker/server/cron" + "github.com/woodpecker-ci/woodpecker/server/forge" woodpeckerGrpcServer "github.com/woodpecker-ci/woodpecker/server/grpc" "github.com/woodpecker-ci/woodpecker/server/logging" "github.com/woodpecker-ci/woodpecker/server/model" "github.com/woodpecker-ci/woodpecker/server/plugins/config" "github.com/woodpecker-ci/woodpecker/server/pubsub" - "github.com/woodpecker-ci/woodpecker/server/remote" "github.com/woodpecker-ci/woodpecker/server/router" "github.com/woodpecker-ci/woodpecker/server/router/middleware" "github.com/woodpecker-ci/woodpecker/server/store" @@ -101,7 +101,7 @@ func run(c *cli.Context) error { ) } - _remote, err := setupRemote(c) + _forge, err := setupForge(c) if err != nil { log.Fatal().Err(err).Msg("") } @@ -116,14 +116,14 @@ func run(c *cli.Context) error { } }() - setupEvilGlobals(c, _store, _remote) + setupEvilGlobals(c, _store, _forge) var g errgroup.Group setupMetrics(&g, _store) g.Go(func() error { - return cron.Start(c.Context, _store, _remote) + return cron.Start(c.Context, _store, _forge) }) // start the grpc server @@ -144,7 +144,7 @@ func run(c *cli.Context) error { }), ) woodpeckerServer := woodpeckerGrpcServer.NewWoodpeckerServer( - _remote, + _forge, server.Config.Services.Queue, server.Config.Services.Logs, server.Config.Services.Pubsub, @@ -253,12 +253,12 @@ func run(c *cli.Context) error { return g.Wait() } -func setupEvilGlobals(c *cli.Context, v store.Store, r remote.Remote) { +func setupEvilGlobals(c *cli.Context, v store.Store, f forge.Forge) { // storage server.Config.Storage.Files = v - // remote - server.Config.Services.Remote = r + // forge + server.Config.Services.Forge = f // services server.Config.Services.Queue = setupQueue(c, v) @@ -270,7 +270,7 @@ func setupEvilGlobals(c *cli.Context, v store.Store, r remote.Remote) { server.Config.Services.Registries = setupRegistryService(c, v) server.Config.Services.Secrets = setupSecretService(c, v) server.Config.Services.Environ = setupEnvironService(c, v) - server.Config.Services.Membership = setupMembershipService(c, r) + server.Config.Services.Membership = setupMembershipService(c, f) server.Config.Services.SignaturePrivateKey, server.Config.Services.SignaturePublicKey = setupSignatureKeys(v) diff --git a/cmd/server/setup.go b/cmd/server/setup.go index 4a01ef05d..ae2ecda79 100644 --- a/cmd/server/setup.go +++ b/cmd/server/setup.go @@ -36,19 +36,19 @@ import ( "github.com/woodpecker-ci/woodpecker/server" "github.com/woodpecker-ci/woodpecker/server/cache" + "github.com/woodpecker-ci/woodpecker/server/forge" + "github.com/woodpecker-ci/woodpecker/server/forge/bitbucket" + "github.com/woodpecker-ci/woodpecker/server/forge/bitbucketserver" + "github.com/woodpecker-ci/woodpecker/server/forge/coding" + "github.com/woodpecker-ci/woodpecker/server/forge/gitea" + "github.com/woodpecker-ci/woodpecker/server/forge/github" + "github.com/woodpecker-ci/woodpecker/server/forge/gitlab" + "github.com/woodpecker-ci/woodpecker/server/forge/gogs" "github.com/woodpecker-ci/woodpecker/server/model" "github.com/woodpecker-ci/woodpecker/server/plugins/environments" "github.com/woodpecker-ci/woodpecker/server/plugins/registry" "github.com/woodpecker-ci/woodpecker/server/plugins/secrets" "github.com/woodpecker-ci/woodpecker/server/queue" - "github.com/woodpecker-ci/woodpecker/server/remote" - "github.com/woodpecker-ci/woodpecker/server/remote/bitbucket" - "github.com/woodpecker-ci/woodpecker/server/remote/bitbucketserver" - "github.com/woodpecker-ci/woodpecker/server/remote/coding" - "github.com/woodpecker-ci/woodpecker/server/remote/gitea" - "github.com/woodpecker-ci/woodpecker/server/remote/github" - "github.com/woodpecker-ci/woodpecker/server/remote/gitlab" - "github.com/woodpecker-ci/woodpecker/server/remote/gogs" "github.com/woodpecker-ci/woodpecker/server/store" "github.com/woodpecker-ci/woodpecker/server/store/datastore" "github.com/woodpecker-ci/woodpecker/server/store/types" @@ -182,12 +182,12 @@ func setupEnvironService(c *cli.Context, s store.Store) model.EnvironService { return environments.Parse(c.StringSlice("environment")) } -func setupMembershipService(_ *cli.Context, r remote.Remote) cache.MembershipService { +func setupMembershipService(_ *cli.Context, r forge.Forge) cache.MembershipService { return cache.NewMembershipService(r) } -// setupRemote helper function to setup the remote from the CLI arguments. -func setupRemote(c *cli.Context) (remote.Remote, error) { +// setupForge helper function to setup the forge from the CLI arguments. +func setupForge(c *cli.Context) (forge.Forge, error) { switch { case c.Bool("github"): return setupGithub(c) @@ -208,18 +208,18 @@ func setupRemote(c *cli.Context) (remote.Remote, error) { } } -// helper function to setup the Bitbucket remote from the CLI arguments. -func setupBitbucket(c *cli.Context) (remote.Remote, error) { +// helper function to setup the Bitbucket forge from the CLI arguments. +func setupBitbucket(c *cli.Context) (forge.Forge, error) { opts := &bitbucket.Opts{ Client: c.String("bitbucket-client"), Secret: c.String("bitbucket-secret"), } - log.Trace().Msgf("Remote (bitbucket) opts: %#v", opts) + log.Trace().Msgf("Forge (bitbucket) opts: %#v", opts) return bitbucket.New(opts) } -// helper function to setup the Gogs remote from the CLI arguments. -func setupGogs(c *cli.Context) (remote.Remote, error) { +// helper function to setup the Gogs forge from the CLI arguments. +func setupGogs(c *cli.Context) (forge.Forge, error) { opts := gogs.Opts{ URL: c.String("gogs-server"), Username: c.String("gogs-git-username"), @@ -227,12 +227,12 @@ func setupGogs(c *cli.Context) (remote.Remote, error) { PrivateMode: c.Bool("gogs-private-mode"), SkipVerify: c.Bool("gogs-skip-verify"), } - log.Trace().Msgf("Remote (gogs) opts: %#v", opts) + log.Trace().Msgf("Forge (gogs) opts: %#v", opts) return gogs.New(opts) } -// helper function to setup the Gitea remote from the CLI arguments. -func setupGitea(c *cli.Context) (remote.Remote, error) { +// helper function to setup the Gitea forge from the CLI arguments. +func setupGitea(c *cli.Context) (forge.Forge, error) { server, err := url.Parse(c.String("gitea-server")) if err != nil { return nil, err @@ -246,12 +246,12 @@ func setupGitea(c *cli.Context) (remote.Remote, error) { if len(opts.URL) == 0 { log.Fatal().Msg("WOODPECKER_GITEA_URL must be set") } - log.Trace().Msgf("Remote (gitea) opts: %#v", opts) + log.Trace().Msgf("Forge (gitea) opts: %#v", opts) return gitea.New(opts) } -// helper function to setup the Stash remote from the CLI arguments. -func setupStash(c *cli.Context) (remote.Remote, error) { +// helper function to setup the Stash forge from the CLI arguments. +func setupStash(c *cli.Context) (forge.Forge, error) { opts := bitbucketserver.Opts{ URL: c.String("stash-server"), Username: c.String("stash-git-username"), @@ -261,12 +261,12 @@ func setupStash(c *cli.Context) (remote.Remote, error) { ConsumerRSAString: c.String("stash-consumer-rsa-string"), SkipVerify: c.Bool("stash-skip-verify"), } - log.Trace().Msgf("Remote (bitbucketserver) opts: %#v", opts) + log.Trace().Msgf("Forge (bitbucketserver) opts: %#v", opts) return bitbucketserver.New(opts) } -// helper function to setup the Gitlab remote from the CLI arguments. -func setupGitlab(c *cli.Context) (remote.Remote, error) { +// helper function to setup the Gitlab forge from the CLI arguments. +func setupGitlab(c *cli.Context) (forge.Forge, error) { return gitlab.New(gitlab.Opts{ URL: c.String("gitlab-server"), ClientID: c.String("gitlab-client"), @@ -275,8 +275,8 @@ func setupGitlab(c *cli.Context) (remote.Remote, error) { }) } -// helper function to setup the GitHub remote from the CLI arguments. -func setupGithub(c *cli.Context) (remote.Remote, error) { +// helper function to setup the GitHub forge from the CLI arguments. +func setupGithub(c *cli.Context) (forge.Forge, error) { opts := github.Opts{ URL: c.String("github-server"), Client: c.String("github-client"), @@ -284,12 +284,12 @@ func setupGithub(c *cli.Context) (remote.Remote, error) { SkipVerify: c.Bool("github-skip-verify"), MergeRef: c.Bool("github-merge-ref"), } - log.Trace().Msgf("Remote (github) opts: %#v", opts) + log.Trace().Msgf("Forge (github) opts: %#v", opts) return github.New(opts) } -// helper function to setup the Coding remote from the CLI arguments. -func setupCoding(c *cli.Context) (remote.Remote, error) { +// helper function to setup the Coding forge from the CLI arguments. +func setupCoding(c *cli.Context) (forge.Forge, error) { opts := coding.Opts{ URL: c.String("coding-server"), Client: c.String("coding-client"), @@ -299,7 +299,7 @@ func setupCoding(c *cli.Context) (remote.Remote, error) { Password: c.String("coding-git-password"), SkipVerify: c.Bool("coding-skip-verify"), } - log.Trace().Msgf("Remote (coding) opts: %#v", opts) + log.Trace().Msgf("Forge (coding) opts: %#v", opts) return coding.New(opts) } diff --git a/docs/docs/20-usage/25-multi-pipeline.md b/docs/docs/20-usage/25-multi-pipeline.md index 539b92f7a..897b75e4c 100644 --- a/docs/docs/20-usage/25-multi-pipeline.md +++ b/docs/docs/20-usage/25-multi-pipeline.md @@ -10,7 +10,7 @@ The Multi-Pipeline feature allows the pipeline to be split into several files an ## Rational -- faster lint/test feedback, the pipeline doesn't have to run fully to have a lint status pushed to the remote +- faster lint/test feedback, the pipeline doesn't have to run fully to have a lint status pushed to the forge - better organization of the pipeline along various concerns: testing, linting, feature apps - utilizing more agents to speed up build diff --git a/docs/docs/20-usage/50-environment.md b/docs/docs/20-usage/50-environment.md index f51a4297b..ee5448bf4 100644 --- a/docs/docs/20-usage/50-environment.md +++ b/docs/docs/20-usage/50-environment.md @@ -55,7 +55,7 @@ This is the reference list of all environment variables available to your pipeli | `CI_REPO_NAME` | repository name | | `CI_REPO_SCM` | repository SCM (git) | | `CI_REPO_LINK` | repository link | -| `CI_REPO_REMOTE` | repository clone URL | +| `CI_REPO_CLONE_URL` | repository clone URL | | `CI_REPO_DEFAULT_BRANCH` | repository default branch (master) | | `CI_REPO_PRIVATE` | repository is private | | `CI_REPO_TRUSTED` | repository is trusted | @@ -68,7 +68,7 @@ This is the reference list of all environment variables available to your pipeli | `CI_COMMIT_TARGET_BRANCH` | commit target branch | | `CI_COMMIT_TAG` | commit tag name (empty if event is not `tag`) | | `CI_COMMIT_PULL_REQUEST` | commit pull request number (empty if event is not `pull_request`) | -| `CI_COMMIT_LINK` | commit link in remote | +| `CI_COMMIT_LINK` | commit link in forge | | `CI_COMMIT_MESSAGE` | commit message | | `CI_COMMIT_AUTHOR` | commit author username | | `CI_COMMIT_AUTHOR_EMAIL` | commit author email address | @@ -95,7 +95,7 @@ This is the reference list of all environment variables available to your pipeli | `CI_PREV_COMMIT_BRANCH` | previous commit branch | | `CI_PREV_COMMIT_SOURCE_BRANCH` | previous commit source branch | | `CI_PREV_COMMIT_TARGET_BRANCH` | previous commit target branch | -| `CI_PREV_COMMIT_LINK` | previous commit link in remote | +| `CI_PREV_COMMIT_LINK` | previous commit link in forge | | `CI_PREV_COMMIT_MESSAGE` | previous commit message | | `CI_PREV_COMMIT_AUTHOR` | previous commit author username | | `CI_PREV_COMMIT_AUTHOR_EMAIL` | previous commit author email address | diff --git a/docs/docs/30-administration/100-external-configuration-api.md b/docs/docs/30-administration/100-external-configuration-api.md index 4d249e34c..15250bcfb 100644 --- a/docs/docs/30-administration/100-external-configuration-api.md +++ b/docs/docs/30-administration/100-external-configuration-api.md @@ -69,7 +69,7 @@ WOODPECKER_CONFIG_SERVICE_ENDPOINT=https://example.com/ciconfig "parent": 0, "ref": "refs/heads/master", "refspec": "", - "remote": "", + "clone_url": "", "reviewed_at": 0, "reviewed_by": "", "sender": "myUser", diff --git a/docs/docs/91-migrations.md b/docs/docs/91-migrations.md index 3bd0af8b0..9dc146cd4 100644 --- a/docs/docs/91-migrations.md +++ b/docs/docs/91-migrations.md @@ -9,6 +9,7 @@ Some versions need some changes to the server configuration or the pipeline conf - Renamed step environment variable `CI_SYSTEM_ARCH` to `CI_SYSTEM_PLATFORM`. Same applies for the cli exec variable. - Renamed environment variables `CI_BUILD_*` and `CI_PREV_BUILD_*` to `CI_PIPELINE_*` and `CI_PREV_PIPELINE_*`, old ones are still available but deprecated - Renamed environment variables `CI_JOB_*` to `CI_STEP_*`, old ones are still available but deprecated +- Renamed environment variable `CI_REPO_REMOTE` to `CI_REPO_CLONE_URL` - Renamed API endpoints for pipelines (`//builds/` -> `//pipelines/`), old ones are still available but deprecated - Updated Prometheus gauge `build_*` to `pipeline_*` - Updated Prometheus gauge `*_job_*` to `*_step_*` diff --git a/docs/docs/92-development/05-architecture.md b/docs/docs/92-development/05-architecture.md index 36fd44ddb..d0093e24a 100644 --- a/docs/docs/92-development/05-architecture.md +++ b/docs/docs/92-development/05-architecture.md @@ -19,23 +19,23 @@ ### Server -| package | meaning | imports -|---------------------|-------------------------------------------------|---------- -| `server/api/**` | handle web requests from `server/router` | `pipeline`, `../badges`, `../ccmenue`, `../logging`, `../model`, `../pubsub`, `../queue`, `../remote`, `../shared`, `../store`, `shared`, (TODO: mv `server/router/middleware/session`) -| `server/badges/**` | generate svg badges for pipelines | `../model` -| `server/ccmenu/**` | generate xml ccmenu for pipelines | `../model` -| `server/grpc/**` | gRPC server agents can connect to | `pipeline/rpc/**`, `../logging`, `../model`, `../pubsub`, `../queue`, `../remote`, `../pipeline`, `../store` -| `server/logging/**` | logging lib for gPRC server to stream logs while running | std -| `server/model/**` | structs for store (db) and api (json) | std -| `server/plugins/**` | plugins for server | `../model`, `../remote` -| `server/pipeline/**`| orchestrate pipelines | `pipeline`, `../model`, `../pubsub`, `../queue`, `../remote`, `../store`, `../plugins` -| `server/pubsub/**` | pubsub lib for server to push changes to the WebUI | std -| `server/queue/**` | queue lib for server where agents pull new pipelines from via gRPC | `server/model` -| `server/remote/**` | remote lib for server to connect and handle forge specific stuff | `shared`, `server/model` -| `server/router/**` | handle requests to REST API (and all middleware) and serve UI and WebUI config | `shared`, `../api`, `../model`, `../remote`, `../store`, `../web` -| `server/store/**` | handle database | `server/model` -| `server/shared/**` | TODO: move and split [#974](https://github.com/woodpecker-ci/woodpecker/issues/974) | -| `server/web/**` | server SPA | +| package | meaning | imports +|----------------------|-------------------------------------------------------------------------------------|---------- +| `server/api/**` | handle web requests from `server/router` | `pipeline`, `../badges`, `../ccmenue`, `../logging`, `../model`, `../pubsub`, `../queue`, `../forge`, `../shared`, `../store`, `shared`, (TODO: mv `server/router/middleware/session`) +| `server/badges/**` | generate svg badges for pipelines | `../model` +| `server/ccmenu/**` | generate xml ccmenu for pipelines | `../model` +| `server/grpc/**` | gRPC server agents can connect to | `pipeline/rpc/**`, `../logging`, `../model`, `../pubsub`, `../queue`, `../forge`, `../pipeline`, `../store` +| `server/logging/**` | logging lib for gPRC server to stream logs while running | std +| `server/model/**` | structs for store (db) and api (json) | std +| `server/plugins/**` | plugins for server | `../model`, `../forge` +| `server/pipeline/**` | orchestrate pipelines | `pipeline`, `../model`, `../pubsub`, `../queue`, `../forge`, `../store`, `../plugins` +| `server/pubsub/**` | pubsub lib for server to push changes to the WebUI | std +| `server/queue/**` | queue lib for server where agents pull new pipelines from via gRPC | `server/model` +| `server/forge/**` | forge lib for server to connect and handle forge specific stuff | `shared`, `server/model` +| `server/router/**` | handle requests to REST API (and all middleware) and serve UI and WebUI config | `shared`, `../api`, `../model`, `../forge`, `../store`, `../web` +| `server/store/**` | handle database | `server/model` +| `server/shared/**` | TODO: move and split [#974](https://github.com/woodpecker-ci/woodpecker/issues/974) | +| `server/web/**` | server SPA | * `../` = `server/` diff --git a/pipeline/frontend/drone_compatibility.go b/pipeline/frontend/drone_compatibility.go index cd5956868..0b8b00cb4 100644 --- a/pipeline/frontend/drone_compatibility.go +++ b/pipeline/frontend/drone_compatibility.go @@ -51,8 +51,8 @@ func (m *Metadata) setDroneEnviron(env map[string]string) { env["DRONE_REPO_BRANCH"] = env["CI_REPO_DEFAULT_BRANCH"] env["DRONE_REPO_PRIVATE"] = env["CI_REPO_PRIVATE"] // clone - env["DRONE_REMOTE_URL"] = env["CI_REPO_REMOTE"] - env["DRONE_GIT_HTTP_URL"] = env["CI_REPO_REMOTE"] + env["DRONE_REMOTE_URL"] = env["CI_REPO_CLONE_URL"] + env["DRONE_GIT_HTTP_URL"] = env["CI_REPO_CLONE_URL"] // misc env["DRONE_SYSTEM_HOST"] = env["CI_SYSTEM_HOST"] env["DRONE_STEP_NUMBER"] = env["CI_STEP_NUMBER"] diff --git a/pipeline/frontend/metadata.go b/pipeline/frontend/metadata.go index 60d4889a0..e37e1e68a 100644 --- a/pipeline/frontend/metadata.go +++ b/pipeline/frontend/metadata.go @@ -45,12 +45,12 @@ type ( // Repo defines runtime metadata for a repository. Repo struct { - Name string `json:"name,omitempty"` - Link string `json:"link,omitempty"` - Remote string `json:"remote,omitempty"` - Private bool `json:"private,omitempty"` - Secrets []Secret `json:"secrets,omitempty"` - Branch string `json:"default_branch,omitempty"` + Name string `json:"name,omitempty"` + Link string `json:"link,omitempty"` + CloneURL string `json:"clone_url,omitempty"` + Private bool `json:"private,omitempty"` + Secrets []Secret `json:"secrets,omitempty"` + Branch string `json:"default_branch,omitempty"` } // Pipeline defines runtime metadata for a pipeline. @@ -142,7 +142,7 @@ func (m *Metadata) Environ() map[string]string { "CI_REPO_NAME": repoName, "CI_REPO_SCM": "git", "CI_REPO_LINK": m.Repo.Link, - "CI_REPO_REMOTE": m.Repo.Remote, + "CI_REPO_CLONE_URL": m.Repo.CloneURL, "CI_REPO_DEFAULT_BRANCH": m.Repo.Branch, "CI_REPO_PRIVATE": strconv.FormatBool(m.Repo.Private), "CI_REPO_TRUSTED": "false", // TODO should this be added? @@ -229,6 +229,8 @@ func (m *Metadata) Environ() map[string]string { "CI_JOB_STATUS": "", // will be set by agent "CI_JOB_STARTED": "", // will be set by agent "CI_JOB_FINISHED": "", // will be set by agent + // CI_REPO_CLONE_URL + "CI_REPO_REMOTE": m.Repo.CloneURL, } if m.Curr.Event == EventTag { params["CI_COMMIT_TAG"] = strings.TrimPrefix(m.Curr.Commit.Ref, "refs/tags/") diff --git a/pipeline/frontend/yaml/compiler/option_test.go b/pipeline/frontend/yaml/compiler/option_test.go index 19b91f297..976a5075f 100644 --- a/pipeline/frontend/yaml/compiler/option_test.go +++ b/pipeline/frontend/yaml/compiler/option_test.go @@ -100,10 +100,10 @@ func TestWithPrefix(t *testing.T) { func TestWithMetadata(t *testing.T) { metadata := frontend.Metadata{ Repo: frontend.Repo{ - Name: "octocat/hello-world", - Private: true, - Link: "https://github.com/octocat/hello-world", - Remote: "https://github.com/octocat/hello-world.git", + Name: "octocat/hello-world", + Private: true, + Link: "https://github.com/octocat/hello-world", + CloneURL: "https://github.com/octocat/hello-world.git", }, } compiler := New( @@ -119,8 +119,8 @@ func TestWithMetadata(t *testing.T) { if compiler.env["CI_REPO_LINK"] != metadata.Repo.Link { t.Errorf("WithMetadata must set CI_REPO_LINK") } - if compiler.env["CI_REPO_REMOTE"] != metadata.Repo.Remote { - t.Errorf("WithMetadata must set CI_REPO_REMOTE") + if compiler.env["CI_REPO_CLONE_URL"] != metadata.Repo.CloneURL { + t.Errorf("WithMetadata must set CI_REPO_CLONE_URL") } } diff --git a/server/api/cron.go b/server/api/cron.go index cdf42f54e..ea141ddbc 100644 --- a/server/api/cron.go +++ b/server/api/cron.go @@ -62,7 +62,7 @@ func RunCron(c *gin.Context) { return } - repo, newPipeline, err := cronScheduler.CreatePipeline(c, _store, server.Config.Services.Remote, cron) + repo, newPipeline, err := cronScheduler.CreatePipeline(c, _store, server.Config.Services.Forge, cron) if err != nil { c.String(http.StatusInternalServerError, "Error creating pipeline for cron %q. %s", id, err) return @@ -82,7 +82,7 @@ func PostCron(c *gin.Context) { repo := session.Repo(c) user := session.User(c) store := store.FromContext(c) - remote := server.Config.Services.Remote + forge := server.Config.Services.Forge in := new(model.Cron) if err := c.Bind(in); err != nil { @@ -109,8 +109,8 @@ func PostCron(c *gin.Context) { cron.NextExec = nextExec.Unix() if in.Branch != "" { - // check if branch exists on remote - _, err := remote.BranchHead(c, user, repo, in.Branch) + // check if branch exists on forge + _, err := forge.BranchHead(c, user, repo, in.Branch) if err != nil { c.String(400, "Error inserting cron. branch not resolved: %s", err) return @@ -129,7 +129,7 @@ func PatchCron(c *gin.Context) { repo := session.Repo(c) user := session.User(c) store := store.FromContext(c) - remote := server.Config.Services.Remote + forge := server.Config.Services.Forge id, err := strconv.ParseInt(c.Param("cron"), 10, 64) if err != nil { @@ -150,8 +150,8 @@ func PatchCron(c *gin.Context) { return } if in.Branch != "" { - // check if branch exists on remote - _, err := remote.BranchHead(c, user, repo, in.Branch) + // check if branch exists on forge + _, err := forge.BranchHead(c, user, repo, in.Branch) if err != nil { c.String(400, "Error inserting cron. branch not resolved: %s", err) return diff --git a/server/api/helper.go b/server/api/helper.go index 4826cc5c8..1968b14e6 100644 --- a/server/api/helper.go +++ b/server/api/helper.go @@ -21,9 +21,9 @@ import ( "github.com/rs/zerolog/log" "github.com/woodpecker-ci/woodpecker/server" + "github.com/woodpecker-ci/woodpecker/server/forge" "github.com/woodpecker-ci/woodpecker/server/model" "github.com/woodpecker-ci/woodpecker/server/pipeline" - "github.com/woodpecker-ci/woodpecker/server/remote" "github.com/woodpecker-ci/woodpecker/server/store" ) @@ -39,12 +39,12 @@ func handlePipelineErr(c *gin.Context, err error) { } } -// if the remote has a refresh token, the current access token may be stale. +// if the forge has a refresh token, the current access token may be stale. // Therefore, we should refresh prior to dispatching the job. func refreshUserToken(c *gin.Context, user *model.User) { - _remote := server.Config.Services.Remote + _forge := server.Config.Services.Forge _store := store.FromContext(c) - if refresher, ok := _remote.(remote.Refresher); ok { + if refresher, ok := _forge.(forge.Refresher); ok { ok, err := refresher.Refresh(c, user) if err != nil { log.Error().Err(err).Msgf("refresh oauth token of user '%s' failed", user.Login) diff --git a/server/api/hook.go b/server/api/hook.go index 967cc193e..27d604a8d 100644 --- a/server/api/hook.go +++ b/server/api/hook.go @@ -70,9 +70,9 @@ func BlockTilQueueHasRunningItem(c *gin.Context) { // PostHook start a pipeline triggered by a forges post webhook func PostHook(c *gin.Context) { _store := store.FromContext(c) - remote := server.Config.Services.Remote + forge := server.Config.Services.Forge - tmpRepo, tmpBuild, err := remote.Hook(c, c.Request) + tmpRepo, tmpBuild, err := forge.Hook(c, c.Request) if err != nil { msg := "failure to parse hook" log.Debug().Err(err).Msg(msg) @@ -102,7 +102,7 @@ func PostHook(c *gin.Context) { return } - repo, err := _store.GetRepoNameFallback(tmpRepo.RemoteID, tmpRepo.FullName) + repo, err := _store.GetRepoNameFallback(tmpRepo.ForgeID, tmpRepo.FullName) if err != nil { msg := fmt.Sprintf("failure to get repo %s from store", tmpRepo.FullName) log.Error().Err(err).Msg(msg) diff --git a/server/api/login.go b/server/api/login.go index eb37154d0..72a9d29ae 100644 --- a/server/api/login.go +++ b/server/api/login.go @@ -49,13 +49,13 @@ func HandleAuth(c *gin.Context) { // cannot, however, remember why, so need to revisit this line. c.Writer.Header().Del("Content-Type") - tmpuser, err := server.Config.Services.Remote.Login(c, c.Writer, c.Request) + tmpuser, err := server.Config.Services.Forge.Login(c, c.Writer, c.Request) if err != nil { log.Error().Msgf("cannot authenticate user. %s", err) c.Redirect(303, "/login?error=oauth_error") return } - // this will happen when the user is redirected by the remote provider as + // this will happen when the user is redirected by the forge as // part of the authorization workflow. if tmpuser == nil { return @@ -75,7 +75,7 @@ func HandleAuth(c *gin.Context) { // if self-registration is enabled for whitelisted organizations we need to // check the user's organization membership. if len(config.Orgs) != 0 { - teams, terr := server.Config.Services.Remote.Teams(c, tmpuser) + teams, terr := server.Config.Services.Forge.Teams(c, tmpuser) if terr != nil || !config.IsMember(teams) { log.Error().Msgf("cannot verify team membership for %s.", u.Login) c.Redirect(303, "/login?error=access_denied") @@ -112,7 +112,7 @@ func HandleAuth(c *gin.Context) { // if self-registration is enabled for whitelisted organizations we need to // check the user's organization membership. if len(config.Orgs) != 0 { - teams, terr := server.Config.Services.Remote.Teams(c, u) + teams, terr := server.Config.Services.Forge.Teams(c, u) if terr != nil || !config.IsMember(teams) { log.Error().Msgf("cannot verify team membership for %s.", u.Login) c.Redirect(303, "/login?error=access_denied") @@ -155,7 +155,7 @@ func GetLoginToken(c *gin.Context) { return } - login, err := server.Config.Services.Remote.Auth(c, in.Access, in.Refresh) + login, err := server.Config.Services.Forge.Auth(c, in.Access, in.Refresh) if err != nil { _ = c.AbortWithError(http.StatusUnauthorized, err) return diff --git a/server/api/pipeline.go b/server/api/pipeline.go index 06b95ab0a..00d717ded 100644 --- a/server/api/pipeline.go +++ b/server/api/pipeline.go @@ -54,7 +54,7 @@ func CreatePipeline(c *gin.Context) { user := session.User(c) - lastCommit, _ := server.Config.Services.Remote.BranchHead(c, user, repo, p.Branch) + lastCommit, _ := server.Config.Services.Forge.BranchHead(c, user, repo, p.Branch) tmpBuild := createTmpPipeline(model.EventManual, lastCommit, repo, user, &p) diff --git a/server/api/repo.go b/server/api/repo.go index 1103b0c07..cd0a00367 100644 --- a/server/api/repo.go +++ b/server/api/repo.go @@ -39,7 +39,7 @@ const ( ) func PostRepo(c *gin.Context) { - remote := server.Config.Services.Remote + forge := server.Config.Services.Forge _store := store.FromContext(c) user := session.User(c) repo := session.Repo(c) @@ -87,7 +87,7 @@ func PostRepo(c *gin.Context) { sig, ) - from, err := remote.Repo(c, user, repo.RemoteID, repo.Owner, repo.Name) + from, err := forge.Repo(c, user, repo.ForgeID, repo.Owner, repo.Name) if err == nil { if repo.FullName != from.FullName { // create a redirection @@ -100,7 +100,7 @@ func PostRepo(c *gin.Context) { repo.Update(from) } - err = remote.Activate(c, user, repo, link) + err = forge.Activate(c, user, repo, link) if err != nil { c.String(http.StatusInternalServerError, err.Error()) return @@ -198,9 +198,9 @@ func GetRepoPermissions(c *gin.Context) { func GetRepoBranches(c *gin.Context) { repo := session.Repo(c) user := session.User(c) - r := server.Config.Services.Remote + f := server.Config.Services.Forge - branches, err := r.Branches(c, user, repo) + branches, err := f.Branches(c, user, repo) if err != nil { _ = c.AbortWithError(http.StatusInternalServerError, err) return @@ -231,7 +231,7 @@ func DeleteRepo(c *gin.Context) { } } - if err := server.Config.Services.Remote.Deactivate(c, user, repo, server.Config.Server.Host); err != nil { + if err := server.Config.Services.Forge.Deactivate(c, user, repo, server.Config.Server.Host); err != nil { _ = c.AbortWithError(http.StatusInternalServerError, err) return } @@ -239,7 +239,7 @@ func DeleteRepo(c *gin.Context) { } func RepairRepo(c *gin.Context) { - remote := server.Config.Services.Remote + forge := server.Config.Services.Forge _store := store.FromContext(c) repo := session.Repo(c) user := session.User(c) @@ -260,9 +260,9 @@ func RepairRepo(c *gin.Context) { sig, ) - from, err := remote.Repo(c, user, repo.RemoteID, repo.Owner, repo.Name) + from, err := forge.Repo(c, user, repo.ForgeID, repo.Owner, repo.Name) if err != nil { - log.Error().Err(err).Msgf("get repo '%s/%s' from remote", repo.Owner, repo.Name) + log.Error().Err(err).Msgf("get repo '%s/%s' from forge", repo.Owner, repo.Name) c.AbortWithStatus(http.StatusInternalServerError) return } @@ -282,10 +282,10 @@ func RepairRepo(c *gin.Context) { return } - if err := remote.Deactivate(c, user, repo, host); err != nil { + if err := forge.Deactivate(c, user, repo, host); err != nil { log.Trace().Err(err).Msgf("deactivate repo '%s' to repair failed", repo.FullName) } - if err := remote.Activate(c, user, repo, link); err != nil { + if err := forge.Activate(c, user, repo, link); err != nil { c.String(500, err.Error()) return } @@ -294,7 +294,7 @@ func RepairRepo(c *gin.Context) { } func MoveRepo(c *gin.Context) { - remote := server.Config.Services.Remote + forge := server.Config.Services.Forge _store := store.FromContext(c) repo := session.Repo(c) user := session.User(c) @@ -312,7 +312,7 @@ func MoveRepo(c *gin.Context) { return } - from, err := remote.Repo(c, user, "", owner, name) + from, err := forge.Repo(c, user, "", owner, name) if err != nil { _ = c.AbortWithError(http.StatusInternalServerError, err) return @@ -352,10 +352,10 @@ func MoveRepo(c *gin.Context) { sig, ) - if err := remote.Deactivate(c, user, repo, host); err != nil { + if err := forge.Deactivate(c, user, repo, host); err != nil { log.Trace().Err(err).Msgf("deactivate repo '%s' for move to activate later, got an error", repo.FullName) } - if err := remote.Activate(c, user, repo, link); err != nil { + if err := forge.Activate(c, user, repo, link); err != nil { c.String(500, err.Error()) return } diff --git a/server/api/user.go b/server/api/user.go index fef44ed37..889e51156 100644 --- a/server/api/user.go +++ b/server/api/user.go @@ -38,7 +38,7 @@ func GetSelf(c *gin.Context) { func GetFeed(c *gin.Context) { _store := store.FromContext(c) - remote := server.Config.Services.Remote + forge := server.Config.Services.Forge user := session.User(c) latest, _ := strconv.ParseBool(c.Query("latest")) @@ -55,10 +55,10 @@ func GetFeed(c *gin.Context) { config := ToConfig(c) sync := shared.Syncer{ - Remote: remote, - Store: _store, - Perms: _store, - Match: shared.NamespaceFilter(config.OwnersWhitelist), + Forge: forge, + Store: _store, + Perms: _store, + Match: shared.NamespaceFilter(config.OwnersWhitelist), } if err := sync.Sync(c, user, server.Config.FlatPermissions); err != nil { log.Debug().Msgf("sync error: %s: %s", user.Login, err) @@ -87,7 +87,7 @@ func GetFeed(c *gin.Context) { func GetRepos(c *gin.Context) { _store := store.FromContext(c) - remote := server.Config.Services.Remote + forge := server.Config.Services.Forge user := session.User(c) all, _ := strconv.ParseBool(c.Query("all")) @@ -104,10 +104,10 @@ func GetRepos(c *gin.Context) { config := ToConfig(c) sync := shared.Syncer{ - Remote: remote, - Store: _store, - Perms: _store, - Match: shared.NamespaceFilter(config.OwnersWhitelist), + Forge: forge, + Store: _store, + Perms: _store, + Match: shared.NamespaceFilter(config.OwnersWhitelist), } if err := sync.Sync(c, user, server.Config.FlatPermissions); err != nil { diff --git a/server/cache/membership.go b/server/cache/membership.go index bafd7a04c..20b096d10 100644 --- a/server/cache/membership.go +++ b/server/cache/membership.go @@ -18,8 +18,8 @@ import ( "context" "time" + "github.com/woodpecker-ci/woodpecker/server/forge" "github.com/woodpecker-ci/woodpecker/server/model" - "github.com/woodpecker-ci/woodpecker/server/remote" "github.com/lafriks/ttlcache/v3" ) @@ -31,17 +31,17 @@ type MembershipService interface { } type membershipCache struct { - Remote remote.Remote - Cache *ttlcache.Cache[string, *model.OrgPerm] - TTL time.Duration + Forge forge.Forge + Cache *ttlcache.Cache[string, *model.OrgPerm] + TTL time.Duration } // NewMembershipService creates a new membership service. -func NewMembershipService(r remote.Remote) MembershipService { +func NewMembershipService(f forge.Forge) MembershipService { return &membershipCache{ - TTL: 10 * time.Minute, - Remote: r, - Cache: ttlcache.New(ttlcache.WithDisableTouchOnHit[string, *model.OrgPerm]()), + TTL: 10 * time.Minute, + Forge: f, + Cache: ttlcache.New(ttlcache.WithDisableTouchOnHit[string, *model.OrgPerm]()), } } @@ -54,7 +54,7 @@ func (c *membershipCache) Get(ctx context.Context, u *model.User, name string) ( return item.Value(), nil } - perm, err := c.Remote.OrgMembership(ctx, u, name) + perm, err := c.Forge.OrgMembership(ctx, u, name) if err != nil { return nil, err } diff --git a/server/config.go b/server/config.go index bdcad5773..4e4152fce 100644 --- a/server/config.go +++ b/server/config.go @@ -22,12 +22,12 @@ import ( "time" "github.com/woodpecker-ci/woodpecker/server/cache" + "github.com/woodpecker-ci/woodpecker/server/forge" "github.com/woodpecker-ci/woodpecker/server/logging" "github.com/woodpecker-ci/woodpecker/server/model" "github.com/woodpecker-ci/woodpecker/server/plugins/config" "github.com/woodpecker-ci/woodpecker/server/pubsub" "github.com/woodpecker-ci/woodpecker/server/queue" - "github.com/woodpecker-ci/woodpecker/server/remote" ) var Config = struct { @@ -38,7 +38,7 @@ var Config = struct { Secrets model.SecretService Registries model.RegistryService Environ model.EnvironService - Remote remote.Remote + Forge forge.Forge Membership cache.MembershipService ConfigService config.Extension SignaturePrivateKey crypto.PrivateKey diff --git a/server/cron/cron.go b/server/cron/cron.go index 919b856f0..b85f6d324 100644 --- a/server/cron/cron.go +++ b/server/cron/cron.go @@ -22,9 +22,9 @@ import ( "github.com/robfig/cron" "github.com/rs/zerolog/log" + "github.com/woodpecker-ci/woodpecker/server/forge" "github.com/woodpecker-ci/woodpecker/server/model" "github.com/woodpecker-ci/woodpecker/server/pipeline" - "github.com/woodpecker-ci/woodpecker/server/remote" "github.com/woodpecker-ci/woodpecker/server/store" ) @@ -37,7 +37,7 @@ const ( ) // Start starts the cron scheduler loop -func Start(ctx context.Context, store store.Store, remote remote.Remote) error { +func Start(ctx context.Context, store store.Store, forge forge.Forge) error { for { select { case <-ctx.Done(): @@ -54,7 +54,7 @@ func Start(ctx context.Context, store store.Store, remote remote.Remote) error { } for _, cron := range crons { - if err := runCron(store, remote, cron, now); err != nil { + if err := runCron(store, forge, cron, now); err != nil { log.Error().Err(err).Int64("cronID", cron.ID).Msg("run cron failed") } } @@ -77,7 +77,7 @@ func CalcNewNext(schedule string, now time.Time) (time.Time, error) { return c.Next(now), nil } -func runCron(store store.Store, remote remote.Remote, cron *model.Cron, now time.Time) error { +func runCron(store store.Store, forge forge.Forge, cron *model.Cron, now time.Time) error { log.Trace().Msgf("Cron: run id[%d]", cron.ID) ctx := context.Background() @@ -96,7 +96,7 @@ func runCron(store store.Store, remote remote.Remote, cron *model.Cron, now time return nil } - repo, newPipeline, err := CreatePipeline(ctx, store, remote, cron) + repo, newPipeline, err := CreatePipeline(ctx, store, forge, cron) if err != nil { return err } @@ -105,7 +105,7 @@ func runCron(store store.Store, remote remote.Remote, cron *model.Cron, now time return err } -func CreatePipeline(ctx context.Context, store store.Store, remote remote.Remote, cron *model.Cron) (*model.Repo, *model.Pipeline, error) { +func CreatePipeline(ctx context.Context, store store.Store, forge forge.Forge, cron *model.Cron) (*model.Repo, *model.Pipeline, error) { repo, err := store.GetRepo(cron.RepoID) if err != nil { return nil, nil, err @@ -121,7 +121,7 @@ func CreatePipeline(ctx context.Context, store store.Store, remote remote.Remote return nil, nil, err } - commit, err := remote.BranchHead(ctx, creator, repo, cron.Branch) + commit, err := forge.BranchHead(ctx, creator, repo, cron.Branch) if err != nil { return nil, nil, err } diff --git a/server/cron/cron_test.go b/server/cron/cron_test.go index 94b319d0d..66acbc716 100644 --- a/server/cron/cron_test.go +++ b/server/cron/cron_test.go @@ -22,13 +22,13 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" + mocks_forge "github.com/woodpecker-ci/woodpecker/server/forge/mocks" "github.com/woodpecker-ci/woodpecker/server/model" - mocks_remote "github.com/woodpecker-ci/woodpecker/server/remote/mocks" mocks_store "github.com/woodpecker-ci/woodpecker/server/store/mocks" ) func TestCreateBuild(t *testing.T) { - remote := mocks_remote.NewRemote(t) + forge := mocks_forge.NewForge(t) store := mocks_store.NewStore(t) ctx := context.Background() @@ -47,9 +47,9 @@ func TestCreateBuild(t *testing.T) { // mock things store.On("GetRepo", mock.Anything).Return(repo1, nil) store.On("GetUser", mock.Anything).Return(creator, nil) - remote.On("BranchHead", mock.Anything, creator, repo1, "default").Return("sha1", nil) + forge.On("BranchHead", mock.Anything, creator, repo1, "default").Return("sha1", nil) - _, pipeline, err := CreatePipeline(ctx, store, remote, &model.Cron{ + _, pipeline, err := CreatePipeline(ctx, store, forge, &model.Cron{ Name: "test", }) assert.NoError(t, err) diff --git a/server/remote/bitbucket/bitbucket.go b/server/forge/bitbucket/bitbucket.go similarity index 95% rename from server/remote/bitbucket/bitbucket.go rename to server/forge/bitbucket/bitbucket.go index 5a2f3b397..6dfaea3bf 100644 --- a/server/remote/bitbucket/bitbucket.go +++ b/server/forge/bitbucket/bitbucket.go @@ -24,10 +24,10 @@ import ( "golang.org/x/oauth2" "github.com/woodpecker-ci/woodpecker/server" + "github.com/woodpecker-ci/woodpecker/server/forge" + "github.com/woodpecker-ci/woodpecker/server/forge/bitbucket/internal" + "github.com/woodpecker-ci/woodpecker/server/forge/common" "github.com/woodpecker-ci/woodpecker/server/model" - "github.com/woodpecker-ci/woodpecker/server/remote" - "github.com/woodpecker-ci/woodpecker/server/remote/bitbucket/internal" - "github.com/woodpecker-ci/woodpecker/server/remote/common" ) // Bitbucket cloud endpoints. @@ -36,7 +36,7 @@ const ( DefaultURL = "https://bitbucket.org" ) -// Opts are remote options for bitbucket +// Opts are forge options for bitbucket type Opts struct { Client string Secret string @@ -49,9 +49,9 @@ type config struct { Secret string } -// New returns a new remote Configuration for integrating with the Bitbucket +// New returns a new forge Configuration for integrating with the Bitbucket // repository hosting service at https://bitbucket.org -func New(opts *Opts) (remote.Remote, error) { +func New(opts *Opts) (forge.Forge, error) { return &config{ API: DefaultAPI, URL: DefaultURL, @@ -73,7 +73,7 @@ func (c *config) Login(ctx context.Context, w http.ResponseWriter, req *http.Req // get the OAuth errors if err := req.FormValue("error"); err != "" { - return nil, &remote.AuthError{ + return nil, &forge.AuthError{ Err: err, Description: req.FormValue("error_description"), URI: req.FormValue("error_uri"), @@ -143,7 +143,7 @@ func (c *config) Teams(ctx context.Context, u *model.User) ([]*model.Team, error } // Repo returns the named Bitbucket repository. -func (c *config) Repo(ctx context.Context, u *model.User, id model.RemoteID, owner, name string) (*model.Repo, error) { +func (c *config) Repo(ctx context.Context, u *model.User, id model.ForgeID, owner, name string) (*model.Repo, error) { if id.IsValid() { name = string(id) } @@ -222,7 +222,7 @@ func (c *config) File(ctx context.Context, u *model.User, r *model.Repo, p *mode return []byte(*config), err } -func (c *config) Dir(ctx context.Context, u *model.User, r *model.Repo, p *model.Pipeline, f string) ([]*remote.FileMeta, error) { +func (c *config) Dir(ctx context.Context, u *model.User, r *model.Repo, p *model.Pipeline, f string) ([]*forge.FileMeta, error) { return nil, fmt.Errorf("Not implemented") } diff --git a/server/remote/bitbucket/bitbucket_test.go b/server/forge/bitbucket/bitbucket_test.go similarity index 95% rename from server/remote/bitbucket/bitbucket_test.go rename to server/forge/bitbucket/bitbucket_test.go index 9694c6c53..85cc7e96e 100644 --- a/server/remote/bitbucket/bitbucket_test.go +++ b/server/forge/bitbucket/bitbucket_test.go @@ -25,9 +25,9 @@ import ( "github.com/franela/goblin" "github.com/gin-gonic/gin" + "github.com/woodpecker-ci/woodpecker/server/forge/bitbucket/fixtures" + "github.com/woodpecker-ci/woodpecker/server/forge/bitbucket/internal" "github.com/woodpecker-ci/woodpecker/server/model" - "github.com/woodpecker-ci/woodpecker/server/remote/bitbucket/fixtures" - "github.com/woodpecker-ci/woodpecker/server/remote/bitbucket/internal" ) func Test_bitbucket(t *testing.T) { @@ -44,16 +44,16 @@ func Test_bitbucket(t *testing.T) { }) g.It("Should return client with default endpoint", func() { - remote, _ := New(&Opts{Client: "4vyW6b49Z", Secret: "a5012f6c6"}) - g.Assert(remote.(*config).URL).Equal(DefaultURL) - g.Assert(remote.(*config).API).Equal(DefaultAPI) - g.Assert(remote.(*config).Client).Equal("4vyW6b49Z") - g.Assert(remote.(*config).Secret).Equal("a5012f6c6") + forge, _ := New(&Opts{Client: "4vyW6b49Z", Secret: "a5012f6c6"}) + g.Assert(forge.(*config).URL).Equal(DefaultURL) + g.Assert(forge.(*config).API).Equal(DefaultAPI) + g.Assert(forge.(*config).Client).Equal("4vyW6b49Z") + g.Assert(forge.(*config).Secret).Equal("a5012f6c6") }) g.It("Should return the netrc file", func() { - remote, _ := New(&Opts{}) - netrc, _ := remote.Netrc(fakeUser, fakeRepo) + forge, _ := New(&Opts{}) + netrc, _ := forge.Netrc(fakeUser, fakeRepo) g.Assert(netrc.Machine).Equal("bitbucket.org") g.Assert(netrc.Login).Equal("x-token-auth") g.Assert(netrc.Password).Equal(fakeUser.Token) diff --git a/server/remote/bitbucket/convert.go b/server/forge/bitbucket/convert.go similarity index 97% rename from server/remote/bitbucket/convert.go rename to server/forge/bitbucket/convert.go index 552150bec..bdbedac29 100644 --- a/server/remote/bitbucket/convert.go +++ b/server/forge/bitbucket/convert.go @@ -23,8 +23,8 @@ import ( "golang.org/x/oauth2" + "github.com/woodpecker-ci/woodpecker/server/forge/bitbucket/internal" "github.com/woodpecker-ci/woodpecker/server/model" - "github.com/woodpecker-ci/woodpecker/server/remote/bitbucket/internal" ) const ( @@ -50,7 +50,7 @@ func convertStatus(status model.StatusValue) string { // structure to the common Woodpecker repository structure. func convertRepo(from *internal.Repo) *model.Repo { repo := model.Repo{ - RemoteID: model.RemoteID(from.UUID), + ForgeID: model.ForgeID(from.UUID), Clone: cloneLink(from), Owner: strings.Split(from.FullName, "/")[0], Name: strings.Split(from.FullName, "/")[1], @@ -140,7 +140,7 @@ func convertPullHook(from *internal.PullRequestHook) *model.Pipeline { from.PullRequest.Source.Branch.Name, from.PullRequest.Dest.Branch.Name, ), - Remote: fmt.Sprintf("https://bitbucket.org/%s", from.PullRequest.Source.Repo.FullName), + CloneURL: fmt.Sprintf("https://bitbucket.org/%s", from.PullRequest.Source.Repo.FullName), Link: from.PullRequest.Links.HTML.Href, Branch: from.PullRequest.Dest.Branch.Name, Message: from.PullRequest.Desc, diff --git a/server/remote/bitbucket/convert_test.go b/server/forge/bitbucket/convert_test.go similarity index 97% rename from server/remote/bitbucket/convert_test.go rename to server/forge/bitbucket/convert_test.go index 381d82dc2..5ac86c91c 100644 --- a/server/remote/bitbucket/convert_test.go +++ b/server/forge/bitbucket/convert_test.go @@ -22,8 +22,8 @@ import ( "github.com/franela/goblin" "golang.org/x/oauth2" + "github.com/woodpecker-ci/woodpecker/server/forge/bitbucket/internal" "github.com/woodpecker-ci/woodpecker/server/model" - "github.com/woodpecker-ci/woodpecker/server/remote/bitbucket/internal" ) func Test_helper(t *testing.T) { @@ -137,7 +137,7 @@ func Test_helper(t *testing.T) { g.Assert(pipeline.Link).Equal(hook.PullRequest.Links.HTML.Href) g.Assert(pipeline.Ref).Equal("refs/heads/master") g.Assert(pipeline.Refspec).Equal("change:master") - g.Assert(pipeline.Remote).Equal("https://bitbucket.org/baz/bar") + g.Assert(pipeline.CloneURL).Equal("https://bitbucket.org/baz/bar") g.Assert(pipeline.Message).Equal(hook.PullRequest.Desc) g.Assert(pipeline.Timestamp).Equal(hook.PullRequest.Updated.Unix()) }) diff --git a/server/remote/bitbucket/fixtures/handler.go b/server/forge/bitbucket/fixtures/handler.go similarity index 100% rename from server/remote/bitbucket/fixtures/handler.go rename to server/forge/bitbucket/fixtures/handler.go diff --git a/server/remote/bitbucket/fixtures/hooks.go b/server/forge/bitbucket/fixtures/hooks.go similarity index 100% rename from server/remote/bitbucket/fixtures/hooks.go rename to server/forge/bitbucket/fixtures/hooks.go diff --git a/server/remote/bitbucket/internal/client.go b/server/forge/bitbucket/internal/client.go similarity index 100% rename from server/remote/bitbucket/internal/client.go rename to server/forge/bitbucket/internal/client.go diff --git a/server/remote/bitbucket/internal/types.go b/server/forge/bitbucket/internal/types.go similarity index 100% rename from server/remote/bitbucket/internal/types.go rename to server/forge/bitbucket/internal/types.go diff --git a/server/remote/bitbucket/parse.go b/server/forge/bitbucket/parse.go similarity index 97% rename from server/remote/bitbucket/parse.go rename to server/forge/bitbucket/parse.go index 499733a52..5e277a104 100644 --- a/server/remote/bitbucket/parse.go +++ b/server/forge/bitbucket/parse.go @@ -19,8 +19,8 @@ import ( "io" "net/http" + "github.com/woodpecker-ci/woodpecker/server/forge/bitbucket/internal" "github.com/woodpecker-ci/woodpecker/server/model" - "github.com/woodpecker-ci/woodpecker/server/remote/bitbucket/internal" ) const ( diff --git a/server/remote/bitbucket/parse_test.go b/server/forge/bitbucket/parse_test.go similarity index 98% rename from server/remote/bitbucket/parse_test.go rename to server/forge/bitbucket/parse_test.go index e2830839a..bb3175622 100644 --- a/server/remote/bitbucket/parse_test.go +++ b/server/forge/bitbucket/parse_test.go @@ -21,8 +21,8 @@ import ( "github.com/franela/goblin" + "github.com/woodpecker-ci/woodpecker/server/forge/bitbucket/fixtures" "github.com/woodpecker-ci/woodpecker/server/model" - "github.com/woodpecker-ci/woodpecker/server/remote/bitbucket/fixtures" ) func Test_parser(t *testing.T) { diff --git a/server/remote/bitbucketserver/bitbucketserver.go b/server/forge/bitbucketserver/bitbucketserver.go similarity index 95% rename from server/remote/bitbucketserver/bitbucketserver.go rename to server/forge/bitbucketserver/bitbucketserver.go index a5805708e..6f1fa2de0 100644 --- a/server/remote/bitbucketserver/bitbucketserver.go +++ b/server/forge/bitbucketserver/bitbucketserver.go @@ -30,10 +30,10 @@ import ( "github.com/mrjones/oauth" + "github.com/woodpecker-ci/woodpecker/server/forge" + "github.com/woodpecker-ci/woodpecker/server/forge/bitbucketserver/internal" + "github.com/woodpecker-ci/woodpecker/server/forge/common" "github.com/woodpecker-ci/woodpecker/server/model" - "github.com/woodpecker-ci/woodpecker/server/remote" - "github.com/woodpecker-ci/woodpecker/server/remote/bitbucketserver/internal" - "github.com/woodpecker-ci/woodpecker/server/remote/common" ) const ( @@ -61,9 +61,9 @@ type Config struct { Consumer *oauth.Consumer } -// New returns a Remote implementation that integrates with Bitbucket Server, +// New returns a Forge implementation that integrates with Bitbucket Server, // the on-premise edition of Bitbucket Cloud, formerly known as Stash. -func New(opts Opts) (remote.Remote, error) { +func New(opts Opts) (forge.Forge, error) { config := &Config{ URL: opts.URL, Username: opts.Username, @@ -152,7 +152,7 @@ func (*Config) TeamPerm(u *model.User, org string) (*model.Perm, error) { return nil, nil } -func (c *Config) Repo(ctx context.Context, u *model.User, _ model.RemoteID, owner, name string) (*model.Repo, error) { +func (c *Config) Repo(ctx context.Context, u *model.User, _ model.ForgeID, owner, name string) (*model.Repo, error) { repo, err := internal.NewClientWithToken(ctx, c.URL, c.Consumer, u.Token).FindRepo(owner, name) if err != nil { return nil, err @@ -185,7 +185,7 @@ func (c *Config) File(ctx context.Context, u *model.User, r *model.Repo, p *mode return client.FindFileForRepo(r.Owner, r.Name, f, p.Ref) } -func (c *Config) Dir(ctx context.Context, u *model.User, r *model.Repo, p *model.Pipeline, f string) ([]*remote.FileMeta, error) { +func (c *Config) Dir(ctx context.Context, u *model.User, r *model.Repo, p *model.Pipeline, f string) ([]*forge.FileMeta, error) { return nil, fmt.Errorf("Not implemented") } diff --git a/server/remote/bitbucketserver/convert.go b/server/forge/bitbucketserver/convert.go similarity index 96% rename from server/remote/bitbucketserver/convert.go rename to server/forge/bitbucketserver/convert.go index f2841f136..3b1320df8 100644 --- a/server/remote/bitbucketserver/convert.go +++ b/server/forge/bitbucketserver/convert.go @@ -25,8 +25,8 @@ import ( "github.com/mrjones/oauth" + "github.com/woodpecker-ci/woodpecker/server/forge/bitbucketserver/internal" "github.com/woodpecker-ci/woodpecker/server/model" - "github.com/woodpecker-ci/woodpecker/server/remote/bitbucketserver/internal" ) const ( @@ -52,7 +52,7 @@ func convertStatus(status model.StatusValue) string { // structure to the common Woodpecker repository structure. func convertRepo(from *internal.Repo) *model.Repo { repo := model.Repo{ - RemoteID: model.RemoteID(fmt.Sprint(from.ID)), + ForgeID: model.ForgeID(fmt.Sprint(from.ID)), Name: from.Slug, Owner: from.Project.Key, Branch: "master", diff --git a/server/remote/bitbucketserver/convert_test.go b/server/forge/bitbucketserver/convert_test.go similarity index 98% rename from server/remote/bitbucketserver/convert_test.go rename to server/forge/bitbucketserver/convert_test.go index 23601503d..db9747893 100644 --- a/server/remote/bitbucketserver/convert_test.go +++ b/server/forge/bitbucketserver/convert_test.go @@ -21,8 +21,8 @@ import ( "github.com/franela/goblin" "github.com/mrjones/oauth" + "github.com/woodpecker-ci/woodpecker/server/forge/bitbucketserver/internal" "github.com/woodpecker-ci/woodpecker/server/model" - "github.com/woodpecker-ci/woodpecker/server/remote/bitbucketserver/internal" ) func Test_helper(t *testing.T) { diff --git a/server/remote/bitbucketserver/internal/client.go b/server/forge/bitbucketserver/internal/client.go similarity index 100% rename from server/remote/bitbucketserver/internal/client.go rename to server/forge/bitbucketserver/internal/client.go diff --git a/server/remote/bitbucketserver/internal/types.go b/server/forge/bitbucketserver/internal/types.go similarity index 100% rename from server/remote/bitbucketserver/internal/types.go rename to server/forge/bitbucketserver/internal/types.go diff --git a/server/remote/bitbucketserver/parse.go b/server/forge/bitbucketserver/parse.go similarity index 93% rename from server/remote/bitbucketserver/parse.go rename to server/forge/bitbucketserver/parse.go index bc87ce138..e66015b82 100644 --- a/server/remote/bitbucketserver/parse.go +++ b/server/forge/bitbucketserver/parse.go @@ -19,8 +19,8 @@ import ( "encoding/json" "net/http" + "github.com/woodpecker-ci/woodpecker/server/forge/bitbucketserver/internal" "github.com/woodpecker-ci/woodpecker/server/model" - "github.com/woodpecker-ci/woodpecker/server/remote/bitbucketserver/internal" ) // parseHook parses a Bitbucket hook from an http.Request request and returns diff --git a/server/remote/coding/coding.go b/server/forge/coding/coding.go similarity index 90% rename from server/remote/coding/coding.go rename to server/forge/coding/coding.go index 368692bc2..a2f2f5bbd 100644 --- a/server/remote/coding/coding.go +++ b/server/forge/coding/coding.go @@ -25,10 +25,10 @@ import ( "golang.org/x/oauth2" "github.com/woodpecker-ci/woodpecker/server" + "github.com/woodpecker-ci/woodpecker/server/forge" + "github.com/woodpecker-ci/woodpecker/server/forge/coding/internal" + "github.com/woodpecker-ci/woodpecker/server/forge/common" "github.com/woodpecker-ci/woodpecker/server/model" - "github.com/woodpecker-ci/woodpecker/server/remote" - "github.com/woodpecker-ci/woodpecker/server/remote/coding/internal" - "github.com/woodpecker-ci/woodpecker/server/remote/common" ) const ( @@ -46,9 +46,9 @@ type Opts struct { SkipVerify bool // Skip ssl verification. } -// New returns a Remote implementation that integrates with a Coding Platform or +// New returns a Forge implementation that integrates with a Coding Platform or // Coding Enterprise version control hosting provider. -func New(opts Opts) (remote.Remote, error) { +func New(opts Opts) (forge.Forge, error) { r := &Coding{ URL: defaultURL, Client: opts.Client, @@ -81,13 +81,13 @@ func (c *Coding) Name() string { } // Login authenticates the session and returns the -// remote user details. +// forge user details. func (c *Coding) Login(ctx context.Context, res http.ResponseWriter, req *http.Request) (*model.User, error) { config := c.newConfig(server.Config.Server.Host) // get the OAuth errors if err := req.FormValue("error"); err != "" { - return nil, &remote.AuthError{ + return nil, &forge.AuthError{ Err: err, Description: req.FormValue("error_description"), URI: req.FormValue("error_uri"), @@ -121,7 +121,7 @@ func (c *Coding) Login(ctx context.Context, res http.ResponseWriter, req *http.R }, nil } -// Auth authenticates the session and returns the remote user +// Auth authenticates the session and returns the forge user // login for the given token and secret func (c *Coding) Auth(ctx context.Context, token, secret string) (string, error) { user, err := c.newClientToken(ctx, token).GetCurrentUser() @@ -148,21 +148,21 @@ func (c *Coding) Refresh(ctx context.Context, u *model.User) (bool, error) { return true, nil } -// Teams fetches a list of team memberships from the remote system. +// Teams fetches a list of team memberships from the forge. func (c *Coding) Teams(ctx context.Context, u *model.User) ([]*model.Team, error) { // EMPTY: not implemented in Coding OAuth API return nil, fmt.Errorf("Not implemented") } // TeamPerm fetches the named organization permissions from -// the remote system for the specified user. +// the forge for the specified user. func (c *Coding) TeamPerm(u *model.User, org string) (*model.Perm, error) { // EMPTY: not implemented in Coding OAuth API return nil, nil } -// Repo fetches the repository from the remote system. -func (c *Coding) Repo(ctx context.Context, u *model.User, _ model.RemoteID, owner, name string) (*model.Repo, error) { +// Repo fetches the repository from the forge. +func (c *Coding) Repo(ctx context.Context, u *model.User, _ model.ForgeID, owner, name string) (*model.Repo, error) { client := c.newClient(ctx, u) project, err := client.GetProject(owner, name) if err != nil { @@ -173,7 +173,7 @@ func (c *Coding) Repo(ctx context.Context, u *model.User, _ model.RemoteID, owne return nil, err } return &model.Repo{ - // TODO(1138) RemoteID: project.ID, + // TODO(1138) ForgeID: project.ID, Owner: project.Owner, Name: project.Name, FullName: projectFullName(project.Owner, project.Name), @@ -186,7 +186,7 @@ func (c *Coding) Repo(ctx context.Context, u *model.User, _ model.RemoteID, owne }, nil } -// Repos fetches a list of repos from the remote system. +// Repos fetches a list of repos from the forge. func (c *Coding) Repos(ctx context.Context, u *model.User) ([]*model.Repo, error) { client := c.newClient(ctx, u) projectList, err := client.GetProjectList() @@ -201,7 +201,7 @@ func (c *Coding) Repos(ctx context.Context, u *model.User) ([]*model.Repo, error return nil, err } repo := &model.Repo{ - // TODO(1138) RemoteID: project.ID, + // TODO(1138) ForgeID: project.ID, Owner: project.Owner, Name: project.Name, FullName: projectFullName(project.Owner, project.Name), @@ -218,7 +218,7 @@ func (c *Coding) Repos(ctx context.Context, u *model.User) ([]*model.Repo, error } // Perm fetches the named repository permissions from -// the remote system for the specified user. +// the forge for the specified user. func (c *Coding) Perm(ctx context.Context, u *model.User, repo *model.Repo) (*model.Perm, error) { project, err := c.newClient(ctx, u).GetProject(repo.Owner, repo.Name) if err != nil { @@ -234,7 +234,7 @@ func (c *Coding) Perm(ctx context.Context, u *model.User, repo *model.Repo) (*mo return &model.Perm{Pull: false, Push: false, Admin: false}, nil } -// File fetches a file from the remote repository and returns in string +// File fetches a file from the forge repository and returns in string // format. func (c *Coding) File(ctx context.Context, u *model.User, r *model.Repo, b *model.Pipeline, f string) ([]byte, error) { data, err := c.newClient(ctx, u).GetFile(r.Owner, r.Name, b.Commit, f) @@ -244,18 +244,18 @@ func (c *Coding) File(ctx context.Context, u *model.User, r *model.Repo, b *mode return data, nil } -func (c *Coding) Dir(ctx context.Context, u *model.User, r *model.Repo, b *model.Pipeline, f string) ([]*remote.FileMeta, error) { +func (c *Coding) Dir(ctx context.Context, u *model.User, r *model.Repo, b *model.Pipeline, f string) ([]*forge.FileMeta, error) { return nil, fmt.Errorf("Not implemented") } -// Status sends the commit status to the remote system. +// Status sends the commit status to the forge. func (c *Coding) Status(ctx context.Context, u *model.User, r *model.Repo, b *model.Pipeline, step *model.Step) error { // EMPTY: not implemented in Coding OAuth API return nil } // Netrc returns a .netrc file that can be used to clone -// private repositories from a remote system. +// private repositories from a forge. func (c *Coding) Netrc(u *model.User, r *model.Repo) (*model.Netrc, error) { host, err := common.ExtractHostFromCloneURL(r.Clone) if err != nil { @@ -318,7 +318,7 @@ func (c *Coding) OrgMembership(ctx context.Context, u *model.User, owner string) } // helper function to return the Coding oauth2 context using an HTTPClient that -// disables TLS verification if disabled in the remote settings. +// disables TLS verification if disabled in the forge settings. func (c *Coding) newContext(ctx context.Context) context.Context { if !c.SkipVerify { return ctx diff --git a/server/remote/coding/coding_test.go b/server/forge/coding/coding_test.go similarity index 91% rename from server/remote/coding/coding_test.go rename to server/forge/coding/coding_test.go index 1d18d74f0..c63966575 100644 --- a/server/remote/coding/coding_test.go +++ b/server/forge/coding/coding_test.go @@ -25,8 +25,8 @@ import ( "github.com/franela/goblin" "github.com/gin-gonic/gin" + "github.com/woodpecker-ci/woodpecker/server/forge/coding/fixtures" "github.com/woodpecker-ci/woodpecker/server/model" - "github.com/woodpecker-ci/woodpecker/server/remote/coding/fixtures" ) func Test_coding(t *testing.T) { @@ -42,9 +42,9 @@ func Test_coding(t *testing.T) { s.Close() }) - g.Describe("Creating a remote", func() { + g.Describe("Creating a forge", func() { g.It("Should return client with specified options", func() { - remote, _ := New(Opts{ + forge, _ := New(Opts{ URL: "https://coding.net", Client: "KTNF2ALdm3ofbtxLh6IbV95Ro5AKWJUP", Secret: "zVtxJrKhNhBcNyqCz1NggNAAmehAxnRO3Z0fXmCp", @@ -53,13 +53,13 @@ func Test_coding(t *testing.T) { Password: "password", SkipVerify: true, }) - g.Assert(remote.(*Coding).URL).Equal("https://coding.net") - g.Assert(remote.(*Coding).Client).Equal("KTNF2ALdm3ofbtxLh6IbV95Ro5AKWJUP") - g.Assert(remote.(*Coding).Secret).Equal("zVtxJrKhNhBcNyqCz1NggNAAmehAxnRO3Z0fXmCp") - g.Assert(remote.(*Coding).Scopes).Equal([]string{"user", "project", "project:depot"}) - g.Assert(remote.(*Coding).Username).Equal("someuser") - g.Assert(remote.(*Coding).Password).Equal("password") - g.Assert(remote.(*Coding).SkipVerify).Equal(true) + g.Assert(forge.(*Coding).URL).Equal("https://coding.net") + g.Assert(forge.(*Coding).Client).Equal("KTNF2ALdm3ofbtxLh6IbV95Ro5AKWJUP") + g.Assert(forge.(*Coding).Secret).Equal("zVtxJrKhNhBcNyqCz1NggNAAmehAxnRO3Z0fXmCp") + g.Assert(forge.(*Coding).Scopes).Equal([]string{"user", "project", "project:depot"}) + g.Assert(forge.(*Coding).Username).Equal("someuser") + g.Assert(forge.(*Coding).Password).Equal("password") + g.Assert(forge.(*Coding).SkipVerify).Equal(true) }) }) @@ -170,19 +170,19 @@ func Test_coding(t *testing.T) { g.Describe("When requesting a netrc config", func() { g.It("Should return the netrc file for global credential", func() { - remote, _ := New(Opts{ + forge, _ := New(Opts{ Username: "someuser", Password: "password", }) - netrc, err := remote.Netrc(fakeUser, fakeRepo) + netrc, err := forge.Netrc(fakeUser, fakeRepo) g.Assert(err).IsNil() g.Assert(netrc.Login).Equal("someuser") g.Assert(netrc.Password).Equal("password") g.Assert(netrc.Machine).Equal("git.coding.net") }) g.It("Should return the netrc file for specified user", func() { - remote, _ := New(Opts{}) - netrc, err := remote.Netrc(fakeUser, fakeRepo) + forge, _ := New(Opts{}) + netrc, err := forge.Netrc(fakeUser, fakeRepo) g.Assert(err).IsNil() g.Assert(netrc.Login).Equal(fakeUser.Token) g.Assert(netrc.Password).Equal("x-oauth-basic") diff --git a/server/remote/coding/fixtures/handler.go b/server/forge/coding/fixtures/handler.go similarity index 100% rename from server/remote/coding/fixtures/handler.go rename to server/forge/coding/fixtures/handler.go diff --git a/server/remote/coding/fixtures/hooks.go b/server/forge/coding/fixtures/hooks.go similarity index 100% rename from server/remote/coding/fixtures/hooks.go rename to server/forge/coding/fixtures/hooks.go diff --git a/server/remote/coding/hook.go b/server/forge/coding/hook.go similarity index 78% rename from server/remote/coding/hook.go rename to server/forge/coding/hook.go index 31196b0e5..ed03196cf 100644 --- a/server/remote/coding/hook.go +++ b/server/forge/coding/hook.go @@ -138,7 +138,7 @@ func convertRepository(repo *Repository) (*model.Repo, error) { } return &model.Repo{ - // TODO RemoteID: repo.ID, + // TODO ForgeID: repo.ID, Owner: matches[1], Name: repo.Name, FullName: projectFullName(repo.Owner.GlobalKey, repo.Name), @@ -167,16 +167,16 @@ func parsePushHook(raw []byte) (*model.Repo, *model.Pipeline, error) { lastCommit := findLastCommit(hook.Commits, hook.After) pipeline := &model.Pipeline{ - Event: model.EventPush, - Commit: hook.After, - Ref: hook.Ref, - Link: fmt.Sprintf("%s/git/commit/%s", hook.Repository.WebURL, hook.After), - Branch: strings.Replace(hook.Ref, "refs/heads/", "", -1), - Message: lastCommit.ShortMessage, - Email: lastCommit.Committer.Email, - Avatar: hook.User.Avatar, - Author: hook.User.GlobalKey, - Remote: hook.Repository.HTTPSURL, + Event: model.EventPush, + Commit: hook.After, + Ref: hook.Ref, + Link: fmt.Sprintf("%s/git/commit/%s", hook.Repository.WebURL, hook.After), + Branch: strings.Replace(hook.Ref, "refs/heads/", "", -1), + Message: lastCommit.ShortMessage, + Email: lastCommit.Committer.Email, + Avatar: hook.User.Avatar, + Author: hook.User.GlobalKey, + CloneURL: hook.Repository.HTTPSURL, } return repo, pipeline, nil } @@ -197,17 +197,17 @@ func parsePullRequestHook(raw []byte) (*model.Repo, *model.Pipeline, error) { return nil, nil, err } pipeline := &model.Pipeline{ - Event: model.EventPull, - Commit: hook.PullRequest.CommitSHA, - Link: hook.PullRequest.WebURL, - Ref: fmt.Sprintf("refs/pull/%d/MERGE", int(hook.PullRequest.Number)), - Branch: hook.PullRequest.TargetBranch, - Message: hook.PullRequest.Body, - Author: hook.PullRequest.User.GlobalKey, - Avatar: hook.PullRequest.User.Avatar, - Title: hook.PullRequest.Title, - Remote: hook.Repository.HTTPSURL, - Refspec: fmt.Sprintf("%s:%s", hook.PullRequest.SourceBranch, hook.PullRequest.TargetBranch), + Event: model.EventPull, + Commit: hook.PullRequest.CommitSHA, + Link: hook.PullRequest.WebURL, + Ref: fmt.Sprintf("refs/pull/%d/MERGE", int(hook.PullRequest.Number)), + Branch: hook.PullRequest.TargetBranch, + Message: hook.PullRequest.Body, + Author: hook.PullRequest.User.GlobalKey, + Avatar: hook.PullRequest.User.Avatar, + Title: hook.PullRequest.Title, + CloneURL: hook.Repository.HTTPSURL, + Refspec: fmt.Sprintf("%s:%s", hook.PullRequest.SourceBranch, hook.PullRequest.TargetBranch), } return repo, pipeline, nil @@ -230,17 +230,17 @@ func parseMergeReuqestHook(raw []byte) (*model.Repo, *model.Pipeline, error) { } pipeline := &model.Pipeline{ - Event: model.EventPull, - Commit: hook.MergeRequest.CommitSHA, - Link: hook.MergeRequest.WebURL, - Ref: fmt.Sprintf("refs/merge/%d/MERGE", int(hook.MergeRequest.Number)), - Branch: hook.MergeRequest.TargetBranch, - Message: hook.MergeRequest.Body, - Author: hook.MergeRequest.User.GlobalKey, - Avatar: hook.MergeRequest.User.Avatar, - Title: hook.MergeRequest.Title, - Remote: hook.Repository.HTTPSURL, - Refspec: fmt.Sprintf("%s:%s", hook.MergeRequest.SourceBranch, hook.MergeRequest.TargetBranch), + Event: model.EventPull, + Commit: hook.MergeRequest.CommitSHA, + Link: hook.MergeRequest.WebURL, + Ref: fmt.Sprintf("refs/merge/%d/MERGE", int(hook.MergeRequest.Number)), + Branch: hook.MergeRequest.TargetBranch, + Message: hook.MergeRequest.Body, + Author: hook.MergeRequest.User.GlobalKey, + Avatar: hook.MergeRequest.User.Avatar, + Title: hook.MergeRequest.Title, + CloneURL: hook.Repository.HTTPSURL, + Refspec: fmt.Sprintf("%s:%s", hook.MergeRequest.SourceBranch, hook.MergeRequest.TargetBranch), } return repo, pipeline, nil } diff --git a/server/remote/coding/hook_test.go b/server/forge/coding/hook_test.go similarity index 72% rename from server/remote/coding/hook_test.go rename to server/forge/coding/hook_test.go index adb859e8a..6e9302b69 100644 --- a/server/remote/coding/hook_test.go +++ b/server/forge/coding/hook_test.go @@ -23,8 +23,8 @@ import ( "github.com/franela/goblin" + "github.com/woodpecker-ci/woodpecker/server/forge/coding/fixtures" "github.com/woodpecker-ci/woodpecker/server/model" - "github.com/woodpecker-ci/woodpecker/server/remote/coding/fixtures" ) func Test_hook(t *testing.T) { @@ -49,16 +49,16 @@ func Test_hook(t *testing.T) { } pipeline := &model.Pipeline{ - Event: model.EventPush, - Commit: "5b9912a6ff272e9c93a4c44c278fe9b359ed1ab4", - Ref: "refs/heads/master", - Link: "https://coding.net/u/demo1/p/test1/git/commit/5b9912a6ff272e9c93a4c44c278fe9b359ed1ab4", - Branch: "master", - Message: "new file .woodpecker.yml\n", - Email: "demo1@gmail.com", - Avatar: "/static/fruit_avatar/Fruit-20.png", - Author: "demo1", - Remote: "https://git.coding.net/demo1/test1.git", + Event: model.EventPush, + Commit: "5b9912a6ff272e9c93a4c44c278fe9b359ed1ab4", + Ref: "refs/heads/master", + Link: "https://coding.net/u/demo1/p/test1/git/commit/5b9912a6ff272e9c93a4c44c278fe9b359ed1ab4", + Branch: "master", + Message: "new file .woodpecker.yml\n", + Email: "demo1@gmail.com", + Avatar: "/static/fruit_avatar/Fruit-20.png", + Author: "demo1", + CloneURL: "https://git.coding.net/demo1/test1.git", } actualRepo, actualPipeline, err := parseHook(r) @@ -117,16 +117,16 @@ func Test_hook(t *testing.T) { } pipeline := &model.Pipeline{ - Event: model.EventPush, - Commit: "5b9912a6ff272e9c93a4c44c278fe9b359ed1ab4", - Ref: "refs/heads/master", - Link: "https://coding.net/u/demo1/p/test1/git/commit/5b9912a6ff272e9c93a4c44c278fe9b359ed1ab4", - Branch: "master", - Message: "new file .woodpecker.yml\n", - Email: "demo1@gmail.com", - Avatar: "/static/fruit_avatar/Fruit-20.png", - Author: "demo1", - Remote: "https://git.coding.net/demo1/test1.git", + Event: model.EventPush, + Commit: "5b9912a6ff272e9c93a4c44c278fe9b359ed1ab4", + Ref: "refs/heads/master", + Link: "https://coding.net/u/demo1/p/test1/git/commit/5b9912a6ff272e9c93a4c44c278fe9b359ed1ab4", + Branch: "master", + Message: "new file .woodpecker.yml\n", + Email: "demo1@gmail.com", + Avatar: "/static/fruit_avatar/Fruit-20.png", + Author: "demo1", + CloneURL: "https://git.coding.net/demo1/test1.git", } actualRepo, actualPipeline, err := parsePushHook([]byte(fixtures.PushHook)) @@ -153,17 +153,17 @@ func Test_hook(t *testing.T) { } pipeline := &model.Pipeline{ - Event: model.EventPull, - Commit: "55e77b328b71d3ee4f9e70a5f67231b0acceeadc", - Link: "https://coding.net/u/demo1/p/test2/git/pull/1", - Ref: "refs/pull/1/MERGE", - Branch: "master", - Message: "pr message", - Author: "demo2", - Avatar: "/static/fruit_avatar/Fruit-2.png", - Title: "pr1", - Remote: "https://git.coding.net/demo1/test2.git", - Refspec: "master:master", + Event: model.EventPull, + Commit: "55e77b328b71d3ee4f9e70a5f67231b0acceeadc", + Link: "https://coding.net/u/demo1/p/test2/git/pull/1", + Ref: "refs/pull/1/MERGE", + Branch: "master", + Message: "pr message", + Author: "demo2", + Avatar: "/static/fruit_avatar/Fruit-2.png", + Title: "pr1", + CloneURL: "https://git.coding.net/demo1/test2.git", + Refspec: "master:master", } actualRepo, actualPipeline, err := parsePullRequestHook([]byte(fixtures.PullRequestHook)) @@ -183,17 +183,17 @@ func Test_hook(t *testing.T) { } pipeline := &model.Pipeline{ - Event: model.EventPull, - Commit: "74e6755580c34e9fd81dbcfcbd43ee5f30259436", - Link: "https://coding.net/u/demo1/p/test1/git/merge/1", - Ref: "refs/merge/1/MERGE", - Branch: "master", - Message: "

mr message

", - Author: "demo1", - Avatar: "/static/fruit_avatar/Fruit-20.png", - Title: "mr1", - Remote: "https://git.coding.net/demo1/test1.git", - Refspec: "branch1:master", + Event: model.EventPull, + Commit: "74e6755580c34e9fd81dbcfcbd43ee5f30259436", + Link: "https://coding.net/u/demo1/p/test1/git/merge/1", + Ref: "refs/merge/1/MERGE", + Branch: "master", + Message: "

mr message

", + Author: "demo1", + Avatar: "/static/fruit_avatar/Fruit-20.png", + Title: "mr1", + CloneURL: "https://git.coding.net/demo1/test1.git", + Refspec: "branch1:master", } actualRepo, actualPipeline, err := parseMergeReuqestHook([]byte(fixtures.MergeRequestHook)) diff --git a/server/remote/coding/internal/coding.go b/server/forge/coding/internal/coding.go similarity index 100% rename from server/remote/coding/internal/coding.go rename to server/forge/coding/internal/coding.go diff --git a/server/remote/coding/internal/error.go b/server/forge/coding/internal/error.go similarity index 100% rename from server/remote/coding/internal/error.go rename to server/forge/coding/internal/error.go diff --git a/server/remote/coding/internal/file.go b/server/forge/coding/internal/file.go similarity index 100% rename from server/remote/coding/internal/file.go rename to server/forge/coding/internal/file.go diff --git a/server/remote/coding/internal/project.go b/server/forge/coding/internal/project.go similarity index 100% rename from server/remote/coding/internal/project.go rename to server/forge/coding/internal/project.go diff --git a/server/remote/coding/internal/user.go b/server/forge/coding/internal/user.go similarity index 100% rename from server/remote/coding/internal/user.go rename to server/forge/coding/internal/user.go diff --git a/server/remote/coding/internal/webhook.go b/server/forge/coding/internal/webhook.go similarity index 100% rename from server/remote/coding/internal/webhook.go rename to server/forge/coding/internal/webhook.go diff --git a/server/remote/coding/util.go b/server/forge/coding/util.go similarity index 100% rename from server/remote/coding/util.go rename to server/forge/coding/util.go diff --git a/server/remote/coding/util_test.go b/server/forge/coding/util_test.go similarity index 100% rename from server/remote/coding/util_test.go rename to server/forge/coding/util_test.go diff --git a/server/remote/common/status.go b/server/forge/common/status.go similarity index 100% rename from server/remote/common/status.go rename to server/forge/common/status.go diff --git a/server/remote/common/status_test.go b/server/forge/common/status_test.go similarity index 100% rename from server/remote/common/status_test.go rename to server/forge/common/status_test.go diff --git a/server/remote/common/utils.go b/server/forge/common/utils.go similarity index 100% rename from server/remote/common/utils.go rename to server/forge/common/utils.go diff --git a/server/remote/common/utils_test.go b/server/forge/common/utils_test.go similarity index 95% rename from server/remote/common/utils_test.go rename to server/forge/common/utils_test.go index d8f085f97..a426cf737 100644 --- a/server/remote/common/utils_test.go +++ b/server/forge/common/utils_test.go @@ -18,7 +18,7 @@ import ( "testing" "github.com/stretchr/testify/assert" - "github.com/woodpecker-ci/woodpecker/server/remote/common" + "github.com/woodpecker-ci/woodpecker/server/forge/common" ) func Test_Netrc(t *testing.T) { diff --git a/server/remote/errors.go b/server/forge/errors.go similarity index 93% rename from server/remote/errors.go rename to server/forge/errors.go index d3df06ecd..6a0e02134 100644 --- a/server/remote/errors.go +++ b/server/forge/errors.go @@ -12,9 +12,9 @@ // See the License for the specific language governing permissions and // limitations under the License. -package remote +package forge -// AuthError represents remote authentication error. +// AuthError represents forge authentication error. type AuthError struct { Err string Description string diff --git a/server/remote/gitea/fixtures/handler.go b/server/forge/gitea/fixtures/handler.go similarity index 100% rename from server/remote/gitea/fixtures/handler.go rename to server/forge/gitea/fixtures/handler.go diff --git a/server/remote/gitea/fixtures/hooks.go b/server/forge/gitea/fixtures/hooks.go similarity index 100% rename from server/remote/gitea/fixtures/hooks.go rename to server/forge/gitea/fixtures/hooks.go diff --git a/server/remote/gitea/gitea.go b/server/forge/gitea/gitea.go similarity index 96% rename from server/remote/gitea/gitea.go rename to server/forge/gitea/gitea.go index 192dc92a8..c4b26a7b9 100644 --- a/server/remote/gitea/gitea.go +++ b/server/forge/gitea/gitea.go @@ -36,9 +36,9 @@ import ( "golang.org/x/oauth2" "github.com/woodpecker-ci/woodpecker/server" + "github.com/woodpecker-ci/woodpecker/server/forge" + "github.com/woodpecker-ci/woodpecker/server/forge/common" "github.com/woodpecker-ci/woodpecker/server/model" - "github.com/woodpecker-ci/woodpecker/server/remote" - "github.com/woodpecker-ci/woodpecker/server/remote/common" "github.com/woodpecker-ci/woodpecker/server/store" ) @@ -64,9 +64,9 @@ type Opts struct { SkipVerify bool // Skip ssl verification. } -// New returns a Remote implementation that integrates with Gitea, +// New returns a Forge implementation that integrates with Gitea, // an open source Git service written in Go. See https://gitea.io/ -func New(opts Opts) (remote.Remote, error) { +func New(opts Opts) (forge.Forge, error) { u, err := url.Parse(opts.URL) if err != nil { return nil, err @@ -112,7 +112,7 @@ func (c *Gitea) Login(ctx context.Context, w http.ResponseWriter, req *http.Requ // get the OAuth errors if err := req.FormValue("error"); err != "" { - return nil, &remote.AuthError{ + return nil, &forge.AuthError{ Err: err, Description: req.FormValue("error_description"), URI: req.FormValue("error_uri"), @@ -217,7 +217,7 @@ func (c *Gitea) TeamPerm(u *model.User, org string) (*model.Perm, error) { } // Repo returns the Gitea repository. -func (c *Gitea) Repo(ctx context.Context, u *model.User, id model.RemoteID, owner, name string) (*model.Repo, error) { +func (c *Gitea) Repo(ctx context.Context, u *model.User, id model.ForgeID, owner, name string) (*model.Repo, error) { client, err := c.newClientToken(ctx, u.Token) if err != nil { return nil, err @@ -292,8 +292,8 @@ func (c *Gitea) File(ctx context.Context, u *model.User, r *model.Repo, b *model return cfg, err } -func (c *Gitea) Dir(ctx context.Context, u *model.User, r *model.Repo, b *model.Pipeline, f string) ([]*remote.FileMeta, error) { - var configs []*remote.FileMeta +func (c *Gitea) Dir(ctx context.Context, u *model.User, r *model.Repo, b *model.Pipeline, f string) ([]*forge.FileMeta, error) { + var configs []*forge.FileMeta client, err := c.newClientToken(ctx, u.Token) if err != nil { @@ -316,7 +316,7 @@ func (c *Gitea) Dir(ctx context.Context, u *model.User, r *model.Repo, b *model. return nil, fmt.Errorf("multi-pipeline cannot get %s: %s", e.Path, err) } - configs = append(configs, &remote.FileMeta{ + configs = append(configs, &forge.FileMeta{ Name: e.Path, Data: data, }) @@ -565,7 +565,7 @@ func (c *Gitea) getChangedFilesForPR(ctx context.Context, repo *model.Repo, inde return []string{}, nil } - repo, err := _store.GetRepoNameFallback(repo.RemoteID, repo.FullName) + repo, err := _store.GetRepoNameFallback(repo.ForgeID, repo.FullName) if err != nil { return nil, err } diff --git a/server/remote/gitea/gitea_test.go b/server/forge/gitea/gitea_test.go similarity index 91% rename from server/remote/gitea/gitea_test.go rename to server/forge/gitea/gitea_test.go index 3e3ef82dd..20ccebdb1 100644 --- a/server/remote/gitea/gitea_test.go +++ b/server/forge/gitea/gitea_test.go @@ -27,8 +27,8 @@ import ( "github.com/stretchr/testify/mock" "github.com/woodpecker-ci/woodpecker/shared/utils" + "github.com/woodpecker-ci/woodpecker/server/forge/gitea/fixtures" "github.com/woodpecker-ci/woodpecker/server/model" - "github.com/woodpecker-ci/woodpecker/server/remote/gitea/fixtures" "github.com/woodpecker-ci/woodpecker/server/store" mocks_store "github.com/woodpecker-ci/woodpecker/server/store/mocks" ) @@ -51,14 +51,14 @@ func Test_gitea(t *testing.T) { s.Close() }) - g.Describe("Creating a remote", func() { + g.Describe("Creating a forge", func() { g.It("Should return client with specified options", func() { - remote, _ := New(Opts{ + forge, _ := New(Opts{ URL: "http://localhost:8080", SkipVerify: true, }) - g.Assert(remote.(*Gitea).URL).Equal("http://localhost:8080") - g.Assert(remote.(*Gitea).SkipVerify).Equal(true) + g.Assert(forge.(*Gitea).URL).Equal("http://localhost:8080") + g.Assert(forge.(*Gitea).SkipVerify).Equal(true) }) g.It("Should handle malformed url", func() { _, err := New(Opts{URL: "%gh&%ij"}) @@ -68,15 +68,15 @@ func Test_gitea(t *testing.T) { g.Describe("Generating a netrc file", func() { g.It("Should return a netrc with the user token", func() { - remote, _ := New(Opts{}) - netrc, _ := remote.Netrc(fakeUser, fakeRepo) + forge, _ := New(Opts{}) + netrc, _ := forge.Netrc(fakeUser, fakeRepo) g.Assert(netrc.Machine).Equal("gitea.com") g.Assert(netrc.Login).Equal(fakeUser.Login) g.Assert(netrc.Password).Equal(fakeUser.Token) }) g.It("Should return a netrc with the machine account", func() { - remote, _ := New(Opts{}) - netrc, _ := remote.Netrc(nil, fakeRepo) + forge, _ := New(Opts{}) + netrc, _ := forge.Netrc(nil, fakeRepo) g.Assert(netrc.Machine).Equal("gitea.com") g.Assert(netrc.Login).Equal("") g.Assert(netrc.Password).Equal("") @@ -85,7 +85,7 @@ func Test_gitea(t *testing.T) { g.Describe("Requesting a repository", func() { g.It("Should return the repository details", func() { - repo, err := c.Repo(ctx, fakeUser, fakeRepo.RemoteID, fakeRepo.Owner, fakeRepo.Name) + repo, err := c.Repo(ctx, fakeUser, fakeRepo.ForgeID, fakeRepo.Owner, fakeRepo.Name) g.Assert(err).IsNil() g.Assert(repo.Owner).Equal(fakeRepo.Owner) g.Assert(repo.Name).Equal(fakeRepo.Name) @@ -118,7 +118,7 @@ func Test_gitea(t *testing.T) { g.It("Should return the repository list", func() { repos, err := c.Repos(ctx, fakeUser) g.Assert(err).IsNil() - g.Assert(repos[0].RemoteID).Equal(fakeRepo.RemoteID) + g.Assert(repos[0].ForgeID).Equal(fakeRepo.ForgeID) g.Assert(repos[0].Owner).Equal(fakeRepo.Owner) g.Assert(repos[0].Name).Equal(fakeRepo.Name) g.Assert(repos[0].FullName).Equal(fakeRepo.Owner + "/" + fakeRepo.Name) @@ -193,7 +193,7 @@ var ( fakeRepo = &model.Repo{ Clone: "http://gitea.com/test_name/repo_name.git", - RemoteID: "5", + ForgeID: "5", Owner: "test_name", Name: "repo_name", FullName: "test_name/repo_name", diff --git a/server/remote/gitea/helper.go b/server/forge/gitea/helper.go similarity index 99% rename from server/remote/gitea/helper.go rename to server/forge/gitea/helper.go index 76fdc4356..2b93623c3 100644 --- a/server/remote/gitea/helper.go +++ b/server/forge/gitea/helper.go @@ -37,7 +37,7 @@ func toRepo(from *gitea.Repository) *model.Repo { from.Owner.AvatarURL, ) return &model.Repo{ - RemoteID: model.RemoteID(fmt.Sprint(from.ID)), + ForgeID: model.ForgeID(fmt.Sprint(from.ID)), SCMKind: model.RepoGit, Name: name, Owner: from.Owner.UserName, diff --git a/server/remote/gitea/helper_test.go b/server/forge/gitea/helper_test.go similarity index 99% rename from server/remote/gitea/helper_test.go rename to server/forge/gitea/helper_test.go index fdc23ed7b..73cae8540 100644 --- a/server/remote/gitea/helper_test.go +++ b/server/forge/gitea/helper_test.go @@ -22,8 +22,8 @@ import ( "code.gitea.io/sdk/gitea" "github.com/franela/goblin" + "github.com/woodpecker-ci/woodpecker/server/forge/gitea/fixtures" "github.com/woodpecker-ci/woodpecker/server/model" - "github.com/woodpecker-ci/woodpecker/server/remote/gitea/fixtures" "github.com/woodpecker-ci/woodpecker/shared/utils" ) diff --git a/server/remote/gitea/parse.go b/server/forge/gitea/parse.go similarity index 100% rename from server/remote/gitea/parse.go rename to server/forge/gitea/parse.go diff --git a/server/remote/gitea/parse_test.go b/server/forge/gitea/parse_test.go similarity index 97% rename from server/remote/gitea/parse_test.go rename to server/forge/gitea/parse_test.go index 5a8fb2d3e..d6191fc63 100644 --- a/server/remote/gitea/parse_test.go +++ b/server/forge/gitea/parse_test.go @@ -22,8 +22,8 @@ import ( "github.com/franela/goblin" + "github.com/woodpecker-ci/woodpecker/server/forge/gitea/fixtures" "github.com/woodpecker-ci/woodpecker/server/model" - "github.com/woodpecker-ci/woodpecker/server/remote/gitea/fixtures" "github.com/woodpecker-ci/woodpecker/shared/utils" ) diff --git a/server/remote/gitea/types.go b/server/forge/gitea/types.go similarity index 100% rename from server/remote/gitea/types.go rename to server/forge/gitea/types.go diff --git a/server/remote/github/convert.go b/server/forge/github/convert.go similarity index 97% rename from server/remote/github/convert.go rename to server/forge/github/convert.go index 67779e107..347fca41a 100644 --- a/server/remote/github/convert.go +++ b/server/forge/github/convert.go @@ -85,7 +85,7 @@ func convertDesc(status model.StatusValue) string { // structure to the common Woodpecker repository structure. func convertRepo(from *github.Repository) *model.Repo { repo := &model.Repo{ - RemoteID: model.RemoteID(fmt.Sprint(from.GetID())), + ForgeID: model.ForgeID(fmt.Sprint(from.GetID())), Name: from.GetName(), FullName: from.GetFullName(), Link: from.GetHTMLURL(), @@ -146,7 +146,7 @@ func convertTeam(from *github.Organization) *model.Team { // from a webhook and convert to the common Woodpecker repository structure. func convertRepoHook(eventRepo *github.PushEventRepository) *model.Repo { repo := &model.Repo{ - RemoteID: model.RemoteID(fmt.Sprint(eventRepo.GetID())), + ForgeID: model.ForgeID(fmt.Sprint(eventRepo.GetID())), Owner: eventRepo.GetOwner().GetLogin(), Name: eventRepo.GetName(), FullName: eventRepo.GetFullName(), diff --git a/server/remote/github/convert_test.go b/server/forge/github/convert_test.go similarity index 98% rename from server/remote/github/convert_test.go rename to server/forge/github/convert_test.go index d415d7363..0eb1691c7 100644 --- a/server/remote/github/convert_test.go +++ b/server/forge/github/convert_test.go @@ -212,7 +212,7 @@ func Test_helper(t *testing.T) { g.Assert(pipeline.Branch).Equal(*from.PullRequest.Base.Ref) g.Assert(pipeline.Ref).Equal("refs/pull/42/merge") g.Assert(pipeline.Refspec).Equal("changes:master") - g.Assert(pipeline.Remote).Equal("https://github.com/octocat/hello-world-fork") + g.Assert(pipeline.CloneURL).Equal("https://github.com/octocat/hello-world-fork") g.Assert(pipeline.Commit).Equal(*from.PullRequest.Head.SHA) g.Assert(pipeline.Message).Equal(*from.PullRequest.Title) g.Assert(pipeline.Title).Equal(*from.PullRequest.Title) @@ -266,7 +266,7 @@ func Test_helper(t *testing.T) { g.Assert(pipeline.Author).Equal(*from.Sender.Login) g.Assert(pipeline.Avatar).Equal(*from.Sender.AvatarURL) g.Assert(pipeline.Email).Equal(*from.HeadCommit.Author.Email) - g.Assert(pipeline.Remote).Equal(*from.Repo.CloneURL) + g.Assert(pipeline.CloneURL).Equal(*from.Repo.CloneURL) }) g.It("should convert a tag from webhook", func() { diff --git a/server/remote/github/fixtures/handler.go b/server/forge/github/fixtures/handler.go similarity index 100% rename from server/remote/github/fixtures/handler.go rename to server/forge/github/fixtures/handler.go diff --git a/server/remote/github/fixtures/hooks.go b/server/forge/github/fixtures/hooks.go similarity index 100% rename from server/remote/github/fixtures/hooks.go rename to server/forge/github/fixtures/hooks.go diff --git a/server/remote/github/fixtures/mock_server.go b/server/forge/github/fixtures/mock_server.go similarity index 100% rename from server/remote/github/fixtures/mock_server.go rename to server/forge/github/fixtures/mock_server.go diff --git a/server/remote/github/github.go b/server/forge/github/github.go similarity index 95% rename from server/remote/github/github.go rename to server/forge/github/github.go index 11c33a4f5..a935e68e6 100644 --- a/server/remote/github/github.go +++ b/server/forge/github/github.go @@ -30,9 +30,9 @@ import ( "golang.org/x/oauth2" "github.com/woodpecker-ci/woodpecker/server" + "github.com/woodpecker-ci/woodpecker/server/forge" + "github.com/woodpecker-ci/woodpecker/server/forge/common" "github.com/woodpecker-ci/woodpecker/server/model" - "github.com/woodpecker-ci/woodpecker/server/remote" - "github.com/woodpecker-ci/woodpecker/server/remote/common" "github.com/woodpecker-ci/woodpecker/server/store" "github.com/woodpecker-ci/woodpecker/shared/utils" ) @@ -51,9 +51,9 @@ type Opts struct { MergeRef bool // Clone pull requests using the merge ref. } -// New returns a Remote implementation that integrates with a GitHub Cloud or +// New returns a Forge implementation that integrates with a GitHub Cloud or // GitHub Enterprise version control hosting provider. -func New(opts Opts) (remote.Remote, error) { +func New(opts Opts) (forge.Forge, error) { r := &client{ API: defaultAPI, URL: defaultURL, @@ -84,13 +84,13 @@ func (c *client) Name() string { return "github" } -// Login authenticates the session and returns the remote user details. +// Login authenticates the session and returns the forge user details. func (c *client) Login(ctx context.Context, res http.ResponseWriter, req *http.Request) (*model.User, error) { config := c.newConfig(req) // get the OAuth errors if err := req.FormValue("error"); err != "" { - return nil, &remote.AuthError{ + return nil, &forge.AuthError{ Err: err, Description: req.FormValue("error_description"), URI: req.FormValue("error_uri"), @@ -165,7 +165,7 @@ func (c *client) Teams(ctx context.Context, u *model.User) ([]*model.Team, error } // Repo returns the GitHub repository. -func (c *client) Repo(ctx context.Context, u *model.User, id model.RemoteID, owner, name string) (*model.Repo, error) { +func (c *client) Repo(ctx context.Context, u *model.User, id model.ForgeID, owner, name string) (*model.Repo, error) { client := c.newClientToken(ctx, u.Token) if id.IsValid() { @@ -235,7 +235,7 @@ func (c *client) File(ctx context.Context, u *model.User, r *model.Repo, b *mode return []byte(data), err } -func (c *client) Dir(ctx context.Context, u *model.User, r *model.Repo, b *model.Pipeline, f string) ([]*remote.FileMeta, error) { +func (c *client) Dir(ctx context.Context, u *model.User, r *model.Repo, b *model.Pipeline, f string) ([]*forge.FileMeta, error) { client := c.newClientToken(ctx, u.Token) opts := new(github.RepositoryContentGetOptions) @@ -245,7 +245,7 @@ func (c *client) Dir(ctx context.Context, u *model.User, r *model.Repo, b *model return nil, err } - fc := make(chan *remote.FileMeta) + fc := make(chan *forge.FileMeta) errc := make(chan error) for _, file := range data { @@ -254,7 +254,7 @@ func (c *client) Dir(ctx context.Context, u *model.User, r *model.Repo, b *model if err != nil { errc <- err } else { - fc <- &remote.FileMeta{ + fc <- &forge.FileMeta{ Name: path, Data: content, } @@ -262,7 +262,7 @@ func (c *client) Dir(ctx context.Context, u *model.User, r *model.Repo, b *model }(f + "/" + *file.Name) } - var files []*remote.FileMeta + var files []*forge.FileMeta for i := 0; i < len(data); i++ { select { @@ -332,7 +332,7 @@ func (c *client) OrgMembership(ctx context.Context, u *model.User, owner string) } // helper function to return the GitHub oauth2 context using an HTTPClient that -// disables TLS verification if disabled in the remote settings. +// disables TLS verification if disabled in the forge settings. func (c *client) newContext(ctx context.Context) context.Context { if !c.SkipVerify { return ctx @@ -435,7 +435,7 @@ func matchingHooks(hooks []*github.Hook, rawurl string) *github.Hook { var reDeploy = regexp.MustCompile(`.+/deployments/(\d+)`) -// Status sends the commit status to the remote system. +// Status sends the commit status to the forge. // An example would be the GitHub pull request status. func (c *client) Status(ctx context.Context, user *model.User, repo *model.Repo, pipeline *model.Pipeline, step *model.Step) error { client := c.newClientToken(ctx, user.Token) @@ -545,7 +545,7 @@ func (c *client) loadChangedFilesFromPullRequest(ctx context.Context, pull *gith return pipeline, nil } - repo, err := _store.GetRepoNameFallback(tmpRepo.RemoteID, tmpRepo.FullName) + repo, err := _store.GetRepoNameFallback(tmpRepo.ForgeID, tmpRepo.FullName) if err != nil { return nil, err } diff --git a/server/remote/github/github_test.go b/server/forge/github/github_test.go similarity index 83% rename from server/remote/github/github_test.go rename to server/forge/github/github_test.go index d5b33cf1d..e0a030b86 100644 --- a/server/remote/github/github_test.go +++ b/server/forge/github/github_test.go @@ -23,8 +23,8 @@ import ( "github.com/franela/goblin" "github.com/gin-gonic/gin" + "github.com/woodpecker-ci/woodpecker/server/forge/github/fixtures" "github.com/woodpecker-ci/woodpecker/server/model" - "github.com/woodpecker-ci/woodpecker/server/remote/github/fixtures" ) func Test_github(t *testing.T) { @@ -43,33 +43,33 @@ func Test_github(t *testing.T) { s.Close() }) - g.Describe("Creating a remote", func() { + g.Describe("Creating a forge", func() { g.It("Should return client with specified options", func() { - remote, _ := New(Opts{ + forge, _ := New(Opts{ URL: "http://localhost:8080/", Client: "0ZXh0IjoiI", Secret: "I1NiIsInR5", SkipVerify: true, }) - g.Assert(remote.(*client).URL).Equal("http://localhost:8080") - g.Assert(remote.(*client).API).Equal("http://localhost:8080/api/v3/") - g.Assert(remote.(*client).Client).Equal("0ZXh0IjoiI") - g.Assert(remote.(*client).Secret).Equal("I1NiIsInR5") - g.Assert(remote.(*client).SkipVerify).Equal(true) + g.Assert(forge.(*client).URL).Equal("http://localhost:8080") + g.Assert(forge.(*client).API).Equal("http://localhost:8080/api/v3/") + g.Assert(forge.(*client).Client).Equal("0ZXh0IjoiI") + g.Assert(forge.(*client).Secret).Equal("I1NiIsInR5") + g.Assert(forge.(*client).SkipVerify).Equal(true) }) }) g.Describe("Generating a netrc file", func() { g.It("Should return a netrc with the user token", func() { - remote, _ := New(Opts{}) - netrc, _ := remote.Netrc(fakeUser, fakeRepo) + forge, _ := New(Opts{}) + netrc, _ := forge.Netrc(fakeUser, fakeRepo) g.Assert(netrc.Machine).Equal("github.com") g.Assert(netrc.Login).Equal(fakeUser.Token) g.Assert(netrc.Password).Equal("x-oauth-basic") }) g.It("Should return a netrc with the machine account", func() { - remote, _ := New(Opts{}) - netrc, _ := remote.Netrc(nil, fakeRepo) + forge, _ := New(Opts{}) + netrc, _ := forge.Netrc(nil, fakeRepo) g.Assert(netrc.Machine).Equal("github.com") g.Assert(netrc.Login).Equal("") g.Assert(netrc.Password).Equal("") @@ -78,9 +78,9 @@ func Test_github(t *testing.T) { g.Describe("Requesting a repository", func() { g.It("Should return the repository details", func() { - repo, err := c.Repo(ctx, fakeUser, fakeRepo.RemoteID, fakeRepo.Owner, fakeRepo.Name) + repo, err := c.Repo(ctx, fakeUser, fakeRepo.ForgeID, fakeRepo.Owner, fakeRepo.Name) g.Assert(err).IsNil() - g.Assert(repo.RemoteID).Equal(fakeRepo.RemoteID) + g.Assert(repo.ForgeID).Equal(fakeRepo.ForgeID) g.Assert(repo.Owner).Equal(fakeRepo.Owner) g.Assert(repo.Name).Equal(fakeRepo.Name) g.Assert(repo.FullName).Equal(fakeRepo.FullName) @@ -133,7 +133,7 @@ var ( } fakeRepo = &model.Repo{ - RemoteID: "5", + ForgeID: "5", Owner: "octocat", Name: "Hello-World", FullName: "octocat/Hello-World", diff --git a/server/remote/github/parse.go b/server/forge/github/parse.go similarity index 90% rename from server/remote/github/parse.go rename to server/forge/github/parse.go index d10621cb6..b2c50c67c 100644 --- a/server/remote/github/parse.go +++ b/server/forge/github/parse.go @@ -86,7 +86,7 @@ func parsePushHook(hook *github.PushEvent) (*model.Repo, *model.Pipeline, error) Email: hook.GetHeadCommit().GetAuthor().GetEmail(), Avatar: hook.GetSender().GetAvatarURL(), Author: hook.GetSender().GetLogin(), - Remote: hook.GetRepo().GetCloneURL(), + CloneURL: hook.GetRepo().GetCloneURL(), Sender: hook.GetSender().GetLogin(), ChangedFiles: getChangedFilesFromCommits(hook.Commits), } @@ -155,17 +155,17 @@ func parsePullHook(hook *github.PullRequestEvent, merge bool) (*github.PullReque } pipeline := &model.Pipeline{ - Event: model.EventPull, - Commit: hook.GetPullRequest().GetHead().GetSHA(), - Link: hook.GetPullRequest().GetHTMLURL(), - Ref: fmt.Sprintf(headRefs, hook.GetPullRequest().GetNumber()), - Branch: hook.GetPullRequest().GetBase().GetRef(), - Message: hook.GetPullRequest().GetTitle(), - Author: hook.GetPullRequest().GetUser().GetLogin(), - Avatar: hook.GetPullRequest().GetUser().GetAvatarURL(), - Title: hook.GetPullRequest().GetTitle(), - Sender: hook.GetSender().GetLogin(), - Remote: hook.GetPullRequest().GetHead().GetRepo().GetCloneURL(), + Event: model.EventPull, + Commit: hook.GetPullRequest().GetHead().GetSHA(), + Link: hook.GetPullRequest().GetHTMLURL(), + Ref: fmt.Sprintf(headRefs, hook.GetPullRequest().GetNumber()), + Branch: hook.GetPullRequest().GetBase().GetRef(), + Message: hook.GetPullRequest().GetTitle(), + Author: hook.GetPullRequest().GetUser().GetLogin(), + Avatar: hook.GetPullRequest().GetUser().GetAvatarURL(), + Title: hook.GetPullRequest().GetTitle(), + Sender: hook.GetSender().GetLogin(), + CloneURL: hook.GetPullRequest().GetHead().GetRepo().GetCloneURL(), Refspec: fmt.Sprintf(refSpec, hook.GetPullRequest().GetHead().GetRef(), hook.GetPullRequest().GetBase().GetRef(), diff --git a/server/remote/github/parse_test.go b/server/forge/github/parse_test.go similarity index 98% rename from server/remote/github/parse_test.go rename to server/forge/github/parse_test.go index 7d988a573..ce30655f3 100644 --- a/server/remote/github/parse_test.go +++ b/server/forge/github/parse_test.go @@ -23,8 +23,8 @@ import ( "github.com/franela/goblin" + "github.com/woodpecker-ci/woodpecker/server/forge/github/fixtures" "github.com/woodpecker-ci/woodpecker/server/model" - "github.com/woodpecker-ci/woodpecker/server/remote/github/fixtures" ) const ( diff --git a/server/remote/gitlab/convert.go b/server/forge/gitlab/convert.go similarity index 95% rename from server/remote/gitlab/convert.go rename to server/forge/gitlab/convert.go index 67670275a..f89d7b08c 100644 --- a/server/remote/gitlab/convert.go +++ b/server/forge/gitlab/convert.go @@ -37,7 +37,7 @@ func (g *Gitlab) convertGitlabRepo(_repo *gitlab.Project) (*model.Repo, error) { owner := strings.Join(parts[:len(parts)-1], "/") name := parts[len(parts)-1] repo := &model.Repo{ - RemoteID: model.RemoteID(fmt.Sprint(_repo.ID)), + ForgeID: model.ForgeID(fmt.Sprint(_repo.ID)), Owner: owner, Name: name, FullName: _repo.PathWithNamespace, @@ -88,7 +88,7 @@ func convertMergeRequestHook(hook *gitlab.MergeEvent, req *http.Request) (int, * repo.FullName = fmt.Sprintf("%s/%s", repo.Owner, repo.Name) } - repo.RemoteID = model.RemoteID(fmt.Sprint(obj.TargetProjectID)) + repo.ForgeID = model.ForgeID(fmt.Sprint(obj.TargetProjectID)) repo.Link = target.WebURL if target.GitHTTPURL != "" { @@ -113,7 +113,7 @@ func convertMergeRequestHook(hook *gitlab.MergeEvent, req *http.Request) (int, * pipeline.Message = lastCommit.Message pipeline.Commit = lastCommit.ID - pipeline.Remote = obj.Source.HTTPURL + pipeline.CloneURL = obj.Source.HTTPURL pipeline.Ref = fmt.Sprintf(mergeRefs, obj.IID) pipeline.Branch = obj.SourceBranch @@ -142,7 +142,7 @@ func convertPushHook(hook *gitlab.PushEvent) (*model.Repo, *model.Pipeline, erro return nil, nil, err } - repo.RemoteID = model.RemoteID(fmt.Sprint(hook.ProjectID)) + repo.ForgeID = model.ForgeID(fmt.Sprint(hook.ProjectID)) repo.Avatar = hook.Project.AvatarURL repo.Link = hook.Project.WebURL repo.Clone = hook.Project.GitHTTPURL @@ -194,7 +194,7 @@ func convertTagHook(hook *gitlab.TagEvent) (*model.Repo, *model.Pipeline, error) return nil, nil, err } - repo.RemoteID = model.RemoteID(fmt.Sprint(hook.ProjectID)) + repo.ForgeID = model.ForgeID(fmt.Sprint(hook.ProjectID)) repo.Avatar = hook.Project.AvatarURL repo.Link = hook.Project.WebURL repo.Clone = hook.Project.GitHTTPURL diff --git a/server/remote/gitlab/gitlab.go b/server/forge/gitlab/gitlab.go similarity index 93% rename from server/remote/gitlab/gitlab.go rename to server/forge/gitlab/gitlab.go index 7c57bd384..817537e00 100644 --- a/server/remote/gitlab/gitlab.go +++ b/server/forge/gitlab/gitlab.go @@ -31,9 +31,9 @@ import ( "golang.org/x/oauth2" "github.com/woodpecker-ci/woodpecker/server" + "github.com/woodpecker-ci/woodpecker/server/forge" + "github.com/woodpecker-ci/woodpecker/server/forge/common" "github.com/woodpecker-ci/woodpecker/server/model" - "github.com/woodpecker-ci/woodpecker/server/remote" - "github.com/woodpecker-ci/woodpecker/server/remote/common" "github.com/woodpecker-ci/woodpecker/server/store" "github.com/woodpecker-ci/woodpecker/shared/utils" ) @@ -51,7 +51,7 @@ type Opts struct { SkipVerify bool // Skip ssl verification. } -// Gitlab implements "Remote" interface +// Gitlab implements "Forge" interface type Gitlab struct { URL string ClientID string @@ -61,9 +61,9 @@ type Gitlab struct { Search bool } -// New returns a Remote implementation that integrates with Gitlab, an open +// New returns a Forge implementation that integrates with Gitlab, an open // source Git service. See https://gitlab.com -func New(opts Opts) (remote.Remote, error) { +func New(opts Opts) (forge.Forge, error) { return &Gitlab{ URL: opts.URL, ClientID: opts.ClientID, @@ -96,13 +96,13 @@ func (g *Gitlab) oauth2Config(ctx context.Context) (*oauth2.Config, context.Cont } // Login authenticates the session and returns the -// remote user details. +// forge user details. func (g *Gitlab) Login(ctx context.Context, res http.ResponseWriter, req *http.Request) (*model.User, error) { config, oauth2Ctx := g.oauth2Config(ctx) // get the OAuth errors if err := req.FormValue("error"); err != "" { - return nil, &remote.AuthError{ + return nil, &forge.AuthError{ Err: err, Description: req.FormValue("error_description"), URI: req.FormValue("error_uri"), @@ -168,7 +168,7 @@ func (g *Gitlab) Refresh(ctx context.Context, user *model.User) (bool, error) { return true, nil } -// Auth authenticates the session and returns the remote user login for the given token +// Auth authenticates the session and returns the forge user login for the given token func (g *Gitlab) Auth(ctx context.Context, token, _ string) (string, error) { client, err := newClient(g.URL, token, g.SkipVerify) if err != nil { @@ -182,7 +182,7 @@ func (g *Gitlab) Auth(ctx context.Context, token, _ string) (string, error) { return login.Username, nil } -// Teams fetches a list of team memberships from the remote system. +// Teams fetches a list of team memberships from the forge. func (g *Gitlab) Teams(ctx context.Context, user *model.User) ([]*model.Team, error) { client, err := newClient(g.URL, user.Token, g.SkipVerify) if err != nil { @@ -217,7 +217,7 @@ func (g *Gitlab) Teams(ctx context.Context, user *model.User) ([]*model.Team, er return teams, nil } -// getProject fetches the named repository from the remote system. +// getProject fetches the named repository from the forge. func (g *Gitlab) getProject(ctx context.Context, client *gitlab.Client, owner, name string) (*gitlab.Project, error) { repo, _, err := client.Projects.GetProject(fmt.Sprintf("%s/%s", owner, name), nil, gitlab.WithContext(ctx)) if err != nil { @@ -227,8 +227,8 @@ func (g *Gitlab) getProject(ctx context.Context, client *gitlab.Client, owner, n return repo, nil } -// Repo fetches the repository from the remote system. -func (g *Gitlab) Repo(ctx context.Context, user *model.User, id model.RemoteID, owner, name string) (*model.Repo, error) { +// Repo fetches the repository from the forge. +func (g *Gitlab) Repo(ctx context.Context, user *model.User, id model.ForgeID, owner, name string) (*model.Repo, error) { client, err := newClient(g.URL, user.Token, g.SkipVerify) if err != nil { return nil, err @@ -254,7 +254,7 @@ func (g *Gitlab) Repo(ctx context.Context, user *model.User, id model.RemoteID, return g.convertGitlabRepo(_repo) } -// Repos fetches a list of repos from the remote system. +// Repos fetches a list of repos from the forge. func (g *Gitlab) Repos(ctx context.Context, user *model.User) ([]*model.Repo, error) { client, err := newClient(g.URL, user.Token, g.SkipVerify) if err != nil { @@ -300,7 +300,7 @@ func (g *Gitlab) Repos(ctx context.Context, user *model.User) ([]*model.Repo, er return repos, err } -// Perm fetches the named repository from the remote system. +// Perm fetches the named repository from the forge. func (g *Gitlab) Perm(ctx context.Context, user *model.User, r *model.Repo) (*model.Perm, error) { client, err := newClient(g.URL, user.Token, g.SkipVerify) if err != nil { @@ -324,7 +324,7 @@ func (g *Gitlab) Perm(ctx context.Context, user *model.User, r *model.Repo) (*mo }, nil } -// File fetches a file from the remote repository and returns in string format. +// File fetches a file from the forge repository and returns in string format. func (g *Gitlab) File(ctx context.Context, user *model.User, repo *model.Repo, pipeline *model.Pipeline, fileName string) ([]byte, error) { client, err := newClient(g.URL, user.Token, g.SkipVerify) if err != nil { @@ -338,14 +338,14 @@ func (g *Gitlab) File(ctx context.Context, user *model.User, repo *model.Repo, p return file, err } -// Dir fetches a folder from the remote repository -func (g *Gitlab) Dir(ctx context.Context, user *model.User, repo *model.Repo, pipeline *model.Pipeline, path string) ([]*remote.FileMeta, error) { +// Dir fetches a folder from the forge repository +func (g *Gitlab) Dir(ctx context.Context, user *model.User, repo *model.Repo, pipeline *model.Pipeline, path string) ([]*forge.FileMeta, error) { client, err := newClient(g.URL, user.Token, g.SkipVerify) if err != nil { return nil, err } - files := make([]*remote.FileMeta, 0, perPage) + files := make([]*forge.FileMeta, 0, perPage) _repo, err := g.getProject(ctx, client, repo.Owner, repo.Name) if err != nil { return nil, err @@ -372,7 +372,7 @@ func (g *Gitlab) Dir(ctx context.Context, user *model.User, repo *model.Repo, pi if err != nil { return nil, err } - files = append(files, &remote.FileMeta{ + files = append(files, &forge.FileMeta{ Name: batch[i].Path, Data: data, }) @@ -681,7 +681,7 @@ func (g *Gitlab) loadChangedFilesFromMergeRequest(ctx context.Context, tmpRepo * return pipeline, nil } - repo, err := _store.GetRepoNameFallback(tmpRepo.RemoteID, tmpRepo.FullName) + repo, err := _store.GetRepoNameFallback(tmpRepo.ForgeID, tmpRepo.FullName) if err != nil { return nil, err } diff --git a/server/remote/gitlab/gitlab_test.go b/server/forge/gitlab/gitlab_test.go similarity index 99% rename from server/remote/gitlab/gitlab_test.go rename to server/forge/gitlab/gitlab_test.go index e6dd66b59..5dc80eab2 100644 --- a/server/remote/gitlab/gitlab_test.go +++ b/server/forge/gitlab/gitlab_test.go @@ -26,8 +26,8 @@ import ( "github.com/franela/goblin" "github.com/stretchr/testify/assert" + "github.com/woodpecker-ci/woodpecker/server/forge/gitlab/testdata" "github.com/woodpecker-ci/woodpecker/server/model" - "github.com/woodpecker-ci/woodpecker/server/remote/gitlab/testdata" ) func load(t *testing.T, config string) *Gitlab { diff --git a/server/remote/gitlab/helper.go b/server/forge/gitlab/helper.go similarity index 100% rename from server/remote/gitlab/helper.go rename to server/forge/gitlab/helper.go diff --git a/server/remote/gitlab/status.go b/server/forge/gitlab/status.go similarity index 100% rename from server/remote/gitlab/status.go rename to server/forge/gitlab/status.go diff --git a/server/remote/gitlab/testdata/hooks.go b/server/forge/gitlab/testdata/hooks.go similarity index 100% rename from server/remote/gitlab/testdata/hooks.go rename to server/forge/gitlab/testdata/hooks.go diff --git a/server/remote/gitlab/testdata/oauth.go b/server/forge/gitlab/testdata/oauth.go similarity index 100% rename from server/remote/gitlab/testdata/oauth.go rename to server/forge/gitlab/testdata/oauth.go diff --git a/server/remote/gitlab/testdata/projects.go b/server/forge/gitlab/testdata/projects.go similarity index 100% rename from server/remote/gitlab/testdata/projects.go rename to server/forge/gitlab/testdata/projects.go diff --git a/server/remote/gitlab/testdata/testdata.go b/server/forge/gitlab/testdata/testdata.go similarity index 96% rename from server/remote/gitlab/testdata/testdata.go rename to server/forge/gitlab/testdata/testdata.go index 71f30f6e6..f07583af6 100644 --- a/server/remote/gitlab/testdata/testdata.go +++ b/server/forge/gitlab/testdata/testdata.go @@ -27,7 +27,7 @@ func NewServer(t *testing.T) *httptest.Server { // handle requests and serve mock data mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { - t.Logf("gitlab remote mock server: [%s] %s", r.Method, r.URL.Path) + t.Logf("gitlab forge mock server: [%s] %s", r.Method, r.URL.Path) // evaluate the path to serve a dummy data file // TODO: find source of "/api/v4/" requests diff --git a/server/remote/gitlab/testdata/users.go b/server/forge/gitlab/testdata/users.go similarity index 100% rename from server/remote/gitlab/testdata/users.go rename to server/forge/gitlab/testdata/users.go diff --git a/server/remote/gogs/fixtures/handler.go b/server/forge/gogs/fixtures/handler.go similarity index 100% rename from server/remote/gogs/fixtures/handler.go rename to server/forge/gogs/fixtures/handler.go diff --git a/server/remote/gogs/fixtures/hooks.go b/server/forge/gogs/fixtures/hooks.go similarity index 100% rename from server/remote/gogs/fixtures/hooks.go rename to server/forge/gogs/fixtures/hooks.go diff --git a/server/remote/gogs/gogs.go b/server/forge/gogs/gogs.go similarity index 96% rename from server/remote/gogs/gogs.go rename to server/forge/gogs/gogs.go index cf48cc1b9..0cae9c55e 100644 --- a/server/remote/gogs/gogs.go +++ b/server/forge/gogs/gogs.go @@ -26,9 +26,9 @@ import ( "github.com/gogits/go-gogs-client" + "github.com/woodpecker-ci/woodpecker/server/forge" + "github.com/woodpecker-ci/woodpecker/server/forge/common" "github.com/woodpecker-ci/woodpecker/server/model" - "github.com/woodpecker-ci/woodpecker/server/remote" - "github.com/woodpecker-ci/woodpecker/server/remote/common" ) // Opts defines configuration options. @@ -48,9 +48,9 @@ type client struct { SkipVerify bool } -// New returns a Remote implementation that integrates with Gogs, an open +// New returns a Forge implementation that integrates with Gogs, an open // source Git service written in Go. See https://gogs.io/ -func New(opts Opts) (remote.Remote, error) { +func New(opts Opts) (forge.Forge, error) { u, err := url.Parse(opts.URL) if err != nil { return nil, err @@ -149,7 +149,7 @@ func (c *client) Teams(ctx context.Context, u *model.User) ([]*model.Team, error } // Repo returns the named Gogs repository. -func (c *client) Repo(ctx context.Context, u *model.User, _ model.RemoteID, owner, name string) (*model.Repo, error) { +func (c *client) Repo(ctx context.Context, u *model.User, _ model.ForgeID, owner, name string) (*model.Repo, error) { client := c.newClientToken(u.Token) repo, err := client.GetRepo(owner, name) if err != nil { @@ -209,7 +209,7 @@ func (c *client) File(ctx context.Context, u *model.User, r *model.Repo, b *mode return cfg, err } -func (c *client) Dir(ctx context.Context, u *model.User, r *model.Repo, b *model.Pipeline, f string) ([]*remote.FileMeta, error) { +func (c *client) Dir(ctx context.Context, u *model.User, r *model.Repo, b *model.Pipeline, f string) ([]*forge.FileMeta, error) { return nil, fmt.Errorf("Not implemented") } diff --git a/server/remote/gogs/gogs_test.go b/server/forge/gogs/gogs_test.go similarity index 88% rename from server/remote/gogs/gogs_test.go rename to server/forge/gogs/gogs_test.go index 1e35cbb21..40dd3d55f 100644 --- a/server/remote/gogs/gogs_test.go +++ b/server/forge/gogs/gogs_test.go @@ -23,8 +23,8 @@ import ( "github.com/franela/goblin" "github.com/gin-gonic/gin" + "github.com/woodpecker-ci/woodpecker/server/forge/gogs/fixtures" "github.com/woodpecker-ci/woodpecker/server/model" - "github.com/woodpecker-ci/woodpecker/server/remote/gogs/fixtures" ) func Test_gogs(t *testing.T) { @@ -43,20 +43,20 @@ func Test_gogs(t *testing.T) { s.Close() }) - g.Describe("Creating a remote", func() { + g.Describe("Creating a forge", func() { g.It("Should return client with specified options", func() { - remote, _ := New(Opts{ + forge, _ := New(Opts{ URL: "http://localhost:8080", Username: "someuser", Password: "password", SkipVerify: true, PrivateMode: true, }) - g.Assert(remote.(*client).URL).Equal("http://localhost:8080") - g.Assert(remote.(*client).Username).Equal("someuser") - g.Assert(remote.(*client).Password).Equal("password") - g.Assert(remote.(*client).SkipVerify).Equal(true) - g.Assert(remote.(*client).PrivateMode).Equal(true) + g.Assert(forge.(*client).URL).Equal("http://localhost:8080") + g.Assert(forge.(*client).Username).Equal("someuser") + g.Assert(forge.(*client).Password).Equal("password") + g.Assert(forge.(*client).SkipVerify).Equal(true) + g.Assert(forge.(*client).PrivateMode).Equal(true) }) g.It("Should handle malformed url", func() { _, err := New(Opts{URL: "%gh&%ij"}) @@ -66,18 +66,18 @@ func Test_gogs(t *testing.T) { g.Describe("Generating a netrc file", func() { g.It("Should return a netrc with the user token", func() { - remote, _ := New(Opts{}) - netrc, _ := remote.Netrc(fakeUser, fakeRepo) + forge, _ := New(Opts{}) + netrc, _ := forge.Netrc(fakeUser, fakeRepo) g.Assert(netrc.Machine).Equal("gogs.com") g.Assert(netrc.Login).Equal(fakeUser.Token) g.Assert(netrc.Password).Equal("x-oauth-basic") }) g.It("Should return a netrc with the machine account", func() { - remote, _ := New(Opts{ + forge, _ := New(Opts{ Username: "someuser", Password: "password", }) - netrc, _ := remote.Netrc(nil, fakeRepo) + netrc, _ := forge.Netrc(nil, fakeRepo) g.Assert(netrc.Machine).Equal("gogs.com") g.Assert(netrc.Login).Equal("someuser") g.Assert(netrc.Password).Equal("password") @@ -86,7 +86,7 @@ func Test_gogs(t *testing.T) { g.Describe("Requesting a repository", func() { g.It("Should return the repository details", func() { - repo, err := c.Repo(ctx, fakeUser, fakeRepo.RemoteID, fakeRepo.Owner, fakeRepo.Name) + repo, err := c.Repo(ctx, fakeUser, fakeRepo.ForgeID, fakeRepo.Owner, fakeRepo.Name) g.Assert(err).IsNil() g.Assert(repo.Owner).Equal(fakeRepo.Owner) g.Assert(repo.Name).Equal(fakeRepo.Name) @@ -119,7 +119,7 @@ func Test_gogs(t *testing.T) { g.It("Should return the repository list", func() { repos, err := c.Repos(ctx, fakeUser) g.Assert(err).IsNil() - g.Assert(repos[0].RemoteID).Equal(fakeRepo.RemoteID) + g.Assert(repos[0].ForgeID).Equal(fakeRepo.ForgeID) g.Assert(repos[0].Owner).Equal(fakeRepo.Owner) g.Assert(repos[0].Name).Equal(fakeRepo.Name) g.Assert(repos[0].FullName).Equal(fakeRepo.Owner + "/" + fakeRepo.Name) @@ -183,7 +183,7 @@ var ( } fakeRepo = &model.Repo{ - RemoteID: "5", + ForgeID: "5", Clone: "http://gogs.com/test_name/repo_name.git", Owner: "test_name", Name: "repo_name", diff --git a/server/remote/gogs/helper.go b/server/forge/gogs/helper.go similarity index 99% rename from server/remote/gogs/helper.go rename to server/forge/gogs/helper.go index 727e64971..60298b14e 100644 --- a/server/remote/gogs/helper.go +++ b/server/forge/gogs/helper.go @@ -36,7 +36,7 @@ func toRepo(from *gogs.Repository, privateMode bool) *model.Repo { from.Owner.AvatarUrl, ) return &model.Repo{ - RemoteID: model.RemoteID(fmt.Sprint(from.ID)), + ForgeID: model.ForgeID(fmt.Sprint(from.ID)), SCMKind: model.RepoGit, Name: name, Owner: from.Owner.UserName, diff --git a/server/remote/gogs/helper_test.go b/server/forge/gogs/helper_test.go similarity index 99% rename from server/remote/gogs/helper_test.go rename to server/forge/gogs/helper_test.go index c37650767..df80081e6 100644 --- a/server/remote/gogs/helper_test.go +++ b/server/forge/gogs/helper_test.go @@ -22,8 +22,8 @@ import ( "github.com/franela/goblin" "github.com/gogits/go-gogs-client" + "github.com/woodpecker-ci/woodpecker/server/forge/gogs/fixtures" "github.com/woodpecker-ci/woodpecker/server/model" - "github.com/woodpecker-ci/woodpecker/server/remote/gogs/fixtures" ) func Test_parse(t *testing.T) { diff --git a/server/remote/gogs/parse.go b/server/forge/gogs/parse.go similarity index 100% rename from server/remote/gogs/parse.go rename to server/forge/gogs/parse.go diff --git a/server/remote/gogs/types.go b/server/forge/gogs/types.go similarity index 100% rename from server/remote/gogs/types.go rename to server/forge/gogs/types.go diff --git a/server/remote/mocks/remote.go b/server/forge/mocks/forge.go similarity index 76% rename from server/remote/mocks/remote.go rename to server/forge/mocks/forge.go index 852723ed2..0a6ca4ae8 100644 --- a/server/remote/mocks/remote.go +++ b/server/forge/mocks/forge.go @@ -6,20 +6,20 @@ import ( context "context" http "net/http" + forge "github.com/woodpecker-ci/woodpecker/server/forge" + mock "github.com/stretchr/testify/mock" model "github.com/woodpecker-ci/woodpecker/server/model" - - remote "github.com/woodpecker-ci/woodpecker/server/remote" ) -// Remote is an autogenerated mock type for the Remote type -type Remote struct { +// Forge is an autogenerated mock type for the Forge type +type Forge struct { mock.Mock } // Activate provides a mock function with given fields: ctx, u, r, link -func (_m *Remote) Activate(ctx context.Context, u *model.User, r *model.Repo, link string) error { +func (_m *Forge) Activate(ctx context.Context, u *model.User, r *model.Repo, link string) error { ret := _m.Called(ctx, u, r, link) var r0 error @@ -33,7 +33,7 @@ func (_m *Remote) Activate(ctx context.Context, u *model.User, r *model.Repo, li } // Auth provides a mock function with given fields: ctx, token, secret -func (_m *Remote) Auth(ctx context.Context, token string, secret string) (string, error) { +func (_m *Forge) Auth(ctx context.Context, token string, secret string) (string, error) { ret := _m.Called(ctx, token, secret) var r0 string @@ -54,7 +54,7 @@ func (_m *Remote) Auth(ctx context.Context, token string, secret string) (string } // BranchHead provides a mock function with given fields: ctx, u, r, branch -func (_m *Remote) BranchHead(ctx context.Context, u *model.User, r *model.Repo, branch string) (string, error) { +func (_m *Forge) BranchHead(ctx context.Context, u *model.User, r *model.Repo, branch string) (string, error) { ret := _m.Called(ctx, u, r, branch) var r0 string @@ -75,7 +75,7 @@ func (_m *Remote) BranchHead(ctx context.Context, u *model.User, r *model.Repo, } // Branches provides a mock function with given fields: ctx, u, r -func (_m *Remote) Branches(ctx context.Context, u *model.User, r *model.Repo) ([]string, error) { +func (_m *Forge) Branches(ctx context.Context, u *model.User, r *model.Repo) ([]string, error) { ret := _m.Called(ctx, u, r) var r0 []string @@ -98,7 +98,7 @@ func (_m *Remote) Branches(ctx context.Context, u *model.User, r *model.Repo) ([ } // Deactivate provides a mock function with given fields: ctx, u, r, link -func (_m *Remote) Deactivate(ctx context.Context, u *model.User, r *model.Repo, link string) error { +func (_m *Forge) Deactivate(ctx context.Context, u *model.User, r *model.Repo, link string) error { ret := _m.Called(ctx, u, r, link) var r0 error @@ -112,15 +112,15 @@ func (_m *Remote) Deactivate(ctx context.Context, u *model.User, r *model.Repo, } // Dir provides a mock function with given fields: ctx, u, r, b, f -func (_m *Remote) Dir(ctx context.Context, u *model.User, r *model.Repo, b *model.Pipeline, f string) ([]*remote.FileMeta, error) { +func (_m *Forge) Dir(ctx context.Context, u *model.User, r *model.Repo, b *model.Pipeline, f string) ([]*forge.FileMeta, error) { ret := _m.Called(ctx, u, r, b, f) - var r0 []*remote.FileMeta - if rf, ok := ret.Get(0).(func(context.Context, *model.User, *model.Repo, *model.Pipeline, string) []*remote.FileMeta); ok { + var r0 []*forge.FileMeta + if rf, ok := ret.Get(0).(func(context.Context, *model.User, *model.Repo, *model.Pipeline, string) []*forge.FileMeta); ok { r0 = rf(ctx, u, r, b, f) } else { if ret.Get(0) != nil { - r0 = ret.Get(0).([]*remote.FileMeta) + r0 = ret.Get(0).([]*forge.FileMeta) } } @@ -135,7 +135,7 @@ func (_m *Remote) Dir(ctx context.Context, u *model.User, r *model.Repo, b *mode } // File provides a mock function with given fields: ctx, u, r, b, f -func (_m *Remote) File(ctx context.Context, u *model.User, r *model.Repo, b *model.Pipeline, f string) ([]byte, error) { +func (_m *Forge) File(ctx context.Context, u *model.User, r *model.Repo, b *model.Pipeline, f string) ([]byte, error) { ret := _m.Called(ctx, u, r, b, f) var r0 []byte @@ -158,7 +158,7 @@ func (_m *Remote) File(ctx context.Context, u *model.User, r *model.Repo, b *mod } // Hook provides a mock function with given fields: ctx, r -func (_m *Remote) Hook(ctx context.Context, r *http.Request) (*model.Repo, *model.Pipeline, error) { +func (_m *Forge) Hook(ctx context.Context, r *http.Request) (*model.Repo, *model.Pipeline, error) { ret := _m.Called(ctx, r) var r0 *model.Repo @@ -190,7 +190,7 @@ func (_m *Remote) Hook(ctx context.Context, r *http.Request) (*model.Repo, *mode } // Login provides a mock function with given fields: ctx, w, r -func (_m *Remote) Login(ctx context.Context, w http.ResponseWriter, r *http.Request) (*model.User, error) { +func (_m *Forge) Login(ctx context.Context, w http.ResponseWriter, r *http.Request) (*model.User, error) { ret := _m.Called(ctx, w, r) var r0 *model.User @@ -213,7 +213,7 @@ func (_m *Remote) Login(ctx context.Context, w http.ResponseWriter, r *http.Requ } // Name provides a mock function with given fields: -func (_m *Remote) Name() string { +func (_m *Forge) Name() string { ret := _m.Called() var r0 string @@ -227,7 +227,7 @@ func (_m *Remote) Name() string { } // Netrc provides a mock function with given fields: u, r -func (_m *Remote) Netrc(u *model.User, r *model.Repo) (*model.Netrc, error) { +func (_m *Forge) Netrc(u *model.User, r *model.Repo) (*model.Netrc, error) { ret := _m.Called(u, r) var r0 *model.Netrc @@ -250,7 +250,7 @@ func (_m *Remote) Netrc(u *model.User, r *model.Repo) (*model.Netrc, error) { } // OrgMembership provides a mock function with given fields: ctx, u, owner -func (_m *Remote) OrgMembership(ctx context.Context, u *model.User, owner string) (*model.OrgPerm, error) { +func (_m *Forge) OrgMembership(ctx context.Context, u *model.User, owner string) (*model.OrgPerm, error) { ret := _m.Called(ctx, u, owner) var r0 *model.OrgPerm @@ -273,7 +273,7 @@ func (_m *Remote) OrgMembership(ctx context.Context, u *model.User, owner string } // Perm provides a mock function with given fields: ctx, u, r -func (_m *Remote) Perm(ctx context.Context, u *model.User, r *model.Repo) (*model.Perm, error) { +func (_m *Forge) Perm(ctx context.Context, u *model.User, r *model.Repo) (*model.Perm, error) { ret := _m.Called(ctx, u, r) var r0 *model.Perm @@ -296,11 +296,11 @@ func (_m *Remote) Perm(ctx context.Context, u *model.User, r *model.Repo) (*mode } // Repo provides a mock function with given fields: ctx, u, id, owner, name -func (_m *Remote) Repo(ctx context.Context, u *model.User, id model.RemoteID, owner string, name string) (*model.Repo, error) { +func (_m *Forge) Repo(ctx context.Context, u *model.User, id model.ForgeID, owner string, name string) (*model.Repo, error) { ret := _m.Called(ctx, u, id, owner, name) var r0 *model.Repo - if rf, ok := ret.Get(0).(func(context.Context, *model.User, model.RemoteID, string, string) *model.Repo); ok { + if rf, ok := ret.Get(0).(func(context.Context, *model.User, model.ForgeID, string, string) *model.Repo); ok { r0 = rf(ctx, u, id, owner, name) } else { if ret.Get(0) != nil { @@ -309,7 +309,7 @@ func (_m *Remote) Repo(ctx context.Context, u *model.User, id model.RemoteID, ow } var r1 error - if rf, ok := ret.Get(1).(func(context.Context, *model.User, model.RemoteID, string, string) error); ok { + if rf, ok := ret.Get(1).(func(context.Context, *model.User, model.ForgeID, string, string) error); ok { r1 = rf(ctx, u, id, owner, name) } else { r1 = ret.Error(1) @@ -319,7 +319,7 @@ func (_m *Remote) Repo(ctx context.Context, u *model.User, id model.RemoteID, ow } // Repos provides a mock function with given fields: ctx, u -func (_m *Remote) Repos(ctx context.Context, u *model.User) ([]*model.Repo, error) { +func (_m *Forge) Repos(ctx context.Context, u *model.User) ([]*model.Repo, error) { ret := _m.Called(ctx, u) var r0 []*model.Repo @@ -342,7 +342,7 @@ func (_m *Remote) Repos(ctx context.Context, u *model.User) ([]*model.Repo, erro } // Status provides a mock function with given fields: ctx, u, r, b, p -func (_m *Remote) Status(ctx context.Context, u *model.User, r *model.Repo, b *model.Pipeline, p *model.Step) error { +func (_m *Forge) Status(ctx context.Context, u *model.User, r *model.Repo, b *model.Pipeline, p *model.Step) error { ret := _m.Called(ctx, u, r, b, p) var r0 error @@ -356,7 +356,7 @@ func (_m *Remote) Status(ctx context.Context, u *model.User, r *model.Repo, b *m } // Teams provides a mock function with given fields: ctx, u -func (_m *Remote) Teams(ctx context.Context, u *model.User) ([]*model.Team, error) { +func (_m *Forge) Teams(ctx context.Context, u *model.User) ([]*model.Team, error) { ret := _m.Called(ctx, u) var r0 []*model.Team @@ -378,14 +378,14 @@ func (_m *Remote) Teams(ctx context.Context, u *model.User) ([]*model.Team, erro return r0, r1 } -type mockConstructorTestingTNewRemote interface { +type mockConstructorTestingTNewForge interface { mock.TestingT Cleanup(func()) } -// NewRemote creates a new instance of Remote. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. -func NewRemote(t mockConstructorTestingTNewRemote) *Remote { - mock := &Remote{} +// NewForge creates a new instance of Forge. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +func NewForge(t mockConstructorTestingTNewForge) *Forge { + mock := &Forge{} mock.Mock.Test(t) t.Cleanup(func() { mock.AssertExpectations(t) }) diff --git a/server/remote/remote.go b/server/forge/remote.go similarity index 81% rename from server/remote/remote.go rename to server/forge/remote.go index 400c35281..ef3b51004 100644 --- a/server/remote/remote.go +++ b/server/forge/remote.go @@ -13,10 +13,10 @@ // See the License for the specific language governing permissions and // limitations under the License. -package remote +package forge //go:generate go install github.com/vektra/mockery/v2@latest -//go:generate mockery --name Remote --output mocks --case underscore +//go:generate mockery --name Forge --output mocks --case underscore import ( "context" @@ -28,44 +28,44 @@ import ( // TODO: use pagination // TODO: add Driver() who return source forge back -type Remote interface { +type Forge interface { // Name returns the string name of this driver Name() string // Login authenticates the session and returns the - // remote user details. + // forge user details. Login(ctx context.Context, w http.ResponseWriter, r *http.Request) (*model.User, error) - // Auth authenticates the session and returns the remote user + // Auth authenticates the session and returns the forge user // login for the given token and secret Auth(ctx context.Context, token, secret string) (string, error) - // Teams fetches a list of team memberships from the remote system. + // Teams fetches a list of team memberships from the forge. Teams(ctx context.Context, u *model.User) ([]*model.Team, error) - // Repo fetches the repository from the remote system, preferred is using the ID, fallback is owner/name. - Repo(ctx context.Context, u *model.User, id model.RemoteID, owner, name string) (*model.Repo, error) + // Repo fetches the repository from the forge, preferred is using the ID, fallback is owner/name. + Repo(ctx context.Context, u *model.User, id model.ForgeID, owner, name string) (*model.Repo, error) - // Repos fetches a list of repos from the remote system. + // Repos fetches a list of repos from the forge. Repos(ctx context.Context, u *model.User) ([]*model.Repo, error) // Perm fetches the named repository permissions from - // the remote system for the specified user. + // the forge for the specified user. Perm(ctx context.Context, u *model.User, r *model.Repo) (*model.Perm, error) - // File fetches a file from the remote repository and returns in string + // File fetches a file from the forge repository and returns in string // format. File(ctx context.Context, u *model.User, r *model.Repo, b *model.Pipeline, f string) ([]byte, error) - // Dir fetches a folder from the remote repository + // Dir fetches a folder from the forge repository Dir(ctx context.Context, u *model.User, r *model.Repo, b *model.Pipeline, f string) ([]*FileMeta, error) - // Status sends the commit status to the remote system. + // Status sends the commit status to the forge. // An example would be the GitHub pull request status. Status(ctx context.Context, u *model.User, r *model.Repo, b *model.Pipeline, p *model.Step) error // Netrc returns a .netrc file that can be used to clone - // private repositories from a remote system. + // private repositories from a forge. Netrc(u *model.User, r *model.Repo) (*model.Netrc, error) // Activate activates a repository by creating the post-commit hook. @@ -76,7 +76,7 @@ type Remote interface { Deactivate(ctx context.Context, u *model.User, r *model.Repo, link string) error // Branches returns the names of all branches for the named repository. - // TODO: Add proper pagination handling and remove workaround in gitea remote + // TODO: Add proper pagination handling and remove workaround in gitea forge Branches(ctx context.Context, u *model.User, r *model.Repo) ([]string, error) // BranchHead returns the sha of the head (lastest commit) of the specified branch diff --git a/server/grpc/rpc.go b/server/grpc/rpc.go index 19c4ce13c..3b5705cde 100644 --- a/server/grpc/rpc.go +++ b/server/grpc/rpc.go @@ -32,17 +32,17 @@ import ( "github.com/woodpecker-ci/woodpecker/pipeline/rpc" "github.com/woodpecker-ci/woodpecker/server" + "github.com/woodpecker-ci/woodpecker/server/forge" "github.com/woodpecker-ci/woodpecker/server/logging" "github.com/woodpecker-ci/woodpecker/server/model" "github.com/woodpecker-ci/woodpecker/server/pubsub" "github.com/woodpecker-ci/woodpecker/server/queue" - "github.com/woodpecker-ci/woodpecker/server/remote" "github.com/woodpecker-ci/woodpecker/server/shared" "github.com/woodpecker-ci/woodpecker/server/store" ) type RPC struct { - remote remote.Remote + forge forge.Forge queue queue.Queue pubsub pubsub.Publisher logger logging.Log @@ -351,7 +351,7 @@ func (s *RPC) Done(c context.Context, id string, state rpc.State) error { } } - s.updateRemoteStatus(c, repo, pipeline, step) + s.updateForgeStatus(c, repo, pipeline, step) if err := s.logger.Close(c, id); err != nil { log.Error().Err(err).Msgf("done: cannot close build_id %d logger", step.ID) @@ -392,14 +392,14 @@ func (s *RPC) completeChildrenIfParentCompleted(steps []*model.Step, completedSt } } -func (s *RPC) updateRemoteStatus(ctx context.Context, repo *model.Repo, pipeline *model.Pipeline, step *model.Step) { +func (s *RPC) updateForgeStatus(ctx context.Context, repo *model.Repo, pipeline *model.Pipeline, step *model.Step) { user, err := s.store.GetUser(repo.UserID) if err != nil { log.Error().Err(err).Msgf("can not get user with id '%d'", repo.UserID) return } - if refresher, ok := s.remote.(remote.Refresher); ok { + if refresher, ok := s.forge.(forge.Refresher); ok { ok, err := refresher.Refresh(ctx, user) if err != nil { log.Error().Err(err).Msgf("grpc: refresh oauth token of user '%s' failed", user.Login) @@ -412,7 +412,7 @@ func (s *RPC) updateRemoteStatus(ctx context.Context, repo *model.Repo, pipeline // only do status updates for parent steps if step != nil && step.IsParent() { - err = s.remote.Status(ctx, user, repo, pipeline, step) + err = s.forge.Status(ctx, user, repo, pipeline, step) if err != nil { log.Error().Err(err).Msgf("error setting commit status for %s/%d", repo.FullName, pipeline.Number) } diff --git a/server/grpc/server.go b/server/grpc/server.go index 16e74b867..021d922c8 100644 --- a/server/grpc/server.go +++ b/server/grpc/server.go @@ -23,10 +23,10 @@ import ( "github.com/woodpecker-ci/woodpecker/pipeline/rpc" "github.com/woodpecker-ci/woodpecker/pipeline/rpc/proto" + "github.com/woodpecker-ci/woodpecker/server/forge" "github.com/woodpecker-ci/woodpecker/server/logging" "github.com/woodpecker-ci/woodpecker/server/pubsub" "github.com/woodpecker-ci/woodpecker/server/queue" - "github.com/woodpecker-ci/woodpecker/server/remote" "github.com/woodpecker-ci/woodpecker/server/store" ) @@ -36,7 +36,7 @@ type WoodpeckerServer struct { peer RPC } -func NewWoodpeckerServer(remote remote.Remote, queue queue.Queue, logger logging.Log, pubsub pubsub.Publisher, store store.Store, host string) *WoodpeckerServer { +func NewWoodpeckerServer(forge forge.Forge, queue queue.Queue, logger logging.Log, pubsub pubsub.Publisher, store store.Store, host string) *WoodpeckerServer { pipelineTime := promauto.NewGaugeVec(prometheus.GaugeOpts{ Namespace: "woodpecker", Name: "pipeline_time", @@ -48,7 +48,7 @@ func NewWoodpeckerServer(remote remote.Remote, queue queue.Queue, logger logging Help: "Pipeline count.", }, []string{"repo", "branch", "status", "pipeline"}) peer := RPC{ - remote: remote, + forge: forge, store: store, queue: queue, pubsub: pubsub, diff --git a/server/model/feed.go b/server/model/feed.go index 7e3ede09c..c2e80c6ca 100644 --- a/server/model/feed.go +++ b/server/model/feed.go @@ -33,7 +33,7 @@ type Feed struct { Branch string `json:"branch,omitempty" xorm:"feed_pipeline_branch"` Ref string `json:"ref,omitempty" xorm:"feed_pipeline_ref"` Refspec string `json:"refspec,omitempty" xorm:"feed_pipeline_refspec"` - Remote string `json:"remote,omitempty" xorm:"feed_pipeline_remote"` + Remote string `json:"remote,omitempty" xorm:"feed_pipeline_clone_url"` Title string `json:"title,omitempty" xorm:"feed_pipeline_title"` Message string `json:"message,omitempty" xorm:"feed_pipeline_message"` Author string `json:"author,omitempty" xorm:"feed_pipeline_author"` diff --git a/server/model/pipeline.go b/server/model/pipeline.go index a6777cc1f..c6d8fcd3b 100644 --- a/server/model/pipeline.go +++ b/server/model/pipeline.go @@ -36,7 +36,7 @@ type Pipeline struct { Branch string `json:"branch" xorm:"pipeline_branch"` Ref string `json:"ref" xorm:"pipeline_ref"` Refspec string `json:"refspec" xorm:"pipeline_refspec"` - Remote string `json:"remote" xorm:"pipeline_remote"` + CloneURL string `json:"clone_url" xorm:"pipeline_clone_url"` Title string `json:"title" xorm:"pipeline_title"` Message string `json:"message" xorm:"TEXT 'pipeline_message'"` Timestamp int64 `json:"timestamp" xorm:"pipeline_timestamp"` diff --git a/server/model/repo.go b/server/model/repo.go index 5c81eb267..a9511b5df 100644 --- a/server/model/repo.go +++ b/server/model/repo.go @@ -26,7 +26,7 @@ import ( type Repo struct { ID int64 `json:"id,omitempty" xorm:"pk autoincr 'repo_id'"` UserID int64 `json:"-" xorm:"repo_user_id"` - RemoteID RemoteID `json:"-" xorm:"'remote_id'"` + ForgeID ForgeID `json:"-" xorm:"forge_id"` Owner string `json:"owner" xorm:"UNIQUE(name) 'repo_owner'"` Name string `json:"name" xorm:"UNIQUE(name) 'repo_name'"` FullName string `json:"full_name" xorm:"UNIQUE 'repo_full_name'"` @@ -75,8 +75,8 @@ func ParseRepo(str string) (user, repo string, err error) { // Update updates the repository with values from the given Repo. func (r *Repo) Update(from *Repo) { - if from.RemoteID.IsValid() { - r.RemoteID = from.RemoteID + if from.ForgeID.IsValid() { + r.ForgeID = from.ForgeID } r.Owner = from.Owner r.Name = from.Name @@ -109,8 +109,8 @@ type RepoPatch struct { CancelPreviousPipelineEvents *[]WebhookEvent `json:"cancel_previous_pipeline_events"` } -type RemoteID string +type ForgeID string -func (r RemoteID) IsValid() bool { +func (r ForgeID) IsValid() bool { return r != "" && r != "0" } diff --git a/server/model/team.go b/server/model/team.go index b4c4d9afa..e21489573 100644 --- a/server/model/team.go +++ b/server/model/team.go @@ -14,7 +14,7 @@ package model -// Team represents a team or organization in the remote version control system. +// Team represents a team or organization in the forge. // // swagger:model user type Team struct { diff --git a/server/model/user.go b/server/model/user.go index 4e1520816..7be5b190d 100644 --- a/server/model/user.go +++ b/server/model/user.go @@ -59,7 +59,7 @@ type User struct { // Activate indicates the user is active in the system. Active bool `json:"active" xorm:"user_active"` - // Synced is the timestamp when the user was synced with the remote system. + // Synced is the timestamp when the user was synced with the forge. Synced int64 `json:"synced" xorm:"user_synced"` // Admin indicates the user is a system administrator. diff --git a/server/pipeline/approve.go b/server/pipeline/approve.go index 4a0b9fd1d..7b3f7b302 100644 --- a/server/pipeline/approve.go +++ b/server/pipeline/approve.go @@ -20,8 +20,8 @@ import ( "github.com/rs/zerolog/log" + "github.com/woodpecker-ci/woodpecker/server/forge" "github.com/woodpecker-ci/woodpecker/server/model" - "github.com/woodpecker-ci/woodpecker/server/remote" "github.com/woodpecker-ci/woodpecker/server/shared" "github.com/woodpecker-ci/woodpecker/server/store" ) @@ -45,9 +45,9 @@ func Approve(ctx context.Context, store store.Store, pipeline *model.Pipeline, u return nil, fmt.Errorf("error updating pipeline. %s", err) } - var yamls []*remote.FileMeta + var yamls []*forge.FileMeta for _, y := range configs { - yamls = append(yamls, &remote.FileMeta{Data: y.Data, Name: y.Name}) + yamls = append(yamls, &forge.FileMeta{Data: y.Data, Name: y.Name}) } pipeline, pipelineItems, err := createPipelineItems(ctx, store, pipeline, user, repo, yamls, nil) diff --git a/server/pipeline/config.go b/server/pipeline/config.go index d555c8de7..038e06d9f 100644 --- a/server/pipeline/config.go +++ b/server/pipeline/config.go @@ -18,21 +18,21 @@ import ( "crypto/sha256" "fmt" + "github.com/woodpecker-ci/woodpecker/server/forge" "github.com/woodpecker-ci/woodpecker/server/model" - "github.com/woodpecker-ci/woodpecker/server/remote" "github.com/woodpecker-ci/woodpecker/server/shared" "github.com/woodpecker-ci/woodpecker/server/store" ) -func findOrPersistPipelineConfig(store store.Store, pipeline *model.Pipeline, remoteYamlConfig *remote.FileMeta) (*model.Config, error) { - sha := fmt.Sprintf("%x", sha256.Sum256(remoteYamlConfig.Data)) +func findOrPersistPipelineConfig(store store.Store, pipeline *model.Pipeline, forgeYamlConfig *forge.FileMeta) (*model.Config, error) { + sha := fmt.Sprintf("%x", sha256.Sum256(forgeYamlConfig.Data)) conf, err := store.ConfigFindIdentical(pipeline.RepoID, sha) if err != nil { conf = &model.Config{ RepoID: pipeline.RepoID, - Data: remoteYamlConfig.Data, + Data: forgeYamlConfig.Data, Hash: sha, - Name: shared.SanitizePath(remoteYamlConfig.Name), + Name: shared.SanitizePath(forgeYamlConfig.Name), } err = store.ConfigCreate(conf) if err != nil { diff --git a/server/pipeline/create.go b/server/pipeline/create.go index f51c1324c..674105caf 100644 --- a/server/pipeline/create.go +++ b/server/pipeline/create.go @@ -22,8 +22,8 @@ import ( "github.com/rs/zerolog/log" "github.com/woodpecker-ci/woodpecker/server" + "github.com/woodpecker-ci/woodpecker/server/forge" "github.com/woodpecker-ci/woodpecker/server/model" - "github.com/woodpecker-ci/woodpecker/server/remote" "github.com/woodpecker-ci/woodpecker/server/shared" "github.com/woodpecker-ci/woodpecker/server/store" ) @@ -37,10 +37,10 @@ func Create(ctx context.Context, _store store.Store, repo *model.Repo, pipeline return nil, fmt.Errorf(msg) } - // if the remote has a refresh token, the current access token + // if the forge has a refresh token, the current access token // may be stale. Therefore, we should refresh prior to dispatching // the pipeline. - if refresher, ok := server.Config.Services.Remote.(remote.Refresher); ok { + if refresher, ok := server.Config.Services.Forge.(forge.Refresher); ok { refreshed, err := refresher.Refresh(ctx, repoUser) if err != nil { log.Error().Err(err).Msgf("failed to refresh oauth2 token for repoUser: %s", repoUser.Login) @@ -53,17 +53,17 @@ func Create(ctx context.Context, _store store.Store, repo *model.Repo, pipeline } var ( - remoteYamlConfigs []*remote.FileMeta - configFetchErr error - filtered bool - parseErr error + forgeYamlConfigs []*forge.FileMeta + configFetchErr error + filtered bool + parseErr error ) - // fetch the pipeline file from the remote - configFetcher := shared.NewConfigFetcher(server.Config.Services.Remote, server.Config.Services.ConfigService, repoUser, repo, pipeline) - remoteYamlConfigs, configFetchErr = configFetcher.Fetch(ctx) + // fetch the pipeline file from the forge + configFetcher := shared.NewConfigFetcher(server.Config.Services.Forge, server.Config.Services.ConfigService, repoUser, repo, pipeline) + forgeYamlConfigs, configFetchErr = configFetcher.Fetch(ctx) if configFetchErr == nil { - filtered, parseErr = checkIfFiltered(pipeline, remoteYamlConfigs) + filtered, parseErr = checkIfFiltered(pipeline, forgeYamlConfigs) if parseErr == nil { if filtered { err := ErrFiltered{Msg: "branch does not match restrictions defined in yaml"} @@ -71,7 +71,7 @@ func Create(ctx context.Context, _store store.Store, repo *model.Repo, pipeline return nil, err } - if zeroSteps(pipeline, remoteYamlConfigs) { + if zeroSteps(pipeline, forgeYamlConfigs) { err := ErrFiltered{Msg: "step conditions yield zero runnable steps"} log.Debug().Str("repo", repo.FullName).Msgf("%v", err) return nil, err @@ -109,8 +109,8 @@ func Create(ctx context.Context, _store store.Store, repo *model.Repo, pipeline } // persist the pipeline config for historical correctness, restarts, etc - for _, remoteYamlConfig := range remoteYamlConfigs { - _, err := findOrPersistPipelineConfig(_store, pipeline, remoteYamlConfig) + for _, forgeYamlConfig := range forgeYamlConfigs { + _, err := findOrPersistPipelineConfig(_store, pipeline, forgeYamlConfig) if err != nil { msg := fmt.Sprintf("failure to find or persist pipeline config for %s", repo.FullName) log.Error().Err(err).Msg(msg) @@ -130,7 +130,7 @@ func Create(ctx context.Context, _store store.Store, repo *model.Repo, pipeline return pipeline, nil } - pipeline, pipelineItems, err := createPipelineItems(ctx, _store, pipeline, repoUser, repo, remoteYamlConfigs, nil) + pipeline, pipelineItems, err := createPipelineItems(ctx, _store, pipeline, repoUser, repo, forgeYamlConfigs, nil) if err != nil { msg := fmt.Sprintf("failure to createPipelineItems for %s", repo.FullName) log.Error().Err(err).Msg(msg) diff --git a/server/pipeline/filter.go b/server/pipeline/filter.go index 09b05cc8f..8ab4fdd66 100644 --- a/server/pipeline/filter.go +++ b/server/pipeline/filter.go @@ -21,12 +21,12 @@ import ( "github.com/woodpecker-ci/woodpecker/pipeline/frontend" "github.com/woodpecker-ci/woodpecker/pipeline/frontend/yaml" + "github.com/woodpecker-ci/woodpecker/server/forge" "github.com/woodpecker-ci/woodpecker/server/model" - "github.com/woodpecker-ci/woodpecker/server/remote" "github.com/woodpecker-ci/woodpecker/server/shared" ) -func zeroSteps(pipeline *model.Pipeline, remoteYamlConfigs []*remote.FileMeta) bool { +func zeroSteps(pipeline *model.Pipeline, forgeYamlConfigs []*forge.FileMeta) bool { b := shared.StepBuilder{ Repo: &model.Repo{}, Curr: pipeline, @@ -35,7 +35,7 @@ func zeroSteps(pipeline *model.Pipeline, remoteYamlConfigs []*remote.FileMeta) b Secs: []*model.Secret{}, Regs: []*model.Registry{}, Link: "", - Yamls: remoteYamlConfigs, + Yamls: forgeYamlConfigs, } pipelineItems, err := b.Build() @@ -51,8 +51,8 @@ func zeroSteps(pipeline *model.Pipeline, remoteYamlConfigs []*remote.FileMeta) b // TODO: parse yaml once and not for each filter function // Check if at least one pipeline step will be execute otherwise we will just ignore this webhook -func checkIfFiltered(pipeline *model.Pipeline, remoteYamlConfigs []*remote.FileMeta) (bool, error) { - log.Trace().Msgf("hook.branchFiltered(): pipeline branch: '%s' pipeline event: '%s' config count: %d", pipeline.Branch, pipeline.Event, len(remoteYamlConfigs)) +func checkIfFiltered(pipeline *model.Pipeline, forgeYamlConfigs []*forge.FileMeta) (bool, error) { + log.Trace().Msgf("hook.branchFiltered(): pipeline branch: '%s' pipeline event: '%s' config count: %d", pipeline.Branch, pipeline.Event, len(forgeYamlConfigs)) matchMetadata := frontend.Metadata{ Curr: frontend.Pipeline{ @@ -63,13 +63,13 @@ func checkIfFiltered(pipeline *model.Pipeline, remoteYamlConfigs []*remote.FileM }, } - for _, remoteYamlConfig := range remoteYamlConfigs { - parsedPipelineConfig, err := yaml.ParseBytes(remoteYamlConfig.Data) + for _, forgeYamlConfig := range forgeYamlConfigs { + parsedPipelineConfig, err := yaml.ParseBytes(forgeYamlConfig.Data) if err != nil { - log.Trace().Msgf("parse config '%s': %s", remoteYamlConfig.Name, err) + log.Trace().Msgf("parse config '%s': %s", forgeYamlConfig.Name, err) return false, err } - log.Trace().Msgf("config '%s': %#v", remoteYamlConfig.Name, parsedPipelineConfig) + log.Trace().Msgf("config '%s': %#v", forgeYamlConfig.Name, parsedPipelineConfig) // ignore if the pipeline was filtered by matched constraints if match, err := parsedPipelineConfig.When.Match(matchMetadata, true); !match && err == nil { diff --git a/server/pipeline/helper.go b/server/pipeline/helper.go index 5741418ad..e5d95a7d3 100644 --- a/server/pipeline/helper.go +++ b/server/pipeline/helper.go @@ -30,7 +30,7 @@ func updatePipelineStatus(ctx context.Context, pipeline *model.Pipeline, repo *m continue } - err := server.Config.Services.Remote.Status(ctx, user, repo, pipeline, step) + err := server.Config.Services.Forge.Status(ctx, user, repo, pipeline, step) if err != nil { log.Error().Err(err).Msgf("error setting commit status for %s/%d", repo.FullName, pipeline.Number) return err diff --git a/server/pipeline/items.go b/server/pipeline/items.go index 249ea127a..2e8246d89 100644 --- a/server/pipeline/items.go +++ b/server/pipeline/items.go @@ -22,14 +22,14 @@ import ( "github.com/rs/zerolog/log" "github.com/woodpecker-ci/woodpecker/server" + "github.com/woodpecker-ci/woodpecker/server/forge" "github.com/woodpecker-ci/woodpecker/server/model" - "github.com/woodpecker-ci/woodpecker/server/remote" "github.com/woodpecker-ci/woodpecker/server/shared" "github.com/woodpecker-ci/woodpecker/server/store" ) -func createPipelineItems(ctx context.Context, store store.Store, pipeline *model.Pipeline, user *model.User, repo *model.Repo, yamls []*remote.FileMeta, envs map[string]string) (*model.Pipeline, []*shared.PipelineItem, error) { - netrc, err := server.Config.Services.Remote.Netrc(user, repo) +func createPipelineItems(ctx context.Context, store store.Store, pipeline *model.Pipeline, user *model.User, repo *model.Repo, yamls []*forge.FileMeta, envs map[string]string) (*model.Pipeline, []*shared.PipelineItem, error) { + netrc, err := server.Config.Services.Forge.Netrc(user, repo) if err != nil { log.Error().Err(err).Msg("Failed to generate netrc file") } diff --git a/server/pipeline/restart.go b/server/pipeline/restart.go index aaeee8916..89d87f9f3 100644 --- a/server/pipeline/restart.go +++ b/server/pipeline/restart.go @@ -24,8 +24,8 @@ import ( "github.com/woodpecker-ci/woodpecker/pipeline/frontend/yaml" "github.com/woodpecker-ci/woodpecker/server" + "github.com/woodpecker-ci/woodpecker/server/forge" "github.com/woodpecker-ci/woodpecker/server/model" - "github.com/woodpecker-ci/woodpecker/server/remote" "github.com/woodpecker-ci/woodpecker/server/shared" "github.com/woodpecker-ci/woodpecker/server/store" ) @@ -38,7 +38,7 @@ func Restart(ctx context.Context, store store.Store, lastBuild *model.Pipeline, return nil, ErrBadRequest{Msg: fmt.Sprintf("cannot restart a pipeline with status %s", lastBuild.Status)} } - var pipelineFiles []*remote.FileMeta + var pipelineFiles []*forge.FileMeta // fetch the old pipeline config from database configs, err := store.ConfigsForPipeline(lastBuild.ID) @@ -49,14 +49,14 @@ func Restart(ctx context.Context, store store.Store, lastBuild *model.Pipeline, } for _, y := range configs { - pipelineFiles = append(pipelineFiles, &remote.FileMeta{Data: y.Data, Name: y.Name}) + pipelineFiles = append(pipelineFiles, &forge.FileMeta{Data: y.Data, Name: y.Name}) } // If config extension is active we should refetch the config in case something changed if server.Config.Services.ConfigService != nil && server.Config.Services.ConfigService.IsConfigured() { - currentFileMeta := make([]*remote.FileMeta, len(configs)) + currentFileMeta := make([]*forge.FileMeta, len(configs)) for i, cfg := range configs { - currentFileMeta[i] = &remote.FileMeta{Name: cfg.Name, Data: cfg.Data} + currentFileMeta[i] = &forge.FileMeta{Name: cfg.Name, Data: cfg.Data} } newConfig, useOld, err := server.Config.Services.ConfigService.FetchConfig(ctx, repo, lastBuild, currentFileMeta) diff --git a/server/plugins/config/extension.go b/server/plugins/config/extension.go index d63551254..98e073089 100644 --- a/server/plugins/config/extension.go +++ b/server/plugins/config/extension.go @@ -17,11 +17,11 @@ package config import ( "context" + "github.com/woodpecker-ci/woodpecker/server/forge" "github.com/woodpecker-ci/woodpecker/server/model" - "github.com/woodpecker-ci/woodpecker/server/remote" ) type Extension interface { IsConfigured() bool - FetchConfig(ctx context.Context, repo *model.Repo, pipeline *model.Pipeline, currentFileMeta []*remote.FileMeta) (configData []*remote.FileMeta, useOld bool, err error) + FetchConfig(ctx context.Context, repo *model.Repo, pipeline *model.Pipeline, currentFileMeta []*forge.FileMeta) (configData []*forge.FileMeta, useOld bool, err error) } diff --git a/server/plugins/config/http.go b/server/plugins/config/http.go index e3a88dcbb..47dc15285 100644 --- a/server/plugins/config/http.go +++ b/server/plugins/config/http.go @@ -19,9 +19,9 @@ import ( "crypto" "fmt" + "github.com/woodpecker-ci/woodpecker/server/forge" "github.com/woodpecker-ci/woodpecker/server/model" "github.com/woodpecker-ci/woodpecker/server/plugins/utils" - "github.com/woodpecker-ci/woodpecker/server/remote" ) type http struct { @@ -29,7 +29,7 @@ type http struct { privateKey crypto.PrivateKey } -// Same as remote.FileMeta but with json tags and string data +// Same as forge.FileMeta but with json tags and string data type config struct { Name string `json:"name"` Data string `json:"data"` @@ -53,7 +53,7 @@ func (cp *http) IsConfigured() bool { return cp.endpoint != "" } -func (cp *http) FetchConfig(ctx context.Context, repo *model.Repo, pipeline *model.Pipeline, currentFileMeta []*remote.FileMeta) (configData []*remote.FileMeta, useOld bool, err error) { +func (cp *http) FetchConfig(ctx context.Context, repo *model.Repo, pipeline *model.Pipeline, currentFileMeta []*forge.FileMeta) (configData []*forge.FileMeta, useOld bool, err error) { currentConfigs := make([]*config, len(currentFileMeta)) for i, pipe := range currentFileMeta { currentConfigs[i] = &config{Name: pipe.Name, Data: string(pipe.Data)} @@ -66,13 +66,13 @@ func (cp *http) FetchConfig(ctx context.Context, repo *model.Repo, pipeline *mod return nil, false, fmt.Errorf("Failed to fetch config via http (%d) %w", status, err) } - var newFileMeta []*remote.FileMeta + var newFileMeta []*forge.FileMeta if status != 200 { - newFileMeta = make([]*remote.FileMeta, 0) + newFileMeta = make([]*forge.FileMeta, 0) } else { - newFileMeta = make([]*remote.FileMeta, len(response.Configs)) + newFileMeta = make([]*forge.FileMeta, len(response.Configs)) for i, pipe := range response.Configs { - newFileMeta[i] = &remote.FileMeta{Name: pipe.Name, Data: []byte(pipe.Data)} + newFileMeta[i] = &forge.FileMeta{Name: pipe.Name, Data: []byte(pipe.Data)} } } diff --git a/server/router/middleware/session/repo.go b/server/router/middleware/session/repo.go index b8cded22a..34866b7a1 100644 --- a/server/router/middleware/session/repo.go +++ b/server/router/middleware/session/repo.go @@ -97,7 +97,7 @@ func SetPerm() gin.HandlerFunc { user.Login, repo.FullName, err) } if time.Unix(perm.Synced, 0).Add(time.Hour).Before(time.Now()) { - perm, err = server.Config.Services.Remote.Perm(c, user, repo) + perm, err = server.Config.Services.Forge.Perm(c, user, repo) if err == nil { log.Debug().Msgf("Synced user permission for %s %s", user.Login, repo.FullName) perm.Repo = repo diff --git a/server/router/middleware/token/token.go b/server/router/middleware/token/token.go index fc7870246..f51d6fb0f 100644 --- a/server/router/middleware/token/token.go +++ b/server/router/middleware/token/token.go @@ -22,7 +22,7 @@ import ( "github.com/gin-gonic/gin" "github.com/woodpecker-ci/woodpecker/server" - "github.com/woodpecker-ci/woodpecker/server/remote" + "github.com/woodpecker-ci/woodpecker/server/forge" "github.com/woodpecker-ci/woodpecker/server/router/middleware/session" "github.com/woodpecker-ci/woodpecker/server/store" ) @@ -34,10 +34,10 @@ func Refresh(c *gin.Context) { return } - // check if the remote includes the ability to + // check if the forge includes the ability to // refresh the user token. - _remote := server.Config.Services.Remote - refresher, ok := _remote.(remote.Refresher) + _forge := server.Config.Services.Forge + refresher, ok := _forge.(forge.Refresher) if !ok { c.Next() return diff --git a/server/shared/configFetcher.go b/server/shared/configFetcher.go index 273984f2f..4416ca108 100644 --- a/server/shared/configFetcher.go +++ b/server/shared/configFetcher.go @@ -22,30 +22,30 @@ import ( "time" "github.com/rs/zerolog/log" - "github.com/woodpecker-ci/woodpecker/server/plugins/config" + "github.com/woodpecker-ci/woodpecker/server/forge" "github.com/woodpecker-ci/woodpecker/server/model" - "github.com/woodpecker-ci/woodpecker/server/remote" + "github.com/woodpecker-ci/woodpecker/server/plugins/config" "github.com/woodpecker-ci/woodpecker/shared/constant" ) type ConfigFetcher interface { - Fetch(ctx context.Context) (files []*remote.FileMeta, err error) + Fetch(ctx context.Context) (files []*forge.FileMeta, err error) } // TODO(974) move to new package type configFetcher struct { - remote remote.Remote + forge forge.Forge user *model.User repo *model.Repo pipeline *model.Pipeline configExtension config.Extension } -func NewConfigFetcher(remote remote.Remote, configExtension config.Extension, user *model.User, repo *model.Repo, pipeline *model.Pipeline) ConfigFetcher { +func NewConfigFetcher(forge forge.Forge, configExtension config.Extension, user *model.User, repo *model.Repo, pipeline *model.Pipeline) ConfigFetcher { return &configFetcher{ - remote: remote, + forge: forge, user: user, repo: repo, pipeline: pipeline, @@ -57,7 +57,7 @@ func NewConfigFetcher(remote remote.Remote, configExtension config.Extension, us var configFetchTimeout = time.Second * 3 // Fetch pipeline config from source forge -func (cf *configFetcher) Fetch(ctx context.Context) (files []*remote.FileMeta, err error) { +func (cf *configFetcher) Fetch(ctx context.Context) (files []*forge.FileMeta, err error) { log.Trace().Msgf("Start Fetching config for '%s'", cf.repo.FullName) // try to fetch 3 times @@ -92,7 +92,7 @@ func (cf *configFetcher) Fetch(ctx context.Context) (files []*remote.FileMeta, e } // fetch config by timeout -func (cf *configFetcher) fetch(c context.Context, timeout time.Duration, config string) ([]*remote.FileMeta, error) { +func (cf *configFetcher) fetch(c context.Context, timeout time.Duration, config string) ([]*forge.FileMeta, error) { ctx, cancel := context.WithTimeout(c, timeout) defer cancel() @@ -121,12 +121,12 @@ func (cf *configFetcher) fetch(c context.Context, timeout time.Duration, config case <-ctx.Done(): return nil, ctx.Err() default: - return []*remote.FileMeta{}, fmt.Errorf("ConfigFetcher: Fallback did not find config: %s", err) + return []*forge.FileMeta{}, fmt.Errorf("ConfigFetcher: Fallback did not find config: %s", err) } } -func filterPipelineFiles(files []*remote.FileMeta) []*remote.FileMeta { - var res []*remote.FileMeta +func filterPipelineFiles(files []*forge.FileMeta) []*forge.FileMeta { + var res []*forge.FileMeta for _, file := range files { if strings.HasSuffix(file.Name, ".yml") || strings.HasSuffix(file.Name, ".yaml") { @@ -137,13 +137,13 @@ func filterPipelineFiles(files []*remote.FileMeta) []*remote.FileMeta { return res } -func (cf *configFetcher) checkPipelineFile(c context.Context, config string) (fileMeta []*remote.FileMeta, found bool) { - file, err := cf.remote.File(c, cf.user, cf.repo, cf.pipeline, config) +func (cf *configFetcher) checkPipelineFile(c context.Context, config string) (fileMeta []*forge.FileMeta, found bool) { + file, err := cf.forge.File(c, cf.user, cf.repo, cf.pipeline, config) if err == nil && len(file) != 0 { log.Trace().Msgf("ConfigFetch[%s]: found file '%s'", cf.repo.FullName, config) - return []*remote.FileMeta{{ + return []*forge.FileMeta{{ Name: config, Data: file, }}, true @@ -152,7 +152,7 @@ func (cf *configFetcher) checkPipelineFile(c context.Context, config string) (fi return nil, false } -func (cf *configFetcher) getFirstAvailableConfig(c context.Context, configs []string, userDefined bool) ([]*remote.FileMeta, error) { +func (cf *configFetcher) getFirstAvailableConfig(c context.Context, configs []string, userDefined bool) ([]*forge.FileMeta, error) { userDefinedLog := "" if userDefined { userDefinedLog = "user defined" @@ -162,7 +162,7 @@ func (cf *configFetcher) getFirstAvailableConfig(c context.Context, configs []st if strings.HasSuffix(fileOrFolder, "/") { // config is a folder // if folder is not supported we will get a "Not implemented" error and continue - files, err := cf.remote.Dir(c, cf.user, cf.repo, cf.pipeline, strings.TrimSuffix(fileOrFolder, "/")) + files, err := cf.forge.Dir(c, cf.user, cf.repo, cf.pipeline, strings.TrimSuffix(fileOrFolder, "/")) files = filterPipelineFiles(files) if err == nil && len(files) != 0 { log.Trace().Msgf("ConfigFetch[%s]: found %d %s files in '%s'", cf.repo.FullName, len(files), userDefinedLog, fileOrFolder) diff --git a/server/shared/configFetcher_test.go b/server/shared/configFetcher_test.go index 7a9fe4383..a50e7fac0 100644 --- a/server/shared/configFetcher_test.go +++ b/server/shared/configFetcher_test.go @@ -30,10 +30,10 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" + "github.com/woodpecker-ci/woodpecker/server/forge" + "github.com/woodpecker-ci/woodpecker/server/forge/mocks" "github.com/woodpecker-ci/woodpecker/server/model" "github.com/woodpecker-ci/woodpecker/server/plugins/config" - "github.com/woodpecker-ci/woodpecker/server/remote" - "github.com/woodpecker-ci/woodpecker/server/remote/mocks" "github.com/woodpecker-ci/woodpecker/server/shared" ) @@ -293,13 +293,13 @@ func TestFetch(t *testing.T) { t.Run(tt.name, func(t *testing.T) { repo := &model.Repo{Owner: "laszlocph", Name: "multipipeline", Config: tt.repoConfig} - r := new(mocks.Remote) - dirs := map[string][]*remote.FileMeta{} + f := new(mocks.Forge) + dirs := map[string][]*forge.FileMeta{} for _, file := range tt.files { - r.On("File", mock.Anything, mock.Anything, mock.Anything, mock.Anything, file.name).Return(file.data, nil) + f.On("File", mock.Anything, mock.Anything, mock.Anything, mock.Anything, file.name).Return(file.data, nil) path := filepath.Dir(file.name) if path != "." { - dirs[path] = append(dirs[path], &remote.FileMeta{ + dirs[path] = append(dirs[path], &forge.FileMeta{ Name: file.name, Data: file.data, }) @@ -307,15 +307,15 @@ func TestFetch(t *testing.T) { } for path, files := range dirs { - r.On("Dir", mock.Anything, mock.Anything, mock.Anything, mock.Anything, path).Return(files, nil) + f.On("Dir", mock.Anything, mock.Anything, mock.Anything, mock.Anything, path).Return(files, nil) } // if the previous mocks do not match return not found errors - r.On("File", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, fmt.Errorf("File not found")) - r.On("Dir", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, fmt.Errorf("Directory not found")) + f.On("File", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, fmt.Errorf("File not found")) + f.On("Dir", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, fmt.Errorf("Directory not found")) configFetcher := shared.NewConfigFetcher( - r, + f, config.NewHTTP("", ""), &model.User{Token: "xxx"}, repo, @@ -498,13 +498,13 @@ func TestFetchFromConfigService(t *testing.T) { t.Run(tt.name, func(t *testing.T) { repo := &model.Repo{Owner: "laszlocph", Name: tt.name, Config: tt.repoConfig} // Using test name as repo name to provide different responses in mock server - r := new(mocks.Remote) - dirs := map[string][]*remote.FileMeta{} + f := new(mocks.Forge) + dirs := map[string][]*forge.FileMeta{} for _, file := range tt.files { - r.On("File", mock.Anything, mock.Anything, mock.Anything, mock.Anything, file.name).Return(file.data, nil) + f.On("File", mock.Anything, mock.Anything, mock.Anything, mock.Anything, file.name).Return(file.data, nil) path := filepath.Dir(file.name) if path != "." { - dirs[path] = append(dirs[path], &remote.FileMeta{ + dirs[path] = append(dirs[path], &forge.FileMeta{ Name: file.name, Data: file.data, }) @@ -512,15 +512,15 @@ func TestFetchFromConfigService(t *testing.T) { } for path, files := range dirs { - r.On("Dir", mock.Anything, mock.Anything, mock.Anything, mock.Anything, path).Return(files, nil) + f.On("Dir", mock.Anything, mock.Anything, mock.Anything, mock.Anything, path).Return(files, nil) } // if the previous mocks do not match return not found errors - r.On("File", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, fmt.Errorf("File not found")) - r.On("Dir", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, fmt.Errorf("Directory not found")) + f.On("File", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, fmt.Errorf("File not found")) + f.On("Dir", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, fmt.Errorf("Directory not found")) configFetcher := shared.NewConfigFetcher( - r, + f, configAPI, &model.User{Token: "xxx"}, repo, diff --git a/server/shared/stepBuilder.go b/server/shared/stepBuilder.go index 186d9b2cc..e989b780b 100644 --- a/server/shared/stepBuilder.go +++ b/server/shared/stepBuilder.go @@ -33,8 +33,8 @@ import ( "github.com/woodpecker-ci/woodpecker/pipeline/frontend/yaml/linter" "github.com/woodpecker-ci/woodpecker/pipeline/frontend/yaml/matrix" "github.com/woodpecker-ci/woodpecker/server" + "github.com/woodpecker-ci/woodpecker/server/forge" "github.com/woodpecker-ci/woodpecker/server/model" - "github.com/woodpecker-ci/woodpecker/server/remote" ) // TODO(974) move to pipeline/* @@ -48,7 +48,7 @@ type StepBuilder struct { Secs []*model.Secret Regs []*model.Registry Link string - Yamls []*remote.FileMeta + Yamls []*forge.FileMeta Envs map[string]string } @@ -64,7 +64,7 @@ type PipelineItem struct { func (b *StepBuilder) Build() ([]*PipelineItem, error) { var items []*PipelineItem - sort.Sort(remote.ByName(b.Yamls)) + sort.Sort(forge.ByName(b.Yamls)) pidSequence := 1 @@ -338,11 +338,11 @@ func metadataFromStruct(repo *model.Repo, pipeline, last *model.Pipeline, step * } return frontend.Metadata{ Repo: frontend.Repo{ - Name: repo.FullName, - Link: repo.Link, - Remote: repo.Clone, - Private: repo.IsSCMPrivate, - Branch: repo.Branch, + Name: repo.FullName, + Link: repo.Link, + CloneURL: repo.Clone, + Private: repo.IsSCMPrivate, + Branch: repo.Branch, }, Curr: metadataPipelineFromModelPipeline(pipeline, true), Prev: metadataPipelineFromModelPipeline(last, false), diff --git a/server/shared/stepBuilder_test.go b/server/shared/stepBuilder_test.go index e17858e18..f0d0025ca 100644 --- a/server/shared/stepBuilder_test.go +++ b/server/shared/stepBuilder_test.go @@ -19,8 +19,8 @@ import ( "fmt" "testing" + "github.com/woodpecker-ci/woodpecker/server/forge" "github.com/woodpecker-ci/woodpecker/server/model" - "github.com/woodpecker-ci/woodpecker/server/remote" ) // TODO(974) move to pipeline/* @@ -42,7 +42,7 @@ func TestGlobalEnvsubst(t *testing.T) { Secs: []*model.Secret{}, Regs: []*model.Registry{}, Link: "", - Yamls: []*remote.FileMeta{ + Yamls: []*forge.FileMeta{ {Data: []byte(` pipeline: build: @@ -76,7 +76,7 @@ func TestMissingGlobalEnvsubst(t *testing.T) { Secs: []*model.Secret{}, Regs: []*model.Registry{}, Link: "", - Yamls: []*remote.FileMeta{ + Yamls: []*forge.FileMeta{ {Data: []byte(` pipeline: build: @@ -107,7 +107,7 @@ bbb`, Secs: []*model.Secret{}, Regs: []*model.Registry{}, Link: "", - Yamls: []*remote.FileMeta{ + Yamls: []*forge.FileMeta{ {Data: []byte(` pipeline: xxx: @@ -141,7 +141,7 @@ func TestMultiPipeline(t *testing.T) { Secs: []*model.Secret{}, Regs: []*model.Registry{}, Link: "", - Yamls: []*remote.FileMeta{ + Yamls: []*forge.FileMeta{ {Data: []byte(` pipeline: xxx: @@ -175,7 +175,7 @@ func TestDependsOn(t *testing.T) { Secs: []*model.Secret{}, Regs: []*model.Registry{}, Link: "", - Yamls: []*remote.FileMeta{ + Yamls: []*forge.FileMeta{ {Name: "lint", Data: []byte(` pipeline: build: @@ -221,7 +221,7 @@ func TestRunsOn(t *testing.T) { Secs: []*model.Secret{}, Regs: []*model.Registry{}, Link: "", - Yamls: []*remote.FileMeta{ + Yamls: []*forge.FileMeta{ {Data: []byte(` pipeline: deploy: @@ -257,7 +257,7 @@ func TestPipelineName(t *testing.T) { Secs: []*model.Secret{}, Regs: []*model.Registry{}, Link: "", - Yamls: []*remote.FileMeta{ + Yamls: []*forge.FileMeta{ {Name: ".woodpecker/lint.yml", Data: []byte(` pipeline: build: @@ -292,7 +292,7 @@ func TestBranchFilter(t *testing.T) { Secs: []*model.Secret{}, Regs: []*model.Registry{}, Link: "", - Yamls: []*remote.FileMeta{ + Yamls: []*forge.FileMeta{ {Data: []byte(` pipeline: xxx: @@ -338,7 +338,7 @@ func TestRootWhenFilter(t *testing.T) { Secs: []*model.Secret{}, Regs: []*model.Registry{}, Link: "", - Yamls: []*remote.FileMeta{ + Yamls: []*forge.FileMeta{ {Data: []byte(` when: event: @@ -386,7 +386,7 @@ func TestZeroSteps(t *testing.T) { Secs: []*model.Secret{}, Regs: []*model.Registry{}, Link: "", - Yamls: []*remote.FileMeta{ + Yamls: []*forge.FileMeta{ {Data: []byte(` skip_clone: true pipeline: @@ -420,7 +420,7 @@ func TestZeroStepsAsMultiPipelineDeps(t *testing.T) { Secs: []*model.Secret{}, Regs: []*model.Registry{}, Link: "", - Yamls: []*remote.FileMeta{ + Yamls: []*forge.FileMeta{ {Name: "zerostep", Data: []byte(` skip_clone: true pipeline: @@ -468,7 +468,7 @@ func TestZeroStepsAsMultiPipelineTransitiveDeps(t *testing.T) { Secs: []*model.Secret{}, Regs: []*model.Registry{}, Link: "", - Yamls: []*remote.FileMeta{ + Yamls: []*forge.FileMeta{ {Name: "zerostep", Data: []byte(` skip_clone: true pipeline: @@ -524,7 +524,7 @@ func TestTree(t *testing.T) { Secs: []*model.Secret{}, Regs: []*model.Registry{}, Link: "", - Yamls: []*remote.FileMeta{ + Yamls: []*forge.FileMeta{ {Data: []byte(` pipeline: build: diff --git a/server/shared/userSyncer.go b/server/shared/userSyncer.go index bd5636a3f..80179b078 100644 --- a/server/shared/userSyncer.go +++ b/server/shared/userSyncer.go @@ -20,8 +20,8 @@ import ( "fmt" "time" + "github.com/woodpecker-ci/woodpecker/server/forge" "github.com/woodpecker-ci/woodpecker/server/model" - "github.com/woodpecker-ci/woodpecker/server/remote" "github.com/woodpecker-ci/woodpecker/server/store" ) @@ -33,10 +33,10 @@ type UserSyncer interface { } type Syncer struct { - Remote remote.Remote - Store store.Store - Perms model.PermStore - Match FilterFunc + Forge forge.Forge + Store store.Store + Perms model.PermStore + Match FilterFunc } // FilterFunc can be used to filter which repositories are @@ -64,12 +64,12 @@ func (s *Syncer) SetFilter(fn FilterFunc) { func (s *Syncer) Sync(ctx context.Context, user *model.User, flatPermissions bool) error { unix := time.Now().Unix() - (3601) // force immediate expiration. note 1 hour expiration is hard coded at the moment - repos, err := s.Remote.Repos(ctx, user) + repos, err := s.Forge.Repos(ctx, user) if err != nil { return err } - remoteRepos := make([]*model.Repo, 0, len(repos)) + forgeRepos := make([]*model.Repo, 0, len(repos)) for _, repo := range repos { if s.Match(repo) { repo.Perm = &model.Perm{ @@ -87,20 +87,20 @@ func (s *Syncer) Sync(ctx context.Context, user *model.User, flatPermissions boo repo.Perm.Admin = true } } else { - remotePerm, err := s.Remote.Perm(ctx, user, repo) + forgePerm, err := s.Forge.Perm(ctx, user, repo) if err != nil { return fmt.Errorf("could not fetch permission of repo '%s': %v", repo.FullName, err) } - repo.Perm.Pull = remotePerm.Pull - repo.Perm.Push = remotePerm.Push - repo.Perm.Admin = remotePerm.Admin + repo.Perm.Pull = forgePerm.Pull + repo.Perm.Push = forgePerm.Push + repo.Perm.Admin = forgePerm.Admin } - remoteRepos = append(remoteRepos, repo) + forgeRepos = append(forgeRepos, repo) } } - err = s.Store.RepoBatch(remoteRepos) + err = s.Store.RepoBatch(forgeRepos) if err != nil { return err } diff --git a/server/store/datastore/feed.go b/server/store/datastore/feed.go index c99992a0d..b57122398 100644 --- a/server/store/datastore/feed.go +++ b/server/store/datastore/feed.go @@ -33,7 +33,7 @@ pipelines.pipeline_commit as feed_pipeline_commit, pipelines.pipeline_branch as feed_pipeline_branch, pipelines.pipeline_ref as feed_pipeline_ref, pipelines.pipeline_refspec as feed_pipeline_refspec, -pipelines.pipeline_remote as feed_pipeline_remote, +pipelines.pipeline_clone_url as feed_pipeline_clone_url, pipelines.pipeline_title as feed_pipeline_title, pipelines.pipeline_message as feed_pipeline_message, pipelines.pipeline_author as feed_pipeline_author, diff --git a/server/store/datastore/feed_test.go b/server/store/datastore/feed_test.go index 446e9e5a7..658bd9a93 100644 --- a/server/store/datastore/feed_test.go +++ b/server/store/datastore/feed_test.go @@ -37,7 +37,7 @@ func TestGetPipelineQueue(t *testing.T) { Owner: "bradrydzewski", Name: "test", FullName: "bradrydzewski/test", - RemoteID: "1", + ForgeID: "1", IsActive: true, } @@ -78,14 +78,14 @@ func TestUserFeed(t *testing.T) { Owner: "bradrydzewski", Name: "test1", FullName: "bradrydzewski/test1", - RemoteID: "1", + ForgeID: "1", IsActive: true, } repo2 := &model.Repo{ Owner: "johndoe", Name: "test", FullName: "johndoe/test2", - RemoteID: "2", + ForgeID: "2", IsActive: true, } @@ -129,21 +129,21 @@ func TestRepoListLatest(t *testing.T) { Owner: "bradrydzewski", Name: "test", FullName: "bradrydzewski/test", - RemoteID: "1", + ForgeID: "1", IsActive: true, } repo2 := &model.Repo{ Owner: "test", Name: "test", FullName: "test/test", - RemoteID: "2", + ForgeID: "2", IsActive: true, } repo3 := &model.Repo{ Owner: "octocat", Name: "hello-world", FullName: "octocat/hello-world", - RemoteID: "3", + ForgeID: "3", IsActive: true, } assert.NoError(t, store.CreateRepo(repo1)) diff --git a/server/store/datastore/migration/012_rename_remote_to_forge.go b/server/store/datastore/migration/012_rename_remote_to_forge.go new file mode 100644 index 000000000..8f648acab --- /dev/null +++ b/server/store/datastore/migration/012_rename_remote_to_forge.go @@ -0,0 +1,48 @@ +// Copyright 2022 Woodpecker Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package migration + +import ( + "xorm.io/xorm" +) + +type oldRepo012 struct { + ID int64 `xorm:"pk autoincr 'repo_id'"` + RemoteID string `xorm:"remote_id"` +} + +func (oldRepo012) TableName() string { + return "repos" +} + +var renameRemoteToForge = task{ + name: "rename-remote-to-forge", + required: true, + fn: func(sess *xorm.Session) error { + if err := renameColumn(sess, "pipelines", "pipeline_remote", "pipeline_clone_url"); err != nil { + return err + } + + // make sure the column exist before rename it + if err := sess.Sync2(new(oldRepo012)); err != nil { + return err + } + if err := renameColumn(sess, "repos", "remote_id", "forge_id"); err != nil { + return err + } + + return nil + }, +} diff --git a/server/store/datastore/migration/migration.go b/server/store/datastore/migration/migration.go index 970a219c8..4cc6197ad 100644 --- a/server/store/datastore/migration/migration.go +++ b/server/store/datastore/migration/migration.go @@ -39,6 +39,7 @@ var migrationTasks = []*task{ &renameBuildsToPipeline, &renameColumnsBuildsToPipeline, &renameTableProcsToSteps, + &renameRemoteToForge, } var allBeans = []interface{}{ diff --git a/server/store/datastore/permission.go b/server/store/datastore/permission.go index 8a20d8800..a192c57ac 100644 --- a/server/store/datastore/permission.go +++ b/server/store/datastore/permission.go @@ -50,9 +50,9 @@ func (s storage) permUpsert(sess *xorm.Session, perm *model.Perm) error { return fmt.Errorf("could not determine repo for permission: %v", perm) } - // lookup repo based on name or remote ID if possible + // lookup repo based on name or forge ID if possible if perm.RepoID == 0 && perm.Repo != nil { - r, err := s.getRepoNameFallback(sess, perm.Repo.RemoteID, perm.Repo.FullName) + r, err := s.getRepoNameFallback(sess, perm.Repo.ForgeID, perm.Repo.FullName) if err != nil { return err } diff --git a/server/store/datastore/permission_test.go b/server/store/datastore/permission_test.go index 79a2d16d8..83e4061ee 100644 --- a/server/store/datastore/permission_test.go +++ b/server/store/datastore/permission_test.go @@ -32,7 +32,7 @@ func TestPermFind(t *testing.T) { FullName: "bradrydzewski/test", Owner: "bradrydzewski", Name: "test", - RemoteID: "1", + ForgeID: "1", } assert.NoError(t, store.CreateRepo(repo)) @@ -77,7 +77,7 @@ func TestPermUpsert(t *testing.T) { FullName: "bradrydzewski/test", Owner: "bradrydzewski", Name: "test", - RemoteID: "1", + ForgeID: "1", } assert.NoError(t, store.CreateRepo(repo)) @@ -157,7 +157,7 @@ func TestPermDelete(t *testing.T) { FullName: "bradrydzewski/test", Owner: "bradrydzewski", Name: "test", - RemoteID: "1", + ForgeID: "1", } assert.NoError(t, store.CreateRepo(repo)) diff --git a/server/store/datastore/repo.go b/server/store/datastore/repo.go index 6d420c258..f80805047 100644 --- a/server/store/datastore/repo.go +++ b/server/store/datastore/repo.go @@ -30,25 +30,25 @@ func (s storage) GetRepo(id int64) (*model.Repo, error) { return repo, wrapGet(s.engine.ID(id).Get(repo)) } -func (s storage) GetRepoRemoteID(id model.RemoteID) (*model.Repo, error) { +func (s storage) GetRepoForgeID(id model.ForgeID) (*model.Repo, error) { sess := s.engine.NewSession() defer sess.Close() - return s.getRepoRemoteID(sess, id) + return s.getRepoForgeID(sess, id) } -func (s storage) getRepoRemoteID(e *xorm.Session, id model.RemoteID) (*model.Repo, error) { +func (s storage) getRepoForgeID(e *xorm.Session, id model.ForgeID) (*model.Repo, error) { repo := new(model.Repo) - return repo, wrapGet(e.Where("remote_id = ?", id).Get(repo)) + return repo, wrapGet(e.Where("forge_id = ?", id).Get(repo)) } -func (s storage) GetRepoNameFallback(remoteID model.RemoteID, fullName string) (*model.Repo, error) { +func (s storage) GetRepoNameFallback(forgeID model.ForgeID, fullName string) (*model.Repo, error) { sess := s.engine.NewSession() defer sess.Close() - return s.getRepoNameFallback(sess, remoteID, fullName) + return s.getRepoNameFallback(sess, forgeID, fullName) } -func (s storage) getRepoNameFallback(e *xorm.Session, remoteID model.RemoteID, fullName string) (*model.Repo, error) { - repo, err := s.getRepoRemoteID(e, remoteID) +func (s storage) getRepoNameFallback(e *xorm.Session, forgeID model.ForgeID, fullName string) (*model.Repo, error) { + repo, err := s.getRepoForgeID(e, forgeID) if errors.Is(err, types.RecordNotExist) { return s.getRepoName(e, fullName) } @@ -169,7 +169,7 @@ func (s storage) RepoBatch(repos []*model.Repo) error { } exist := true - repo, err := s.getRepoNameFallback(sess, repos[i].RemoteID, repos[i].FullName) + repo, err := s.getRepoNameFallback(sess, repos[i].ForgeID, repos[i].FullName) if err != nil { if errors.Is(err, types.RecordNotExist) { exist = false @@ -186,10 +186,10 @@ func (s storage) RepoBatch(repos []*model.Repo) error { return err } } - if repos[i].RemoteID.IsValid() { + if repos[i].ForgeID.IsValid() { if _, err := sess. - Where("remote_id = ?", repos[i].RemoteID). - Cols("repo_owner", "repo_name", "repo_full_name", "repo_scm", "repo_avatar", "repo_link", "repo_private", "repo_clone", "repo_branch", "remote_id"). + Where("forge_id = ?", repos[i].ForgeID). + Cols("repo_owner", "repo_name", "repo_full_name", "repo_scm", "repo_avatar", "repo_link", "repo_private", "repo_clone", "repo_branch", "forge_id"). Update(repos[i]); err != nil { return err } @@ -197,14 +197,14 @@ func (s storage) RepoBatch(repos []*model.Repo) error { if _, err := sess. Where("repo_owner = ?", repos[i].Owner). And(" repo_name = ?", repos[i].Name). - Cols("repo_owner", "repo_name", "repo_full_name", "repo_scm", "repo_avatar", "repo_link", "repo_private", "repo_clone", "repo_branch", "remote_id"). + Cols("repo_owner", "repo_name", "repo_full_name", "repo_scm", "repo_avatar", "repo_link", "repo_private", "repo_clone", "repo_branch", "forge_id"). Update(repos[i]); err != nil { return err } } _, err := sess. - Where("remote_id = ?", repos[i].RemoteID). + Where("forge_id = ?", repos[i].ForgeID). Get(repos[i]) if err != nil { return err diff --git a/server/store/datastore/repo_test.go b/server/store/datastore/repo_test.go index ae2748eab..c1aa18568 100644 --- a/server/store/datastore/repo_test.go +++ b/server/store/datastore/repo_test.go @@ -139,19 +139,19 @@ func TestRepoList(t *testing.T) { Owner: "bradrydzewski", Name: "test", FullName: "bradrydzewski/test", - RemoteID: "1", + ForgeID: "1", } repo2 := &model.Repo{ Owner: "test", Name: "test", FullName: "test/test", - RemoteID: "2", + ForgeID: "2", } repo3 := &model.Repo{ Owner: "octocat", Name: "hello-world", FullName: "octocat/hello-world", - RemoteID: "3", + ForgeID: "3", } assert.NoError(t, store.CreateRepo(repo1)) assert.NoError(t, store.CreateRepo(repo2)) @@ -195,25 +195,25 @@ func TestOwnedRepoList(t *testing.T) { Owner: "bradrydzewski", Name: "test", FullName: "bradrydzewski/test", - RemoteID: "1", + ForgeID: "1", } repo2 := &model.Repo{ Owner: "test", Name: "test", FullName: "test/test", - RemoteID: "2", + ForgeID: "2", } repo3 := &model.Repo{ Owner: "octocat", Name: "hello-world", FullName: "octocat/hello-world", - RemoteID: "3", + ForgeID: "3", } repo4 := &model.Repo{ Owner: "demo", Name: "demo", FullName: "demo/demo", - RemoteID: "4", + ForgeID: "4", } assert.NoError(t, store.CreateRepo(repo1)) assert.NoError(t, store.CreateRepo(repo2)) @@ -282,7 +282,7 @@ func TestRepoBatch(t *testing.T) { defer closer() if !assert.NoError(t, store.CreateRepo(&model.Repo{ - RemoteID: "5", + ForgeID: "5", UserID: 1, FullName: "foo/bar", Owner: "foo", @@ -294,7 +294,7 @@ func TestRepoBatch(t *testing.T) { repos := []*model.Repo{ { - RemoteID: "5", + ForgeID: "5", UserID: 1, FullName: "foo/bar", Owner: "foo", @@ -309,7 +309,7 @@ func TestRepoBatch(t *testing.T) { }, }, { - RemoteID: "6", + ForgeID: "6", UserID: 1, FullName: "bar/baz", Owner: "bar", @@ -317,7 +317,7 @@ func TestRepoBatch(t *testing.T) { IsActive: true, }, { - RemoteID: "7", + ForgeID: "7", UserID: 1, FullName: "baz/qux", Owner: "baz", @@ -325,7 +325,7 @@ func TestRepoBatch(t *testing.T) { IsActive: true, }, { - RemoteID: "8", + ForgeID: "8", UserID: 0, // not activated repos do hot have a user id assigned FullName: "baz/notes", Owner: "baz", @@ -343,7 +343,7 @@ func TestRepoBatch(t *testing.T) { assert.True(t, perm.Admin) repo := &model.Repo{ - RemoteID: "5", + ForgeID: "5", FullName: "foo/bar", Owner: "foo", Name: "bar", @@ -444,7 +444,7 @@ func TestRepoRedirection(t *testing.T) { repo := model.Repo{ UserID: 1, - RemoteID: "1", + ForgeID: "1", FullName: "bradrydzewski/test", Owner: "bradrydzewski", Name: "test", @@ -452,7 +452,7 @@ func TestRepoRedirection(t *testing.T) { assert.NoError(t, store.CreateRepo(&repo)) repoUpdated := model.Repo{ - RemoteID: "1", + ForgeID: "1", FullName: "bradrydzewski/test-renamed", Owner: "bradrydzewski", Name: "test-renamed", @@ -465,16 +465,16 @@ func TestRepoRedirection(t *testing.T) { assert.NoError(t, err) assert.Equal(t, repoFromStore.FullName, repoUpdated.FullName) - // test getting repo without remote ID (use name fallback) + // test getting repo without forge ID (use name fallback) repo = model.Repo{ UserID: 1, - FullName: "bradrydzewski/test-no-remote-id", + FullName: "bradrydzewski/test-no-forge-id", Owner: "bradrydzewski", - Name: "test-no-remote-id", + Name: "test-no-forge-id", } assert.NoError(t, store.CreateRepo(&repo)) - repoFromStore, err = store.GetRepoNameFallback("", "bradrydzewski/test-no-remote-id") + repoFromStore, err = store.GetRepoNameFallback("", "bradrydzewski/test-no-forge-id") assert.NoError(t, err) assert.Equal(t, repoFromStore.FullName, repo.FullName) } diff --git a/server/store/datastore/users_test.go b/server/store/datastore/users_test.go index 10f28a8d0..81ab5f4cd 100644 --- a/server/store/datastore/users_test.go +++ b/server/store/datastore/users_test.go @@ -196,21 +196,21 @@ func TestUsers(t *testing.T) { Name: "test", FullName: "bradrydzewski/test", IsActive: true, - RemoteID: "1", + ForgeID: "1", } repo2 := &model.Repo{ Owner: "test", Name: "test", FullName: "test/test", IsActive: true, - RemoteID: "2", + ForgeID: "2", } repo3 := &model.Repo{ Owner: "octocat", Name: "hello-world", FullName: "octocat/hello-world", IsActive: true, - RemoteID: "3", + ForgeID: "3", } g.Assert(store.CreateRepo(repo1)).IsNil() g.Assert(store.CreateRepo(repo2)).IsNil() diff --git a/server/store/mocks/store.go b/server/store/mocks/store.go index bcc2be205..e47272a4e 100644 --- a/server/store/mocks/store.go +++ b/server/store/mocks/store.go @@ -710,6 +710,29 @@ func (_m *Store) GetRepoCount() (int64, error) { return r0, r1 } +// GetRepoForgeID provides a mock function with given fields: _a0 +func (_m *Store) GetRepoForgeID(_a0 model.ForgeID) (*model.Repo, error) { + ret := _m.Called(_a0) + + var r0 *model.Repo + if rf, ok := ret.Get(0).(func(model.ForgeID) *model.Repo); ok { + r0 = rf(_a0) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*model.Repo) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(model.ForgeID) error); ok { + r1 = rf(_a0) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + // GetRepoName provides a mock function with given fields: _a0 func (_m *Store) GetRepoName(_a0 string) (*model.Repo, error) { ret := _m.Called(_a0) @@ -733,13 +756,13 @@ func (_m *Store) GetRepoName(_a0 string) (*model.Repo, error) { return r0, r1 } -// GetRepoNameFallback provides a mock function with given fields: remoteID, fullName -func (_m *Store) GetRepoNameFallback(remoteID model.RemoteID, fullName string) (*model.Repo, error) { - ret := _m.Called(remoteID, fullName) +// GetRepoNameFallback provides a mock function with given fields: forgeID, fullName +func (_m *Store) GetRepoNameFallback(forgeID model.ForgeID, fullName string) (*model.Repo, error) { + ret := _m.Called(forgeID, fullName) var r0 *model.Repo - if rf, ok := ret.Get(0).(func(model.RemoteID, string) *model.Repo); ok { - r0 = rf(remoteID, fullName) + if rf, ok := ret.Get(0).(func(model.ForgeID, string) *model.Repo); ok { + r0 = rf(forgeID, fullName) } else { if ret.Get(0) != nil { r0 = ret.Get(0).(*model.Repo) @@ -747,31 +770,8 @@ func (_m *Store) GetRepoNameFallback(remoteID model.RemoteID, fullName string) ( } var r1 error - if rf, ok := ret.Get(1).(func(model.RemoteID, string) error); ok { - r1 = rf(remoteID, fullName) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// GetRepoRemoteID provides a mock function with given fields: _a0 -func (_m *Store) GetRepoRemoteID(_a0 model.RemoteID) (*model.Repo, error) { - ret := _m.Called(_a0) - - var r0 *model.Repo - if rf, ok := ret.Get(0).(func(model.RemoteID) *model.Repo); ok { - r0 = rf(_a0) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*model.Repo) - } - } - - var r1 error - if rf, ok := ret.Get(1).(func(model.RemoteID) error); ok { - r1 = rf(_a0) + if rf, ok := ret.Get(1).(func(model.ForgeID, string) error); ok { + r1 = rf(forgeID, fullName) } else { r1 = ret.Error(1) } diff --git a/server/store/store.go b/server/store/store.go index 95144db5f..1b545071e 100644 --- a/server/store/store.go +++ b/server/store/store.go @@ -46,10 +46,10 @@ type Store interface { // Repos // GetRepo gets a repo by unique ID. GetRepo(int64) (*model.Repo, error) - // GetRepoRemoteID gets a repo by its remote ID. - GetRepoRemoteID(model.RemoteID) (*model.Repo, error) - // GetRepoNameFallback gets the repo by its remote ID and if this doesn't exist by its full name. - GetRepoNameFallback(remoteID model.RemoteID, fullName string) (*model.Repo, error) + // GetRepoForgeID gets a repo by its forge ID. + GetRepoForgeID(model.ForgeID) (*model.Repo, error) + // GetRepoNameFallback gets the repo by its forge ID and if this doesn't exist by its full name. + GetRepoNameFallback(forgeID model.ForgeID, fullName string) (*model.Repo, error) // GetRepoName gets a repo by its full name. GetRepoName(string) (*model.Repo, error) // GetRepoCount gets a count of all repositories in the system. diff --git a/server/web/config.go b/server/web/config.go index 3847aa35d..e08b563c4 100644 --- a/server/web/config.go +++ b/server/web/config.go @@ -51,7 +51,7 @@ func Config(c *gin.Context) { "syncing": syncing, "docs": server.Config.Server.Docs, "version": version.String(), - "forge": server.Config.Services.Remote.Name(), + "forge": server.Config.Services.Forge.Name(), } // default func map with json parser. diff --git a/web/src/lib/api/types/pipeline.ts b/web/src/lib/api/types/pipeline.ts index 3ba82f3ba..1d9669850 100644 --- a/web/src/lib/api/types/pipeline.ts +++ b/web/src/lib/api/types/pipeline.ts @@ -48,11 +48,11 @@ export type Pipeline = { // The alias for the commit. ref: string; - // The mapping from the local repository to a branch in the remote. + // The mapping from the local repository to a branch in the forge. refspec: string; - // The remote repository. - remote: string; + // The clone URL of the forge repository. + clone_url: string; title: string; diff --git a/woodpecker-go/woodpecker/types.go b/woodpecker-go/woodpecker/types.go index 4a75c54d9..2995f2b08 100644 --- a/woodpecker-go/woodpecker/types.go +++ b/woodpecker-go/woodpecker/types.go @@ -74,7 +74,7 @@ type ( Branch string `json:"branch"` Ref string `json:"ref"` Refspec string `json:"refspec"` - Remote string `json:"remote"` + CloneURL string `json:"clone_url"` Title string `json:"title"` Message string `json:"message"` Timestamp int64 `json:"timestamp"` @@ -141,7 +141,7 @@ type ( Branch string `json:"branch,omitempty"` Ref string `json:"ref,omitempty"` Refspec string `json:"refspec,omitempty"` - Remote string `json:"remote,omitempty"` + CloneURL string `json:"clone_url,omitempty"` Title string `json:"title,omitempty"` Message string `json:"message,omitempty"` Author string `json:"author,omitempty"`