mirror of
				https://gitee.com/gitea/gitea
				synced 2025-11-04 08:30:25 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			157 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			157 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
// Copyright 2016 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"
 | 
						|
	"strings"
 | 
						|
	"time"
 | 
						|
)
 | 
						|
 | 
						|
const (
 | 
						|
	// ProtectedBranchRepoID protected Repo ID
 | 
						|
	ProtectedBranchRepoID = "GITEA_REPO_ID"
 | 
						|
)
 | 
						|
 | 
						|
// ProtectedBranch struct
 | 
						|
type ProtectedBranch struct {
 | 
						|
	ID          int64  `xorm:"pk autoincr"`
 | 
						|
	RepoID      int64  `xorm:"UNIQUE(s)"`
 | 
						|
	BranchName  string `xorm:"UNIQUE(s)"`
 | 
						|
	CanPush     bool
 | 
						|
	Created     time.Time `xorm:"-"`
 | 
						|
	CreatedUnix int64
 | 
						|
	Updated     time.Time `xorm:"-"`
 | 
						|
	UpdatedUnix int64
 | 
						|
}
 | 
						|
 | 
						|
// BeforeInsert before protected branch insert create and update time
 | 
						|
func (protectBranch *ProtectedBranch) BeforeInsert() {
 | 
						|
	protectBranch.CreatedUnix = time.Now().Unix()
 | 
						|
	protectBranch.UpdatedUnix = protectBranch.CreatedUnix
 | 
						|
}
 | 
						|
 | 
						|
// BeforeUpdate before protected branch update time
 | 
						|
func (protectBranch *ProtectedBranch) BeforeUpdate() {
 | 
						|
	protectBranch.UpdatedUnix = time.Now().Unix()
 | 
						|
}
 | 
						|
 | 
						|
// GetProtectedBranchByRepoID getting protected branch by repo ID
 | 
						|
func GetProtectedBranchByRepoID(RepoID int64) ([]*ProtectedBranch, error) {
 | 
						|
	protectedBranches := make([]*ProtectedBranch, 0)
 | 
						|
	return protectedBranches, x.Where("repo_id = ?", RepoID).Desc("updated_unix").Find(&protectedBranches)
 | 
						|
}
 | 
						|
 | 
						|
// GetProtectedBranchBy getting protected branch by ID/Name
 | 
						|
func GetProtectedBranchBy(repoID int64, BranchName string) (*ProtectedBranch, error) {
 | 
						|
	rel := &ProtectedBranch{RepoID: repoID, BranchName: strings.ToLower(BranchName)}
 | 
						|
	has, err := x.Get(rel)
 | 
						|
	if err != nil {
 | 
						|
		return nil, err
 | 
						|
	}
 | 
						|
	if !has {
 | 
						|
		return nil, nil
 | 
						|
	}
 | 
						|
	return rel, nil
 | 
						|
}
 | 
						|
 | 
						|
// GetProtectedBranches get all protected btanches
 | 
						|
func (repo *Repository) GetProtectedBranches() ([]*ProtectedBranch, error) {
 | 
						|
	protectedBranches := make([]*ProtectedBranch, 0)
 | 
						|
	return protectedBranches, x.Find(&protectedBranches, &ProtectedBranch{RepoID: repo.ID})
 | 
						|
}
 | 
						|
 | 
						|
// AddProtectedBranch add protection to branch
 | 
						|
func (repo *Repository) AddProtectedBranch(branchName string, canPush bool) error {
 | 
						|
	protectedBranch := &ProtectedBranch{
 | 
						|
		RepoID:     repo.ID,
 | 
						|
		BranchName: branchName,
 | 
						|
	}
 | 
						|
 | 
						|
	has, err := x.Get(protectedBranch)
 | 
						|
	if err != nil {
 | 
						|
		return err
 | 
						|
	} else if has {
 | 
						|
		return nil
 | 
						|
	}
 | 
						|
 | 
						|
	sess := x.NewSession()
 | 
						|
	defer sessionRelease(sess)
 | 
						|
	if err = sess.Begin(); err != nil {
 | 
						|
		return err
 | 
						|
	}
 | 
						|
	protectedBranch.CanPush = canPush
 | 
						|
	if _, err = sess.InsertOne(protectedBranch); err != nil {
 | 
						|
		return err
 | 
						|
	}
 | 
						|
 | 
						|
	return sess.Commit()
 | 
						|
}
 | 
						|
 | 
						|
// ChangeProtectedBranch access mode sets new access mode for the ProtectedBranch.
 | 
						|
func (repo *Repository) ChangeProtectedBranch(id int64, canPush bool) error {
 | 
						|
	ProtectedBranch := &ProtectedBranch{
 | 
						|
		RepoID: repo.ID,
 | 
						|
		ID:     id,
 | 
						|
	}
 | 
						|
	has, err := x.Get(ProtectedBranch)
 | 
						|
	if err != nil {
 | 
						|
		return fmt.Errorf("get ProtectedBranch: %v", err)
 | 
						|
	} else if !has {
 | 
						|
		return nil
 | 
						|
	}
 | 
						|
 | 
						|
	if ProtectedBranch.CanPush == canPush {
 | 
						|
		return nil
 | 
						|
	}
 | 
						|
	ProtectedBranch.CanPush = canPush
 | 
						|
 | 
						|
	sess := x.NewSession()
 | 
						|
	defer sessionRelease(sess)
 | 
						|
	if err = sess.Begin(); err != nil {
 | 
						|
		return err
 | 
						|
	}
 | 
						|
 | 
						|
	if _, err = sess.Id(ProtectedBranch.ID).AllCols().Update(ProtectedBranch); err != nil {
 | 
						|
		return fmt.Errorf("update ProtectedBranch: %v", err)
 | 
						|
	}
 | 
						|
 | 
						|
	return sess.Commit()
 | 
						|
}
 | 
						|
 | 
						|
// DeleteProtectedBranch removes ProtectedBranch relation between the user and repository.
 | 
						|
func (repo *Repository) DeleteProtectedBranch(id int64) (err error) {
 | 
						|
	protectedBranch := &ProtectedBranch{
 | 
						|
		RepoID: repo.ID,
 | 
						|
		ID:     id,
 | 
						|
	}
 | 
						|
 | 
						|
	sess := x.NewSession()
 | 
						|
	defer sessionRelease(sess)
 | 
						|
	if err = sess.Begin(); err != nil {
 | 
						|
		return err
 | 
						|
	}
 | 
						|
 | 
						|
	if affected, err := sess.Delete(protectedBranch); err != nil {
 | 
						|
		return err
 | 
						|
	} else if affected != 1 {
 | 
						|
		return fmt.Errorf("delete protected branch ID(%v) failed", id)
 | 
						|
	}
 | 
						|
 | 
						|
	return sess.Commit()
 | 
						|
}
 | 
						|
 | 
						|
// newProtectedBranch insert one queue
 | 
						|
func newProtectedBranch(protectedBranch *ProtectedBranch) error {
 | 
						|
	_, err := x.InsertOne(protectedBranch)
 | 
						|
	return err
 | 
						|
}
 | 
						|
 | 
						|
// UpdateProtectedBranch update queue
 | 
						|
func UpdateProtectedBranch(protectedBranch *ProtectedBranch) error {
 | 
						|
	_, err := x.Update(protectedBranch)
 | 
						|
	return err
 | 
						|
}
 |