2021-11-13 19:18:06 +00:00
|
|
|
// Copyright 2021 Woodpecker Authors
|
2018-02-19 22:24:10 +00:00
|
|
|
// Copyright 2018 Drone.IO Inc.
|
2018-03-21 13:02:17 +00:00
|
|
|
//
|
2018-02-19 22:24:10 +00:00
|
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
|
|
// you may not use this file except in compliance with the License.
|
|
|
|
// You may obtain a copy of the License at
|
2018-03-21 13:02:17 +00:00
|
|
|
//
|
2018-02-19 22:24:10 +00:00
|
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
2018-03-21 13:02:17 +00:00
|
|
|
//
|
2018-02-19 22:24:10 +00:00
|
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
|
// See the License for the specific language governing permissions and
|
|
|
|
// limitations under the License.
|
|
|
|
|
2015-09-30 01:21:17 +00:00
|
|
|
package model
|
2015-04-07 08:20:55 +00:00
|
|
|
|
2017-08-21 22:49:09 +00:00
|
|
|
import (
|
|
|
|
"fmt"
|
2018-03-21 13:02:17 +00:00
|
|
|
"strings"
|
2017-08-21 22:49:09 +00:00
|
|
|
)
|
|
|
|
|
2016-03-30 20:15:28 +00:00
|
|
|
// Repo represents a repository.
|
2015-09-30 01:21:17 +00:00
|
|
|
type Repo struct {
|
2024-04-16 06:04:55 +00:00
|
|
|
ID int64 `json:"id,omitempty" xorm:"pk autoincr 'repo_id'"`
|
|
|
|
UserID int64 `json:"-" xorm:"repo_user_id"`
|
|
|
|
ForgeID int64 `json:"forge_id,omitempty" xorm:"forge_id"`
|
2022-11-15 14:01:23 +00:00
|
|
|
// ForgeRemoteID is the unique identifier for the repository on the forge.
|
2023-06-12 23:07:52 +00:00
|
|
|
ForgeRemoteID ForgeRemoteID `json:"forge_remote_id" xorm:"forge_remote_id"`
|
2023-07-21 17:45:32 +00:00
|
|
|
OrgID int64 `json:"org_id" xorm:"repo_org_id"`
|
2022-05-09 09:26:09 +00:00
|
|
|
Owner string `json:"owner" xorm:"UNIQUE(name) 'repo_owner'"`
|
|
|
|
Name string `json:"name" xorm:"UNIQUE(name) 'repo_name'"`
|
|
|
|
FullName string `json:"full_name" xorm:"UNIQUE 'repo_full_name'"`
|
|
|
|
Avatar string `json:"avatar_url,omitempty" xorm:"varchar(500) 'repo_avatar'"`
|
2023-11-14 16:12:12 +00:00
|
|
|
ForgeURL string `json:"forge_url,omitempty" xorm:"varchar(1000) 'repo_forge_url'"`
|
2022-05-09 09:26:09 +00:00
|
|
|
Clone string `json:"clone_url,omitempty" xorm:"varchar(1000) 'repo_clone'"`
|
2023-08-12 15:39:13 +00:00
|
|
|
CloneSSH string `json:"clone_url_ssh" xorm:"varchar(1000) 'repo_clone_ssh'"`
|
2022-05-09 09:26:09 +00:00
|
|
|
Branch string `json:"default_branch,omitempty" xorm:"varchar(500) 'repo_branch'"`
|
|
|
|
SCMKind SCMKind `json:"scm,omitempty" xorm:"varchar(50) 'repo_scm'"`
|
2023-12-24 09:04:18 +00:00
|
|
|
PREnabled bool `json:"pr_enabled" xorm:"DEFAULT TRUE 'repo_pr_enabled'"`
|
2022-05-09 09:26:09 +00:00
|
|
|
Timeout int64 `json:"timeout,omitempty" xorm:"repo_timeout"`
|
2023-04-30 12:01:11 +00:00
|
|
|
Visibility RepoVisibility `json:"visibility" xorm:"varchar(10) 'repo_visibility'"`
|
2022-05-09 09:26:09 +00:00
|
|
|
IsSCMPrivate bool `json:"private" xorm:"repo_private"`
|
|
|
|
IsTrusted bool `json:"trusted" xorm:"repo_trusted"`
|
|
|
|
IsGated bool `json:"gated" xorm:"repo_gated"`
|
|
|
|
IsActive bool `json:"active" xorm:"repo_active"`
|
|
|
|
AllowPull bool `json:"allow_pr" xorm:"repo_allow_pr"`
|
2024-04-02 20:03:37 +00:00
|
|
|
AllowDeploy bool `json:"allow_deploy" xorm:"repo_allow_deploy"`
|
2022-05-09 09:26:09 +00:00
|
|
|
Config string `json:"config_file" xorm:"varchar(500) 'repo_config_path'"`
|
|
|
|
Hash string `json:"-" xorm:"varchar(500) 'repo_hash'"`
|
|
|
|
Perm *Perm `json:"-" xorm:"-"`
|
|
|
|
CancelPreviousPipelineEvents []WebhookEvent `json:"cancel_previous_pipeline_events" xorm:"json 'cancel_previous_pipeline_events'"`
|
2023-03-20 20:17:49 +00:00
|
|
|
NetrcOnlyTrusted bool `json:"netrc_only_trusted" xorm:"NOT NULL DEFAULT true 'netrc_only_trusted'"`
|
2023-06-03 19:38:36 +00:00
|
|
|
} // @name Repo
|
2021-11-13 19:18:06 +00:00
|
|
|
|
2024-05-13 20:58:21 +00:00
|
|
|
// TableName return database table name for xorm.
|
2021-11-13 19:18:06 +00:00
|
|
|
func (Repo) TableName() string {
|
|
|
|
return "repos"
|
2015-09-30 01:21:17 +00:00
|
|
|
}
|
2017-04-12 12:12:21 +00:00
|
|
|
|
2017-08-21 22:49:09 +00:00
|
|
|
func (r *Repo) ResetVisibility() {
|
|
|
|
r.Visibility = VisibilityPublic
|
2021-11-22 11:55:13 +00:00
|
|
|
if r.IsSCMPrivate {
|
2017-08-21 22:49:09 +00:00
|
|
|
r.Visibility = VisibilityPrivate
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// ParseRepo parses the repository owner and name from a string.
|
|
|
|
func ParseRepo(str string) (user, repo string, err error) {
|
2024-03-15 17:00:25 +00:00
|
|
|
before, after, _ := strings.Cut(str, "/")
|
|
|
|
if before == "" || after == "" {
|
|
|
|
err = fmt.Errorf("invalid or missing repository (e.g. octocat/hello-world)")
|
2017-08-21 22:49:09 +00:00
|
|
|
return
|
|
|
|
}
|
2024-03-15 17:00:25 +00:00
|
|
|
user = before
|
|
|
|
repo = after
|
2017-08-21 22:49:09 +00:00
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2017-07-21 15:53:11 +00:00
|
|
|
// Update updates the repository with values from the given Repo.
|
|
|
|
func (r *Repo) Update(from *Repo) {
|
2022-11-15 14:01:23 +00:00
|
|
|
if from.ForgeRemoteID.IsValid() {
|
|
|
|
r.ForgeRemoteID = from.ForgeRemoteID
|
2022-09-07 17:16:40 +00:00
|
|
|
}
|
2022-09-05 15:08:51 +00:00
|
|
|
r.Owner = from.Owner
|
|
|
|
r.Name = from.Name
|
|
|
|
r.FullName = from.FullName
|
2017-07-21 15:53:11 +00:00
|
|
|
r.Avatar = from.Avatar
|
2023-11-14 16:12:12 +00:00
|
|
|
r.ForgeURL = from.ForgeURL
|
2021-11-22 11:55:13 +00:00
|
|
|
r.SCMKind = from.SCMKind
|
2023-12-24 09:04:18 +00:00
|
|
|
r.PREnabled = from.PREnabled
|
2022-09-07 16:34:08 +00:00
|
|
|
if len(from.Clone) > 0 {
|
|
|
|
r.Clone = from.Clone
|
|
|
|
}
|
2023-08-12 15:39:13 +00:00
|
|
|
if len(from.CloneSSH) > 0 {
|
|
|
|
r.CloneSSH = from.CloneSSH
|
|
|
|
}
|
2017-07-21 15:53:11 +00:00
|
|
|
r.Branch = from.Branch
|
2021-11-22 11:55:13 +00:00
|
|
|
if from.IsSCMPrivate != r.IsSCMPrivate {
|
|
|
|
if from.IsSCMPrivate {
|
2017-07-21 15:53:11 +00:00
|
|
|
r.Visibility = VisibilityPrivate
|
|
|
|
} else {
|
|
|
|
r.Visibility = VisibilityPublic
|
|
|
|
}
|
|
|
|
}
|
2021-11-22 11:55:13 +00:00
|
|
|
r.IsSCMPrivate = from.IsSCMPrivate
|
2017-07-21 15:53:11 +00:00
|
|
|
}
|
|
|
|
|
2017-04-12 12:12:21 +00:00
|
|
|
// RepoPatch represents a repository patch object.
|
|
|
|
type RepoPatch struct {
|
2022-05-09 09:26:09 +00:00
|
|
|
Config *string `json:"config_file,omitempty"`
|
|
|
|
IsTrusted *bool `json:"trusted,omitempty"`
|
|
|
|
IsGated *bool `json:"gated,omitempty"`
|
|
|
|
Timeout *int64 `json:"timeout,omitempty"`
|
|
|
|
Visibility *string `json:"visibility,omitempty"`
|
|
|
|
AllowPull *bool `json:"allow_pr,omitempty"`
|
2024-04-02 20:03:37 +00:00
|
|
|
AllowDeploy *bool `json:"allow_deploy,omitempty"`
|
2022-05-09 09:26:09 +00:00
|
|
|
CancelPreviousPipelineEvents *[]WebhookEvent `json:"cancel_previous_pipeline_events"`
|
2023-03-20 20:17:49 +00:00
|
|
|
NetrcOnlyTrusted *bool `json:"netrc_only_trusted"`
|
2023-06-03 19:38:36 +00:00
|
|
|
} // @name RepoPatch
|
2022-09-05 15:08:51 +00:00
|
|
|
|
2022-11-15 14:01:23 +00:00
|
|
|
type ForgeRemoteID string
|
2022-09-05 15:08:51 +00:00
|
|
|
|
2022-11-15 14:01:23 +00:00
|
|
|
func (r ForgeRemoteID) IsValid() bool {
|
2022-09-05 15:08:51 +00:00
|
|
|
return r != "" && r != "0"
|
|
|
|
}
|