From cf10d779ad49fc6a8bd0e46e084e90762897a985 Mon Sep 17 00:00:00 2001 From: Mohamed Sekour Date: Mon, 30 May 2022 13:58:48 +0000 Subject: [PATCH 01/30] add new endpoints for push mirrors management: * [x] add a new push mirror to specific repository * [x] sync now ( send all the changes to the configured push mirrors ) * [x] Get list of all push mirrors of a repository * [x] get a push mirror by ID * [x] delete push mirror by ID Signed-off-by: Mohamed Sekour --- .drone.yml | 61 ++++ .../git_helper_for_declarative_test.go | 11 + integrations/mirror_push_test.go | 5 +- models/repo/pushmirror.go | 8 +- modules/context/repo.go | 2 +- modules/convert/convert.go | 1 + modules/convert/mirror.go | 36 ++ modules/structs/mirror.go | 26 ++ package-lock.json | 53 +++ routers/api/v1/api.go | 9 + routers/api/v1/repo/mirror.go | 310 ++++++++++++++++++ routers/api/v1/repo/repo.go | 1 - routers/api/v1/swagger/options.go | 3 + routers/api/v1/swagger/repo.go | 14 + routers/web/repo/setting.go | 4 +- services/mailer/mail_test.go | 1 - templates/swagger/v1_json.tmpl | 304 ++++++++++++++++- 17 files changed, 839 insertions(+), 10 deletions(-) create mode 100644 modules/convert/mirror.go create mode 100644 modules/structs/mirror.go diff --git a/.drone.yml b/.drone.yml index ce922f8c60f6..a45e0d9e8e65 100644 --- a/.drone.yml +++ b/.drone.yml @@ -1061,6 +1061,67 @@ steps: exclude: - pull_request +--- +kind: pipeline +name: docker-linux-amd64-release-branch + +platform: + os: linux + arch: amd64 + +depends_on: + - testing-amd64 + - testing-arm64 + +trigger: + ref: + - "refs/heads/release/v*" + event: + exclude: + - cron + +steps: + - name: fetch-tags + image: docker:git + commands: + - git fetch --tags --force + + - name: publish + pull: always + image: techknowlogick/drone-docker:latest + settings: + auto_tag: false + tags: ${DRONE_BRANCH##release/v}-dev-linux-amd64 + repo: gitea/gitea + build_args: + - GOPROXY=https://goproxy.cn + password: + from_secret: docker_password + username: + from_secret: docker_username + when: + event: + exclude: + - pull_request + + - name: publish-rootless + image: techknowlogick/drone-docker:latest + settings: + dockerfile: Dockerfile.rootless + auto_tag: false + tags: ${DRONE_BRANCH##release/v}-dev-linux-amd64-rootless + repo: gitea/gitea + build_args: + - GOPROXY=https://goproxy.cn + password: + from_secret: docker_password + username: + from_secret: docker_username + when: + event: + exclude: + - pull_request + --- kind: pipeline type: docker diff --git a/integrations/git_helper_for_declarative_test.go b/integrations/git_helper_for_declarative_test.go index 1ea594b739c8..e2e0a0508c27 100644 --- a/integrations/git_helper_for_declarative_test.go +++ b/integrations/git_helper_for_declarative_test.go @@ -117,6 +117,17 @@ func doPartialGitClone(dstLocalPath string, u *url.URL) func(*testing.T) { } } +func doPartialGitClone(dstLocalPath string, u *url.URL) func(*testing.T) { + return func(t *testing.T) { + assert.NoError(t, git.CloneWithArgs(context.Background(), u.String(), dstLocalPath, allowLFSFilters(), git.CloneRepoOptions{ + Filter: "blob:none", + })) + exist, err := util.IsExist(filepath.Join(dstLocalPath, "README.md")) + assert.NoError(t, err) + assert.True(t, exist) + } +} + func doGitCloneFail(u *url.URL) func(*testing.T) { return func(t *testing.T) { tmpDir, err := os.MkdirTemp("", "doGitCloneFail") diff --git a/integrations/mirror_push_test.go b/integrations/mirror_push_test.go index a73b69e7869d..bb08b7a4d592 100644 --- a/integrations/mirror_push_test.go +++ b/integrations/mirror_push_test.go @@ -13,6 +13,7 @@ import ( "testing" "code.gitea.io/gitea/models" + "code.gitea.io/gitea/models/db" repo_model "code.gitea.io/gitea/models/repo" "code.gitea.io/gitea/models/unittest" user_model "code.gitea.io/gitea/models/user" @@ -47,7 +48,7 @@ func testMirrorPush(t *testing.T, u *url.URL) { doCreatePushMirror(ctx, fmt.Sprintf("%s%s/%s", u.String(), url.PathEscape(ctx.Username), url.PathEscape(mirrorRepo.Name)), user.LowerName, userPassword)(t) - mirrors, err := repo_model.GetPushMirrorsByRepoID(srcRepo.ID) + mirrors, err := repo_model.GetPushMirrorsByRepoID(srcRepo.ID, db.ListOptions{}) assert.NoError(t, err) assert.Len(t, mirrors, 1) @@ -72,7 +73,7 @@ func testMirrorPush(t *testing.T, u *url.URL) { // Cleanup doRemovePushMirror(ctx, fmt.Sprintf("%s%s/%s", u.String(), url.PathEscape(ctx.Username), url.PathEscape(mirrorRepo.Name)), user.LowerName, userPassword, int(mirrors[0].ID))(t) - mirrors, err = repo_model.GetPushMirrorsByRepoID(srcRepo.ID) + mirrors, err = repo_model.GetPushMirrorsByRepoID(srcRepo.ID, db.ListOptions{}) assert.NoError(t, err) assert.Len(t, mirrors, 0) } diff --git a/models/repo/pushmirror.go b/models/repo/pushmirror.go index 048c0c3487b7..03e781a4aea5 100644 --- a/models/repo/pushmirror.go +++ b/models/repo/pushmirror.go @@ -88,9 +88,13 @@ func GetPushMirrorByID(ID int64) (*PushMirror, error) { } // GetPushMirrorsByRepoID returns push-mirror information of a repository. -func GetPushMirrorsByRepoID(repoID int64) ([]*PushMirror, error) { +func GetPushMirrorsByRepoID(repoID int64, listOptions db.ListOptions) ([]*PushMirror, error) { mirrors := make([]*PushMirror, 0, 10) - return mirrors, db.GetEngine(db.DefaultContext).Where("repo_id=?", repoID).Find(&mirrors) + sess := db.GetEngine(db.DefaultContext).Where("repo_id = ?", repoID) + if listOptions.Page != 0 { + sess = db.SetSessionPagination(sess, &listOptions) + } + return mirrors, sess.Find(&mirrors) } // PushMirrorsIterate iterates all push-mirror repositories. diff --git a/modules/context/repo.go b/modules/context/repo.go index 539b111f153f..281b7f2e273f 100644 --- a/modules/context/repo.go +++ b/modules/context/repo.go @@ -398,7 +398,7 @@ func repoAssignment(ctx *Context, repo *repo_model.Repository) { } } - pushMirrors, err := repo_model.GetPushMirrorsByRepoID(repo.ID) + pushMirrors, err := repo_model.GetPushMirrorsByRepoID(repo.ID, db.ListOptions{}) if err != nil { ctx.ServerError("GetPushMirrorsByRepoID", err) return diff --git a/modules/convert/convert.go b/modules/convert/convert.go index 67b3902cd7ac..3ef8c7ac8aa7 100644 --- a/modules/convert/convert.go +++ b/modules/convert/convert.go @@ -413,3 +413,4 @@ func ToLFSLock(l *models.LFSLock) *api.LFSLock { }, } } + diff --git a/modules/convert/mirror.go b/modules/convert/mirror.go new file mode 100644 index 000000000000..e7ac62a08c89 --- /dev/null +++ b/modules/convert/mirror.go @@ -0,0 +1,36 @@ +// Copyright 2022 The Gitea Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package convert + +import ( + repo_model "code.gitea.io/gitea/models/repo" + "code.gitea.io/gitea/modules/git" + api "code.gitea.io/gitea/modules/structs" +) + +// ToPushMirror convert from repo_model.PushMirror and remoteAddress to api.TopicResponse +func ToPushMirror(pm *repo_model.PushMirror, repo *repo_model.Repository) *api.PushMirror { + remoteAddress, _ := getMirrorRemoteAddress(repo, pm.RemoteName) + return &api.PushMirror{ + ID: pm.ID, + RepoName: repo.Name, + RemoteName: pm.RemoteName, + RemoteAddress: remoteAddress, + CreatedUnix: pm.CreatedUnix.FormatLong(), + LastUpdateUnix: pm.LastUpdateUnix.FormatLong(), + LastError: pm.LastError, + Interval: pm.Interval.String(), + } +} + +func getMirrorRemoteAddress(repo *repo_model.Repository, remoteName string) (string, error) { + u, err := git.GetRemoteAddress(git.DefaultContext, repo.RepoPath(), remoteName) + if err != nil { + return "", err + } + // remove confidential information + u.User = nil + return u.String(), nil +} diff --git a/modules/structs/mirror.go b/modules/structs/mirror.go new file mode 100644 index 000000000000..c75e02fcbd8b --- /dev/null +++ b/modules/structs/mirror.go @@ -0,0 +1,26 @@ +// Copyright 2021 The Gitea Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package structs + +// CreatePushMirrorOption represents need information to create a push mirror of a repository. +type CreatePushMirrorOption struct { + RemoteAddress string `json:"remoteAddress"` + RemoteUsername string `json:"remoteUsername"` + RemotePassword string `json:"remotePassword"` + Interval string `json:"interval"` +} + +// PushMirror represents information of a push mirror +// swagger:model +type PushMirror struct { + ID int64 `json:"id"` + RepoName string `json:"repoName"` + RemoteName string `json:"remoteName"` + RemoteAddress string `json:"remoteAddress"` + CreatedUnix string `json:"created"` + LastUpdateUnix string `json:"lastUpdate"` + LastError string `json:"lastError"` + Interval string `json:"interval"` +} diff --git a/package-lock.json b/package-lock.json index 8f8f7013a51c..cf3a32272e76 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9559,6 +9559,41 @@ "node": ">=8" } }, + "node_modules/stylelint/node_modules/typedarray-to-buffer": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-4.0.0.tgz", + "integrity": "sha512-6dOYeZfS3O9RtRD1caom0sMxgK59b27+IwoNy8RDPsmslSGOyU+mpTamlaIW7aNKi90ZQZ9DFaZL3YRoiSCULQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/stylelint/node_modules/write-file-atomic": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.0.tgz", + "integrity": "sha512-JhcWoKffJNF7ivO9yflBhc7tn3wKnokMUfWpBriM9yCXj4ePQnRPcWglBkkg1AHC8nsW/EfxwwhqsLtOy59djA==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^4.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16" + } + }, "node_modules/stylis": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.1.1.tgz", @@ -18172,6 +18207,24 @@ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true + }, + "typedarray-to-buffer": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-4.0.0.tgz", + "integrity": "sha512-6dOYeZfS3O9RtRD1caom0sMxgK59b27+IwoNy8RDPsmslSGOyU+mpTamlaIW7aNKi90ZQZ9DFaZL3YRoiSCULQ==", + "dev": true + }, + "write-file-atomic": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.0.tgz", + "integrity": "sha512-JhcWoKffJNF7ivO9yflBhc7tn3wKnokMUfWpBriM9yCXj4ePQnRPcWglBkkg1AHC8nsW/EfxwwhqsLtOy59djA==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^4.0.0" + } } } }, diff --git a/routers/api/v1/api.go b/routers/api/v1/api.go index 62c4a8934cab..134da88fe157 100644 --- a/routers/api/v1/api.go +++ b/routers/api/v1/api.go @@ -973,6 +973,15 @@ func Routes() *web.Route { }) }, reqRepoReader(unit.TypeReleases)) m.Post("/mirror-sync", reqToken(), reqRepoWriter(unit.TypeCode), repo.MirrorSync) + m.Post("/push-mirror-sync", reqAdmin(), repo.PushMirrorSync) + m.Group("/push-mirror", func() { + m.Combo("").Get(reqAdmin(), repo.ListPushMirrors). + Post(reqAdmin(), bind(api.CreatePushMirrorOption{}), repo.AddPushMirror) + m.Combo("/{id}"). + Delete(reqAdmin(), repo.DeletePushMirrorByID). + Get(reqAdmin(), repo.GetPushMirrorByID) + }) + m.Get("/editorconfig/{filename}", context.ReferencesGitRepo(), context.RepoRefForAPI, reqRepoReader(unit.TypeCode), repo.GetEditorconfig) m.Group("/pulls", func() { m.Combo("").Get(repo.ListPullRequests). diff --git a/routers/api/v1/repo/mirror.go b/routers/api/v1/repo/mirror.go index 1af63c55be01..35998bea30ea 100644 --- a/routers/api/v1/repo/mirror.go +++ b/routers/api/v1/repo/mirror.go @@ -6,12 +6,24 @@ package repo import ( "errors" + "fmt" "net/http" + "time" + "code.gitea.io/gitea/models" + "code.gitea.io/gitea/routers/api/v1/utils" + + "code.gitea.io/gitea/models/db" repo_model "code.gitea.io/gitea/models/repo" "code.gitea.io/gitea/models/unit" "code.gitea.io/gitea/modules/context" + "code.gitea.io/gitea/modules/convert" "code.gitea.io/gitea/modules/setting" + api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/modules/util" + "code.gitea.io/gitea/modules/web" + "code.gitea.io/gitea/services/forms" + "code.gitea.io/gitea/services/migrations" mirror_service "code.gitea.io/gitea/services/mirror" ) @@ -63,3 +75,301 @@ func MirrorSync(ctx *context.APIContext) { ctx.Status(http.StatusOK) } + +// PushMirrorSync adds all push mirrored repositories to the sync queue +func PushMirrorSync(ctx *context.APIContext) { + // swagger:operation POST /repos/{owner}/{repo}/push-mirror-sync repository repoPushMirrorSync + // --- + // summary: Sync all push mirrored repository + // produces: + // - application/json + // parameters: + // - name: owner + // in: path + // description: owner of the repo to sync + // type: string + // required: true + // - name: repo + // in: path + // description: name of the repo to sync + // type: string + // required: true + // responses: + // "200": + // "$ref": "#/responses/empty" + // "403": + // "$ref": "#/responses/forbidden" + + repo := ctx.Repo.Repository + + if !setting.Mirror.Enabled { + ctx.Error(http.StatusBadRequest, "PushMirrorSync", "Mirror feature is disabled") + return + } + // Get All push mirrors of a specific repo + pushMirrors, err := repo_model.GetPushMirrorsByRepoID(repo.ID, db.ListOptions{}) + if err != nil { + ctx.Error(http.StatusBadRequest, "PushMirrorSync", err) + return + } + for _, mirror := range pushMirrors { + mirror_service.SyncPushMirror(ctx, mirror.ID) + } + + ctx.Status(http.StatusOK) +} + +// ListPushMirrors get list of push mirrors of a repository +func ListPushMirrors(ctx *context.APIContext) { + // swagger:operation GET /repos/{owner}/{repo}/push-mirror repository repoListPushMirrors + // --- + // summary: Get all push mirrors of the repository + // produces: + // - application/json + // parameters: + // - name: owner + // in: path + // description: owner of the repo + // type: string + // required: true + // - name: repo + // in: path + // description: name of the repo + // type: string + // required: true + // - name: page + // in: query + // description: page number of results to return (1-based) + // type: integer + // - name: limit + // in: query + // description: page size of results + // type: integer + // responses: + // "200": + // "$ref": "#/responses/PushMirrorList" + // "400": + // "$ref": "#/responses/error" + // "403": + // "$ref": "#/responses/forbidden" + + repo := ctx.Repo.Repository + listOptions := utils.GetListOptions(ctx) + if !setting.Mirror.Enabled { + ctx.Error(http.StatusBadRequest, "ListPushMirrors", "Mirror feature is disabled") + return + } + // Get All push mirrors of a specific repo + pushMirrors, err := repo_model.GetPushMirrorsByRepoID(repo.ID, listOptions) + if err != nil { + ctx.Error(http.StatusBadRequest, "ListPushMirrors", err) + return + } + + var responsePushMirrors = make([]*api.PushMirror, 0) + for _, mirror := range pushMirrors { + responsePushMirrors = append(responsePushMirrors, convert.ToPushMirror(mirror, repo)) + } + ctx.SetLinkHeader(len(pushMirrors), listOptions.PageSize) + ctx.SetTotalCountHeader(int64(len(pushMirrors))) + ctx.JSON(http.StatusOK, responsePushMirrors) +} + +// GetPushMirrorByID get push mirror of a repository by ID +func GetPushMirrorByID(ctx *context.APIContext) { + // swagger:operation GET /repos/{owner}/{repo}/push-mirror/{id} repository repoGetPushMirrorByID + // --- + // summary: Get push mirror of the repository by ID + // produces: + // - application/json + // parameters: + // - name: owner + // in: path + // description: owner of the repo to sync + // type: string + // required: true + // - name: repo + // in: path + // description: name of the repo to sync + // type: string + // required: true + // - name: id + // in: path + // description: ID of push mirror + // type: string + // required: true + // responses: + // "200": + // "$ref": "#/responses/PushMirror" + // "400": + // "$ref": "#/responses/error" + // "403": + // "$ref": "#/responses/forbidden" + + repo := ctx.Repo.Repository + id := ctx.ParamsInt64(":id") + if !setting.Mirror.Enabled { + ctx.Error(http.StatusBadRequest, "GetPushMirrorByID", "Mirror feature is disabled") + return + } + // Get push mirror of a specific repo by ID + pushMirror, err := repo_model.GetPushMirrorByID(id) + if err != nil { + ctx.Error(http.StatusBadRequest, "GetPushMirrorByID", err) + return + } + + ctx.JSON(http.StatusOK, convert.ToPushMirror(pushMirror, repo)) +} + +// AddPushMirror adds a push mirror to a repository +func AddPushMirror(ctx *context.APIContext) { + // swagger:operation POST /repos/{owner}/{repo}/push-mirror repository repoAddPushMirror + // --- + // summary: add a push mirror to the repository + // consumes: + // - application/json + // produces: + // - application/json + // parameters: + // - name: owner + // in: path + // description: owner of the repo + // type: string + // required: true + // - name: repo + // in: path + // description: name of the repo + // type: string + // required: true + // - name: body + // in: body + // schema: + // "$ref": "#/definitions/CreatePushMirrorOption" + // responses: + // "201": + // "$ref": "#/responses/PushMirror" + // "403": + // "$ref": "#/responses/forbidden" + // "400": + // "$ref": "#/responses/error" + + pushMirror := web.GetForm(ctx).(*api.CreatePushMirrorOption) + + if !setting.Mirror.Enabled { + ctx.Error(http.StatusBadRequest, "AddPushMirror", "Mirror feature is disabled") + return + } + CreatePushMirror(ctx, pushMirror) +} + +// DeletePushMirrorByID deletes a push mirror from a repository by ID +func DeletePushMirrorByID(ctx *context.APIContext) { + // swagger:operation DELETE /repos/{owner}/{repo}/push-mirror/{id} repository repoDeletePushMirror + // --- + // summary: deletes a push mirror from a repository by ID + // produces: + // - application/json + // parameters: + // - name: owner + // in: path + // description: owner of the repo + // type: string + // required: true + // - name: repo + // in: path + // description: name of the repo + // type: string + // required: true + // - name: id + // in: path + // description: id of the pushMirror + // type: string + // required: true + // responses: + // "204": + // "$ref": "#/responses/empty" + // "404": + // "$ref": "#/responses/notFound" + // "400": + // "$ref": "#/responses/error" + + id := ctx.ParamsInt64(":id") + + if !setting.Mirror.Enabled { + ctx.Error(http.StatusBadRequest, "DeletePushMirrorByID", "Mirror feature is disabled") + return + } + // delete push mirror by id + err := repo_model.DeletePushMirrorByID(id) + if err != nil { + ctx.Error(http.StatusBadRequest, "DeletePushMirrorByID", err) + return + } + ctx.Status(http.StatusNoContent) +} +func CreatePushMirror(ctx *context.APIContext, mirrorOption *api.CreatePushMirrorOption) { + repo := ctx.Repo.Repository + + interval, err := time.ParseDuration(mirrorOption.Interval) + if err != nil || (interval != 0 && interval < setting.Mirror.MinInterval) { + ctx.Error(http.StatusBadRequest, "AddPushMirror", err) + return + } + + address, err := forms.ParseRemoteAddr(mirrorOption.RemoteAddress, mirrorOption.RemoteUsername, mirrorOption.RemotePassword) + if err == nil { + err = migrations.IsMigrateURLAllowed(address, ctx.ContextUser) + } + if err != nil { + handleSettingRemoteAddrError(ctx, err) + return + } + + remoteSuffix, err := util.CryptoRandomString(10) + if err != nil { + ctx.ServerError("RandomString", err) + return + } + + pushMirror := &repo_model.PushMirror{ + RepoID: repo.ID, + Repo: repo, + RemoteName: fmt.Sprintf("remote_mirror_%s", remoteSuffix), + Interval: interval, + } + + if err = repo_model.InsertPushMirror(pushMirror); err != nil { + ctx.ServerError("InsertPushMirror", err) + return + } + + // if the registration of the push mirrorOption fails remove it from the database + if err = mirror_service.AddPushMirrorRemote(ctx, pushMirror, address); err != nil { + if err := repo_model.DeletePushMirrorByID(pushMirror.ID); err != nil { + ctx.ServerError("AddPushMirror", err) + } + ctx.ServerError("AddPushMirror", err) + return + } + + // create response + ctx.JSON(http.StatusCreated, convert.ToPushMirror(pushMirror, repo)) +} + +func handleSettingRemoteAddrError(ctx *context.APIContext, err error) { + if models.IsErrInvalidCloneAddr(err) { + addrErr := err.(*models.ErrInvalidCloneAddr) + switch { + case addrErr.IsProtocolInvalid: + ctx.Error(http.StatusBadRequest, "AddPushMirror", "Invalid mirror protocol") + case addrErr.IsURLError: + ctx.Error(http.StatusBadRequest, "AddPushMirror", "Invalid Url ") + case addrErr.IsPermissionDenied: + ctx.Error(http.StatusUnauthorized, "AddPushMirror", "permission denied") + default: + ctx.Error(http.StatusBadRequest, "AddPushMirror", "Unknown error") + } + return + } +} diff --git a/routers/api/v1/repo/repo.go b/routers/api/v1/repo/repo.go index 8485ffbac214..bd380b03cd74 100644 --- a/routers/api/v1/repo/repo.go +++ b/routers/api/v1/repo/repo.go @@ -263,7 +263,6 @@ func CreateUserRepo(ctx *context.APIContext, owner *user_model.User, opt api.Cre if err != nil { ctx.Error(http.StatusInternalServerError, "GetRepositoryByID", err) } - ctx.JSON(http.StatusCreated, convert.ToRepo(repo, perm.AccessModeOwner)) } diff --git a/routers/api/v1/swagger/options.go b/routers/api/v1/swagger/options.go index 2bd43c618087..bf17644655d3 100644 --- a/routers/api/v1/swagger/options.go +++ b/routers/api/v1/swagger/options.go @@ -172,4 +172,7 @@ type swaggerParameterBodies struct { // in:body CreateWikiPageOptions api.CreateWikiPageOptions + + // in:body + CreatePushMirrorOption api.CreatePushMirrorOption } diff --git a/routers/api/v1/swagger/repo.go b/routers/api/v1/swagger/repo.go index ab802db7812f..3522e242764e 100644 --- a/routers/api/v1/swagger/repo.go +++ b/routers/api/v1/swagger/repo.go @@ -345,6 +345,20 @@ type swaggerWikiCommitList struct { Body api.WikiCommitList `json:"body"` } +// PushMirror +// swagger:response PushMirror +type swaggerPushMirror struct { + // in:body + Body api.PushMirror `json:"body"` +} + +// PushMirrorList +// swagger:response PushMirrorList +type swaggerPushMirrorList struct { + // in:body + Body []api.PushMirror `json:"body"` +} + // RepoCollaboratorPermission // swagger:response RepoCollaboratorPermission type swaggerRepoCollaboratorPermission struct { diff --git a/routers/web/repo/setting.go b/routers/web/repo/setting.go index a60bf5262216..5200a3e0dea4 100644 --- a/routers/web/repo/setting.go +++ b/routers/web/repo/setting.go @@ -86,7 +86,7 @@ func Settings(ctx *context.Context) { } ctx.Data["StatsIndexerStatus"] = status } - pushMirrors, err := repo_model.GetPushMirrorsByRepoID(ctx.Repo.Repository.ID) + pushMirrors, err := repo_model.GetPushMirrorsByRepoID(ctx.Repo.Repository.ID, db.ListOptions{}) if err != nil { ctx.ServerError("GetPushMirrorsByRepoID", err) return @@ -1208,7 +1208,7 @@ func selectPushMirrorByForm(form *forms.RepoSettingForm, repo *repo_model.Reposi return nil, err } - pushMirrors, err := repo_model.GetPushMirrorsByRepoID(repo.ID) + pushMirrors, err := repo_model.GetPushMirrorsByRepoID(repo.ID, db.ListOptions{}) if err != nil { return nil, err } diff --git a/services/mailer/mail_test.go b/services/mailer/mail_test.go index baf426146acf..b943e64cd399 100644 --- a/services/mailer/mail_test.go +++ b/services/mailer/mail_test.go @@ -19,7 +19,6 @@ import ( "code.gitea.io/gitea/models/unittest" user_model "code.gitea.io/gitea/models/user" "code.gitea.io/gitea/modules/setting" - "github.com/stretchr/testify/assert" ) diff --git a/templates/swagger/v1_json.tmpl b/templates/swagger/v1_json.tmpl index d63cde60ecf1..e800e2c8d711 100644 --- a/templates/swagger/v1_json.tmpl +++ b/templates/swagger/v1_json.tmpl @@ -8678,6 +8678,230 @@ } } }, + "/repos/{owner}/{repo}/push-mirror": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "Get all push mirrors of the repository", + "operationId": "repoListPushMirrors", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "integer", + "description": "page number of results to return (1-based)", + "name": "page", + "in": "query" + }, + { + "type": "integer", + "description": "page size of results", + "name": "limit", + "in": "query" + } + ], + "responses": { + "200": { + "$ref": "#/responses/PushMirrorList" + }, + "400": { + "$ref": "#/responses/error" + }, + "403": { + "$ref": "#/responses/forbidden" + } + } + }, + "post": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "add a push mirror to the repository", + "operationId": "repoAddPushMirror", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "name": "body", + "in": "body", + "schema": { + "$ref": "#/definitions/CreatePushMirrorOption" + } + } + ], + "responses": { + "201": { + "$ref": "#/responses/PushMirror" + }, + "400": { + "$ref": "#/responses/error" + }, + "403": { + "$ref": "#/responses/forbidden" + } + } + } + }, + "/repos/{owner}/{repo}/push-mirror-sync": { + "post": { + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "Sync all push mirrored repository", + "operationId": "repoPushMirrorSync", + "parameters": [ + { + "type": "string", + "description": "owner of the repo to sync", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo to sync", + "name": "repo", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/empty" + }, + "403": { + "$ref": "#/responses/forbidden" + } + } + } + }, + "/repos/{owner}/{repo}/push-mirror/{id}": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "Get push mirror of the repository by ID", + "operationId": "repoGetPushMirrorByID", + "parameters": [ + { + "type": "string", + "description": "owner of the repo to sync", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo to sync", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "ID of push mirror", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/PushMirror" + }, + "400": { + "$ref": "#/responses/error" + }, + "403": { + "$ref": "#/responses/forbidden" + } + } + }, + "delete": { + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "deletes a push mirror from a repository by ID", + "operationId": "repoDeletePushMirror", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "id of the pushMirror", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "$ref": "#/responses/empty" + }, + "400": { + "$ref": "#/responses/error" + }, + "404": { + "$ref": "#/responses/notFound" + } + } + } + }, "/repos/{owner}/{repo}/raw/{filepath}": { "get": { "produces": [ @@ -14318,6 +14542,29 @@ }, "x-go-package": "code.gitea.io/gitea/modules/structs" }, + "CreatePushMirrorOption": { + "type": "object", + "title": "CreatePushMirrorOption represents need information to create a push mirror of a repository.", + "properties": { + "interval": { + "type": "string", + "x-go-name": "Interval" + }, + "remoteAddress": { + "type": "string", + "x-go-name": "RemoteAddress" + }, + "remotePassword": { + "type": "string", + "x-go-name": "RemotePassword" + }, + "remoteUsername": { + "type": "string", + "x-go-name": "RemoteUsername" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, "CreateReleaseOption": { "description": "CreateReleaseOption options when creating a release", "type": "object", @@ -17483,6 +17730,46 @@ }, "x-go-package": "code.gitea.io/gitea/modules/structs" }, + "PushMirror": { + "description": "PushMirror represents information of a push mirror", + "type": "object", + "properties": { + "created": { + "type": "string", + "x-go-name": "CreatedUnix" + }, + "id": { + "type": "integer", + "format": "int64", + "x-go-name": "ID" + }, + "interval": { + "type": "string", + "x-go-name": "Interval" + }, + "lastError": { + "type": "string", + "x-go-name": "LastError" + }, + "lastUpdate": { + "type": "string", + "x-go-name": "LastUpdateUnix" + }, + "remoteAddress": { + "type": "string", + "x-go-name": "RemoteAddress" + }, + "remoteName": { + "type": "string", + "x-go-name": "RemoteName" + }, + "repoName": { + "type": "string", + "x-go-name": "RepoName" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, "Reaction": { "description": "Reaction contain one reaction", "type": "object", @@ -19240,6 +19527,21 @@ } } }, + "PushMirror": { + "description": "PushMirror", + "schema": { + "$ref": "#/definitions/PushMirror" + } + }, + "PushMirrorList": { + "description": "PushMirrorList", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/PushMirror" + } + } + }, "Reaction": { "description": "Reaction", "schema": { @@ -19519,7 +19821,7 @@ "parameterBodies": { "description": "parameterBodies", "schema": { - "$ref": "#/definitions/CreateWikiPageOptions" + "$ref": "#/definitions/CreatePushMirrorOption" } }, "redirect": { From a4b40bd139c5c4b0c259fcf1ca0a609ccd70c309 Mon Sep 17 00:00:00 2001 From: Mohamed Date: Thu, 2 Jun 2022 09:48:45 +0200 Subject: [PATCH 02/30] remove changes added to some files by mistake Signed-off-by: Mohamed Sekour --- .drone.yml | 63 +------------------ .../git_helper_for_declarative_test.go | 11 ---- package-lock.json | 3 +- 3 files changed, 2 insertions(+), 75 deletions(-) diff --git a/.drone.yml b/.drone.yml index a45e0d9e8e65..d6ad08713ec5 100644 --- a/.drone.yml +++ b/.drone.yml @@ -1061,67 +1061,6 @@ steps: exclude: - pull_request ---- -kind: pipeline -name: docker-linux-amd64-release-branch - -platform: - os: linux - arch: amd64 - -depends_on: - - testing-amd64 - - testing-arm64 - -trigger: - ref: - - "refs/heads/release/v*" - event: - exclude: - - cron - -steps: - - name: fetch-tags - image: docker:git - commands: - - git fetch --tags --force - - - name: publish - pull: always - image: techknowlogick/drone-docker:latest - settings: - auto_tag: false - tags: ${DRONE_BRANCH##release/v}-dev-linux-amd64 - repo: gitea/gitea - build_args: - - GOPROXY=https://goproxy.cn - password: - from_secret: docker_password - username: - from_secret: docker_username - when: - event: - exclude: - - pull_request - - - name: publish-rootless - image: techknowlogick/drone-docker:latest - settings: - dockerfile: Dockerfile.rootless - auto_tag: false - tags: ${DRONE_BRANCH##release/v}-dev-linux-amd64-rootless - repo: gitea/gitea - build_args: - - GOPROXY=https://goproxy.cn - password: - from_secret: docker_password - username: - from_secret: docker_username - when: - event: - exclude: - - pull_request - --- kind: pipeline type: docker @@ -1485,4 +1424,4 @@ steps: webhook_id: from_secret: discord_webhook_id webhook_token: - from_secret: discord_webhook_token + from_secret: discord_webhook_token \ No newline at end of file diff --git a/integrations/git_helper_for_declarative_test.go b/integrations/git_helper_for_declarative_test.go index e2e0a0508c27..1ea594b739c8 100644 --- a/integrations/git_helper_for_declarative_test.go +++ b/integrations/git_helper_for_declarative_test.go @@ -117,17 +117,6 @@ func doPartialGitClone(dstLocalPath string, u *url.URL) func(*testing.T) { } } -func doPartialGitClone(dstLocalPath string, u *url.URL) func(*testing.T) { - return func(t *testing.T) { - assert.NoError(t, git.CloneWithArgs(context.Background(), u.String(), dstLocalPath, allowLFSFilters(), git.CloneRepoOptions{ - Filter: "blob:none", - })) - exist, err := util.IsExist(filepath.Join(dstLocalPath, "README.md")) - assert.NoError(t, err) - assert.True(t, exist) - } -} - func doGitCloneFail(u *url.URL) func(*testing.T) { return func(t *testing.T) { tmpDir, err := os.MkdirTemp("", "doGitCloneFail") diff --git a/package-lock.json b/package-lock.json index cf3a32272e76..9795c4b1f3f3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18215,8 +18215,7 @@ "dev": true }, "write-file-atomic": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.0.tgz", + "version": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.0.tgz", "integrity": "sha512-JhcWoKffJNF7ivO9yflBhc7tn3wKnokMUfWpBriM9yCXj4ePQnRPcWglBkkg1AHC8nsW/EfxwwhqsLtOy59djA==", "dev": true, "requires": { From 4a1fb913ae9633ce809fd4b875e554d025fe52e1 Mon Sep 17 00:00:00 2001 From: Mohamed Date: Thu, 2 Jun 2022 10:47:18 +0200 Subject: [PATCH 03/30] fix lint errors --- modules/convert/convert.go | 1 - package-lock.json | 11 +++++++++++ package.json | 1 + routers/api/v1/repo/mirror.go | 3 ++- 4 files changed, 14 insertions(+), 2 deletions(-) diff --git a/modules/convert/convert.go b/modules/convert/convert.go index 3ef8c7ac8aa7..67b3902cd7ac 100644 --- a/modules/convert/convert.go +++ b/modules/convert/convert.go @@ -413,4 +413,3 @@ func ToLFSLock(l *models.LFSLock) *api.LFSLock { }, } } - diff --git a/package-lock.json b/package-lock.json index 9795c4b1f3f3..ba6cc6f94566 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17,6 +17,7 @@ "escape-goat": "4.0.0", "fast-glob": "3.2.11", "font-awesome": "4.7.0", + "is-typedarray": "1.0.0", "jquery": "3.6.0", "jquery.are-you-sure": "1.9.0", "less": "4.1.2", @@ -5602,6 +5603,11 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" + }, "node_modules/is-weakref": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", @@ -15159,6 +15165,11 @@ "has-symbols": "^1.0.2" } }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" + }, "is-weakref": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", diff --git a/package.json b/package.json index addf5633fbf9..13486a025797 100644 --- a/package.json +++ b/package.json @@ -17,6 +17,7 @@ "escape-goat": "4.0.0", "fast-glob": "3.2.11", "font-awesome": "4.7.0", + "is-typedarray": "1.0.0", "jquery": "3.6.0", "jquery.are-you-sure": "1.9.0", "less": "4.1.2", diff --git a/routers/api/v1/repo/mirror.go b/routers/api/v1/repo/mirror.go index 35998bea30ea..1bb317889410 100644 --- a/routers/api/v1/repo/mirror.go +++ b/routers/api/v1/repo/mirror.go @@ -166,7 +166,7 @@ func ListPushMirrors(ctx *context.APIContext) { return } - var responsePushMirrors = make([]*api.PushMirror, 0) + responsePushMirrors := make([]*api.PushMirror, 0) for _, mirror := range pushMirrors { responsePushMirrors = append(responsePushMirrors, convert.ToPushMirror(mirror, repo)) } @@ -308,6 +308,7 @@ func DeletePushMirrorByID(ctx *context.APIContext) { } ctx.Status(http.StatusNoContent) } + func CreatePushMirror(ctx *context.APIContext, mirrorOption *api.CreatePushMirrorOption) { repo := ctx.Repo.Repository From 5c5eef3f09f58ce2a57772455c837d54242ddc49 Mon Sep 17 00:00:00 2001 From: zeripath Date: Thu, 2 Jun 2022 10:36:54 +0100 Subject: [PATCH 04/30] Update .drone.yml --- .drone.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.drone.yml b/.drone.yml index d6ad08713ec5..ce922f8c60f6 100644 --- a/.drone.yml +++ b/.drone.yml @@ -1424,4 +1424,4 @@ steps: webhook_id: from_secret: discord_webhook_id webhook_token: - from_secret: discord_webhook_token \ No newline at end of file + from_secret: discord_webhook_token From a79cd856b3e0f3a4611b25bb1f57488f1562fb28 Mon Sep 17 00:00:00 2001 From: Andrew Thornton Date: Thu, 2 Jun 2022 11:55:58 +0100 Subject: [PATCH 05/30] Remove unnecessary package change Signed-off-by: Andrew Thornton --- package-lock.json | 63 ----------------------------------------------- package.json | 1 - 2 files changed, 64 deletions(-) diff --git a/package-lock.json b/package-lock.json index ba6cc6f94566..8f8f7013a51c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17,7 +17,6 @@ "escape-goat": "4.0.0", "fast-glob": "3.2.11", "font-awesome": "4.7.0", - "is-typedarray": "1.0.0", "jquery": "3.6.0", "jquery.are-you-sure": "1.9.0", "less": "4.1.2", @@ -5603,11 +5602,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" - }, "node_modules/is-weakref": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", @@ -9565,41 +9559,6 @@ "node": ">=8" } }, - "node_modules/stylelint/node_modules/typedarray-to-buffer": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-4.0.0.tgz", - "integrity": "sha512-6dOYeZfS3O9RtRD1caom0sMxgK59b27+IwoNy8RDPsmslSGOyU+mpTamlaIW7aNKi90ZQZ9DFaZL3YRoiSCULQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/stylelint/node_modules/write-file-atomic": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.0.tgz", - "integrity": "sha512-JhcWoKffJNF7ivO9yflBhc7tn3wKnokMUfWpBriM9yCXj4ePQnRPcWglBkkg1AHC8nsW/EfxwwhqsLtOy59djA==", - "dev": true, - "dependencies": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^4.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16" - } - }, "node_modules/stylis": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.1.1.tgz", @@ -15165,11 +15124,6 @@ "has-symbols": "^1.0.2" } }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" - }, "is-weakref": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", @@ -18218,23 +18172,6 @@ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true - }, - "typedarray-to-buffer": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-4.0.0.tgz", - "integrity": "sha512-6dOYeZfS3O9RtRD1caom0sMxgK59b27+IwoNy8RDPsmslSGOyU+mpTamlaIW7aNKi90ZQZ9DFaZL3YRoiSCULQ==", - "dev": true - }, - "write-file-atomic": { - "version": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.0.tgz", - "integrity": "sha512-JhcWoKffJNF7ivO9yflBhc7tn3wKnokMUfWpBriM9yCXj4ePQnRPcWglBkkg1AHC8nsW/EfxwwhqsLtOy59djA==", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^4.0.0" - } } } }, diff --git a/package.json b/package.json index 13486a025797..addf5633fbf9 100644 --- a/package.json +++ b/package.json @@ -17,7 +17,6 @@ "escape-goat": "4.0.0", "fast-glob": "3.2.11", "font-awesome": "4.7.0", - "is-typedarray": "1.0.0", "jquery": "3.6.0", "jquery.are-you-sure": "1.9.0", "less": "4.1.2", From 99f6a77e8e43fb9960bed2621caa4a6bbd714563 Mon Sep 17 00:00:00 2001 From: Andrew Thornton Date: Thu, 2 Jun 2022 11:57:07 +0100 Subject: [PATCH 06/30] Protect against reading other repo push mirrors Signed-off-by: Andrew Thornton --- models/repo/pushmirror.go | 13 +++++++++++++ routers/api/v1/repo/mirror.go | 2 +- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/models/repo/pushmirror.go b/models/repo/pushmirror.go index 03e781a4aea5..b34e3eaac629 100644 --- a/models/repo/pushmirror.go +++ b/models/repo/pushmirror.go @@ -76,6 +76,7 @@ func DeletePushMirrorsByRepoID(repoID int64) error { } // GetPushMirrorByID returns push-mirror information. +// WARNING: You should ensure that this PushMirror belongs to the repository you are intending to use it with func GetPushMirrorByID(ID int64) (*PushMirror, error) { m := &PushMirror{} has, err := db.GetEngine(db.DefaultContext).ID(ID).Get(m) @@ -87,6 +88,18 @@ func GetPushMirrorByID(ID int64) (*PushMirror, error) { return m, nil } +// GetPushMirrorByRepoIDAndID returns push-mirror information. +func GetPushMirrorByRepoIDAndID(repoID, mirrorID int64) (*PushMirror, error) { + m := &PushMirror{} + has, err := db.GetEngine(db.DefaultContext).ID(mirrorID).Where("repo_id = ?", repoID).Get(m) + if err != nil { + return nil, err + } else if !has { + return nil, ErrPushMirrorNotExist + } + return m, nil +} + // GetPushMirrorsByRepoID returns push-mirror information of a repository. func GetPushMirrorsByRepoID(repoID int64, listOptions db.ListOptions) ([]*PushMirror, error) { mirrors := make([]*PushMirror, 0, 10) diff --git a/routers/api/v1/repo/mirror.go b/routers/api/v1/repo/mirror.go index 1bb317889410..9b82791dd8a6 100644 --- a/routers/api/v1/repo/mirror.go +++ b/routers/api/v1/repo/mirror.go @@ -213,7 +213,7 @@ func GetPushMirrorByID(ctx *context.APIContext) { return } // Get push mirror of a specific repo by ID - pushMirror, err := repo_model.GetPushMirrorByID(id) + pushMirror, err := repo_model.GetPushMirrorByRepoIDAndID(repo.ID, id) if err != nil { ctx.Error(http.StatusBadRequest, "GetPushMirrorByID", err) return From 4141460a2c2148bafb6c6a4cdc24cd8ad3943f8f Mon Sep 17 00:00:00 2001 From: zeripath Date: Thu, 2 Jun 2022 11:59:39 +0100 Subject: [PATCH 07/30] Update services/mailer/mail_test.go --- services/mailer/mail_test.go | 1 + 1 file changed, 1 insertion(+) diff --git a/services/mailer/mail_test.go b/services/mailer/mail_test.go index b943e64cd399..baf426146acf 100644 --- a/services/mailer/mail_test.go +++ b/services/mailer/mail_test.go @@ -19,6 +19,7 @@ import ( "code.gitea.io/gitea/models/unittest" user_model "code.gitea.io/gitea/models/user" "code.gitea.io/gitea/modules/setting" + "github.com/stretchr/testify/assert" ) From 0742732601499978a204053f93cac436d6e0c7cf Mon Sep 17 00:00:00 2001 From: zeripath Date: Thu, 2 Jun 2022 12:01:05 +0100 Subject: [PATCH 08/30] Apply suggestions from code review --- routers/api/v1/repo/mirror.go | 1 - routers/api/v1/repo/repo.go | 1 + 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/routers/api/v1/repo/mirror.go b/routers/api/v1/repo/mirror.go index 9b82791dd8a6..07768948f217 100644 --- a/routers/api/v1/repo/mirror.go +++ b/routers/api/v1/repo/mirror.go @@ -12,7 +12,6 @@ import ( "code.gitea.io/gitea/models" "code.gitea.io/gitea/routers/api/v1/utils" - "code.gitea.io/gitea/models/db" repo_model "code.gitea.io/gitea/models/repo" "code.gitea.io/gitea/models/unit" diff --git a/routers/api/v1/repo/repo.go b/routers/api/v1/repo/repo.go index bd380b03cd74..8485ffbac214 100644 --- a/routers/api/v1/repo/repo.go +++ b/routers/api/v1/repo/repo.go @@ -263,6 +263,7 @@ func CreateUserRepo(ctx *context.APIContext, owner *user_model.User, opt api.Cre if err != nil { ctx.Error(http.StatusInternalServerError, "GetRepositoryByID", err) } + ctx.JSON(http.StatusCreated, convert.ToRepo(repo, perm.AccessModeOwner)) } From 4fa4660dc76c79a9bf051e1aadd38dd41a7a098c Mon Sep 17 00:00:00 2001 From: Andrew Thornton Date: Thu, 2 Jun 2022 12:33:58 +0100 Subject: [PATCH 09/30] And Delete too Signed-off-by: Andrew Thornton --- models/repo/pushmirror.go | 9 ++++++++- routers/api/v1/repo/mirror.go | 2 +- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/models/repo/pushmirror.go b/models/repo/pushmirror.go index b34e3eaac629..ec140b17924d 100644 --- a/models/repo/pushmirror.go +++ b/models/repo/pushmirror.go @@ -64,11 +64,18 @@ func UpdatePushMirror(m *PushMirror) error { } // DeletePushMirrorByID deletes a push-mirrors by ID +// WARNING: This does not check if this PushMirror belongs to a RepoID func DeletePushMirrorByID(ID int64) error { _, err := db.GetEngine(db.DefaultContext).ID(ID).Delete(&PushMirror{}) return err } +// DeletePushMirrorByRepoIDAndID deletes a push-mirrors by ID +func DeletePushMirrorByRepoIDAndID(repoID, mirrorID int64) error { + _, err := db.GetEngine(db.DefaultContext).ID(mirrorID).Where("repo_id = ?", repoID).Delete(&PushMirror{}) + return err +} + // DeletePushMirrorsByRepoID deletes all push-mirrors by repoID func DeletePushMirrorsByRepoID(repoID int64) error { _, err := db.GetEngine(db.DefaultContext).Delete(&PushMirror{RepoID: repoID}) @@ -76,7 +83,7 @@ func DeletePushMirrorsByRepoID(repoID int64) error { } // GetPushMirrorByID returns push-mirror information. -// WARNING: You should ensure that this PushMirror belongs to the repository you are intending to use it with +// WARNING: You must ensure that this PushMirror belongs to the repository you are intending to use it with func GetPushMirrorByID(ID int64) (*PushMirror, error) { m := &PushMirror{} has, err := db.GetEngine(db.DefaultContext).ID(ID).Get(m) diff --git a/routers/api/v1/repo/mirror.go b/routers/api/v1/repo/mirror.go index 9b82791dd8a6..6d2f884f72a8 100644 --- a/routers/api/v1/repo/mirror.go +++ b/routers/api/v1/repo/mirror.go @@ -301,7 +301,7 @@ func DeletePushMirrorByID(ctx *context.APIContext) { return } // delete push mirror by id - err := repo_model.DeletePushMirrorByID(id) + err := repo_model.DeletePushMirrorByRepoIDAndID(ctx.Repo.Repository.ID, id) if err != nil { ctx.Error(http.StatusBadRequest, "DeletePushMirrorByID", err) return From 633095d630d744383acccd94e6c641d5efc0e3e3 Mon Sep 17 00:00:00 2001 From: Andrew Thornton Date: Thu, 2 Jun 2022 13:05:30 +0100 Subject: [PATCH 10/30] fix lint Signed-off-by: Andrew Thornton --- routers/api/v1/repo/mirror.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/routers/api/v1/repo/mirror.go b/routers/api/v1/repo/mirror.go index 18ccfe89e7f8..6595161e6a43 100644 --- a/routers/api/v1/repo/mirror.go +++ b/routers/api/v1/repo/mirror.go @@ -11,7 +11,6 @@ import ( "time" "code.gitea.io/gitea/models" - "code.gitea.io/gitea/routers/api/v1/utils" "code.gitea.io/gitea/models/db" repo_model "code.gitea.io/gitea/models/repo" "code.gitea.io/gitea/models/unit" @@ -21,6 +20,7 @@ import ( api "code.gitea.io/gitea/modules/structs" "code.gitea.io/gitea/modules/util" "code.gitea.io/gitea/modules/web" + "code.gitea.io/gitea/routers/api/v1/utils" "code.gitea.io/gitea/services/forms" "code.gitea.io/gitea/services/migrations" mirror_service "code.gitea.io/gitea/services/mirror" From d507d47082de78d018f51600c7c8eb19f0043700 Mon Sep 17 00:00:00 2001 From: Andrew Thornton Date: Thu, 2 Jun 2022 22:46:21 +0100 Subject: [PATCH 11/30] Use remote name not id Signed-off-by: Andrew Thornton --- models/repo/pushmirror.go | 12 ++++++------ modules/convert/mirror.go | 1 - modules/structs/mirror.go | 1 - routers/api/v1/api.go | 4 ++-- routers/api/v1/repo/mirror.go | 24 ++++++++++++------------ 5 files changed, 20 insertions(+), 22 deletions(-) diff --git a/models/repo/pushmirror.go b/models/repo/pushmirror.go index ec140b17924d..204895687bde 100644 --- a/models/repo/pushmirror.go +++ b/models/repo/pushmirror.go @@ -70,9 +70,9 @@ func DeletePushMirrorByID(ID int64) error { return err } -// DeletePushMirrorByRepoIDAndID deletes a push-mirrors by ID -func DeletePushMirrorByRepoIDAndID(repoID, mirrorID int64) error { - _, err := db.GetEngine(db.DefaultContext).ID(mirrorID).Where("repo_id = ?", repoID).Delete(&PushMirror{}) +// DeletePushMirrorByRepoIDAndName deletes a push-mirrors by remote name +func DeletePushMirrorByRepoIDAndName(repoID int64, remoteName string) error { + _, err := db.GetEngine(db.DefaultContext).Where("repo_id = ? AND remote_name = ?", repoID, remoteName).Delete(&PushMirror{}) return err } @@ -95,10 +95,10 @@ func GetPushMirrorByID(ID int64) (*PushMirror, error) { return m, nil } -// GetPushMirrorByRepoIDAndID returns push-mirror information. -func GetPushMirrorByRepoIDAndID(repoID, mirrorID int64) (*PushMirror, error) { +// GetPushMirrorByRepoIDAndName returns push-mirror information. +func GetPushMirrorByRepoIDAndName(repoID int64, remoteName string) (*PushMirror, error) { m := &PushMirror{} - has, err := db.GetEngine(db.DefaultContext).ID(mirrorID).Where("repo_id = ?", repoID).Get(m) + has, err := db.GetEngine(db.DefaultContext).Where("repo_id = ? AND remote_name = ?", repoID, remoteName).Get(m) if err != nil { return nil, err } else if !has { diff --git a/modules/convert/mirror.go b/modules/convert/mirror.go index e7ac62a08c89..fe0a1c2cbc67 100644 --- a/modules/convert/mirror.go +++ b/modules/convert/mirror.go @@ -14,7 +14,6 @@ import ( func ToPushMirror(pm *repo_model.PushMirror, repo *repo_model.Repository) *api.PushMirror { remoteAddress, _ := getMirrorRemoteAddress(repo, pm.RemoteName) return &api.PushMirror{ - ID: pm.ID, RepoName: repo.Name, RemoteName: pm.RemoteName, RemoteAddress: remoteAddress, diff --git a/modules/structs/mirror.go b/modules/structs/mirror.go index c75e02fcbd8b..86623c0c8542 100644 --- a/modules/structs/mirror.go +++ b/modules/structs/mirror.go @@ -15,7 +15,6 @@ type CreatePushMirrorOption struct { // PushMirror represents information of a push mirror // swagger:model type PushMirror struct { - ID int64 `json:"id"` RepoName string `json:"repoName"` RemoteName string `json:"remoteName"` RemoteAddress string `json:"remoteAddress"` diff --git a/routers/api/v1/api.go b/routers/api/v1/api.go index 134da88fe157..5751c0067939 100644 --- a/routers/api/v1/api.go +++ b/routers/api/v1/api.go @@ -977,9 +977,9 @@ func Routes() *web.Route { m.Group("/push-mirror", func() { m.Combo("").Get(reqAdmin(), repo.ListPushMirrors). Post(reqAdmin(), bind(api.CreatePushMirrorOption{}), repo.AddPushMirror) - m.Combo("/{id}"). + m.Combo("/{name}"). Delete(reqAdmin(), repo.DeletePushMirrorByID). - Get(reqAdmin(), repo.GetPushMirrorByID) + Get(reqAdmin(), repo.GetPushMirrorByName) }) m.Get("/editorconfig/{filename}", context.ReferencesGitRepo(), context.RepoRefForAPI, reqRepoReader(unit.TypeCode), repo.GetEditorconfig) diff --git a/routers/api/v1/repo/mirror.go b/routers/api/v1/repo/mirror.go index 6595161e6a43..e11602d88e12 100644 --- a/routers/api/v1/repo/mirror.go +++ b/routers/api/v1/repo/mirror.go @@ -174,9 +174,9 @@ func ListPushMirrors(ctx *context.APIContext) { ctx.JSON(http.StatusOK, responsePushMirrors) } -// GetPushMirrorByID get push mirror of a repository by ID -func GetPushMirrorByID(ctx *context.APIContext) { - // swagger:operation GET /repos/{owner}/{repo}/push-mirror/{id} repository repoGetPushMirrorByID +// GetPushMirrorByName get push mirror of a repository by name +func GetPushMirrorByName(ctx *context.APIContext) { + // swagger:operation GET /repos/{owner}/{repo}/push-mirror/{name} repository repoGetPushMirrorByID // --- // summary: Get push mirror of the repository by ID // produces: @@ -192,9 +192,9 @@ func GetPushMirrorByID(ctx *context.APIContext) { // description: name of the repo to sync // type: string // required: true - // - name: id + // - name: name // in: path - // description: ID of push mirror + // description: remote name of push mirror // type: string // required: true // responses: @@ -206,13 +206,13 @@ func GetPushMirrorByID(ctx *context.APIContext) { // "$ref": "#/responses/forbidden" repo := ctx.Repo.Repository - id := ctx.ParamsInt64(":id") + id := ctx.Params(":name") if !setting.Mirror.Enabled { ctx.Error(http.StatusBadRequest, "GetPushMirrorByID", "Mirror feature is disabled") return } // Get push mirror of a specific repo by ID - pushMirror, err := repo_model.GetPushMirrorByRepoIDAndID(repo.ID, id) + pushMirror, err := repo_model.GetPushMirrorByRepoIDAndName(repo.ID, id) if err != nil { ctx.Error(http.StatusBadRequest, "GetPushMirrorByID", err) return @@ -264,7 +264,7 @@ func AddPushMirror(ctx *context.APIContext) { // DeletePushMirrorByID deletes a push mirror from a repository by ID func DeletePushMirrorByID(ctx *context.APIContext) { - // swagger:operation DELETE /repos/{owner}/{repo}/push-mirror/{id} repository repoDeletePushMirror + // swagger:operation DELETE /repos/{owner}/{repo}/push-mirror/{name} repository repoDeletePushMirror // --- // summary: deletes a push mirror from a repository by ID // produces: @@ -280,9 +280,9 @@ func DeletePushMirrorByID(ctx *context.APIContext) { // description: name of the repo // type: string // required: true - // - name: id + // - name: name // in: path - // description: id of the pushMirror + // description: remote name of the pushMirror // type: string // required: true // responses: @@ -293,14 +293,14 @@ func DeletePushMirrorByID(ctx *context.APIContext) { // "400": // "$ref": "#/responses/error" - id := ctx.ParamsInt64(":id") + remoteName := ctx.Params(":name") if !setting.Mirror.Enabled { ctx.Error(http.StatusBadRequest, "DeletePushMirrorByID", "Mirror feature is disabled") return } // delete push mirror by id - err := repo_model.DeletePushMirrorByRepoIDAndID(ctx.Repo.Repository.ID, id) + err := repo_model.DeletePushMirrorByRepoIDAndName(ctx.Repo.Repository.ID, remoteName) if err != nil { ctx.Error(http.StatusBadRequest, "DeletePushMirrorByID", err) return From 179e935d9223bd087e1cc4d19f4f682484b873bd Mon Sep 17 00:00:00 2001 From: Andrew Thornton Date: Thu, 2 Jun 2022 22:47:16 +0100 Subject: [PATCH 12/30] oops swagger Signed-off-by: Andrew Thornton --- templates/swagger/v1_json.tmpl | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/templates/swagger/v1_json.tmpl b/templates/swagger/v1_json.tmpl index e800e2c8d711..29c974a240b8 100644 --- a/templates/swagger/v1_json.tmpl +++ b/templates/swagger/v1_json.tmpl @@ -8812,7 +8812,7 @@ } } }, - "/repos/{owner}/{repo}/push-mirror/{id}": { + "/repos/{owner}/{repo}/push-mirror/{name}": { "get": { "produces": [ "application/json" @@ -8839,8 +8839,8 @@ }, { "type": "string", - "description": "ID of push mirror", - "name": "id", + "description": "remote name of push mirror", + "name": "name", "in": "path", "required": true } @@ -8883,8 +8883,8 @@ }, { "type": "string", - "description": "id of the pushMirror", - "name": "id", + "description": "remote name of the pushMirror", + "name": "name", "in": "path", "required": true } @@ -17738,11 +17738,6 @@ "type": "string", "x-go-name": "CreatedUnix" }, - "id": { - "type": "integer", - "format": "int64", - "x-go-name": "ID" - }, "interval": { "type": "string", "x-go-name": "Interval" From 37ba6cfdc93a0f89aa12ede168ffae175894c3fd Mon Sep 17 00:00:00 2001 From: Mohamed Date: Fri, 3 Jun 2022 11:31:17 +0200 Subject: [PATCH 13/30] rename push-mirror endpoints to push_mirrors Signed-off-by: Mohamed Sekour --- routers/api/v1/api.go | 4 ++-- routers/api/v1/repo/mirror.go | 10 +++++----- templates/swagger/v1_json.tmpl | 6 +++--- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/routers/api/v1/api.go b/routers/api/v1/api.go index 5751c0067939..4d0cdd1e3e42 100644 --- a/routers/api/v1/api.go +++ b/routers/api/v1/api.go @@ -973,8 +973,8 @@ func Routes() *web.Route { }) }, reqRepoReader(unit.TypeReleases)) m.Post("/mirror-sync", reqToken(), reqRepoWriter(unit.TypeCode), repo.MirrorSync) - m.Post("/push-mirror-sync", reqAdmin(), repo.PushMirrorSync) - m.Group("/push-mirror", func() { + m.Post("/push_mirrors-sync", reqAdmin(), repo.PushMirrorSync) + m.Group("/push_mirrors", func() { m.Combo("").Get(reqAdmin(), repo.ListPushMirrors). Post(reqAdmin(), bind(api.CreatePushMirrorOption{}), repo.AddPushMirror) m.Combo("/{name}"). diff --git a/routers/api/v1/repo/mirror.go b/routers/api/v1/repo/mirror.go index e11602d88e12..96f69bbb4a88 100644 --- a/routers/api/v1/repo/mirror.go +++ b/routers/api/v1/repo/mirror.go @@ -77,7 +77,7 @@ func MirrorSync(ctx *context.APIContext) { // PushMirrorSync adds all push mirrored repositories to the sync queue func PushMirrorSync(ctx *context.APIContext) { - // swagger:operation POST /repos/{owner}/{repo}/push-mirror-sync repository repoPushMirrorSync + // swagger:operation POST /repos/{owner}/{repo}/push_mirrors-sync repository repoPushMirrorSync // --- // summary: Sync all push mirrored repository // produces: @@ -120,7 +120,7 @@ func PushMirrorSync(ctx *context.APIContext) { // ListPushMirrors get list of push mirrors of a repository func ListPushMirrors(ctx *context.APIContext) { - // swagger:operation GET /repos/{owner}/{repo}/push-mirror repository repoListPushMirrors + // swagger:operation GET /repos/{owner}/{repo}/push_mirrors repository repoListPushMirrors // --- // summary: Get all push mirrors of the repository // produces: @@ -176,7 +176,7 @@ func ListPushMirrors(ctx *context.APIContext) { // GetPushMirrorByName get push mirror of a repository by name func GetPushMirrorByName(ctx *context.APIContext) { - // swagger:operation GET /repos/{owner}/{repo}/push-mirror/{name} repository repoGetPushMirrorByID + // swagger:operation GET /repos/{owner}/{repo}/push_mirrors/{name} repository repoGetPushMirrorByID // --- // summary: Get push mirror of the repository by ID // produces: @@ -223,7 +223,7 @@ func GetPushMirrorByName(ctx *context.APIContext) { // AddPushMirror adds a push mirror to a repository func AddPushMirror(ctx *context.APIContext) { - // swagger:operation POST /repos/{owner}/{repo}/push-mirror repository repoAddPushMirror + // swagger:operation POST /repos/{owner}/{repo}/push_mirrors repository repoAddPushMirror // --- // summary: add a push mirror to the repository // consumes: @@ -264,7 +264,7 @@ func AddPushMirror(ctx *context.APIContext) { // DeletePushMirrorByID deletes a push mirror from a repository by ID func DeletePushMirrorByID(ctx *context.APIContext) { - // swagger:operation DELETE /repos/{owner}/{repo}/push-mirror/{name} repository repoDeletePushMirror + // swagger:operation DELETE /repos/{owner}/{repo}/push_mirrors/{name} repository repoDeletePushMirror // --- // summary: deletes a push mirror from a repository by ID // produces: diff --git a/templates/swagger/v1_json.tmpl b/templates/swagger/v1_json.tmpl index 29c974a240b8..1160b5244291 100644 --- a/templates/swagger/v1_json.tmpl +++ b/templates/swagger/v1_json.tmpl @@ -8678,7 +8678,7 @@ } } }, - "/repos/{owner}/{repo}/push-mirror": { + "/repos/{owner}/{repo}/push_mirrors": { "get": { "produces": [ "application/json" @@ -8776,7 +8776,7 @@ } } }, - "/repos/{owner}/{repo}/push-mirror-sync": { + "/repos/{owner}/{repo}/push_mirrors-sync": { "post": { "produces": [ "application/json" @@ -8812,7 +8812,7 @@ } } }, - "/repos/{owner}/{repo}/push-mirror/{name}": { + "/repos/{owner}/{repo}/push_mirrors/{name}": { "get": { "produces": [ "application/json" From 4560d3bed6321f3c92da779778d5c68c5450f38f Mon Sep 17 00:00:00 2001 From: Mohamed Date: Tue, 7 Jun 2022 10:43:28 +0200 Subject: [PATCH 14/30] apply the suggested changes Signed-off-by: Mohamed Sekour --- modules/structs/mirror.go | 16 ++++++------- routers/api/v1/api.go | 10 ++++---- routers/api/v1/repo/mirror.go | 43 +++++++++++++++++----------------- templates/swagger/v1_json.tmpl | 19 ++++++++------- 4 files changed, 45 insertions(+), 43 deletions(-) diff --git a/modules/structs/mirror.go b/modules/structs/mirror.go index 86623c0c8542..8e8a8a2705d2 100644 --- a/modules/structs/mirror.go +++ b/modules/structs/mirror.go @@ -6,20 +6,20 @@ package structs // CreatePushMirrorOption represents need information to create a push mirror of a repository. type CreatePushMirrorOption struct { - RemoteAddress string `json:"remoteAddress"` - RemoteUsername string `json:"remoteUsername"` - RemotePassword string `json:"remotePassword"` + RemoteAddress string `json:"remote_address"` + RemoteUsername string `json:"remote_username"` + RemotePassword string `json:"remote_password"` Interval string `json:"interval"` } // PushMirror represents information of a push mirror // swagger:model type PushMirror struct { - RepoName string `json:"repoName"` - RemoteName string `json:"remoteName"` - RemoteAddress string `json:"remoteAddress"` + RepoName string `json:"repo_name"` + RemoteName string `json:"remote_name"` + RemoteAddress string `json:"remote_address"` CreatedUnix string `json:"created"` - LastUpdateUnix string `json:"lastUpdate"` - LastError string `json:"lastError"` + LastUpdateUnix string `json:"last_update"` + LastError string `json:"last_error"` Interval string `json:"interval"` } diff --git a/routers/api/v1/api.go b/routers/api/v1/api.go index 4d0cdd1e3e42..934495ebd071 100644 --- a/routers/api/v1/api.go +++ b/routers/api/v1/api.go @@ -975,12 +975,12 @@ func Routes() *web.Route { m.Post("/mirror-sync", reqToken(), reqRepoWriter(unit.TypeCode), repo.MirrorSync) m.Post("/push_mirrors-sync", reqAdmin(), repo.PushMirrorSync) m.Group("/push_mirrors", func() { - m.Combo("").Get(reqAdmin(), repo.ListPushMirrors). - Post(reqAdmin(), bind(api.CreatePushMirrorOption{}), repo.AddPushMirror) + m.Combo("").Get(repo.ListPushMirrors). + Post(bind(api.CreatePushMirrorOption{}), repo.AddPushMirror) m.Combo("/{name}"). - Delete(reqAdmin(), repo.DeletePushMirrorByID). - Get(reqAdmin(), repo.GetPushMirrorByName) - }) + Delete(repo.DeletePushMirrorByID). + Get(repo.GetPushMirrorByName) + }, reqAdmin()) m.Get("/editorconfig/{filename}", context.ReferencesGitRepo(), context.RepoRefForAPI, reqRepoReader(unit.TypeCode), repo.GetEditorconfig) m.Group("/pulls", func() { diff --git a/routers/api/v1/repo/mirror.go b/routers/api/v1/repo/mirror.go index 96f69bbb4a88..8f479ef5e5e8 100644 --- a/routers/api/v1/repo/mirror.go +++ b/routers/api/v1/repo/mirror.go @@ -96,17 +96,17 @@ func PushMirrorSync(ctx *context.APIContext) { // responses: // "200": // "$ref": "#/responses/empty" + // "400": + // "$ref": "#/responses/error" // "403": // "$ref": "#/responses/forbidden" - repo := ctx.Repo.Repository - if !setting.Mirror.Enabled { ctx.Error(http.StatusBadRequest, "PushMirrorSync", "Mirror feature is disabled") return } // Get All push mirrors of a specific repo - pushMirrors, err := repo_model.GetPushMirrorsByRepoID(repo.ID, db.ListOptions{}) + pushMirrors, err := repo_model.GetPushMirrorsByRepoID(ctx.Repo.Repository.ID, db.ListOptions{}) if err != nil { ctx.Error(http.StatusBadRequest, "PushMirrorSync", err) return @@ -155,13 +155,13 @@ func ListPushMirrors(ctx *context.APIContext) { repo := ctx.Repo.Repository listOptions := utils.GetListOptions(ctx) if !setting.Mirror.Enabled { - ctx.Error(http.StatusBadRequest, "ListPushMirrors", "Mirror feature is disabled") + ctx.Error(http.StatusBadRequest, "GetPushMirrorsByRepoID", "Mirror feature is disabled") return } // Get All push mirrors of a specific repo pushMirrors, err := repo_model.GetPushMirrorsByRepoID(repo.ID, listOptions) if err != nil { - ctx.Error(http.StatusBadRequest, "ListPushMirrors", err) + ctx.Error(http.StatusBadRequest, "GetPushMirrorsByRepoID", err) return } @@ -205,20 +205,19 @@ func GetPushMirrorByName(ctx *context.APIContext) { // "403": // "$ref": "#/responses/forbidden" - repo := ctx.Repo.Repository - id := ctx.Params(":name") + mirrorName := ctx.Params(":name") if !setting.Mirror.Enabled { ctx.Error(http.StatusBadRequest, "GetPushMirrorByID", "Mirror feature is disabled") return } // Get push mirror of a specific repo by ID - pushMirror, err := repo_model.GetPushMirrorByRepoIDAndName(repo.ID, id) + pushMirror, err := repo_model.GetPushMirrorByRepoIDAndName(ctx.Repo.Repository.ID, mirrorName) if err != nil { ctx.Error(http.StatusBadRequest, "GetPushMirrorByID", err) return } - ctx.JSON(http.StatusOK, convert.ToPushMirror(pushMirror, repo)) + ctx.JSON(http.StatusOK, convert.ToPushMirror(pushMirror, ctx.Repo.Repository)) } // AddPushMirror adds a push mirror to a repository @@ -253,12 +252,12 @@ func AddPushMirror(ctx *context.APIContext) { // "400": // "$ref": "#/responses/error" - pushMirror := web.GetForm(ctx).(*api.CreatePushMirrorOption) - if !setting.Mirror.Enabled { ctx.Error(http.StatusBadRequest, "AddPushMirror", "Mirror feature is disabled") return } + + pushMirror := web.GetForm(ctx).(*api.CreatePushMirrorOption) CreatePushMirror(ctx, pushMirror) } @@ -296,13 +295,13 @@ func DeletePushMirrorByID(ctx *context.APIContext) { remoteName := ctx.Params(":name") if !setting.Mirror.Enabled { - ctx.Error(http.StatusBadRequest, "DeletePushMirrorByID", "Mirror feature is disabled") + ctx.Error(http.StatusBadRequest, "DeletePushMirrorByName", "Mirror feature is disabled") return } - // delete push mirror by id + // Delete push mirror on repo by name. err := repo_model.DeletePushMirrorByRepoIDAndName(ctx.Repo.Repository.ID, remoteName) if err != nil { - ctx.Error(http.StatusBadRequest, "DeletePushMirrorByID", err) + ctx.Error(http.StatusBadRequest, "DeletePushMirrorByName", err) return } ctx.Status(http.StatusNoContent) @@ -313,7 +312,7 @@ func CreatePushMirror(ctx *context.APIContext, mirrorOption *api.CreatePushMirro interval, err := time.ParseDuration(mirrorOption.Interval) if err != nil || (interval != 0 && interval < setting.Mirror.MinInterval) { - ctx.Error(http.StatusBadRequest, "AddPushMirror", err) + ctx.Error(http.StatusBadRequest, "CreatePushMirror", err) return } @@ -340,16 +339,16 @@ func CreatePushMirror(ctx *context.APIContext, mirrorOption *api.CreatePushMirro } if err = repo_model.InsertPushMirror(pushMirror); err != nil { - ctx.ServerError("InsertPushMirror", err) + ctx.ServerError("CreatePushMirror", err) return } // if the registration of the push mirrorOption fails remove it from the database if err = mirror_service.AddPushMirrorRemote(ctx, pushMirror, address); err != nil { if err := repo_model.DeletePushMirrorByID(pushMirror.ID); err != nil { - ctx.ServerError("AddPushMirror", err) + ctx.ServerError("DeletePushMirrorByID", err) } - ctx.ServerError("AddPushMirror", err) + ctx.ServerError("CreatePushMirror", err) return } @@ -362,13 +361,13 @@ func handleSettingRemoteAddrError(ctx *context.APIContext, err error) { addrErr := err.(*models.ErrInvalidCloneAddr) switch { case addrErr.IsProtocolInvalid: - ctx.Error(http.StatusBadRequest, "AddPushMirror", "Invalid mirror protocol") + ctx.Error(http.StatusBadRequest, "CreatePushMirror", "Invalid mirror protocol") case addrErr.IsURLError: - ctx.Error(http.StatusBadRequest, "AddPushMirror", "Invalid Url ") + ctx.Error(http.StatusBadRequest, "CreatePushMirror", "Invalid Url ") case addrErr.IsPermissionDenied: - ctx.Error(http.StatusUnauthorized, "AddPushMirror", "permission denied") + ctx.Error(http.StatusUnauthorized, "CreatePushMirror", "permission denied") default: - ctx.Error(http.StatusBadRequest, "AddPushMirror", "Unknown error") + ctx.Error(http.StatusBadRequest, "CreatePushMirror", "Unknown error") } return } diff --git a/templates/swagger/v1_json.tmpl b/templates/swagger/v1_json.tmpl index 1160b5244291..e0c799b164ba 100644 --- a/templates/swagger/v1_json.tmpl +++ b/templates/swagger/v1_json.tmpl @@ -8806,6 +8806,9 @@ "200": { "$ref": "#/responses/empty" }, + "400": { + "$ref": "#/responses/error" + }, "403": { "$ref": "#/responses/forbidden" } @@ -14550,15 +14553,15 @@ "type": "string", "x-go-name": "Interval" }, - "remoteAddress": { + "remote_address": { "type": "string", "x-go-name": "RemoteAddress" }, - "remotePassword": { + "remote_password": { "type": "string", "x-go-name": "RemotePassword" }, - "remoteUsername": { + "remote_username": { "type": "string", "x-go-name": "RemoteUsername" } @@ -17742,23 +17745,23 @@ "type": "string", "x-go-name": "Interval" }, - "lastError": { + "last_error": { "type": "string", "x-go-name": "LastError" }, - "lastUpdate": { + "last_update": { "type": "string", "x-go-name": "LastUpdateUnix" }, - "remoteAddress": { + "remote_address": { "type": "string", "x-go-name": "RemoteAddress" }, - "remoteName": { + "remote_name": { "type": "string", "x-go-name": "RemoteName" }, - "repoName": { + "repo_name": { "type": "string", "x-go-name": "RepoName" } From addd7f1454654a2b656993e3499221c474b1988f Mon Sep 17 00:00:00 2001 From: Mohamed Sekour Date: Wed, 8 Jun 2022 11:41:07 +0200 Subject: [PATCH 15/30] handle error on failed sync mirror Signed-off-by: Mohamed Sekour --- routers/api/v1/repo/mirror.go | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/routers/api/v1/repo/mirror.go b/routers/api/v1/repo/mirror.go index 8f479ef5e5e8..40d309f5a2c1 100644 --- a/routers/api/v1/repo/mirror.go +++ b/routers/api/v1/repo/mirror.go @@ -112,7 +112,11 @@ func PushMirrorSync(ctx *context.APIContext) { return } for _, mirror := range pushMirrors { - mirror_service.SyncPushMirror(ctx, mirror.ID) + ok := mirror_service.SyncPushMirror(ctx, mirror.ID) + if !ok { + ctx.Error(http.StatusInternalServerError, "PushMirrorSync", "error occured when syncing push mirror "+mirror.RemoteName) + return + } } ctx.Status(http.StatusOK) From 40717746c32487fe81819c854ef62b8097dec444 Mon Sep 17 00:00:00 2001 From: Mohamed Date: Wed, 8 Jun 2022 11:55:15 +0200 Subject: [PATCH 16/30] fix typo Signed-off-by: Mohamed Sekour --- routers/api/v1/repo/mirror.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/routers/api/v1/repo/mirror.go b/routers/api/v1/repo/mirror.go index 40d309f5a2c1..822cab02630c 100644 --- a/routers/api/v1/repo/mirror.go +++ b/routers/api/v1/repo/mirror.go @@ -114,7 +114,7 @@ func PushMirrorSync(ctx *context.APIContext) { for _, mirror := range pushMirrors { ok := mirror_service.SyncPushMirror(ctx, mirror.ID) if !ok { - ctx.Error(http.StatusInternalServerError, "PushMirrorSync", "error occured when syncing push mirror "+mirror.RemoteName) + ctx.Error(http.StatusInternalServerError, "PushMirrorSync", "error occurred when syncing push mirror "+mirror.RemoteName) return } } From 9206fc518b5e861b243d99689192268be199af5f Mon Sep 17 00:00:00 2001 From: Mohamed Date: Thu, 9 Jun 2022 14:01:34 +0200 Subject: [PATCH 17/30] apply PR suggestions --- routers/api/v1/repo/mirror.go | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/routers/api/v1/repo/mirror.go b/routers/api/v1/repo/mirror.go index 822cab02630c..902698a9d27e 100644 --- a/routers/api/v1/repo/mirror.go +++ b/routers/api/v1/repo/mirror.go @@ -156,12 +156,13 @@ func ListPushMirrors(ctx *context.APIContext) { // "403": // "$ref": "#/responses/forbidden" - repo := ctx.Repo.Repository - listOptions := utils.GetListOptions(ctx) if !setting.Mirror.Enabled { ctx.Error(http.StatusBadRequest, "GetPushMirrorsByRepoID", "Mirror feature is disabled") return } + + repo := ctx.Repo.Repository + listOptions := utils.GetListOptions(ctx) // Get All push mirrors of a specific repo pushMirrors, err := repo_model.GetPushMirrorsByRepoID(repo.ID, listOptions) if err != nil { @@ -209,11 +210,12 @@ func GetPushMirrorByName(ctx *context.APIContext) { // "403": // "$ref": "#/responses/forbidden" - mirrorName := ctx.Params(":name") if !setting.Mirror.Enabled { ctx.Error(http.StatusBadRequest, "GetPushMirrorByID", "Mirror feature is disabled") return } + + mirrorName := ctx.Params(":name") // Get push mirror of a specific repo by ID pushMirror, err := repo_model.GetPushMirrorByRepoIDAndName(ctx.Repo.Repository.ID, mirrorName) if err != nil { @@ -296,12 +298,12 @@ func DeletePushMirrorByID(ctx *context.APIContext) { // "400": // "$ref": "#/responses/error" - remoteName := ctx.Params(":name") - if !setting.Mirror.Enabled { ctx.Error(http.StatusBadRequest, "DeletePushMirrorByName", "Mirror feature is disabled") return } + + remoteName := ctx.Params(":name") // Delete push mirror on repo by name. err := repo_model.DeletePushMirrorByRepoIDAndName(ctx.Repo.Repository.ID, remoteName) if err != nil { @@ -325,13 +327,13 @@ func CreatePushMirror(ctx *context.APIContext, mirrorOption *api.CreatePushMirro err = migrations.IsMigrateURLAllowed(address, ctx.ContextUser) } if err != nil { - handleSettingRemoteAddrError(ctx, err) + HandleRemoteAddressError(ctx, err) return } remoteSuffix, err := util.CryptoRandomString(10) if err != nil { - ctx.ServerError("RandomString", err) + ctx.ServerError("CryptoRandomString", err) return } @@ -343,7 +345,7 @@ func CreatePushMirror(ctx *context.APIContext, mirrorOption *api.CreatePushMirro } if err = repo_model.InsertPushMirror(pushMirror); err != nil { - ctx.ServerError("CreatePushMirror", err) + ctx.ServerError("InsertPushMirror", err) return } @@ -352,7 +354,7 @@ func CreatePushMirror(ctx *context.APIContext, mirrorOption *api.CreatePushMirro if err := repo_model.DeletePushMirrorByID(pushMirror.ID); err != nil { ctx.ServerError("DeletePushMirrorByID", err) } - ctx.ServerError("CreatePushMirror", err) + ctx.ServerError("AddPushMirrorRemote", err) return } @@ -360,7 +362,7 @@ func CreatePushMirror(ctx *context.APIContext, mirrorOption *api.CreatePushMirro ctx.JSON(http.StatusCreated, convert.ToPushMirror(pushMirror, repo)) } -func handleSettingRemoteAddrError(ctx *context.APIContext, err error) { +func HandleRemoteAddressError(ctx *context.APIContext, err error) { if models.IsErrInvalidCloneAddr(err) { addrErr := err.(*models.ErrInvalidCloneAddr) switch { @@ -369,7 +371,7 @@ func handleSettingRemoteAddrError(ctx *context.APIContext, err error) { case addrErr.IsURLError: ctx.Error(http.StatusBadRequest, "CreatePushMirror", "Invalid Url ") case addrErr.IsPermissionDenied: - ctx.Error(http.StatusUnauthorized, "CreatePushMirror", "permission denied") + ctx.Error(http.StatusUnauthorized, "CreatePushMirror", "Permission denied") default: ctx.Error(http.StatusBadRequest, "CreatePushMirror", "Unknown error") } From 6950ff15b90b9f4ca9428eca8a44ef61b9268428 Mon Sep 17 00:00:00 2001 From: Mohamed Date: Sun, 12 Jun 2022 11:29:51 +0200 Subject: [PATCH 18/30] some code refactor to use remoteName instead of ID --- routers/api/v1/api.go | 2 +- routers/api/v1/repo/mirror.go | 20 ++++++++++---------- templates/swagger/v1_json.tmpl | 10 +++++----- 3 files changed, 16 insertions(+), 16 deletions(-) diff --git a/routers/api/v1/api.go b/routers/api/v1/api.go index 79fa9cc1100b..fbbebb3e478f 100644 --- a/routers/api/v1/api.go +++ b/routers/api/v1/api.go @@ -980,7 +980,7 @@ func Routes() *web.Route { m.Combo("").Get(repo.ListPushMirrors). Post(bind(api.CreatePushMirrorOption{}), repo.AddPushMirror) m.Combo("/{name}"). - Delete(repo.DeletePushMirrorByID). + Delete(repo.DeletePushMirrorByRemoteName). Get(repo.GetPushMirrorByName) }, reqAdmin()) diff --git a/routers/api/v1/repo/mirror.go b/routers/api/v1/repo/mirror.go index 902698a9d27e..d4ee1794b30b 100644 --- a/routers/api/v1/repo/mirror.go +++ b/routers/api/v1/repo/mirror.go @@ -181,20 +181,20 @@ func ListPushMirrors(ctx *context.APIContext) { // GetPushMirrorByName get push mirror of a repository by name func GetPushMirrorByName(ctx *context.APIContext) { - // swagger:operation GET /repos/{owner}/{repo}/push_mirrors/{name} repository repoGetPushMirrorByID + // swagger:operation GET /repos/{owner}/{repo}/push_mirrors/{name} repository repoGetPushMirrorByRemoteName // --- - // summary: Get push mirror of the repository by ID + // summary: Get push mirror of the repository by remoteName // produces: // - application/json // parameters: // - name: owner // in: path - // description: owner of the repo to sync + // description: owner of the repo // type: string // required: true // - name: repo // in: path - // description: name of the repo to sync + // description: name of the repo // type: string // required: true // - name: name @@ -211,15 +211,15 @@ func GetPushMirrorByName(ctx *context.APIContext) { // "$ref": "#/responses/forbidden" if !setting.Mirror.Enabled { - ctx.Error(http.StatusBadRequest, "GetPushMirrorByID", "Mirror feature is disabled") + ctx.Error(http.StatusBadRequest, "GetPushMirrorByRemoteName", "Mirror feature is disabled") return } mirrorName := ctx.Params(":name") - // Get push mirror of a specific repo by ID + // Get push mirror of a specific repo by remoteName pushMirror, err := repo_model.GetPushMirrorByRepoIDAndName(ctx.Repo.Repository.ID, mirrorName) if err != nil { - ctx.Error(http.StatusBadRequest, "GetPushMirrorByID", err) + ctx.Error(http.StatusBadRequest, "GetPushMirrorByRemoteName", err) return } @@ -267,11 +267,11 @@ func AddPushMirror(ctx *context.APIContext) { CreatePushMirror(ctx, pushMirror) } -// DeletePushMirrorByID deletes a push mirror from a repository by ID -func DeletePushMirrorByID(ctx *context.APIContext) { +// DeletePushMirrorByRemoteName deletes a push mirror from a repository by remoteName +func DeletePushMirrorByRemoteName(ctx *context.APIContext) { // swagger:operation DELETE /repos/{owner}/{repo}/push_mirrors/{name} repository repoDeletePushMirror // --- - // summary: deletes a push mirror from a repository by ID + // summary: deletes a push mirror from a repository by remoteName // produces: // - application/json // parameters: diff --git a/templates/swagger/v1_json.tmpl b/templates/swagger/v1_json.tmpl index ae8c72904a69..0c100a97c2fc 100644 --- a/templates/swagger/v1_json.tmpl +++ b/templates/swagger/v1_json.tmpl @@ -8869,19 +8869,19 @@ "tags": [ "repository" ], - "summary": "Get push mirror of the repository by ID", - "operationId": "repoGetPushMirrorByID", + "summary": "Get push mirror of the repository by remoteName", + "operationId": "repoGetPushMirrorByRemoteName", "parameters": [ { "type": "string", - "description": "owner of the repo to sync", + "description": "owner of the repo", "name": "owner", "in": "path", "required": true }, { "type": "string", - "description": "name of the repo to sync", + "description": "name of the repo", "name": "repo", "in": "path", "required": true @@ -8913,7 +8913,7 @@ "tags": [ "repository" ], - "summary": "deletes a push mirror from a repository by ID", + "summary": "deletes a push mirror from a repository by remoteName", "operationId": "repoDeletePushMirror", "parameters": [ { From 0d391523948cb6830cd707e848726e67d2e2959e Mon Sep 17 00:00:00 2001 From: Mohamed Date: Sun, 12 Jun 2022 12:15:49 +0200 Subject: [PATCH 19/30] fix lint-backend error --- modules/convert/mirror.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/convert/mirror.go b/modules/convert/mirror.go index fe0a1c2cbc67..a1136778e15a 100644 --- a/modules/convert/mirror.go +++ b/modules/convert/mirror.go @@ -25,11 +25,11 @@ func ToPushMirror(pm *repo_model.PushMirror, repo *repo_model.Repository) *api.P } func getMirrorRemoteAddress(repo *repo_model.Repository, remoteName string) (string, error) { - u, err := git.GetRemoteAddress(git.DefaultContext, repo.RepoPath(), remoteName) + url, err := git.GetRemoteURL(git.DefaultContext, repo.RepoPath(), remoteName) if err != nil { return "", err } // remove confidential information - u.User = nil - return u.String(), nil + url.User = nil + return url.String(), nil } From b23979ab255925d7858765f1cde81eb04d1161ea Mon Sep 17 00:00:00 2001 From: Mohamed Date: Fri, 17 Jun 2022 17:31:43 +0200 Subject: [PATCH 20/30] code refactoring merge DeletePushMirrorsByID & DeletePushMirrorByRepoIDAndName into DeletePushMirrors merge GetPushMirrorByID & GetPushMirrorByRepoIDAndName into GetPushMirrors Signed-off-by: Mohamed Sekour --- models/repo/pushmirror.go | 68 +++++++++++++++++++--------------- modules/templates/helper.go | 2 +- routers/api/v1/repo/mirror.go | 6 +-- routers/web/repo/setting.go | 6 +-- services/mirror/mirror_push.go | 2 +- 5 files changed, 47 insertions(+), 37 deletions(-) diff --git a/models/repo/pushmirror.go b/models/repo/pushmirror.go index 204895687bde..d59d7b297443 100644 --- a/models/repo/pushmirror.go +++ b/models/repo/pushmirror.go @@ -28,6 +28,11 @@ type PushMirror struct { LastUpdateUnix timeutil.TimeStamp `xorm:"INDEX last_update"` LastError string `xorm:"text"` } +type PushMirrorOptions struct { + ID int64 + RepoID int64 + RemoteName string +} func init() { db.RegisterModel(new(PushMirror)) @@ -63,48 +68,53 @@ func UpdatePushMirror(m *PushMirror) error { return err } -// DeletePushMirrorByID deletes a push-mirrors by ID -// WARNING: This does not check if this PushMirror belongs to a RepoID -func DeletePushMirrorByID(ID int64) error { - _, err := db.GetEngine(db.DefaultContext).ID(ID).Delete(&PushMirror{}) - return err -} - -// DeletePushMirrorByRepoIDAndName deletes a push-mirrors by remote name -func DeletePushMirrorByRepoIDAndName(repoID int64, remoteName string) error { - _, err := db.GetEngine(db.DefaultContext).Where("repo_id = ? AND remote_name = ?", repoID, remoteName).Delete(&PushMirror{}) - return err -} - // DeletePushMirrorsByRepoID deletes all push-mirrors by repoID func DeletePushMirrorsByRepoID(repoID int64) error { _, err := db.GetEngine(db.DefaultContext).Delete(&PushMirror{RepoID: repoID}) return err } -// GetPushMirrorByID returns push-mirror information. -// WARNING: You must ensure that this PushMirror belongs to the repository you are intending to use it with -func GetPushMirrorByID(ID int64) (*PushMirror, error) { - m := &PushMirror{} - has, err := db.GetEngine(db.DefaultContext).ID(ID).Get(m) - if err != nil { - return nil, err - } else if !has { - return nil, ErrPushMirrorNotExist +func DeletePushMirrors(opts PushMirrorOptions) error { + if opts.RepoID > 0 { + //delete using remoteName + if opts.RemoteName != "" { + _, err := db.GetEngine(db.DefaultContext).Where("repo_id = ? AND remote_name = ?", opts.RepoID, opts.RemoteName).Delete(&PushMirror{}) + return err + } + // delete using ID + if opts.ID > 0 { + _, err := db.GetEngine(db.DefaultContext).Where("repo_id = ? AND id = ?", opts.RepoID, opts.ID).Delete(&PushMirror{}) + return err + } + return errors.New("PushMirror ID or RemoteName required") + } else { + return errors.New("repoID required and must be set") } - return m, nil } -// GetPushMirrorByRepoIDAndName returns push-mirror information. -func GetPushMirrorByRepoIDAndName(repoID int64, remoteName string) (*PushMirror, error) { - m := &PushMirror{} - has, err := db.GetEngine(db.DefaultContext).Where("repo_id = ? AND remote_name = ?", repoID, remoteName).Get(m) +func GetPushMirrors(opts PushMirrorOptions) (*PushMirror, error) { + mirror := &PushMirror{} + var exist bool + var err error + if opts.RepoID > 0 { + //get pushMirror using remoteName + if opts.RemoteName != "" { + exist, err = db.GetEngine(db.DefaultContext).Where("repo_id = ? AND remote_name = ?", opts.RepoID, opts.RemoteName).Get(mirror) + } + // get pushMirror using ID + if opts.ID > 0 { + exist, err = db.GetEngine(db.DefaultContext).Where("repo_id = ? AND id = ?", opts.RepoID, opts.ID).Get(mirror) + } + } else { + // if no repoId provided then get pushMirror using only its ID + exist, err = db.GetEngine(db.DefaultContext).ID(opts.ID).Get(mirror) + } if err != nil { return nil, err - } else if !has { + } else if !exist { return nil, ErrPushMirrorNotExist } - return m, nil + return mirror, nil } // GetPushMirrorsByRepoID returns push-mirror information of a repository. diff --git a/modules/templates/helper.go b/modules/templates/helper.go index b77928fc9c02..61be14760127 100644 --- a/modules/templates/helper.go +++ b/modules/templates/helper.go @@ -976,7 +976,7 @@ type remoteAddress struct { func mirrorRemoteAddress(ctx context.Context, m *repo_model.Repository, remoteName string) remoteAddress { a := remoteAddress{} - if !m.IsMirror { + if m.IsMirror { return a } diff --git a/routers/api/v1/repo/mirror.go b/routers/api/v1/repo/mirror.go index d4ee1794b30b..e0486800adf3 100644 --- a/routers/api/v1/repo/mirror.go +++ b/routers/api/v1/repo/mirror.go @@ -217,7 +217,7 @@ func GetPushMirrorByName(ctx *context.APIContext) { mirrorName := ctx.Params(":name") // Get push mirror of a specific repo by remoteName - pushMirror, err := repo_model.GetPushMirrorByRepoIDAndName(ctx.Repo.Repository.ID, mirrorName) + pushMirror, err := repo_model.GetPushMirrors(repo_model.PushMirrorOptions{RepoID: ctx.Repo.Repository.ID, RemoteName: mirrorName}) if err != nil { ctx.Error(http.StatusBadRequest, "GetPushMirrorByRemoteName", err) return @@ -305,7 +305,7 @@ func DeletePushMirrorByRemoteName(ctx *context.APIContext) { remoteName := ctx.Params(":name") // Delete push mirror on repo by name. - err := repo_model.DeletePushMirrorByRepoIDAndName(ctx.Repo.Repository.ID, remoteName) + err := repo_model.DeletePushMirrors(repo_model.PushMirrorOptions{RepoID: ctx.Repo.Repository.ID, RemoteName: remoteName}) if err != nil { ctx.Error(http.StatusBadRequest, "DeletePushMirrorByName", err) return @@ -351,7 +351,7 @@ func CreatePushMirror(ctx *context.APIContext, mirrorOption *api.CreatePushMirro // if the registration of the push mirrorOption fails remove it from the database if err = mirror_service.AddPushMirrorRemote(ctx, pushMirror, address); err != nil { - if err := repo_model.DeletePushMirrorByID(pushMirror.ID); err != nil { + if err := repo_model.DeletePushMirrors(repo_model.PushMirrorOptions{ID: pushMirror.ID, RepoID: pushMirror.RepoID}); err != nil { ctx.ServerError("DeletePushMirrorByID", err) } ctx.ServerError("AddPushMirrorRemote", err) diff --git a/routers/web/repo/setting.go b/routers/web/repo/setting.go index 9f46651527d7..5edfec8d4b4f 100644 --- a/routers/web/repo/setting.go +++ b/routers/web/repo/setting.go @@ -315,7 +315,7 @@ func SettingsPost(ctx *context.Context) { return } - if err = repo_model.DeletePushMirrorByID(m.ID); err != nil { + if err = repo_model.DeletePushMirrors(repo_model.PushMirrorOptions{ID: m.ID, RepoID: m.RepoID}); err != nil { ctx.ServerError("DeletePushMirrorByID", err) return } @@ -368,8 +368,8 @@ func SettingsPost(ctx *context.Context) { } if err := mirror_service.AddPushMirrorRemote(ctx, m, address); err != nil { - if err := repo_model.DeletePushMirrorByID(m.ID); err != nil { - log.Error("DeletePushMirrorByID %v", err) + if err := repo_model.DeletePushMirrors(repo_model.PushMirrorOptions{ID: m.ID, RepoID: m.RepoID}); err != nil { + log.Error("DeletePushMirrors %v", err) } ctx.ServerError("AddPushMirrorRemote", err) return diff --git a/services/mirror/mirror_push.go b/services/mirror/mirror_push.go index 2927bed72b27..43948d3467ba 100644 --- a/services/mirror/mirror_push.go +++ b/services/mirror/mirror_push.go @@ -94,7 +94,7 @@ func SyncPushMirror(ctx context.Context, mirrorID int64) bool { log.Error("PANIC whilst syncPushMirror[%d] Panic: %v\nStacktrace: %s", mirrorID, err, log.Stack(2)) }() - m, err := repo_model.GetPushMirrorByID(mirrorID) + m, err := repo_model.GetPushMirrors(repo_model.PushMirrorOptions{ID: mirrorID}) if err != nil { log.Error("GetPushMirrorByID [%d]: %v", mirrorID, err) return false From c775d3cb355cb3a3c7cd43c1e1ad1bfcb50ab7a8 Mon Sep 17 00:00:00 2001 From: Mohamed Date: Fri, 17 Jun 2022 18:01:46 +0200 Subject: [PATCH 21/30] fix lint Signed-off-by: Mohamed Sekour --- models/repo/pushmirror.go | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/models/repo/pushmirror.go b/models/repo/pushmirror.go index d59d7b297443..63c207411af6 100644 --- a/models/repo/pushmirror.go +++ b/models/repo/pushmirror.go @@ -76,7 +76,7 @@ func DeletePushMirrorsByRepoID(repoID int64) error { func DeletePushMirrors(opts PushMirrorOptions) error { if opts.RepoID > 0 { - //delete using remoteName + // delete using remoteName if opts.RemoteName != "" { _, err := db.GetEngine(db.DefaultContext).Where("repo_id = ? AND remote_name = ?", opts.RepoID, opts.RemoteName).Delete(&PushMirror{}) return err @@ -87,9 +87,8 @@ func DeletePushMirrors(opts PushMirrorOptions) error { return err } return errors.New("PushMirror ID or RemoteName required") - } else { - return errors.New("repoID required and must be set") } + return errors.New("repoID required and must be set") } func GetPushMirrors(opts PushMirrorOptions) (*PushMirror, error) { @@ -97,7 +96,7 @@ func GetPushMirrors(opts PushMirrorOptions) (*PushMirror, error) { var exist bool var err error if opts.RepoID > 0 { - //get pushMirror using remoteName + // get pushMirror using remoteName if opts.RemoteName != "" { exist, err = db.GetEngine(db.DefaultContext).Where("repo_id = ? AND remote_name = ?", opts.RepoID, opts.RemoteName).Get(mirror) } From 614d72494f56071bc3493491f8f364fa80ac7fc3 Mon Sep 17 00:00:00 2001 From: Mohamed Date: Fri, 17 Jun 2022 23:14:30 +0200 Subject: [PATCH 22/30] handle error getMirrorRemoteAddress Signed-off-by: Mohamed Sekour --- modules/convert/mirror.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/modules/convert/mirror.go b/modules/convert/mirror.go index a1136778e15a..2da69bade7fc 100644 --- a/modules/convert/mirror.go +++ b/modules/convert/mirror.go @@ -12,7 +12,10 @@ import ( // ToPushMirror convert from repo_model.PushMirror and remoteAddress to api.TopicResponse func ToPushMirror(pm *repo_model.PushMirror, repo *repo_model.Repository) *api.PushMirror { - remoteAddress, _ := getMirrorRemoteAddress(repo, pm.RemoteName) + remoteAddress, err := getMirrorRemoteAddress(repo, pm.RemoteName) + if err != nil { + return nil + } return &api.PushMirror{ RepoName: repo.Name, RemoteName: pm.RemoteName, From 85eecf5c95962462cbc71832881a875c2209a715 Mon Sep 17 00:00:00 2001 From: Mohamed Date: Fri, 17 Jun 2022 23:51:36 +0200 Subject: [PATCH 23/30] handle errors on convert.ToPushMirror Signed-off-by: Mohamed Sekour --- modules/convert/mirror.go | 8 +++++--- routers/api/v1/repo/mirror.go | 23 +++++++++++++++++------ 2 files changed, 22 insertions(+), 9 deletions(-) diff --git a/modules/convert/mirror.go b/modules/convert/mirror.go index 2da69bade7fc..b02ccdde368f 100644 --- a/modules/convert/mirror.go +++ b/modules/convert/mirror.go @@ -5,16 +5,18 @@ package convert import ( + "errors" + repo_model "code.gitea.io/gitea/models/repo" "code.gitea.io/gitea/modules/git" api "code.gitea.io/gitea/modules/structs" ) // ToPushMirror convert from repo_model.PushMirror and remoteAddress to api.TopicResponse -func ToPushMirror(pm *repo_model.PushMirror, repo *repo_model.Repository) *api.PushMirror { +func ToPushMirror(pm *repo_model.PushMirror, repo *repo_model.Repository) (*api.PushMirror, error) { remoteAddress, err := getMirrorRemoteAddress(repo, pm.RemoteName) if err != nil { - return nil + return nil, errors.New("error getting mirror RemoteAddress") } return &api.PushMirror{ RepoName: repo.Name, @@ -24,7 +26,7 @@ func ToPushMirror(pm *repo_model.PushMirror, repo *repo_model.Repository) *api.P LastUpdateUnix: pm.LastUpdateUnix.FormatLong(), LastError: pm.LastError, Interval: pm.Interval.String(), - } + }, nil } func getMirrorRemoteAddress(repo *repo_model.Repository, remoteName string) (string, error) { diff --git a/routers/api/v1/repo/mirror.go b/routers/api/v1/repo/mirror.go index e0486800adf3..68e5b78fe30f 100644 --- a/routers/api/v1/repo/mirror.go +++ b/routers/api/v1/repo/mirror.go @@ -172,7 +172,11 @@ func ListPushMirrors(ctx *context.APIContext) { responsePushMirrors := make([]*api.PushMirror, 0) for _, mirror := range pushMirrors { - responsePushMirrors = append(responsePushMirrors, convert.ToPushMirror(mirror, repo)) + m, err := convert.ToPushMirror(mirror, repo) + if err == nil { + responsePushMirrors = append(responsePushMirrors, m) + } + } ctx.SetLinkHeader(len(pushMirrors), listOptions.PageSize) ctx.SetTotalCountHeader(int64(len(pushMirrors))) @@ -222,8 +226,12 @@ func GetPushMirrorByName(ctx *context.APIContext) { ctx.Error(http.StatusBadRequest, "GetPushMirrorByRemoteName", err) return } - - ctx.JSON(http.StatusOK, convert.ToPushMirror(pushMirror, ctx.Repo.Repository)) + m, err := convert.ToPushMirror(pushMirror, ctx.Repo.Repository) + if err != nil { + ctx.Error(http.StatusBadRequest, "GetPushMirrorByRemoteName", err.Error()) + return + } + ctx.JSON(http.StatusOK, m) } // AddPushMirror adds a push mirror to a repository @@ -357,9 +365,12 @@ func CreatePushMirror(ctx *context.APIContext, mirrorOption *api.CreatePushMirro ctx.ServerError("AddPushMirrorRemote", err) return } - - // create response - ctx.JSON(http.StatusCreated, convert.ToPushMirror(pushMirror, repo)) + m, err := convert.ToPushMirror(pushMirror, repo) + if err != nil { + ctx.Error(http.StatusBadRequest, "GetPushMirror", err.Error()) + return + } + ctx.JSON(http.StatusOK, m) } func HandleRemoteAddressError(ctx *context.APIContext, err error) { From aabe5e942f6ca565d657e93d20caad53f49dfcb4 Mon Sep 17 00:00:00 2001 From: Mohamed Date: Sat, 18 Jun 2022 09:47:12 +0200 Subject: [PATCH 24/30] use builder.Cond function to simplify code Signed-off-by: Mohamed Sekour --- models/repo/pushmirror.go | 42 +++++++++++++++-------------------- modules/convert/mirror.go | 3 ++- routers/api/v1/repo/mirror.go | 6 ++--- 3 files changed, 23 insertions(+), 28 deletions(-) diff --git a/models/repo/pushmirror.go b/models/repo/pushmirror.go index 63c207411af6..a2e87e576ec4 100644 --- a/models/repo/pushmirror.go +++ b/models/repo/pushmirror.go @@ -11,6 +11,7 @@ import ( "code.gitea.io/gitea/models/db" "code.gitea.io/gitea/modules/log" "code.gitea.io/gitea/modules/timeutil" + "xorm.io/builder" ) // ErrPushMirrorNotExist mirror does not exist error @@ -34,6 +35,20 @@ type PushMirrorOptions struct { RemoteName string } +func (opts *PushMirrorOptions) toConds() builder.Cond { + cond := builder.NewCond() + if opts.RepoID > 0 { + cond = cond.And(builder.Eq{"repo_id": opts.RepoID}) + } + if opts.RemoteName != "" { + cond = cond.And(builder.Eq{"remote_name": opts.RemoteName}) + } + if opts.ID > 0 { + cond = cond.And(builder.Eq{"id": opts.ID}) + } + return cond +} + func init() { db.RegisterModel(new(PushMirror)) } @@ -76,17 +91,8 @@ func DeletePushMirrorsByRepoID(repoID int64) error { func DeletePushMirrors(opts PushMirrorOptions) error { if opts.RepoID > 0 { - // delete using remoteName - if opts.RemoteName != "" { - _, err := db.GetEngine(db.DefaultContext).Where("repo_id = ? AND remote_name = ?", opts.RepoID, opts.RemoteName).Delete(&PushMirror{}) - return err - } - // delete using ID - if opts.ID > 0 { - _, err := db.GetEngine(db.DefaultContext).Where("repo_id = ? AND id = ?", opts.RepoID, opts.ID).Delete(&PushMirror{}) - return err - } - return errors.New("PushMirror ID or RemoteName required") + _, err := db.GetEngine(db.DefaultContext).Where(opts.toConds()).Delete(&PushMirror{}) + return err } return errors.New("repoID required and must be set") } @@ -95,19 +101,7 @@ func GetPushMirrors(opts PushMirrorOptions) (*PushMirror, error) { mirror := &PushMirror{} var exist bool var err error - if opts.RepoID > 0 { - // get pushMirror using remoteName - if opts.RemoteName != "" { - exist, err = db.GetEngine(db.DefaultContext).Where("repo_id = ? AND remote_name = ?", opts.RepoID, opts.RemoteName).Get(mirror) - } - // get pushMirror using ID - if opts.ID > 0 { - exist, err = db.GetEngine(db.DefaultContext).Where("repo_id = ? AND id = ?", opts.RepoID, opts.ID).Get(mirror) - } - } else { - // if no repoId provided then get pushMirror using only its ID - exist, err = db.GetEngine(db.DefaultContext).ID(opts.ID).Get(mirror) - } + exist, err = db.GetEngine(db.DefaultContext).Where(opts.toConds()).Get(mirror) if err != nil { return nil, err } else if !exist { diff --git a/modules/convert/mirror.go b/modules/convert/mirror.go index b02ccdde368f..b4bdabc147fc 100644 --- a/modules/convert/mirror.go +++ b/modules/convert/mirror.go @@ -13,7 +13,8 @@ import ( ) // ToPushMirror convert from repo_model.PushMirror and remoteAddress to api.TopicResponse -func ToPushMirror(pm *repo_model.PushMirror, repo *repo_model.Repository) (*api.PushMirror, error) { +func ToPushMirror(pm *repo_model.PushMirror) (*api.PushMirror, error) { + repo := pm.GetRepository() remoteAddress, err := getMirrorRemoteAddress(repo, pm.RemoteName) if err != nil { return nil, errors.New("error getting mirror RemoteAddress") diff --git a/routers/api/v1/repo/mirror.go b/routers/api/v1/repo/mirror.go index 68e5b78fe30f..93e7ee06e33b 100644 --- a/routers/api/v1/repo/mirror.go +++ b/routers/api/v1/repo/mirror.go @@ -172,7 +172,7 @@ func ListPushMirrors(ctx *context.APIContext) { responsePushMirrors := make([]*api.PushMirror, 0) for _, mirror := range pushMirrors { - m, err := convert.ToPushMirror(mirror, repo) + m, err := convert.ToPushMirror(mirror) if err == nil { responsePushMirrors = append(responsePushMirrors, m) } @@ -226,7 +226,7 @@ func GetPushMirrorByName(ctx *context.APIContext) { ctx.Error(http.StatusBadRequest, "GetPushMirrorByRemoteName", err) return } - m, err := convert.ToPushMirror(pushMirror, ctx.Repo.Repository) + m, err := convert.ToPushMirror(pushMirror) if err != nil { ctx.Error(http.StatusBadRequest, "GetPushMirrorByRemoteName", err.Error()) return @@ -365,7 +365,7 @@ func CreatePushMirror(ctx *context.APIContext, mirrorOption *api.CreatePushMirro ctx.ServerError("AddPushMirrorRemote", err) return } - m, err := convert.ToPushMirror(pushMirror, repo) + m, err := convert.ToPushMirror(pushMirror) if err != nil { ctx.Error(http.StatusBadRequest, "GetPushMirror", err.Error()) return From 4a54502338fd746f2198fecd11eac3424924e4bc Mon Sep 17 00:00:00 2001 From: Mohamed Date: Sun, 19 Jun 2022 01:03:30 +0200 Subject: [PATCH 25/30] restore changes done to helper.go Signed-off-by: Mohamed Sekour --- modules/templates/helper.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/templates/helper.go b/modules/templates/helper.go index 61be14760127..b77928fc9c02 100644 --- a/modules/templates/helper.go +++ b/modules/templates/helper.go @@ -976,7 +976,7 @@ type remoteAddress struct { func mirrorRemoteAddress(ctx context.Context, m *repo_model.Repository, remoteName string) remoteAddress { a := remoteAddress{} - if m.IsMirror { + if !m.IsMirror { return a } From 2645df88b8260530174fd370f56ebe42fa322866 Mon Sep 17 00:00:00 2001 From: Mohamed Date: Thu, 30 Jun 2022 10:08:11 +0200 Subject: [PATCH 26/30] add context parameter to added functions --- integrations/mirror_push_test.go | 4 ++-- models/repo/pushmirror.go | 31 +++++++++++++------------------ models/repo/pushmirror_test.go | 9 +++++---- modules/context/repo.go | 2 +- routers/api/v1/repo/mirror.go | 12 ++++++------ routers/web/repo/setting.go | 16 ++++++++-------- services/mirror/mirror.go | 2 +- services/mirror/mirror_push.go | 4 ++-- 8 files changed, 38 insertions(+), 42 deletions(-) diff --git a/integrations/mirror_push_test.go b/integrations/mirror_push_test.go index bb08b7a4d592..1351bf3995f3 100644 --- a/integrations/mirror_push_test.go +++ b/integrations/mirror_push_test.go @@ -48,7 +48,7 @@ func testMirrorPush(t *testing.T, u *url.URL) { doCreatePushMirror(ctx, fmt.Sprintf("%s%s/%s", u.String(), url.PathEscape(ctx.Username), url.PathEscape(mirrorRepo.Name)), user.LowerName, userPassword)(t) - mirrors, err := repo_model.GetPushMirrorsByRepoID(srcRepo.ID, db.ListOptions{}) + mirrors, err := repo_model.GetPushMirrorsByRepoID(db.DefaultContext, srcRepo.ID, db.ListOptions{}) assert.NoError(t, err) assert.Len(t, mirrors, 1) @@ -73,7 +73,7 @@ func testMirrorPush(t *testing.T, u *url.URL) { // Cleanup doRemovePushMirror(ctx, fmt.Sprintf("%s%s/%s", u.String(), url.PathEscape(ctx.Username), url.PathEscape(mirrorRepo.Name)), user.LowerName, userPassword, int(mirrors[0].ID))(t) - mirrors, err = repo_model.GetPushMirrorsByRepoID(srcRepo.ID, db.ListOptions{}) + mirrors, err = repo_model.GetPushMirrorsByRepoID(db.DefaultContext, srcRepo.ID, db.ListOptions{}) assert.NoError(t, err) assert.Len(t, mirrors, 0) } diff --git a/models/repo/pushmirror.go b/models/repo/pushmirror.go index a2e87e576ec4..34720f0c2397 100644 --- a/models/repo/pushmirror.go +++ b/models/repo/pushmirror.go @@ -5,6 +5,7 @@ package repo import ( + "context" "errors" "time" @@ -72,36 +73,30 @@ func (m *PushMirror) GetRemoteName() string { } // InsertPushMirror inserts a push-mirror to database -func InsertPushMirror(m *PushMirror) error { - _, err := db.GetEngine(db.DefaultContext).Insert(m) +func InsertPushMirror(ctx context.Context, m *PushMirror) error { + _, err := db.GetEngine(ctx).Insert(m) return err } // UpdatePushMirror updates the push-mirror -func UpdatePushMirror(m *PushMirror) error { - _, err := db.GetEngine(db.DefaultContext).ID(m.ID).AllCols().Update(m) +func UpdatePushMirror(ctx context.Context, m *PushMirror) error { + _, err := db.GetEngine(ctx).ID(m.ID).AllCols().Update(m) return err } -// DeletePushMirrorsByRepoID deletes all push-mirrors by repoID -func DeletePushMirrorsByRepoID(repoID int64) error { - _, err := db.GetEngine(db.DefaultContext).Delete(&PushMirror{RepoID: repoID}) - return err -} - -func DeletePushMirrors(opts PushMirrorOptions) error { +func DeletePushMirrors(ctx context.Context, opts PushMirrorOptions) error { if opts.RepoID > 0 { - _, err := db.GetEngine(db.DefaultContext).Where(opts.toConds()).Delete(&PushMirror{}) + _, err := db.GetEngine(ctx).Where(opts.toConds()).Delete(&PushMirror{}) return err } return errors.New("repoID required and must be set") } -func GetPushMirrors(opts PushMirrorOptions) (*PushMirror, error) { +func GetPushMirror(ctx context.Context, opts PushMirrorOptions) (*PushMirror, error) { mirror := &PushMirror{} var exist bool var err error - exist, err = db.GetEngine(db.DefaultContext).Where(opts.toConds()).Get(mirror) + exist, err = db.GetEngine(ctx).Where(opts.toConds()).Get(mirror) if err != nil { return nil, err } else if !exist { @@ -111,9 +106,9 @@ func GetPushMirrors(opts PushMirrorOptions) (*PushMirror, error) { } // GetPushMirrorsByRepoID returns push-mirror information of a repository. -func GetPushMirrorsByRepoID(repoID int64, listOptions db.ListOptions) ([]*PushMirror, error) { +func GetPushMirrorsByRepoID(ctx context.Context, repoID int64, listOptions db.ListOptions) ([]*PushMirror, error) { mirrors := make([]*PushMirror, 0, 10) - sess := db.GetEngine(db.DefaultContext).Where("repo_id = ?", repoID) + sess := db.GetEngine(ctx).Where("repo_id = ?", repoID) if listOptions.Page != 0 { sess = db.SetSessionPagination(sess, &listOptions) } @@ -121,8 +116,8 @@ func GetPushMirrorsByRepoID(repoID int64, listOptions db.ListOptions) ([]*PushMi } // PushMirrorsIterate iterates all push-mirror repositories. -func PushMirrorsIterate(limit int, f func(idx int, bean interface{}) error) error { - return db.GetEngine(db.DefaultContext). +func PushMirrorsIterate(ctx context.Context, limit int, f func(idx int, bean interface{}) error) error { + return db.GetEngine(ctx). Where("last_update + (`interval` / ?) <= ?", time.Second, time.Now().Unix()). And("`interval` != 0"). OrderBy("last_update ASC"). diff --git a/models/repo/pushmirror_test.go b/models/repo/pushmirror_test.go index d36a48547e1c..5087e3009577 100644 --- a/models/repo/pushmirror_test.go +++ b/models/repo/pushmirror_test.go @@ -8,6 +8,7 @@ import ( "testing" "time" + "code.gitea.io/gitea/models/db" repo_model "code.gitea.io/gitea/models/repo" "code.gitea.io/gitea/models/unittest" "code.gitea.io/gitea/modules/timeutil" @@ -20,20 +21,20 @@ func TestPushMirrorsIterate(t *testing.T) { now := timeutil.TimeStampNow() - repo_model.InsertPushMirror(&repo_model.PushMirror{ + repo_model.InsertPushMirror(db.DefaultContext, &repo_model.PushMirror{ RemoteName: "test-1", LastUpdateUnix: now, Interval: 1, }) long, _ := time.ParseDuration("24h") - repo_model.InsertPushMirror(&repo_model.PushMirror{ + repo_model.InsertPushMirror(db.DefaultContext, &repo_model.PushMirror{ RemoteName: "test-2", LastUpdateUnix: now, Interval: long, }) - repo_model.InsertPushMirror(&repo_model.PushMirror{ + repo_model.InsertPushMirror(db.DefaultContext, &repo_model.PushMirror{ RemoteName: "test-3", LastUpdateUnix: now, Interval: 0, @@ -41,7 +42,7 @@ func TestPushMirrorsIterate(t *testing.T) { time.Sleep(1 * time.Millisecond) - repo_model.PushMirrorsIterate(1, func(idx int, bean interface{}) error { + repo_model.PushMirrorsIterate(db.DefaultContext, 1, func(idx int, bean interface{}) error { m, ok := bean.(*repo_model.PushMirror) assert.True(t, ok) assert.Equal(t, "test-1", m.RemoteName) diff --git a/modules/context/repo.go b/modules/context/repo.go index 9131a248b7f9..d55817850610 100644 --- a/modules/context/repo.go +++ b/modules/context/repo.go @@ -393,7 +393,7 @@ func repoAssignment(ctx *Context, repo *repo_model.Repository) { } } - pushMirrors, err := repo_model.GetPushMirrorsByRepoID(repo.ID, db.ListOptions{}) + pushMirrors, err := repo_model.GetPushMirrorsByRepoID(ctx, repo.ID, db.ListOptions{}) if err != nil { ctx.ServerError("GetPushMirrorsByRepoID", err) return diff --git a/routers/api/v1/repo/mirror.go b/routers/api/v1/repo/mirror.go index 93e7ee06e33b..9fc672c262f9 100644 --- a/routers/api/v1/repo/mirror.go +++ b/routers/api/v1/repo/mirror.go @@ -106,7 +106,7 @@ func PushMirrorSync(ctx *context.APIContext) { return } // Get All push mirrors of a specific repo - pushMirrors, err := repo_model.GetPushMirrorsByRepoID(ctx.Repo.Repository.ID, db.ListOptions{}) + pushMirrors, err := repo_model.GetPushMirrorsByRepoID(ctx, ctx.Repo.Repository.ID, db.ListOptions{}) if err != nil { ctx.Error(http.StatusBadRequest, "PushMirrorSync", err) return @@ -164,7 +164,7 @@ func ListPushMirrors(ctx *context.APIContext) { repo := ctx.Repo.Repository listOptions := utils.GetListOptions(ctx) // Get All push mirrors of a specific repo - pushMirrors, err := repo_model.GetPushMirrorsByRepoID(repo.ID, listOptions) + pushMirrors, err := repo_model.GetPushMirrorsByRepoID(ctx, repo.ID, listOptions) if err != nil { ctx.Error(http.StatusBadRequest, "GetPushMirrorsByRepoID", err) return @@ -221,7 +221,7 @@ func GetPushMirrorByName(ctx *context.APIContext) { mirrorName := ctx.Params(":name") // Get push mirror of a specific repo by remoteName - pushMirror, err := repo_model.GetPushMirrors(repo_model.PushMirrorOptions{RepoID: ctx.Repo.Repository.ID, RemoteName: mirrorName}) + pushMirror, err := repo_model.GetPushMirror(ctx, repo_model.PushMirrorOptions{RepoID: ctx.Repo.Repository.ID, RemoteName: mirrorName}) if err != nil { ctx.Error(http.StatusBadRequest, "GetPushMirrorByRemoteName", err) return @@ -313,7 +313,7 @@ func DeletePushMirrorByRemoteName(ctx *context.APIContext) { remoteName := ctx.Params(":name") // Delete push mirror on repo by name. - err := repo_model.DeletePushMirrors(repo_model.PushMirrorOptions{RepoID: ctx.Repo.Repository.ID, RemoteName: remoteName}) + err := repo_model.DeletePushMirrors(ctx, repo_model.PushMirrorOptions{RepoID: ctx.Repo.Repository.ID, RemoteName: remoteName}) if err != nil { ctx.Error(http.StatusBadRequest, "DeletePushMirrorByName", err) return @@ -352,14 +352,14 @@ func CreatePushMirror(ctx *context.APIContext, mirrorOption *api.CreatePushMirro Interval: interval, } - if err = repo_model.InsertPushMirror(pushMirror); err != nil { + if err = repo_model.InsertPushMirror(ctx, pushMirror); err != nil { ctx.ServerError("InsertPushMirror", err) return } // if the registration of the push mirrorOption fails remove it from the database if err = mirror_service.AddPushMirrorRemote(ctx, pushMirror, address); err != nil { - if err := repo_model.DeletePushMirrors(repo_model.PushMirrorOptions{ID: pushMirror.ID, RepoID: pushMirror.RepoID}); err != nil { + if err := repo_model.DeletePushMirrors(ctx, repo_model.PushMirrorOptions{ID: pushMirror.ID, RepoID: pushMirror.RepoID}); err != nil { ctx.ServerError("DeletePushMirrorByID", err) } ctx.ServerError("AddPushMirrorRemote", err) diff --git a/routers/web/repo/setting.go b/routers/web/repo/setting.go index 5edfec8d4b4f..151f8d4a574c 100644 --- a/routers/web/repo/setting.go +++ b/routers/web/repo/setting.go @@ -89,7 +89,7 @@ func SettingsCtxData(ctx *context.Context) { } ctx.Data["StatsIndexerStatus"] = status } - pushMirrors, err := repo_model.GetPushMirrorsByRepoID(ctx.Repo.Repository.ID, db.ListOptions{}) + pushMirrors, err := repo_model.GetPushMirrorsByRepoID(ctx, ctx.Repo.Repository.ID, db.ListOptions{}) if err != nil { ctx.ServerError("GetPushMirrorsByRepoID", err) return @@ -283,7 +283,7 @@ func SettingsPost(ctx *context.Context) { return } - m, err := selectPushMirrorByForm(form, repo) + m, err := selectPushMirrorByForm(ctx, form, repo) if err != nil { ctx.NotFound("", nil) return @@ -304,7 +304,7 @@ func SettingsPost(ctx *context.Context) { // as an error on the UI for this action ctx.Data["Err_RepoName"] = nil - m, err := selectPushMirrorByForm(form, repo) + m, err := selectPushMirrorByForm(ctx, form, repo) if err != nil { ctx.NotFound("", nil) return @@ -315,7 +315,7 @@ func SettingsPost(ctx *context.Context) { return } - if err = repo_model.DeletePushMirrors(repo_model.PushMirrorOptions{ID: m.ID, RepoID: m.RepoID}); err != nil { + if err = repo_model.DeletePushMirrors(ctx, repo_model.PushMirrorOptions{ID: m.ID, RepoID: m.RepoID}); err != nil { ctx.ServerError("DeletePushMirrorByID", err) return } @@ -362,13 +362,13 @@ func SettingsPost(ctx *context.Context) { RemoteName: fmt.Sprintf("remote_mirror_%s", remoteSuffix), Interval: interval, } - if err := repo_model.InsertPushMirror(m); err != nil { + if err := repo_model.InsertPushMirror(ctx, m); err != nil { ctx.ServerError("InsertPushMirror", err) return } if err := mirror_service.AddPushMirrorRemote(ctx, m, address); err != nil { - if err := repo_model.DeletePushMirrors(repo_model.PushMirrorOptions{ID: m.ID, RepoID: m.RepoID}); err != nil { + if err := repo_model.DeletePushMirrors(ctx, repo_model.PushMirrorOptions{ID: m.ID, RepoID: m.RepoID}); err != nil { log.Error("DeletePushMirrors %v", err) } ctx.ServerError("AddPushMirrorRemote", err) @@ -1220,13 +1220,13 @@ func SettingsDeleteAvatar(ctx *context.Context) { ctx.Redirect(ctx.Repo.RepoLink + "/settings") } -func selectPushMirrorByForm(form *forms.RepoSettingForm, repo *repo_model.Repository) (*repo_model.PushMirror, error) { +func selectPushMirrorByForm(ctx *context.Context, form *forms.RepoSettingForm, repo *repo_model.Repository) (*repo_model.PushMirror, error) { id, err := strconv.ParseInt(form.PushMirrorID, 10, 64) if err != nil { return nil, err } - pushMirrors, err := repo_model.GetPushMirrorsByRepoID(repo.ID, db.ListOptions{}) + pushMirrors, err := repo_model.GetPushMirrorsByRepoID(ctx, repo.ID, db.ListOptions{}) if err != nil { return nil, err } diff --git a/services/mirror/mirror.go b/services/mirror/mirror.go index 013adac0f4ed..954602c1cc35 100644 --- a/services/mirror/mirror.go +++ b/services/mirror/mirror.go @@ -125,7 +125,7 @@ func Update(ctx context.Context, pullLimit, pushLimit int) error { pushMirrorsRequested := 0 if pushLimit != 0 { - if err := repo_model.PushMirrorsIterate(pushLimit, func(idx int, bean interface{}) error { + if err := repo_model.PushMirrorsIterate(ctx, pushLimit, func(idx int, bean interface{}) error { if err := handler(idx, bean); err != nil { return err } diff --git a/services/mirror/mirror_push.go b/services/mirror/mirror_push.go index 43948d3467ba..0c8960d78bf2 100644 --- a/services/mirror/mirror_push.go +++ b/services/mirror/mirror_push.go @@ -94,7 +94,7 @@ func SyncPushMirror(ctx context.Context, mirrorID int64) bool { log.Error("PANIC whilst syncPushMirror[%d] Panic: %v\nStacktrace: %s", mirrorID, err, log.Stack(2)) }() - m, err := repo_model.GetPushMirrors(repo_model.PushMirrorOptions{ID: mirrorID}) + m, err := repo_model.GetPushMirror(ctx, repo_model.PushMirrorOptions{ID: mirrorID}) if err != nil { log.Error("GetPushMirrorByID [%d]: %v", mirrorID, err) return false @@ -116,7 +116,7 @@ func SyncPushMirror(ctx context.Context, mirrorID int64) bool { m.LastUpdateUnix = timeutil.TimeStampNow() - if err := repo_model.UpdatePushMirror(m); err != nil { + if err := repo_model.UpdatePushMirror(ctx, m); err != nil { log.Error("UpdatePushMirror [%d]: %v", m.ID, err) return false From 61e493eb90f8c7fe73ab914fe923e803292fd592 Mon Sep 17 00:00:00 2001 From: Mohamed Date: Fri, 1 Jul 2022 16:24:03 +0200 Subject: [PATCH 27/30] apply PR suggestions --- models/repo/pushmirror.go | 4 +--- modules/convert/mirror.go | 4 +--- routers/api/v1/repo/mirror.go | 23 +++++++++++------------ 3 files changed, 13 insertions(+), 18 deletions(-) diff --git a/models/repo/pushmirror.go b/models/repo/pushmirror.go index 34720f0c2397..49d903a0d651 100644 --- a/models/repo/pushmirror.go +++ b/models/repo/pushmirror.go @@ -94,9 +94,7 @@ func DeletePushMirrors(ctx context.Context, opts PushMirrorOptions) error { func GetPushMirror(ctx context.Context, opts PushMirrorOptions) (*PushMirror, error) { mirror := &PushMirror{} - var exist bool - var err error - exist, err = db.GetEngine(ctx).Where(opts.toConds()).Get(mirror) + exist, err := db.GetEngine(ctx).Where(opts.toConds()).Get(mirror) if err != nil { return nil, err } else if !exist { diff --git a/modules/convert/mirror.go b/modules/convert/mirror.go index b4bdabc147fc..4414e9d2819f 100644 --- a/modules/convert/mirror.go +++ b/modules/convert/mirror.go @@ -5,8 +5,6 @@ package convert import ( - "errors" - repo_model "code.gitea.io/gitea/models/repo" "code.gitea.io/gitea/modules/git" api "code.gitea.io/gitea/modules/structs" @@ -17,7 +15,7 @@ func ToPushMirror(pm *repo_model.PushMirror) (*api.PushMirror, error) { repo := pm.GetRepository() remoteAddress, err := getMirrorRemoteAddress(repo, pm.RemoteName) if err != nil { - return nil, errors.New("error getting mirror RemoteAddress") + return nil, err } return &api.PushMirror{ RepoName: repo.Name, diff --git a/routers/api/v1/repo/mirror.go b/routers/api/v1/repo/mirror.go index 9fc672c262f9..6e255d9bbcb7 100644 --- a/routers/api/v1/repo/mirror.go +++ b/routers/api/v1/repo/mirror.go @@ -108,7 +108,7 @@ func PushMirrorSync(ctx *context.APIContext) { // Get All push mirrors of a specific repo pushMirrors, err := repo_model.GetPushMirrorsByRepoID(ctx, ctx.Repo.Repository.ID, db.ListOptions{}) if err != nil { - ctx.Error(http.StatusBadRequest, "PushMirrorSync", err) + ctx.Error(http.StatusNotFound, "PushMirrorSync", err) return } for _, mirror := range pushMirrors { @@ -162,11 +162,10 @@ func ListPushMirrors(ctx *context.APIContext) { } repo := ctx.Repo.Repository - listOptions := utils.GetListOptions(ctx) - // Get All push mirrors of a specific repo - pushMirrors, err := repo_model.GetPushMirrorsByRepoID(ctx, repo.ID, listOptions) + // Get all push mirrors for the specified repository. + pushMirrors, err := repo_model.GetPushMirrorsByRepoID(ctx, repo.ID, utils.GetListOptions(ctx)) if err != nil { - ctx.Error(http.StatusBadRequest, "GetPushMirrorsByRepoID", err) + ctx.Error(http.StatusNotFound, "GetPushMirrorsByRepoID", err) return } @@ -178,8 +177,8 @@ func ListPushMirrors(ctx *context.APIContext) { } } - ctx.SetLinkHeader(len(pushMirrors), listOptions.PageSize) - ctx.SetTotalCountHeader(int64(len(pushMirrors))) + ctx.SetLinkHeader(len(responsePushMirrors), utils.GetListOptions(ctx).PageSize) + ctx.SetTotalCountHeader(int64(len(responsePushMirrors))) ctx.JSON(http.StatusOK, responsePushMirrors) } @@ -223,12 +222,12 @@ func GetPushMirrorByName(ctx *context.APIContext) { // Get push mirror of a specific repo by remoteName pushMirror, err := repo_model.GetPushMirror(ctx, repo_model.PushMirrorOptions{RepoID: ctx.Repo.Repository.ID, RemoteName: mirrorName}) if err != nil { - ctx.Error(http.StatusBadRequest, "GetPushMirrorByRemoteName", err) + ctx.Error(http.StatusNotFound, "GetPushMirrors", err) return } m, err := convert.ToPushMirror(pushMirror) if err != nil { - ctx.Error(http.StatusBadRequest, "GetPushMirrorByRemoteName", err.Error()) + ctx.ServerError("GetPushMirrorByRemoteName", err) return } ctx.JSON(http.StatusOK, m) @@ -315,7 +314,7 @@ func DeletePushMirrorByRemoteName(ctx *context.APIContext) { // Delete push mirror on repo by name. err := repo_model.DeletePushMirrors(ctx, repo_model.PushMirrorOptions{RepoID: ctx.Repo.Repository.ID, RemoteName: remoteName}) if err != nil { - ctx.Error(http.StatusBadRequest, "DeletePushMirrorByName", err) + ctx.Error(http.StatusNotFound, "DeletePushMirrors", err) return } ctx.Status(http.StatusNoContent) @@ -360,14 +359,14 @@ func CreatePushMirror(ctx *context.APIContext, mirrorOption *api.CreatePushMirro // if the registration of the push mirrorOption fails remove it from the database if err = mirror_service.AddPushMirrorRemote(ctx, pushMirror, address); err != nil { if err := repo_model.DeletePushMirrors(ctx, repo_model.PushMirrorOptions{ID: pushMirror.ID, RepoID: pushMirror.RepoID}); err != nil { - ctx.ServerError("DeletePushMirrorByID", err) + ctx.ServerError("DeletePushMirrors", err) } ctx.ServerError("AddPushMirrorRemote", err) return } m, err := convert.ToPushMirror(pushMirror) if err != nil { - ctx.Error(http.StatusBadRequest, "GetPushMirror", err.Error()) + ctx.ServerError("ToPushMirror", err) return } ctx.JSON(http.StatusOK, m) From da57680f857ef30e9852c5492a000e18b4ba20f3 Mon Sep 17 00:00:00 2001 From: Mohamed Date: Sat, 2 Jul 2022 21:10:02 +0200 Subject: [PATCH 28/30] apply PR suggestion --- routers/api/v1/repo/mirror.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/routers/api/v1/repo/mirror.go b/routers/api/v1/repo/mirror.go index 6e255d9bbcb7..6dc98d58ed0d 100644 --- a/routers/api/v1/repo/mirror.go +++ b/routers/api/v1/repo/mirror.go @@ -169,7 +169,7 @@ func ListPushMirrors(ctx *context.APIContext) { return } - responsePushMirrors := make([]*api.PushMirror, 0) + responsePushMirrors := make([]*api.PushMirror, 0, len(pushMirrors)) for _, mirror := range pushMirrors { m, err := convert.ToPushMirror(mirror) if err == nil { From e50174c2a614df7e77af4a1249e674021af61607 Mon Sep 17 00:00:00 2001 From: Mohamed Date: Sun, 3 Jul 2022 16:46:16 +0200 Subject: [PATCH 29/30] some minor refactoring --- models/repo/pushmirror.go | 1 + modules/convert/mirror.go | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/models/repo/pushmirror.go b/models/repo/pushmirror.go index 49d903a0d651..9b9f89a16b3e 100644 --- a/models/repo/pushmirror.go +++ b/models/repo/pushmirror.go @@ -12,6 +12,7 @@ import ( "code.gitea.io/gitea/models/db" "code.gitea.io/gitea/modules/log" "code.gitea.io/gitea/modules/timeutil" + "xorm.io/builder" ) diff --git a/modules/convert/mirror.go b/modules/convert/mirror.go index 4414e9d2819f..b2414f46774c 100644 --- a/modules/convert/mirror.go +++ b/modules/convert/mirror.go @@ -13,7 +13,7 @@ import ( // ToPushMirror convert from repo_model.PushMirror and remoteAddress to api.TopicResponse func ToPushMirror(pm *repo_model.PushMirror) (*api.PushMirror, error) { repo := pm.GetRepository() - remoteAddress, err := getMirrorRemoteAddress(repo, pm.RemoteName) + remoteAddress, err := getRemoteAddress(repo, pm.RemoteName) if err != nil { return nil, err } @@ -28,7 +28,7 @@ func ToPushMirror(pm *repo_model.PushMirror) (*api.PushMirror, error) { }, nil } -func getMirrorRemoteAddress(repo *repo_model.Repository, remoteName string) (string, error) { +func getRemoteAddress(repo *repo_model.Repository, remoteName string) (string, error) { url, err := git.GetRemoteURL(git.DefaultContext, repo.RepoPath(), remoteName) if err != nil { return "", err From d9ddbcf5d828e8dec8a129d0cc5f5c3c38cec24e Mon Sep 17 00:00:00 2001 From: Mohamed Date: Sat, 30 Jul 2022 16:30:50 +0200 Subject: [PATCH 30/30] fix wrong count calculation --- integrations/mirror_push_test.go | 4 ++-- models/repo/pushmirror.go | 10 +++++++--- modules/context/repo.go | 2 +- routers/api/v1/repo/mirror.go | 6 +++--- routers/web/repo/setting.go | 4 ++-- 5 files changed, 15 insertions(+), 11 deletions(-) diff --git a/integrations/mirror_push_test.go b/integrations/mirror_push_test.go index 1351bf3995f3..3a22b0075423 100644 --- a/integrations/mirror_push_test.go +++ b/integrations/mirror_push_test.go @@ -48,7 +48,7 @@ func testMirrorPush(t *testing.T, u *url.URL) { doCreatePushMirror(ctx, fmt.Sprintf("%s%s/%s", u.String(), url.PathEscape(ctx.Username), url.PathEscape(mirrorRepo.Name)), user.LowerName, userPassword)(t) - mirrors, err := repo_model.GetPushMirrorsByRepoID(db.DefaultContext, srcRepo.ID, db.ListOptions{}) + mirrors, _, err := repo_model.GetPushMirrorsByRepoID(db.DefaultContext, srcRepo.ID, db.ListOptions{}) assert.NoError(t, err) assert.Len(t, mirrors, 1) @@ -73,7 +73,7 @@ func testMirrorPush(t *testing.T, u *url.URL) { // Cleanup doRemovePushMirror(ctx, fmt.Sprintf("%s%s/%s", u.String(), url.PathEscape(ctx.Username), url.PathEscape(mirrorRepo.Name)), user.LowerName, userPassword, int(mirrors[0].ID))(t) - mirrors, err = repo_model.GetPushMirrorsByRepoID(db.DefaultContext, srcRepo.ID, db.ListOptions{}) + mirrors, _, err = repo_model.GetPushMirrorsByRepoID(db.DefaultContext, srcRepo.ID, db.ListOptions{}) assert.NoError(t, err) assert.Len(t, mirrors, 0) } diff --git a/models/repo/pushmirror.go b/models/repo/pushmirror.go index 65adc2fdcd69..02ffcbee76a5 100644 --- a/models/repo/pushmirror.go +++ b/models/repo/pushmirror.go @@ -106,13 +106,17 @@ func GetPushMirror(ctx context.Context, opts PushMirrorOptions) (*PushMirror, er } // GetPushMirrorsByRepoID returns push-mirror information of a repository. -func GetPushMirrorsByRepoID(ctx context.Context, repoID int64, listOptions db.ListOptions) ([]*PushMirror, error) { - mirrors := make([]*PushMirror, 0, 10) +func GetPushMirrorsByRepoID(ctx context.Context, repoID int64, listOptions db.ListOptions) ([]*PushMirror, int64, error) { sess := db.GetEngine(ctx).Where("repo_id = ?", repoID) if listOptions.Page != 0 { sess = db.SetSessionPagination(sess, &listOptions) + mirrors := make([]*PushMirror, 0, listOptions.PageSize) + count, err := sess.FindAndCount(&mirrors) + return mirrors, count, err } - return mirrors, sess.Find(&mirrors) + mirrors := make([]*PushMirror, 0, 10) + count, err := sess.FindAndCount(&mirrors) + return mirrors, count, err } // GetPushMirrorsSyncedOnCommit returns push-mirrors for this repo that should be updated by new commits diff --git a/modules/context/repo.go b/modules/context/repo.go index ce7e3efc04c8..ea4054206999 100644 --- a/modules/context/repo.go +++ b/modules/context/repo.go @@ -393,7 +393,7 @@ func repoAssignment(ctx *Context, repo *repo_model.Repository) { } } - pushMirrors, err := repo_model.GetPushMirrorsByRepoID(ctx, repo.ID, db.ListOptions{}) + pushMirrors, _, err := repo_model.GetPushMirrorsByRepoID(ctx, repo.ID, db.ListOptions{}) if err != nil { ctx.ServerError("GetPushMirrorsByRepoID", err) return diff --git a/routers/api/v1/repo/mirror.go b/routers/api/v1/repo/mirror.go index 294be695ca5c..91e5e0c03161 100644 --- a/routers/api/v1/repo/mirror.go +++ b/routers/api/v1/repo/mirror.go @@ -107,7 +107,7 @@ func PushMirrorSync(ctx *context.APIContext) { return } // Get All push mirrors of a specific repo - pushMirrors, err := repo_model.GetPushMirrorsByRepoID(ctx, ctx.Repo.Repository.ID, db.ListOptions{}) + pushMirrors, _, err := repo_model.GetPushMirrorsByRepoID(ctx, ctx.Repo.Repository.ID, db.ListOptions{}) if err != nil { ctx.Error(http.StatusNotFound, "PushMirrorSync", err) return @@ -164,7 +164,7 @@ func ListPushMirrors(ctx *context.APIContext) { repo := ctx.Repo.Repository // Get all push mirrors for the specified repository. - pushMirrors, err := repo_model.GetPushMirrorsByRepoID(ctx, repo.ID, utils.GetListOptions(ctx)) + pushMirrors, count, err := repo_model.GetPushMirrorsByRepoID(ctx, repo.ID, utils.GetListOptions(ctx)) if err != nil { ctx.Error(http.StatusNotFound, "GetPushMirrorsByRepoID", err) return @@ -179,7 +179,7 @@ func ListPushMirrors(ctx *context.APIContext) { } ctx.SetLinkHeader(len(responsePushMirrors), utils.GetListOptions(ctx).PageSize) - ctx.SetTotalCountHeader(int64(len(responsePushMirrors))) + ctx.SetTotalCountHeader(count) ctx.JSON(http.StatusOK, responsePushMirrors) } diff --git a/routers/web/repo/setting.go b/routers/web/repo/setting.go index fc66afb4b951..a59824cecdb4 100644 --- a/routers/web/repo/setting.go +++ b/routers/web/repo/setting.go @@ -90,7 +90,7 @@ func SettingsCtxData(ctx *context.Context) { } ctx.Data["StatsIndexerStatus"] = status } - pushMirrors, err := repo_model.GetPushMirrorsByRepoID(ctx, ctx.Repo.Repository.ID, db.ListOptions{}) + pushMirrors, _, err := repo_model.GetPushMirrorsByRepoID(ctx, ctx.Repo.Repository.ID, db.ListOptions{}) if err != nil { ctx.ServerError("GetPushMirrorsByRepoID", err) return @@ -1228,7 +1228,7 @@ func selectPushMirrorByForm(ctx *context.Context, form *forms.RepoSettingForm, r return nil, err } - pushMirrors, err := repo_model.GetPushMirrorsByRepoID(ctx, repo.ID, db.ListOptions{}) + pushMirrors, _, err := repo_model.GetPushMirrorsByRepoID(ctx, repo.ID, db.ListOptions{}) if err != nil { return nil, err }