* Clean-up HookPreReceive and restore functionality for pushing non-standard refs There was an inadvertent breaking change in #15629 meaning that notes refs and other git extension refs will be automatically rejected. Further following #14295 and #15629 the pre-recieve hook code is untenably long and too complex. This PR refactors the hook code and removes the incorrect forced rejection of non-standard refs. Fix #16688 Signed-off-by: Andrew Thornton <art27@cantab.net>
		
			
				
	
	
		
			76 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			76 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
// Copyright 2021 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 private includes all internal routes. The package name internal is ideal but Golang is not allowed, so we use private as package name instead.
 | 
						|
package private
 | 
						|
 | 
						|
import (
 | 
						|
	"fmt"
 | 
						|
	"net/http"
 | 
						|
 | 
						|
	"code.gitea.io/gitea/models"
 | 
						|
	gitea_context "code.gitea.io/gitea/modules/context"
 | 
						|
	"code.gitea.io/gitea/modules/git"
 | 
						|
	"code.gitea.io/gitea/modules/log"
 | 
						|
	"code.gitea.io/gitea/modules/private"
 | 
						|
)
 | 
						|
 | 
						|
// ________          _____             .__   __
 | 
						|
// \______ \   _____/ ____\____   __ __|  |_/  |_
 | 
						|
//  |    |  \_/ __ \   __\\__  \ |  |  \  |\   __\
 | 
						|
//  |    `   \  ___/|  |   / __ \|  |  /  |_|  |
 | 
						|
// /_______  /\___  >__|  (____  /____/|____/__|
 | 
						|
//         \/     \/           \/
 | 
						|
// __________                             .__
 | 
						|
// \______   \____________    ____   ____ |  |__
 | 
						|
//  |    |  _/\_  __ \__  \  /    \_/ ___\|  |  \
 | 
						|
//  |    |   \ |  | \// __ \|   |  \  \___|   Y  \
 | 
						|
//  |______  / |__|  (____  /___|  /\___  >___|  /
 | 
						|
//         \/             \/     \/     \/     \/
 | 
						|
 | 
						|
// SetDefaultBranch updates the default branch
 | 
						|
func SetDefaultBranch(ctx *gitea_context.PrivateContext) {
 | 
						|
	ownerName := ctx.Params(":owner")
 | 
						|
	repoName := ctx.Params(":repo")
 | 
						|
	branch := ctx.Params(":branch")
 | 
						|
	repo, err := models.GetRepositoryByOwnerAndName(ownerName, repoName)
 | 
						|
	if err != nil {
 | 
						|
		log.Error("Failed to get repository: %s/%s Error: %v", ownerName, repoName, err)
 | 
						|
		ctx.JSON(http.StatusInternalServerError, private.Response{
 | 
						|
			Err: fmt.Sprintf("Failed to get repository: %s/%s Error: %v", ownerName, repoName, err),
 | 
						|
		})
 | 
						|
		return
 | 
						|
	}
 | 
						|
	if repo.OwnerName == "" {
 | 
						|
		repo.OwnerName = ownerName
 | 
						|
	}
 | 
						|
 | 
						|
	repo.DefaultBranch = branch
 | 
						|
	gitRepo, err := git.OpenRepository(repo.RepoPath())
 | 
						|
	if err != nil {
 | 
						|
		ctx.JSON(http.StatusInternalServerError, private.Response{
 | 
						|
			Err: fmt.Sprintf("Failed to get git repository: %s/%s Error: %v", ownerName, repoName, err),
 | 
						|
		})
 | 
						|
		return
 | 
						|
	}
 | 
						|
	if err := gitRepo.SetDefaultBranch(repo.DefaultBranch); err != nil {
 | 
						|
		if !git.IsErrUnsupportedVersion(err) {
 | 
						|
			gitRepo.Close()
 | 
						|
			ctx.JSON(http.StatusInternalServerError, private.Response{
 | 
						|
				Err: fmt.Sprintf("Unable to set default branch on repository: %s/%s Error: %v", ownerName, repoName, err),
 | 
						|
			})
 | 
						|
			return
 | 
						|
		}
 | 
						|
	}
 | 
						|
	gitRepo.Close()
 | 
						|
 | 
						|
	if err := repo.UpdateDefaultBranch(); err != nil {
 | 
						|
		ctx.JSON(http.StatusInternalServerError, private.Response{
 | 
						|
			Err: fmt.Sprintf("Unable to set default branch on repository: %s/%s Error: %v", ownerName, repoName, err),
 | 
						|
		})
 | 
						|
		return
 | 
						|
	}
 | 
						|
	ctx.PlainText(http.StatusOK, []byte("success"))
 | 
						|
}
 |