Платформа ЦРНП "Мирокод" для разработки проектов
https://git.mirocod.ru
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
229 lines
6.4 KiB
229 lines
6.4 KiB
// Copyright 2017 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 models |
|
|
|
import ( |
|
"fmt" |
|
|
|
"code.gitea.io/gitea/models/db" |
|
"code.gitea.io/gitea/models/login" |
|
"code.gitea.io/gitea/models/unit" |
|
"code.gitea.io/gitea/modules/json" |
|
"code.gitea.io/gitea/modules/timeutil" |
|
|
|
"xorm.io/xorm" |
|
"xorm.io/xorm/convert" |
|
) |
|
|
|
// RepoUnit describes all units of a repository |
|
type RepoUnit struct { |
|
ID int64 |
|
RepoID int64 `xorm:"INDEX(s)"` |
|
Type unit.Type `xorm:"INDEX(s)"` |
|
Config convert.Conversion `xorm:"TEXT"` |
|
CreatedUnix timeutil.TimeStamp `xorm:"INDEX CREATED"` |
|
} |
|
|
|
func init() { |
|
db.RegisterModel(new(RepoUnit)) |
|
} |
|
|
|
// UnitConfig describes common unit config |
|
type UnitConfig struct{} |
|
|
|
// FromDB fills up a UnitConfig from serialized format. |
|
func (cfg *UnitConfig) FromDB(bs []byte) error { |
|
return JSONUnmarshalHandleDoubleEncode(bs, &cfg) |
|
} |
|
|
|
// ToDB exports a UnitConfig to a serialized format. |
|
func (cfg *UnitConfig) ToDB() ([]byte, error) { |
|
return json.Marshal(cfg) |
|
} |
|
|
|
// ExternalWikiConfig describes external wiki config |
|
type ExternalWikiConfig struct { |
|
ExternalWikiURL string |
|
} |
|
|
|
// FromDB fills up a ExternalWikiConfig from serialized format. |
|
func (cfg *ExternalWikiConfig) FromDB(bs []byte) error { |
|
return JSONUnmarshalHandleDoubleEncode(bs, &cfg) |
|
} |
|
|
|
// ToDB exports a ExternalWikiConfig to a serialized format. |
|
func (cfg *ExternalWikiConfig) ToDB() ([]byte, error) { |
|
return json.Marshal(cfg) |
|
} |
|
|
|
// ExternalTrackerConfig describes external tracker config |
|
type ExternalTrackerConfig struct { |
|
ExternalTrackerURL string |
|
ExternalTrackerFormat string |
|
ExternalTrackerStyle string |
|
} |
|
|
|
// FromDB fills up a ExternalTrackerConfig from serialized format. |
|
func (cfg *ExternalTrackerConfig) FromDB(bs []byte) error { |
|
return JSONUnmarshalHandleDoubleEncode(bs, &cfg) |
|
} |
|
|
|
// ToDB exports a ExternalTrackerConfig to a serialized format. |
|
func (cfg *ExternalTrackerConfig) ToDB() ([]byte, error) { |
|
return json.Marshal(cfg) |
|
} |
|
|
|
// IssuesConfig describes issues config |
|
type IssuesConfig struct { |
|
EnableTimetracker bool |
|
AllowOnlyContributorsToTrackTime bool |
|
EnableDependencies bool |
|
} |
|
|
|
// FromDB fills up a IssuesConfig from serialized format. |
|
func (cfg *IssuesConfig) FromDB(bs []byte) error { |
|
return JSONUnmarshalHandleDoubleEncode(bs, &cfg) |
|
} |
|
|
|
// ToDB exports a IssuesConfig to a serialized format. |
|
func (cfg *IssuesConfig) ToDB() ([]byte, error) { |
|
return json.Marshal(cfg) |
|
} |
|
|
|
// PullRequestsConfig describes pull requests config |
|
type PullRequestsConfig struct { |
|
IgnoreWhitespaceConflicts bool |
|
AllowMerge bool |
|
AllowRebase bool |
|
AllowRebaseMerge bool |
|
AllowSquash bool |
|
AllowManualMerge bool |
|
AutodetectManualMerge bool |
|
DefaultDeleteBranchAfterMerge bool |
|
DefaultMergeStyle MergeStyle |
|
} |
|
|
|
// FromDB fills up a PullRequestsConfig from serialized format. |
|
func (cfg *PullRequestsConfig) FromDB(bs []byte) error { |
|
return JSONUnmarshalHandleDoubleEncode(bs, &cfg) |
|
} |
|
|
|
// ToDB exports a PullRequestsConfig to a serialized format. |
|
func (cfg *PullRequestsConfig) ToDB() ([]byte, error) { |
|
return json.Marshal(cfg) |
|
} |
|
|
|
// IsMergeStyleAllowed returns if merge style is allowed |
|
func (cfg *PullRequestsConfig) IsMergeStyleAllowed(mergeStyle MergeStyle) bool { |
|
return mergeStyle == MergeStyleMerge && cfg.AllowMerge || |
|
mergeStyle == MergeStyleRebase && cfg.AllowRebase || |
|
mergeStyle == MergeStyleRebaseMerge && cfg.AllowRebaseMerge || |
|
mergeStyle == MergeStyleSquash && cfg.AllowSquash || |
|
mergeStyle == MergeStyleManuallyMerged && cfg.AllowManualMerge |
|
} |
|
|
|
// GetDefaultMergeStyle returns the default merge style for this pull request |
|
func (cfg *PullRequestsConfig) GetDefaultMergeStyle() MergeStyle { |
|
if len(cfg.DefaultMergeStyle) != 0 { |
|
return cfg.DefaultMergeStyle |
|
} |
|
|
|
return MergeStyleMerge |
|
} |
|
|
|
// AllowedMergeStyleCount returns the total count of allowed merge styles for the PullRequestsConfig |
|
func (cfg *PullRequestsConfig) AllowedMergeStyleCount() int { |
|
count := 0 |
|
if cfg.AllowMerge { |
|
count++ |
|
} |
|
if cfg.AllowRebase { |
|
count++ |
|
} |
|
if cfg.AllowRebaseMerge { |
|
count++ |
|
} |
|
if cfg.AllowSquash { |
|
count++ |
|
} |
|
return count |
|
} |
|
|
|
// BeforeSet is invoked from XORM before setting the value of a field of this object. |
|
func (r *RepoUnit) BeforeSet(colName string, val xorm.Cell) { |
|
switch colName { |
|
case "type": |
|
switch unit.Type(login.Cell2Int64(val)) { |
|
case unit.TypeCode, unit.TypeReleases, unit.TypeWiki, unit.TypeProjects: |
|
r.Config = new(UnitConfig) |
|
case unit.TypeExternalWiki: |
|
r.Config = new(ExternalWikiConfig) |
|
case unit.TypeExternalTracker: |
|
r.Config = new(ExternalTrackerConfig) |
|
case unit.TypePullRequests: |
|
r.Config = new(PullRequestsConfig) |
|
case unit.TypeIssues: |
|
r.Config = new(IssuesConfig) |
|
default: |
|
panic(fmt.Sprintf("unrecognized repo unit type: %v", *val)) |
|
} |
|
} |
|
} |
|
|
|
// Unit returns Unit |
|
func (r *RepoUnit) Unit() unit.Unit { |
|
return unit.Units[r.Type] |
|
} |
|
|
|
// CodeConfig returns config for unit.TypeCode |
|
func (r *RepoUnit) CodeConfig() *UnitConfig { |
|
return r.Config.(*UnitConfig) |
|
} |
|
|
|
// PullRequestsConfig returns config for unit.TypePullRequests |
|
func (r *RepoUnit) PullRequestsConfig() *PullRequestsConfig { |
|
return r.Config.(*PullRequestsConfig) |
|
} |
|
|
|
// ReleasesConfig returns config for unit.TypeReleases |
|
func (r *RepoUnit) ReleasesConfig() *UnitConfig { |
|
return r.Config.(*UnitConfig) |
|
} |
|
|
|
// ExternalWikiConfig returns config for unit.TypeExternalWiki |
|
func (r *RepoUnit) ExternalWikiConfig() *ExternalWikiConfig { |
|
return r.Config.(*ExternalWikiConfig) |
|
} |
|
|
|
// IssuesConfig returns config for unit.TypeIssues |
|
func (r *RepoUnit) IssuesConfig() *IssuesConfig { |
|
return r.Config.(*IssuesConfig) |
|
} |
|
|
|
// ExternalTrackerConfig returns config for unit.TypeExternalTracker |
|
func (r *RepoUnit) ExternalTrackerConfig() *ExternalTrackerConfig { |
|
return r.Config.(*ExternalTrackerConfig) |
|
} |
|
|
|
func getUnitsByRepoID(e db.Engine, repoID int64) (units []*RepoUnit, err error) { |
|
var tmpUnits []*RepoUnit |
|
if err := e.Where("repo_id = ?", repoID).Find(&tmpUnits); err != nil { |
|
return nil, err |
|
} |
|
|
|
for _, u := range tmpUnits { |
|
if !u.Type.UnitGlobalDisabled() { |
|
units = append(units, u) |
|
} |
|
} |
|
|
|
return units, nil |
|
} |
|
|
|
// UpdateRepoUnit updates the provided repo unit |
|
func UpdateRepoUnit(unit *RepoUnit) error { |
|
_, err := db.GetEngine(db.DefaultContext).ID(unit.ID).Update(unit) |
|
return err |
|
}
|
|
|