mirror of
				https://gitee.com/gitea/gitea
				synced 2025-11-04 08:30:25 +08:00 
			
		
		
		
	Less naked returns (#25713)
just a step towards #25655 and some related refactoring
This commit is contained in:
		@@ -422,10 +422,10 @@ func RepoIDAssignment() func(ctx *Context) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// RepoAssignment returns a middleware to handle repository assignment
 | 
			
		||||
func RepoAssignment(ctx *Context) (cancel context.CancelFunc) {
 | 
			
		||||
func RepoAssignment(ctx *Context) context.CancelFunc {
 | 
			
		||||
	if _, repoAssignmentOnce := ctx.Data["repoAssignmentExecuted"]; repoAssignmentOnce {
 | 
			
		||||
		log.Trace("RepoAssignment was exec already, skipping second call ...")
 | 
			
		||||
		return
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
	ctx.Data["repoAssignmentExecuted"] = true
 | 
			
		||||
 | 
			
		||||
@@ -453,7 +453,7 @@ func RepoAssignment(ctx *Context) (cancel context.CancelFunc) {
 | 
			
		||||
				// https://github.com/golang/go/issues/19760
 | 
			
		||||
				if ctx.FormString("go-get") == "1" {
 | 
			
		||||
					EarlyResponseForGoGetMeta(ctx)
 | 
			
		||||
					return
 | 
			
		||||
					return nil
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
				if redirectUserID, err := user_model.LookupUserRedirect(userName); err == nil {
 | 
			
		||||
@@ -466,7 +466,7 @@ func RepoAssignment(ctx *Context) (cancel context.CancelFunc) {
 | 
			
		||||
			} else {
 | 
			
		||||
				ctx.ServerError("GetUserByName", err)
 | 
			
		||||
			}
 | 
			
		||||
			return
 | 
			
		||||
			return nil
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	ctx.Repo.Owner = owner
 | 
			
		||||
@@ -490,7 +490,7 @@ func RepoAssignment(ctx *Context) (cancel context.CancelFunc) {
 | 
			
		||||
			redirectPath += "?" + ctx.Req.URL.RawQuery
 | 
			
		||||
		}
 | 
			
		||||
		ctx.Redirect(path.Join(setting.AppSubURL, redirectPath))
 | 
			
		||||
		return
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Get repository.
 | 
			
		||||
@@ -503,7 +503,7 @@ func RepoAssignment(ctx *Context) (cancel context.CancelFunc) {
 | 
			
		||||
			} else if repo_model.IsErrRedirectNotExist(err) {
 | 
			
		||||
				if ctx.FormString("go-get") == "1" {
 | 
			
		||||
					EarlyResponseForGoGetMeta(ctx)
 | 
			
		||||
					return
 | 
			
		||||
					return nil
 | 
			
		||||
				}
 | 
			
		||||
				ctx.NotFound("GetRepositoryByName", nil)
 | 
			
		||||
			} else {
 | 
			
		||||
@@ -512,13 +512,13 @@ func RepoAssignment(ctx *Context) (cancel context.CancelFunc) {
 | 
			
		||||
		} else {
 | 
			
		||||
			ctx.ServerError("GetRepositoryByName", err)
 | 
			
		||||
		}
 | 
			
		||||
		return
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
	repo.Owner = owner
 | 
			
		||||
 | 
			
		||||
	repoAssignment(ctx, repo)
 | 
			
		||||
	if ctx.Written() {
 | 
			
		||||
		return
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	ctx.Repo.RepoLink = repo.Link()
 | 
			
		||||
@@ -542,12 +542,12 @@ func RepoAssignment(ctx *Context) (cancel context.CancelFunc) {
 | 
			
		||||
	})
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		ctx.ServerError("GetReleaseCountByRepoID", err)
 | 
			
		||||
		return
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
	ctx.Data["NumReleases"], err = repo_model.GetReleaseCountByRepoID(ctx, ctx.Repo.Repository.ID, repo_model.FindReleasesOptions{})
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		ctx.ServerError("GetReleaseCountByRepoID", err)
 | 
			
		||||
		return
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	ctx.Data["Title"] = owner.Name + "/" + repo.Name
 | 
			
		||||
@@ -563,14 +563,14 @@ func RepoAssignment(ctx *Context) (cancel context.CancelFunc) {
 | 
			
		||||
	canSignedUserFork, err := repo_module.CanUserForkRepo(ctx.Doer, ctx.Repo.Repository)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		ctx.ServerError("CanUserForkRepo", err)
 | 
			
		||||
		return
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
	ctx.Data["CanSignedUserFork"] = canSignedUserFork
 | 
			
		||||
 | 
			
		||||
	userAndOrgForks, err := repo_model.GetForksByUserAndOrgs(ctx, ctx.Doer, ctx.Repo.Repository)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		ctx.ServerError("GetForksByUserAndOrgs", err)
 | 
			
		||||
		return
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
	ctx.Data["UserAndOrgForks"] = userAndOrgForks
 | 
			
		||||
 | 
			
		||||
@@ -604,14 +604,14 @@ func RepoAssignment(ctx *Context) (cancel context.CancelFunc) {
 | 
			
		||||
	if repo.IsFork {
 | 
			
		||||
		RetrieveBaseRepo(ctx, repo)
 | 
			
		||||
		if ctx.Written() {
 | 
			
		||||
			return
 | 
			
		||||
			return nil
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if repo.IsGenerated() {
 | 
			
		||||
		RetrieveTemplateRepo(ctx, repo)
 | 
			
		||||
		if ctx.Written() {
 | 
			
		||||
			return
 | 
			
		||||
			return nil
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
@@ -623,7 +623,7 @@ func RepoAssignment(ctx *Context) (cancel context.CancelFunc) {
 | 
			
		||||
		if !isHomeOrSettings {
 | 
			
		||||
			ctx.Redirect(ctx.Repo.RepoLink)
 | 
			
		||||
		}
 | 
			
		||||
		return
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	gitRepo, err := git.OpenRepository(ctx, repo_model.RepoPath(userName, repoName))
 | 
			
		||||
@@ -636,10 +636,10 @@ func RepoAssignment(ctx *Context) (cancel context.CancelFunc) {
 | 
			
		||||
			if !isHomeOrSettings {
 | 
			
		||||
				ctx.Redirect(ctx.Repo.RepoLink)
 | 
			
		||||
			}
 | 
			
		||||
			return
 | 
			
		||||
			return nil
 | 
			
		||||
		}
 | 
			
		||||
		ctx.ServerError("RepoAssignment Invalid repo "+repo_model.RepoPath(userName, repoName), err)
 | 
			
		||||
		return
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
	if ctx.Repo.GitRepo != nil {
 | 
			
		||||
		ctx.Repo.GitRepo.Close()
 | 
			
		||||
@@ -647,7 +647,7 @@ func RepoAssignment(ctx *Context) (cancel context.CancelFunc) {
 | 
			
		||||
	ctx.Repo.GitRepo = gitRepo
 | 
			
		||||
 | 
			
		||||
	// We opened it, we should close it
 | 
			
		||||
	cancel = func() {
 | 
			
		||||
	cancel := func() {
 | 
			
		||||
		// If it's been set to nil then assume someone else has closed it.
 | 
			
		||||
		if ctx.Repo.GitRepo != nil {
 | 
			
		||||
			ctx.Repo.GitRepo.Close()
 | 
			
		||||
@@ -657,13 +657,13 @@ func RepoAssignment(ctx *Context) (cancel context.CancelFunc) {
 | 
			
		||||
	// Stop at this point when the repo is empty.
 | 
			
		||||
	if ctx.Repo.Repository.IsEmpty {
 | 
			
		||||
		ctx.Data["BranchName"] = ctx.Repo.Repository.DefaultBranch
 | 
			
		||||
		return
 | 
			
		||||
		return cancel
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	tags, err := repo_model.GetTagNamesByRepoID(ctx, ctx.Repo.Repository.ID)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		ctx.ServerError("GetTagNamesByRepoID", err)
 | 
			
		||||
		return
 | 
			
		||||
		return cancel
 | 
			
		||||
	}
 | 
			
		||||
	ctx.Data["Tags"] = tags
 | 
			
		||||
 | 
			
		||||
@@ -677,7 +677,7 @@ func RepoAssignment(ctx *Context) (cancel context.CancelFunc) {
 | 
			
		||||
	branchesTotal, err := git_model.CountBranches(ctx, branchOpts)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		ctx.ServerError("CountBranches", err)
 | 
			
		||||
		return
 | 
			
		||||
		return cancel
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// non empty repo should have at least 1 branch, so this repository's branches haven't been synced yet
 | 
			
		||||
@@ -685,7 +685,7 @@ func RepoAssignment(ctx *Context) (cancel context.CancelFunc) {
 | 
			
		||||
		branchesTotal, err = repo_module.SyncRepoBranches(ctx, ctx.Repo.Repository.ID, 0)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			ctx.ServerError("SyncRepoBranches", err)
 | 
			
		||||
			return
 | 
			
		||||
			return cancel
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
@@ -694,7 +694,7 @@ func RepoAssignment(ctx *Context) (cancel context.CancelFunc) {
 | 
			
		||||
	brs, err := git_model.FindBranchNames(ctx, branchOpts)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		ctx.ServerError("GetBranches", err)
 | 
			
		||||
		return
 | 
			
		||||
		return cancel
 | 
			
		||||
	}
 | 
			
		||||
	// always put default branch on the top
 | 
			
		||||
	ctx.Data["Branches"] = append(branchOpts.ExcludeBranchNames, brs...)
 | 
			
		||||
@@ -741,12 +741,12 @@ func RepoAssignment(ctx *Context) (cancel context.CancelFunc) {
 | 
			
		||||
		repoTransfer, err := models.GetPendingRepositoryTransfer(ctx, ctx.Repo.Repository)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			ctx.ServerError("GetPendingRepositoryTransfer", err)
 | 
			
		||||
			return
 | 
			
		||||
			return cancel
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if err := repoTransfer.LoadAttributes(ctx); err != nil {
 | 
			
		||||
			ctx.ServerError("LoadRecipient", err)
 | 
			
		||||
			return
 | 
			
		||||
			return cancel
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		ctx.Data["RepoTransfer"] = repoTransfer
 | 
			
		||||
@@ -894,7 +894,7 @@ func RepoRefByType(refType RepoRefType, ignoreNotExistErr ...bool) func(*Context
 | 
			
		||||
			ctx.Repo.IsViewBranch = true
 | 
			
		||||
			ctx.Repo.BranchName = ctx.Repo.Repository.DefaultBranch
 | 
			
		||||
			ctx.Data["TreePath"] = ""
 | 
			
		||||
			return
 | 
			
		||||
			return nil
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		var (
 | 
			
		||||
@@ -907,7 +907,7 @@ func RepoRefByType(refType RepoRefType, ignoreNotExistErr ...bool) func(*Context
 | 
			
		||||
			ctx.Repo.GitRepo, err = git.OpenRepository(ctx, repoPath)
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				ctx.ServerError("RepoRef Invalid repo "+repoPath, err)
 | 
			
		||||
				return
 | 
			
		||||
				return nil
 | 
			
		||||
			}
 | 
			
		||||
			// We opened it, we should close it
 | 
			
		||||
			cancel = func() {
 | 
			
		||||
@@ -944,7 +944,7 @@ func RepoRefByType(refType RepoRefType, ignoreNotExistErr ...bool) func(*Context
 | 
			
		||||
				ctx.Repo.Repository.MarkAsBrokenEmpty()
 | 
			
		||||
			} else {
 | 
			
		||||
				ctx.ServerError("GetBranchCommit", err)
 | 
			
		||||
				return
 | 
			
		||||
				return cancel
 | 
			
		||||
			}
 | 
			
		||||
			ctx.Repo.IsViewBranch = true
 | 
			
		||||
		} else {
 | 
			
		||||
@@ -956,7 +956,7 @@ func RepoRefByType(refType RepoRefType, ignoreNotExistErr ...bool) func(*Context
 | 
			
		||||
				ctx.Flash.Info(ctx.Tr("repo.branch.renamed", refName, renamedBranchName))
 | 
			
		||||
				link := setting.AppSubURL + strings.Replace(ctx.Req.URL.EscapedPath(), util.PathEscapeSegments(refName), util.PathEscapeSegments(renamedBranchName), 1)
 | 
			
		||||
				ctx.Redirect(link)
 | 
			
		||||
				return
 | 
			
		||||
				return cancel
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			if refType.RefTypeIncludesBranches() && ctx.Repo.GitRepo.IsBranchExist(refName) {
 | 
			
		||||
@@ -966,7 +966,7 @@ func RepoRefByType(refType RepoRefType, ignoreNotExistErr ...bool) func(*Context
 | 
			
		||||
				ctx.Repo.Commit, err = ctx.Repo.GitRepo.GetBranchCommit(refName)
 | 
			
		||||
				if err != nil {
 | 
			
		||||
					ctx.ServerError("GetBranchCommit", err)
 | 
			
		||||
					return
 | 
			
		||||
					return cancel
 | 
			
		||||
				}
 | 
			
		||||
				ctx.Repo.CommitID = ctx.Repo.Commit.ID.String()
 | 
			
		||||
 | 
			
		||||
@@ -978,10 +978,10 @@ func RepoRefByType(refType RepoRefType, ignoreNotExistErr ...bool) func(*Context
 | 
			
		||||
				if err != nil {
 | 
			
		||||
					if git.IsErrNotExist(err) {
 | 
			
		||||
						ctx.NotFound("GetTagCommit", err)
 | 
			
		||||
						return
 | 
			
		||||
						return cancel
 | 
			
		||||
					}
 | 
			
		||||
					ctx.ServerError("GetTagCommit", err)
 | 
			
		||||
					return
 | 
			
		||||
					return cancel
 | 
			
		||||
				}
 | 
			
		||||
				ctx.Repo.CommitID = ctx.Repo.Commit.ID.String()
 | 
			
		||||
			} else if len(refName) >= 7 && len(refName) <= git.SHAFullLength {
 | 
			
		||||
@@ -991,7 +991,7 @@ func RepoRefByType(refType RepoRefType, ignoreNotExistErr ...bool) func(*Context
 | 
			
		||||
				ctx.Repo.Commit, err = ctx.Repo.GitRepo.GetCommit(refName)
 | 
			
		||||
				if err != nil {
 | 
			
		||||
					ctx.NotFound("GetCommit", err)
 | 
			
		||||
					return
 | 
			
		||||
					return cancel
 | 
			
		||||
				}
 | 
			
		||||
				// If short commit ID add canonical link header
 | 
			
		||||
				if len(refName) < git.SHAFullLength {
 | 
			
		||||
@@ -1000,10 +1000,10 @@ func RepoRefByType(refType RepoRefType, ignoreNotExistErr ...bool) func(*Context
 | 
			
		||||
				}
 | 
			
		||||
			} else {
 | 
			
		||||
				if len(ignoreNotExistErr) > 0 && ignoreNotExistErr[0] {
 | 
			
		||||
					return
 | 
			
		||||
					return cancel
 | 
			
		||||
				}
 | 
			
		||||
				ctx.NotFound("RepoRef invalid repo", fmt.Errorf("branch or tag not exist: %s", refName))
 | 
			
		||||
				return
 | 
			
		||||
				return cancel
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			if refType == RepoRefLegacy {
 | 
			
		||||
@@ -1015,7 +1015,7 @@ func RepoRefByType(refType RepoRefType, ignoreNotExistErr ...bool) func(*Context
 | 
			
		||||
					util.PathEscapeSegments(prefix),
 | 
			
		||||
					ctx.Repo.BranchNameSubURL(),
 | 
			
		||||
					util.PathEscapeSegments(ctx.Repo.TreePath)))
 | 
			
		||||
				return
 | 
			
		||||
				return cancel
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
@@ -1033,7 +1033,7 @@ func RepoRefByType(refType RepoRefType, ignoreNotExistErr ...bool) func(*Context
 | 
			
		||||
		ctx.Repo.CommitsCount, err = ctx.Repo.GetCommitsCount()
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			ctx.ServerError("GetCommitsCount", err)
 | 
			
		||||
			return
 | 
			
		||||
			return cancel
 | 
			
		||||
		}
 | 
			
		||||
		ctx.Data["CommitsCount"] = ctx.Repo.CommitsCount
 | 
			
		||||
		ctx.Repo.GitRepo.LastCommitCache = git.NewLastCommitCache(ctx.Repo.CommitsCount, ctx.Repo.Repository.FullName(), ctx.Repo.GitRepo, cache.GetCache())
 | 
			
		||||
 
 | 
			
		||||
@@ -6,6 +6,7 @@ package doctor
 | 
			
		||||
import (
 | 
			
		||||
	"bytes"
 | 
			
		||||
	"context"
 | 
			
		||||
	"errors"
 | 
			
		||||
	"fmt"
 | 
			
		||||
 | 
			
		||||
	"code.gitea.io/gitea/models/db"
 | 
			
		||||
@@ -40,12 +41,12 @@ func parseBool16961(bs []byte) (bool, error) {
 | 
			
		||||
func fixUnitConfig16961(bs []byte, cfg *repo_model.UnitConfig) (fixed bool, err error) {
 | 
			
		||||
	err = json.UnmarshalHandleDoubleEncode(bs, &cfg)
 | 
			
		||||
	if err == nil {
 | 
			
		||||
		return
 | 
			
		||||
		return false, nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Handle #16961
 | 
			
		||||
	if string(bs) != "&{}" && len(bs) != 0 {
 | 
			
		||||
		return
 | 
			
		||||
		return false, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return true, nil
 | 
			
		||||
@@ -54,14 +55,14 @@ func fixUnitConfig16961(bs []byte, cfg *repo_model.UnitConfig) (fixed bool, err
 | 
			
		||||
func fixExternalWikiConfig16961(bs []byte, cfg *repo_model.ExternalWikiConfig) (fixed bool, err error) {
 | 
			
		||||
	err = json.UnmarshalHandleDoubleEncode(bs, &cfg)
 | 
			
		||||
	if err == nil {
 | 
			
		||||
		return
 | 
			
		||||
		return false, nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if len(bs) < 3 {
 | 
			
		||||
		return
 | 
			
		||||
		return false, err
 | 
			
		||||
	}
 | 
			
		||||
	if bs[0] != '&' || bs[1] != '{' || bs[len(bs)-1] != '}' {
 | 
			
		||||
		return
 | 
			
		||||
		return false, err
 | 
			
		||||
	}
 | 
			
		||||
	cfg.ExternalWikiURL = string(bs[2 : len(bs)-1])
 | 
			
		||||
	return true, nil
 | 
			
		||||
@@ -70,20 +71,20 @@ func fixExternalWikiConfig16961(bs []byte, cfg *repo_model.ExternalWikiConfig) (
 | 
			
		||||
func fixExternalTrackerConfig16961(bs []byte, cfg *repo_model.ExternalTrackerConfig) (fixed bool, err error) {
 | 
			
		||||
	err = json.UnmarshalHandleDoubleEncode(bs, &cfg)
 | 
			
		||||
	if err == nil {
 | 
			
		||||
		return
 | 
			
		||||
		return false, nil
 | 
			
		||||
	}
 | 
			
		||||
	// Handle #16961
 | 
			
		||||
	if len(bs) < 3 {
 | 
			
		||||
		return
 | 
			
		||||
		return false, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if bs[0] != '&' || bs[1] != '{' || bs[len(bs)-1] != '}' {
 | 
			
		||||
		return
 | 
			
		||||
		return false, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	parts := bytes.Split(bs[2:len(bs)-1], []byte{' '})
 | 
			
		||||
	if len(parts) != 3 {
 | 
			
		||||
		return
 | 
			
		||||
		return false, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	cfg.ExternalTrackerURL = string(bytes.Join(parts[:len(parts)-2], []byte{' '}))
 | 
			
		||||
@@ -95,16 +96,16 @@ func fixExternalTrackerConfig16961(bs []byte, cfg *repo_model.ExternalTrackerCon
 | 
			
		||||
func fixPullRequestsConfig16961(bs []byte, cfg *repo_model.PullRequestsConfig) (fixed bool, err error) {
 | 
			
		||||
	err = json.UnmarshalHandleDoubleEncode(bs, &cfg)
 | 
			
		||||
	if err == nil {
 | 
			
		||||
		return
 | 
			
		||||
		return false, nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Handle #16961
 | 
			
		||||
	if len(bs) < 3 {
 | 
			
		||||
		return
 | 
			
		||||
		return false, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if bs[0] != '&' || bs[1] != '{' || bs[len(bs)-1] != '}' {
 | 
			
		||||
		return
 | 
			
		||||
		return false, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// PullRequestsConfig was the following in 1.14
 | 
			
		||||
@@ -123,37 +124,37 @@ func fixPullRequestsConfig16961(bs []byte, cfg *repo_model.PullRequestsConfig) (
 | 
			
		||||
	// DefaultMergeStyle             MergeStyle
 | 
			
		||||
	parts := bytes.Split(bs[2:len(bs)-1], []byte{' '})
 | 
			
		||||
	if len(parts) < 7 {
 | 
			
		||||
		return
 | 
			
		||||
		return false, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var parseErr error
 | 
			
		||||
	cfg.IgnoreWhitespaceConflicts, parseErr = parseBool16961(parts[0])
 | 
			
		||||
	if parseErr != nil {
 | 
			
		||||
		return
 | 
			
		||||
		return false, errors.Join(err, parseErr)
 | 
			
		||||
	}
 | 
			
		||||
	cfg.AllowMerge, parseErr = parseBool16961(parts[1])
 | 
			
		||||
	if parseErr != nil {
 | 
			
		||||
		return
 | 
			
		||||
		return false, errors.Join(err, parseErr)
 | 
			
		||||
	}
 | 
			
		||||
	cfg.AllowRebase, parseErr = parseBool16961(parts[2])
 | 
			
		||||
	if parseErr != nil {
 | 
			
		||||
		return
 | 
			
		||||
		return false, errors.Join(err, parseErr)
 | 
			
		||||
	}
 | 
			
		||||
	cfg.AllowRebaseMerge, parseErr = parseBool16961(parts[3])
 | 
			
		||||
	if parseErr != nil {
 | 
			
		||||
		return
 | 
			
		||||
		return false, errors.Join(err, parseErr)
 | 
			
		||||
	}
 | 
			
		||||
	cfg.AllowSquash, parseErr = parseBool16961(parts[4])
 | 
			
		||||
	if parseErr != nil {
 | 
			
		||||
		return
 | 
			
		||||
		return false, errors.Join(err, parseErr)
 | 
			
		||||
	}
 | 
			
		||||
	cfg.AllowManualMerge, parseErr = parseBool16961(parts[5])
 | 
			
		||||
	if parseErr != nil {
 | 
			
		||||
		return
 | 
			
		||||
		return false, errors.Join(err, parseErr)
 | 
			
		||||
	}
 | 
			
		||||
	cfg.AutodetectManualMerge, parseErr = parseBool16961(parts[6])
 | 
			
		||||
	if parseErr != nil {
 | 
			
		||||
		return
 | 
			
		||||
		return false, errors.Join(err, parseErr)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// 1.14 unit
 | 
			
		||||
@@ -162,12 +163,12 @@ func fixPullRequestsConfig16961(bs []byte, cfg *repo_model.PullRequestsConfig) (
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if len(parts) < 9 {
 | 
			
		||||
		return
 | 
			
		||||
		return false, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	cfg.DefaultDeleteBranchAfterMerge, parseErr = parseBool16961(parts[7])
 | 
			
		||||
	if parseErr != nil {
 | 
			
		||||
		return
 | 
			
		||||
		return false, errors.Join(err, parseErr)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	cfg.DefaultMergeStyle = repo_model.MergeStyle(string(bytes.Join(parts[8:], []byte{' '})))
 | 
			
		||||
@@ -177,34 +178,34 @@ func fixPullRequestsConfig16961(bs []byte, cfg *repo_model.PullRequestsConfig) (
 | 
			
		||||
func fixIssuesConfig16961(bs []byte, cfg *repo_model.IssuesConfig) (fixed bool, err error) {
 | 
			
		||||
	err = json.UnmarshalHandleDoubleEncode(bs, &cfg)
 | 
			
		||||
	if err == nil {
 | 
			
		||||
		return
 | 
			
		||||
		return false, nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Handle #16961
 | 
			
		||||
	if len(bs) < 3 {
 | 
			
		||||
		return
 | 
			
		||||
		return false, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if bs[0] != '&' || bs[1] != '{' || bs[len(bs)-1] != '}' {
 | 
			
		||||
		return
 | 
			
		||||
		return false, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	parts := bytes.Split(bs[2:len(bs)-1], []byte{' '})
 | 
			
		||||
	if len(parts) != 3 {
 | 
			
		||||
		return
 | 
			
		||||
		return false, err
 | 
			
		||||
	}
 | 
			
		||||
	var parseErr error
 | 
			
		||||
	cfg.EnableTimetracker, parseErr = parseBool16961(parts[0])
 | 
			
		||||
	if parseErr != nil {
 | 
			
		||||
		return
 | 
			
		||||
		return false, errors.Join(err, parseErr)
 | 
			
		||||
	}
 | 
			
		||||
	cfg.AllowOnlyContributorsToTrackTime, parseErr = parseBool16961(parts[1])
 | 
			
		||||
	if parseErr != nil {
 | 
			
		||||
		return
 | 
			
		||||
		return false, errors.Join(err, parseErr)
 | 
			
		||||
	}
 | 
			
		||||
	cfg.EnableDependencies, parseErr = parseBool16961(parts[2])
 | 
			
		||||
	if parseErr != nil {
 | 
			
		||||
		return
 | 
			
		||||
		return false, errors.Join(err, parseErr)
 | 
			
		||||
	}
 | 
			
		||||
	return true, nil
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -15,7 +15,7 @@ import (
 | 
			
		||||
 | 
			
		||||
func wrapNewlines(w io.Writer, prefix, value []byte) (sum int64, err error) {
 | 
			
		||||
	if len(value) == 0 {
 | 
			
		||||
		return
 | 
			
		||||
		return 0, nil
 | 
			
		||||
	}
 | 
			
		||||
	var n int
 | 
			
		||||
	last := 0
 | 
			
		||||
@@ -23,24 +23,24 @@ func wrapNewlines(w io.Writer, prefix, value []byte) (sum int64, err error) {
 | 
			
		||||
		n, err = w.Write(prefix)
 | 
			
		||||
		sum += int64(n)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return
 | 
			
		||||
			return sum, err
 | 
			
		||||
		}
 | 
			
		||||
		n, err = w.Write(value[last : last+j+1])
 | 
			
		||||
		sum += int64(n)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return
 | 
			
		||||
			return sum, err
 | 
			
		||||
		}
 | 
			
		||||
		last += j + 1
 | 
			
		||||
	}
 | 
			
		||||
	n, err = w.Write(prefix)
 | 
			
		||||
	sum += int64(n)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return
 | 
			
		||||
		return sum, err
 | 
			
		||||
	}
 | 
			
		||||
	n, err = w.Write(value[last:])
 | 
			
		||||
	sum += int64(n)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return
 | 
			
		||||
		return sum, err
 | 
			
		||||
	}
 | 
			
		||||
	n, err = w.Write([]byte("\n"))
 | 
			
		||||
	sum += int64(n)
 | 
			
		||||
 
 | 
			
		||||
@@ -70,11 +70,11 @@ func checkIfNoneMatchIsValid(req *http.Request, etag string) bool {
 | 
			
		||||
 | 
			
		||||
// HandleGenericETagTimeCache handles ETag-based caching with Last-Modified caching for a HTTP request.
 | 
			
		||||
// It returns true if the request was handled.
 | 
			
		||||
func HandleGenericETagTimeCache(req *http.Request, w http.ResponseWriter, etag string, lastModified time.Time) (handled bool) {
 | 
			
		||||
func HandleGenericETagTimeCache(req *http.Request, w http.ResponseWriter, etag string, lastModified *time.Time) (handled bool) {
 | 
			
		||||
	if len(etag) > 0 {
 | 
			
		||||
		w.Header().Set("Etag", etag)
 | 
			
		||||
	}
 | 
			
		||||
	if !lastModified.IsZero() {
 | 
			
		||||
	if lastModified != nil && !lastModified.IsZero() {
 | 
			
		||||
		w.Header().Set("Last-Modified", lastModified.Format(http.TimeFormat))
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
@@ -84,7 +84,7 @@ func HandleGenericETagTimeCache(req *http.Request, w http.ResponseWriter, etag s
 | 
			
		||||
			return true
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	if !lastModified.IsZero() {
 | 
			
		||||
	if lastModified != nil && !lastModified.IsZero() {
 | 
			
		||||
		ifModifiedSince := req.Header.Get("If-Modified-Since")
 | 
			
		||||
		if ifModifiedSince != "" {
 | 
			
		||||
			t, err := time.Parse(http.TimeFormat, ifModifiedSince)
 | 
			
		||||
 
 | 
			
		||||
@@ -206,7 +206,7 @@ func ServeContentByReader(r *http.Request, w http.ResponseWriter, filePath strin
 | 
			
		||||
	_, _ = io.CopyN(w, reader, partialLength) // just like http.ServeContent, not necessary to handle the error
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func ServeContentByReadSeeker(r *http.Request, w http.ResponseWriter, filePath string, modTime time.Time, reader io.ReadSeeker) {
 | 
			
		||||
func ServeContentByReadSeeker(r *http.Request, w http.ResponseWriter, filePath string, modTime *time.Time, reader io.ReadSeeker) {
 | 
			
		||||
	buf := make([]byte, mimeDetectionBufferLen)
 | 
			
		||||
	n, err := util.ReadAtMost(reader, buf)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
@@ -221,5 +221,8 @@ func ServeContentByReadSeeker(r *http.Request, w http.ResponseWriter, filePath s
 | 
			
		||||
		buf = buf[:n]
 | 
			
		||||
	}
 | 
			
		||||
	setServeHeadersByFile(r, w, filePath, buf)
 | 
			
		||||
	http.ServeContent(w, r, path.Base(filePath), modTime, reader)
 | 
			
		||||
	if modTime == nil {
 | 
			
		||||
		modTime = &time.Time{}
 | 
			
		||||
	}
 | 
			
		||||
	http.ServeContent(w, r, path.Base(filePath), *modTime, reader)
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -11,7 +11,6 @@ import (
 | 
			
		||||
	"os"
 | 
			
		||||
	"strings"
 | 
			
		||||
	"testing"
 | 
			
		||||
	"time"
 | 
			
		||||
 | 
			
		||||
	"github.com/stretchr/testify/assert"
 | 
			
		||||
)
 | 
			
		||||
@@ -78,7 +77,7 @@ func TestServeContentByReadSeeker(t *testing.T) {
 | 
			
		||||
		defer seekReader.Close()
 | 
			
		||||
 | 
			
		||||
		w := httptest.NewRecorder()
 | 
			
		||||
		ServeContentByReadSeeker(r, w, "test", time.Time{}, seekReader)
 | 
			
		||||
		ServeContentByReadSeeker(r, w, "test", nil, seekReader)
 | 
			
		||||
		assert.Equal(t, expectedStatusCode, w.Code)
 | 
			
		||||
		if expectedStatusCode == http.StatusPartialContent || expectedStatusCode == http.StatusOK {
 | 
			
		||||
			assert.Equal(t, fmt.Sprint(len(expectedContent)), w.Header().Get("Content-Length"))
 | 
			
		||||
 
 | 
			
		||||
@@ -211,7 +211,7 @@ func (pm *Manager) nextPID() (start time.Time, pid IDType) {
 | 
			
		||||
	pid = IDType(strconv.FormatInt(start.Unix(), 16))
 | 
			
		||||
 | 
			
		||||
	if pm.next == 1 {
 | 
			
		||||
		return
 | 
			
		||||
		return start, pid
 | 
			
		||||
	}
 | 
			
		||||
	pid = IDType(string(pid) + "-" + strconv.FormatInt(pm.next, 10))
 | 
			
		||||
	return start, pid
 | 
			
		||||
 
 | 
			
		||||
@@ -256,3 +256,8 @@ func ToFloat64(number any) (float64, error) {
 | 
			
		||||
	}
 | 
			
		||||
	return value, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ToPointer returns the pointer of a copy of any given value
 | 
			
		||||
func ToPointer[T any](val T) *T {
 | 
			
		||||
	return &val
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -224,3 +224,12 @@ func TestToTitleCase(t *testing.T) {
 | 
			
		||||
	assert.Equal(t, ToTitleCase(`foo bar baz`), `Foo Bar Baz`)
 | 
			
		||||
	assert.Equal(t, ToTitleCase(`FOO BAR BAZ`), `Foo Bar Baz`)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestToPointer(t *testing.T) {
 | 
			
		||||
	assert.Equal(t, "abc", *ToPointer("abc"))
 | 
			
		||||
	assert.Equal(t, 123, *ToPointer(123))
 | 
			
		||||
	abc := "abc"
 | 
			
		||||
	assert.False(t, &abc == ToPointer(abc))
 | 
			
		||||
	val123 := 123
 | 
			
		||||
	assert.False(t, &val123 == ToPointer(val123))
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user