From e53b82291566f85ccadb6f2a9b8ab111e1d9c57c Mon Sep 17 00:00:00 2001 From: Anbraten Date: Fri, 9 Jan 2026 17:41:14 +0100 Subject: [PATCH] allow to change repo user --- cmd/server/openapi/docs.go | 6 ++++++ server/model/repo.go | 2 +- web/src/assets/locales/en.json | 6 +++++- web/src/lib/api/index.ts | 4 ++++ web/src/lib/api/types/repo.ts | 3 +++ web/src/views/repo/settings/Actions.vue | 23 +++++++++++++++++++++++ 6 files changed, 42 insertions(+), 2 deletions(-) diff --git a/cmd/server/openapi/docs.go b/cmd/server/openapi/docs.go index b86e7cd2b5e..693106d0b13 100644 --- a/cmd/server/openapi/docs.go +++ b/cmd/server/openapi/docs.go @@ -5274,6 +5274,9 @@ const docTemplate = `{ "trusted": { "$ref": "#/definitions/model.TrustedConfiguration" }, + "user_id": { + "type": "integer" + }, "visibility": { "$ref": "#/definitions/RepoVisibility" } @@ -5370,6 +5373,9 @@ const docTemplate = `{ "trusted": { "$ref": "#/definitions/model.TrustedConfiguration" }, + "user_id": { + "type": "integer" + }, "visibility": { "$ref": "#/definitions/RepoVisibility" } diff --git a/server/model/repo.go b/server/model/repo.go index f2e009f6089..1ecef803f40 100644 --- a/server/model/repo.go +++ b/server/model/repo.go @@ -44,7 +44,7 @@ func (mode ApprovalMode) Valid() bool { // Repo represents a repository. type Repo struct { ID int64 `json:"id,omitempty" xorm:"pk autoincr 'id'"` - UserID int64 `json:"-" xorm:"INDEX 'user_id'"` + UserID int64 `json:"user_id" xorm:"INDEX 'user_id'"` ForgeID int64 `json:"forge_id,omitempty" xorm:"UNIQUE(forge) forge_id"` // ForgeRemoteID is the unique identifier for the repository on the forge. ForgeRemoteID ForgeRemoteID `json:"forge_remote_id" xorm:"UNIQUE(forge) forge_remote_id"` diff --git a/web/src/assets/locales/en.json b/web/src/assets/locales/en.json index 2426835d21f..fe4a6fb35b9 100644 --- a/web/src/assets/locales/en.json +++ b/web/src/assets/locales/en.json @@ -590,5 +590,9 @@ "exit_fullscreen": "Exit fullscreen", "help_translating": "You can help translate Woodpecker into your language on {0}.", "weblate": "our Weblate", - "disabled": "Disabled" + "disabled": "Disabled", + "current_repo_user": "Current repository user: {user_id}", + "set_as_repo_user": "Set yourself as repository user", + "user_associated_to_repo": "The user account associated to the repository will be used for API requests to the forge.", + "repo_user_changed": "You are now the owner of this repository" } diff --git a/web/src/lib/api/index.ts b/web/src/lib/api/index.ts index aebd05120fc..9026ed86c01 100644 --- a/web/src/lib/api/index.ts +++ b/web/src/lib/api/index.ts @@ -89,6 +89,10 @@ export default class WoodpeckerClient extends ApiClient { return this._post(`/api/repos/${repoId}/repair`); } + async chownRepo(repoId: number): Promise { + return this._post(`/api/repos/${repoId}/chown`); + } + async createPipeline(repoId: number, options: PipelineOptions): Promise { return this._post(`/api/repos/${repoId}/pipelines`, options) as Promise; } diff --git a/web/src/lib/api/types/repo.ts b/web/src/lib/api/types/repo.ts index bfca1b5acbd..ae255584bcb 100644 --- a/web/src/lib/api/types/repo.ts +++ b/web/src/lib/api/types/repo.ts @@ -14,6 +14,9 @@ export interface Repo { // The id of the forge that the repository is on. forge_id: number; + // The id of the user that owns the repository. Will be used for api requests to the forge. + user_id: number; + // The source control management being used. // Currently, this is either 'git' or 'hg' (Mercurial). scm: string; diff --git a/web/src/views/repo/settings/Actions.vue b/web/src/views/repo/settings/Actions.vue index 9410d337ea3..87823f586a4 100644 --- a/web/src/views/repo/settings/Actions.vue +++ b/web/src/views/repo/settings/Actions.vue @@ -29,6 +29,22 @@ @click="activateRepo" /> +
+

+ {{ $t('current_repo_user', { user_id: repo.user_id }) }} + {{ $t('user_associated_to_repo') }} +

+ +
+