mirror of
				https://codeberg.org/forgejo/forgejo.git
				synced 2025-10-30 22:11:07 +00:00 
			
		
		
		
	* Do not allow commiting to protected branch from online editor * Add editor integration tests for adding new file and not allowing to add new file to protected branch
		
			
				
	
	
		
			173 lines
		
	
	
	
		
			4.3 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			173 lines
		
	
	
	
		
			4.3 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 branches
 | |
| func (repo *Repository) GetProtectedBranches() ([]*ProtectedBranch, error) {
 | |
| 	protectedBranches := make([]*ProtectedBranch, 0)
 | |
| 	return protectedBranches, x.Find(&protectedBranches, &ProtectedBranch{RepoID: repo.ID})
 | |
| }
 | |
| 
 | |
| // IsProtectedBranch checks if branch is protected
 | |
| func (repo *Repository) IsProtectedBranch(branchName string) (bool, error) {
 | |
| 	protectedBranch := &ProtectedBranch{
 | |
| 		RepoID:     repo.ID,
 | |
| 		BranchName: branchName,
 | |
| 	}
 | |
| 
 | |
| 	has, err := x.Get(protectedBranch)
 | |
| 	if err != nil {
 | |
| 		return true, err
 | |
| 	} else if has {
 | |
| 		return true, nil
 | |
| 	}
 | |
| 
 | |
| 	return false, nil
 | |
| }
 | |
| 
 | |
| // 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
 | |
| }
 |