Backport #30877tags/v1.22.0
@@ -220,10 +220,7 @@ Gitea or set your environment appropriately.`, "") | |||
} | |||
} | |||
supportProcReceive := false | |||
if git.CheckGitVersionAtLeast("2.29") == nil { | |||
supportProcReceive = true | |||
} | |||
supportProcReceive := git.DefaultFeatures().SupportProcReceive | |||
for scanner.Scan() { | |||
// TODO: support news feeds for wiki | |||
@@ -497,7 +494,7 @@ Gitea or set your environment appropriately.`, "") | |||
return nil | |||
} | |||
if git.CheckGitVersionAtLeast("2.29") != nil { | |||
if !git.DefaultFeatures().SupportProcReceive { | |||
return fail(ctx, "No proc-receive support", "current git version doesn't support proc-receive.") | |||
} | |||
@@ -178,7 +178,7 @@ func runServ(c *cli.Context) error { | |||
} | |||
if len(words) < 2 { | |||
if git.CheckGitVersionAtLeast("2.29") == nil { | |||
if git.DefaultFeatures().SupportProcReceive { | |||
// for AGit Flow | |||
if cmd == "ssh_info" { | |||
fmt.Print(`{"type":"gitea","version":1}`) |
@@ -132,7 +132,7 @@ func (r *BlameReader) Close() error { | |||
// CreateBlameReader creates reader for given repository, commit and file | |||
func CreateBlameReader(ctx context.Context, objectFormat ObjectFormat, repoPath string, commit *Commit, file string, bypassBlameIgnore bool) (*BlameReader, error) { | |||
var ignoreRevsFile *string | |||
if CheckGitVersionAtLeast("2.23") == nil && !bypassBlameIgnore { | |||
if DefaultFeatures().CheckVersionAtLeast("2.23") && !bypassBlameIgnore { | |||
ignoreRevsFile = tryCreateBlameIgnoreRevsFile(commit) | |||
} | |||
@@ -423,7 +423,7 @@ func (c *Commit) GetSubModule(entryname string) (*SubModule, error) { | |||
// GetBranchName gets the closest branch name (as returned by 'git name-rev --name-only') | |||
func (c *Commit) GetBranchName() (string, error) { | |||
cmd := NewCommand(c.repo.Ctx, "name-rev") | |||
if CheckGitVersionAtLeast("2.13.0") == nil { | |||
if DefaultFeatures().CheckVersionAtLeast("2.13.0") { | |||
cmd.AddArguments("--exclude", "refs/tags/*") | |||
} | |||
cmd.AddArguments("--name-only", "--no-undefined").AddDynamicArguments(c.ID.String()) |
@@ -22,42 +22,63 @@ import ( | |||
"github.com/hashicorp/go-version" | |||
) | |||
// RequiredVersion is the minimum Git version required | |||
const RequiredVersion = "2.0.0" | |||
const RequiredVersion = "2.0.0" // the minimum Git version required | |||
var ( | |||
// GitExecutable is the command name of git | |||
// Could be updated to an absolute path while initialization | |||
GitExecutable = "git" | |||
// DefaultContext is the default context to run git commands in, must be initialized by git.InitXxx | |||
DefaultContext context.Context | |||
type Features struct { | |||
gitVersion *version.Version | |||
DefaultFeatures struct { | |||
GitVersion *version.Version | |||
UsingGogit bool | |||
SupportProcReceive bool // >= 2.29 | |||
SupportHashSha256 bool // >= 2.42, SHA-256 repositories no longer an ‘experimental curiosity’ | |||
SupportedObjectFormats []ObjectFormat // sha1, sha256 | |||
} | |||
SupportProcReceive bool // >= 2.29 | |||
SupportHashSha256 bool // >= 2.42, SHA-256 repositories no longer an ‘experimental curiosity’ | |||
} | |||
var ( | |||
GitExecutable = "git" // the command name of git, will be updated to an absolute path during initialization | |||
DefaultContext context.Context // the default context to run git commands in, must be initialized by git.InitXxx | |||
defaultFeatures *Features | |||
) | |||
// loadGitVersion tries to get the current git version and stores it into a global variable | |||
func loadGitVersion() error { | |||
// doesn't need RWMutex because it's executed by Init() | |||
if DefaultFeatures.GitVersion != nil { | |||
return nil | |||
func (f *Features) CheckVersionAtLeast(atLeast string) bool { | |||
return f.gitVersion.Compare(version.Must(version.NewVersion(atLeast))) >= 0 | |||
} | |||
// VersionInfo returns git version information | |||
func (f *Features) VersionInfo() string { | |||
return f.gitVersion.Original() | |||
} | |||
func DefaultFeatures() *Features { | |||
if defaultFeatures == nil { | |||
if !setting.IsProd || setting.IsInTesting { | |||
log.Warn("git.DefaultFeatures is called before git.InitXxx, initializing with default values") | |||
} | |||
if err := InitSimple(context.Background()); err != nil { | |||
log.Fatal("git.InitSimple failed: %v", err) | |||
} | |||
} | |||
return defaultFeatures | |||
} | |||
func loadGitVersionFeatures() (*Features, error) { | |||
stdout, _, runErr := NewCommand(DefaultContext, "version").RunStdString(nil) | |||
if runErr != nil { | |||
return runErr | |||
return nil, runErr | |||
} | |||
ver, err := parseGitVersionLine(strings.TrimSpace(stdout)) | |||
if err == nil { | |||
DefaultFeatures.GitVersion = ver | |||
if err != nil { | |||
return nil, err | |||
} | |||
return err | |||
features := &Features{gitVersion: ver, UsingGogit: isGogit} | |||
features.SupportProcReceive = features.CheckVersionAtLeast("2.29") | |||
features.SupportHashSha256 = features.CheckVersionAtLeast("2.42") && !isGogit | |||
features.SupportedObjectFormats = []ObjectFormat{Sha1ObjectFormat} | |||
if features.SupportHashSha256 { | |||
features.SupportedObjectFormats = append(features.SupportedObjectFormats, Sha256ObjectFormat) | |||
} | |||
return features, nil | |||
} | |||
func parseGitVersionLine(s string) (*version.Version, error) { | |||
@@ -85,56 +106,24 @@ func SetExecutablePath(path string) error { | |||
return fmt.Errorf("git not found: %w", err) | |||
} | |||
GitExecutable = absPath | |||
return nil | |||
} | |||
if err = loadGitVersion(); err != nil { | |||
return fmt.Errorf("unable to load git version: %w", err) | |||
} | |||
versionRequired, err := version.NewVersion(RequiredVersion) | |||
if err != nil { | |||
return err | |||
} | |||
if DefaultFeatures.GitVersion.LessThan(versionRequired) { | |||
func ensureGitVersion() error { | |||
if !DefaultFeatures().CheckVersionAtLeast(RequiredVersion) { | |||
moreHint := "get git: https://git-scm.com/download/" | |||
if runtime.GOOS == "linux" { | |||
// there are a lot of CentOS/RHEL users using old git, so we add a special hint for them | |||
if _, err = os.Stat("/etc/redhat-release"); err == nil { | |||
if _, err := os.Stat("/etc/redhat-release"); err == nil { | |||
// ius.io is the recommended official(git-scm.com) method to install git | |||
moreHint = "get git: https://git-scm.com/download/linux and https://ius.io" | |||
} | |||
} | |||
return fmt.Errorf("installed git version %q is not supported, Gitea requires git version >= %q, %s", DefaultFeatures.GitVersion.Original(), RequiredVersion, moreHint) | |||
return fmt.Errorf("installed git version %q is not supported, Gitea requires git version >= %q, %s", DefaultFeatures().gitVersion.Original(), RequiredVersion, moreHint) | |||
} | |||
if err = checkGitVersionCompatibility(DefaultFeatures.GitVersion); err != nil { | |||
return fmt.Errorf("installed git version %s has a known compatibility issue with Gitea: %w, please upgrade (or downgrade) git", DefaultFeatures.GitVersion.String(), err) | |||
} | |||
return nil | |||
} | |||
// VersionInfo returns git version information | |||
func VersionInfo() string { | |||
if DefaultFeatures.GitVersion == nil { | |||
return "(git not found)" | |||
} | |||
format := "%s" | |||
args := []any{DefaultFeatures.GitVersion.Original()} | |||
// Since git wire protocol has been released from git v2.18 | |||
if setting.Git.EnableAutoGitWireProtocol && CheckGitVersionAtLeast("2.18") == nil { | |||
format += ", Wire Protocol %s Enabled" | |||
args = append(args, "Version 2") // for focus color | |||
} | |||
return fmt.Sprintf(format, args...) | |||
} | |||
func checkInit() error { | |||
if setting.Git.HomePath == "" { | |||
return errors.New("unable to init Git's HomeDir, incorrect initialization of the setting and git modules") | |||
} | |||
if DefaultContext != nil { | |||
log.Warn("git module has been initialized already, duplicate init may work but it's better to fix it") | |||
if err := checkGitVersionCompatibility(DefaultFeatures().gitVersion); err != nil { | |||
return fmt.Errorf("installed git version %s has a known compatibility issue with Gitea: %w, please upgrade (or downgrade) git", DefaultFeatures().gitVersion.String(), err) | |||
} | |||
return nil | |||
} | |||
@@ -154,8 +143,12 @@ func HomeDir() string { | |||
// InitSimple initializes git module with a very simple step, no config changes, no global command arguments. | |||
// This method doesn't change anything to filesystem. At the moment, it is only used by some Gitea sub-commands. | |||
func InitSimple(ctx context.Context) error { | |||
if err := checkInit(); err != nil { | |||
return err | |||
if setting.Git.HomePath == "" { | |||
return errors.New("unable to init Git's HomeDir, incorrect initialization of the setting and git modules") | |||
} | |||
if DefaultContext != nil && (!setting.IsProd || setting.IsInTesting) { | |||
log.Warn("git module has been initialized already, duplicate init may work but it's better to fix it") | |||
} | |||
DefaultContext = ctx | |||
@@ -165,13 +158,16 @@ func InitSimple(ctx context.Context) error { | |||
defaultCommandExecutionTimeout = time.Duration(setting.Git.Timeout.Default) * time.Second | |||
} | |||
return SetExecutablePath(setting.Git.Path) | |||
} | |||
if err := SetExecutablePath(setting.Git.Path); err != nil { | |||
return err | |||
} | |||
// InitFull initializes git module with version check and change global variables, sync gitconfig. | |||
// It should only be called once at the beginning of the program initialization (TestMain/GlobalInitInstalled) as this code makes unsynchronized changes to variables. | |||
func InitFull(ctx context.Context) (err error) { | |||
if err = InitSimple(ctx); err != nil { | |||
var err error | |||
defaultFeatures, err = loadGitVersionFeatures() | |||
if err != nil { | |||
return err | |||
} | |||
if err = ensureGitVersion(); err != nil { | |||
return err | |||
} | |||
@@ -179,26 +175,28 @@ func InitFull(ctx context.Context) (err error) { | |||
if _, ok := os.LookupEnv("GNUPGHOME"); !ok { | |||
_ = os.Setenv("GNUPGHOME", filepath.Join(HomeDir(), ".gnupg")) | |||
} | |||
return nil | |||
} | |||
// InitFull initializes git module with version check and change global variables, sync gitconfig. | |||
// It should only be called once at the beginning of the program initialization (TestMain/GlobalInitInstalled) as this code makes unsynchronized changes to variables. | |||
func InitFull(ctx context.Context) (err error) { | |||
if err = InitSimple(ctx); err != nil { | |||
return err | |||
} | |||
// Since git wire protocol has been released from git v2.18 | |||
if setting.Git.EnableAutoGitWireProtocol && CheckGitVersionAtLeast("2.18") == nil { | |||
if setting.Git.EnableAutoGitWireProtocol && DefaultFeatures().CheckVersionAtLeast("2.18") { | |||
globalCommandArgs = append(globalCommandArgs, "-c", "protocol.version=2") | |||
} | |||
// Explicitly disable credential helper, otherwise Git credentials might leak | |||
if CheckGitVersionAtLeast("2.9") == nil { | |||
if DefaultFeatures().CheckVersionAtLeast("2.9") { | |||
globalCommandArgs = append(globalCommandArgs, "-c", "credential.helper=") | |||
} | |||
DefaultFeatures.SupportProcReceive = CheckGitVersionAtLeast("2.29") == nil | |||
DefaultFeatures.SupportHashSha256 = CheckGitVersionAtLeast("2.42") == nil && !isGogit | |||
if DefaultFeatures.SupportHashSha256 { | |||
SupportedObjectFormats = append(SupportedObjectFormats, Sha256ObjectFormat) | |||
} else { | |||
log.Warn("sha256 hash support is disabled - requires Git >= 2.42. Gogit is currently unsupported") | |||
} | |||
if setting.LFS.StartServer { | |||
if CheckGitVersionAtLeast("2.1.2") != nil { | |||
if !DefaultFeatures().CheckVersionAtLeast("2.1.2") { | |||
return errors.New("LFS server support requires Git >= 2.1.2") | |||
} | |||
globalCommandArgs = append(globalCommandArgs, "-c", "filter.lfs.required=", "-c", "filter.lfs.smudge=", "-c", "filter.lfs.clean=") | |||
@@ -238,13 +236,13 @@ func syncGitConfig() (err error) { | |||
return err | |||
} | |||
if CheckGitVersionAtLeast("2.10") == nil { | |||
if DefaultFeatures().CheckVersionAtLeast("2.10") { | |||
if err := configSet("receive.advertisePushOptions", "true"); err != nil { | |||
return err | |||
} | |||
} | |||
if CheckGitVersionAtLeast("2.18") == nil { | |||
if DefaultFeatures().CheckVersionAtLeast("2.18") { | |||
if err := configSet("core.commitGraph", "true"); err != nil { | |||
return err | |||
} | |||
@@ -256,7 +254,7 @@ func syncGitConfig() (err error) { | |||
} | |||
} | |||
if DefaultFeatures.SupportProcReceive { | |||
if DefaultFeatures().SupportProcReceive { | |||
// set support for AGit flow | |||
if err := configAddNonExist("receive.procReceiveRefs", "refs/for"); err != nil { | |||
return err | |||
@@ -294,7 +292,7 @@ func syncGitConfig() (err error) { | |||
} | |||
// By default partial clones are disabled, enable them from git v2.22 | |||
if !setting.Git.DisablePartialClone && CheckGitVersionAtLeast("2.22") == nil { | |||
if !setting.Git.DisablePartialClone && DefaultFeatures().CheckVersionAtLeast("2.22") { | |||
if err = configSet("uploadpack.allowfilter", "true"); err != nil { | |||
return err | |||
} | |||
@@ -309,21 +307,6 @@ func syncGitConfig() (err error) { | |||
return err | |||
} | |||
// CheckGitVersionAtLeast check git version is at least the constraint version | |||
func CheckGitVersionAtLeast(atLeast string) error { | |||
if DefaultFeatures.GitVersion == nil { | |||
panic("git module is not initialized") // it shouldn't happen | |||
} | |||
atLeastVersion, err := version.NewVersion(atLeast) | |||
if err != nil { | |||
return err | |||
} | |||
if DefaultFeatures.GitVersion.Compare(atLeastVersion) < 0 { | |||
return fmt.Errorf("installed git binary version %s is not at least %s", DefaultFeatures.GitVersion.Original(), atLeast) | |||
} | |||
return nil | |||
} | |||
func checkGitVersionCompatibility(gitVer *version.Version) error { | |||
badVersions := []struct { | |||
Version *version.Version |
@@ -120,12 +120,8 @@ var ( | |||
Sha256ObjectFormat ObjectFormat = Sha256ObjectFormatImpl{} | |||
) | |||
var SupportedObjectFormats = []ObjectFormat{ | |||
Sha1ObjectFormat, | |||
} | |||
func ObjectFormatFromName(name string) ObjectFormat { | |||
for _, objectFormat := range SupportedObjectFormats { | |||
for _, objectFormat := range DefaultFeatures().SupportedObjectFormats { | |||
if name == objectFormat.Name() { | |||
return objectFormat | |||
} |
@@ -54,7 +54,7 @@ func (*Sha256Hash) Type() ObjectFormat { return Sha256ObjectFormat } | |||
func NewIDFromString(hexHash string) (ObjectID, error) { | |||
var theObjectFormat ObjectFormat | |||
for _, objectFormat := range SupportedObjectFormats { | |||
for _, objectFormat := range DefaultFeatures().SupportedObjectFormats { | |||
if len(hexHash) == objectFormat.FullLength() { | |||
theObjectFormat = objectFormat | |||
break |
@@ -12,7 +12,7 @@ import ( | |||
// GetRemoteAddress returns remote url of git repository in the repoPath with special remote name | |||
func GetRemoteAddress(ctx context.Context, repoPath, remoteName string) (string, error) { | |||
var cmd *Command | |||
if CheckGitVersionAtLeast("2.7") == nil { | |||
if DefaultFeatures().CheckVersionAtLeast("2.7") { | |||
cmd = NewCommand(ctx, "remote", "get-url").AddDynamicArguments(remoteName) | |||
} else { | |||
cmd = NewCommand(ctx, "config", "--get").AddDynamicArguments("remote." + remoteName + ".url") |
@@ -74,7 +74,7 @@ func InitRepository(ctx context.Context, repoPath string, bare bool, objectForma | |||
if !IsValidObjectFormat(objectFormatName) { | |||
return fmt.Errorf("invalid object format: %s", objectFormatName) | |||
} | |||
if DefaultFeatures.SupportHashSha256 { | |||
if DefaultFeatures().SupportHashSha256 { | |||
cmd.AddOptionValues("--object-format", objectFormatName) | |||
} | |||
@@ -1,6 +0,0 @@ | |||
// Copyright 2021 The Gitea Authors. All rights reserved. | |||
// SPDX-License-Identifier: MIT | |||
package git | |||
var isGogit bool |
@@ -22,9 +22,7 @@ import ( | |||
"github.com/go-git/go-git/v5/storage/filesystem" | |||
) | |||
func init() { | |||
isGogit = true | |||
} | |||
const isGogit = true | |||
// Repository represents a Git repository. | |||
type Repository struct { |
@@ -15,9 +15,7 @@ import ( | |||
"code.gitea.io/gitea/modules/util" | |||
) | |||
func init() { | |||
isGogit = false | |||
} | |||
const isGogit = false | |||
// Repository represents a Git repository. | |||
type Repository struct { |
@@ -438,7 +438,7 @@ func (repo *Repository) getCommitsBeforeLimit(id ObjectID, num int) ([]*Commit, | |||
} | |||
func (repo *Repository) getBranches(commit *Commit, limit int) ([]string, error) { | |||
if CheckGitVersionAtLeast("2.7.0") == nil { | |||
if DefaultFeatures().CheckVersionAtLeast("2.7.0") { | |||
stdout, _, err := NewCommand(repo.Ctx, "for-each-ref", "--format=%(refname:strip=2)"). | |||
AddOptionFormat("--count=%d", limit). | |||
AddOptionValues("--contains", commit.ID.String(), BranchPrefix). |
@@ -11,7 +11,7 @@ import ( | |||
// WriteCommitGraph write commit graph to speed up repo access | |||
// this requires git v2.18 to be installed | |||
func WriteCommitGraph(ctx context.Context, repoPath string) error { | |||
if CheckGitVersionAtLeast("2.18") == nil { | |||
if DefaultFeatures().CheckVersionAtLeast("2.18") { | |||
if _, _, err := NewCommand(ctx, "commit-graph", "write").RunStdString(&RunOpts{Dir: repoPath}); err != nil { | |||
return fmt.Errorf("unable to write commit-graph for '%s' : %w", repoPath, err) | |||
} |
@@ -41,7 +41,7 @@ func SearchPointerBlobs(ctx context.Context, repo *git.Repository, pointerChan c | |||
go pipeline.BlobsLessThan1024FromCatFileBatchCheck(catFileCheckReader, shasToBatchWriter, &wg) | |||
// 1. Run batch-check on all objects in the repository | |||
if git.CheckGitVersionAtLeast("2.6.0") != nil { | |||
if !git.DefaultFeatures().CheckVersionAtLeast("2.6.0") { | |||
revListReader, revListWriter := io.Pipe() | |||
shasToCheckReader, shasToCheckWriter := io.Pipe() | |||
wg.Add(2) |
@@ -25,6 +25,7 @@ import ( | |||
"code.gitea.io/gitea/modules/system" | |||
"code.gitea.io/gitea/modules/templates" | |||
"code.gitea.io/gitea/modules/translation" | |||
"code.gitea.io/gitea/modules/util" | |||
"code.gitea.io/gitea/modules/web" | |||
"code.gitea.io/gitea/modules/web/routing" | |||
actions_router "code.gitea.io/gitea/routers/api/actions" | |||
@@ -112,7 +113,10 @@ func InitWebInstallPage(ctx context.Context) { | |||
// InitWebInstalled is for global installed configuration. | |||
func InitWebInstalled(ctx context.Context) { | |||
mustInitCtx(ctx, git.InitFull) | |||
log.Info("Git version: %s (home: %s)", git.VersionInfo(), git.HomeDir()) | |||
log.Info("Git version: %s (home: %s)", git.DefaultFeatures().VersionInfo(), git.HomeDir()) | |||
if !git.DefaultFeatures().SupportHashSha256 { | |||
log.Warn("sha256 hash support is disabled - requires Git >= 2.42." + util.Iif(git.DefaultFeatures().UsingGogit, " Gogit is currently unsupported.", "")) | |||
} | |||
// Setup i18n | |||
translation.InitLocales(ctx) |
@@ -122,7 +122,7 @@ func HookPreReceive(ctx *gitea_context.PrivateContext) { | |||
preReceiveBranch(ourCtx, oldCommitID, newCommitID, refFullName) | |||
case refFullName.IsTag(): | |||
preReceiveTag(ourCtx, oldCommitID, newCommitID, refFullName) | |||
case git.DefaultFeatures.SupportProcReceive && refFullName.IsFor(): | |||
case git.DefaultFeatures().SupportProcReceive && refFullName.IsFor(): | |||
preReceiveFor(ourCtx, oldCommitID, newCommitID, refFullName) | |||
default: | |||
ourCtx.AssertCanWriteCode() |
@@ -18,7 +18,7 @@ import ( | |||
// HookProcReceive proc-receive hook - only handles agit Proc-Receive requests at present | |||
func HookProcReceive(ctx *gitea_context.PrivateContext) { | |||
opts := web.GetForm(ctx).(*private.HookOptions) | |||
if !git.DefaultFeatures.SupportProcReceive { | |||
if !git.DefaultFeatures().SupportProcReceive { | |||
ctx.Status(http.StatusNotFound) | |||
return | |||
} |
@@ -297,7 +297,7 @@ func ServCommand(ctx *context.PrivateContext) { | |||
} | |||
} else { | |||
// Because of the special ref "refs/for" we will need to delay write permission check | |||
if git.DefaultFeatures.SupportProcReceive && unitType == unit.TypeCode { | |||
if git.DefaultFeatures().SupportProcReceive && unitType == unit.TypeCode { | |||
mode = perm.AccessModeRead | |||
} | |||
@@ -112,7 +112,7 @@ func Config(ctx *context.Context) { | |||
ctx.Data["OfflineMode"] = setting.OfflineMode | |||
ctx.Data["RunUser"] = setting.RunUser | |||
ctx.Data["RunMode"] = util.ToTitleCase(setting.RunMode) | |||
ctx.Data["GitVersion"] = git.VersionInfo() | |||
ctx.Data["GitVersion"] = git.DefaultFeatures().VersionInfo() | |||
ctx.Data["AppDataPath"] = setting.AppDataPath | |||
ctx.Data["RepoRootPath"] = setting.RepoRootPath |
@@ -15,7 +15,7 @@ import ( | |||
) | |||
func SSHInfo(rw http.ResponseWriter, req *http.Request) { | |||
if !git.DefaultFeatures.SupportProcReceive { | |||
if !git.DefaultFeatures().SupportProcReceive { | |||
rw.WriteHeader(http.StatusNotFound) | |||
return | |||
} |
@@ -183,7 +183,7 @@ func httpBase(ctx *context.Context) *serviceHandler { | |||
if repoExist { | |||
// Because of special ref "refs/for" .. , need delay write permission check | |||
if git.DefaultFeatures.SupportProcReceive { | |||
if git.DefaultFeatures().SupportProcReceive { | |||
accessMode = perm.AccessModeRead | |||
} | |||
@@ -180,7 +180,7 @@ func Create(ctx *context.Context) { | |||
ctx.Data["CanCreateRepo"] = ctx.Doer.CanCreateRepo() | |||
ctx.Data["MaxCreationLimit"] = ctx.Doer.MaxCreationLimit() | |||
ctx.Data["SupportedObjectFormats"] = git.SupportedObjectFormats | |||
ctx.Data["SupportedObjectFormats"] = git.DefaultFeatures().SupportedObjectFormats | |||
ctx.Data["DefaultObjectFormat"] = git.Sha1ObjectFormat | |||
ctx.HTML(http.StatusOK, tplCreate) |
@@ -1143,7 +1143,7 @@ func GetDiff(ctx context.Context, gitRepo *git.Repository, opts *DiffOptions, fi | |||
// so if we are using at least this version of git we don't have to tell ParsePatch to do | |||
// the skipping for us | |||
parsePatchSkipToFile := opts.SkipTo | |||
if opts.SkipTo != "" && git.CheckGitVersionAtLeast("2.31") == nil { | |||
if opts.SkipTo != "" && git.DefaultFeatures().CheckVersionAtLeast("2.31") { | |||
cmdDiff.AddOptionFormat("--skip-to=%s", opts.SkipTo) | |||
parsePatchSkipToFile = "" | |||
} |
@@ -383,7 +383,7 @@ func checkConflicts(ctx context.Context, pr *issues_model.PullRequest, gitRepo * | |||
cmdApply.AddArguments("--ignore-whitespace") | |||
} | |||
is3way := false | |||
if git.CheckGitVersionAtLeast("2.32.0") == nil { | |||
if git.DefaultFeatures().CheckVersionAtLeast("2.32.0") { | |||
cmdApply.AddArguments("--3way") | |||
is3way = true | |||
} |
@@ -104,7 +104,7 @@ func createTemporaryRepoForPR(ctx context.Context, pr *issues_model.PullRequest) | |||
baseBranch := "base" | |||
fetchArgs := git.TrustedCmdArgs{"--no-tags"} | |||
if git.CheckGitVersionAtLeast("2.25.0") == nil { | |||
if git.DefaultFeatures().CheckVersionAtLeast("2.25.0") { | |||
// Writing the commit graph can be slow and is not needed here | |||
fetchArgs = append(fetchArgs, "--no-write-commit-graph") | |||
} |
@@ -148,7 +148,7 @@ func ApplyDiffPatch(ctx context.Context, repo *repo_model.Repository, doer *user | |||
stderr := &strings.Builder{} | |||
cmdApply := git.NewCommand(ctx, "apply", "--index", "--recount", "--cached", "--ignore-whitespace", "--whitespace=fix", "--binary") | |||
if git.CheckGitVersionAtLeast("2.32") == nil { | |||
if git.DefaultFeatures().CheckVersionAtLeast("2.32") { | |||
cmdApply.AddArguments("-3") | |||
} | |||
@@ -698,7 +698,7 @@ func doCreateAgitFlowPull(dstPath string, ctx *APITestContext, baseBranch, headB | |||
defer tests.PrintCurrentTest(t)() | |||
// skip this test if git version is low | |||
if git.CheckGitVersionAtLeast("2.29") != nil { | |||
if !git.DefaultFeatures().SupportProcReceive { | |||
return | |||
} | |||