]> source.dussan.org Git - gitea.git/commitdiff
Make sure git version&feature are always prepared (#30877) (#30879)
authorwxiaoguang <wxiaoguang@gmail.com>
Tue, 7 May 2024 02:07:33 +0000 (10:07 +0800)
committerGitHub <noreply@github.com>
Tue, 7 May 2024 02:07:33 +0000 (02:07 +0000)
Backport #30877

28 files changed:
cmd/hook.go
cmd/serv.go
modules/git/blame.go
modules/git/commit.go
modules/git/git.go
modules/git/object_format.go
modules/git/object_id.go
modules/git/remote.go
modules/git/repo.go
modules/git/repo_base.go [deleted file]
modules/git/repo_base_gogit.go
modules/git/repo_base_nogogit.go
modules/git/repo_commit.go
modules/git/repo_commitgraph.go
modules/lfs/pointer_scanner_nogogit.go
routers/init.go
routers/private/hook_pre_receive.go
routers/private/hook_proc_receive.go
routers/private/serv.go
routers/web/admin/config.go
routers/web/misc/misc.go
routers/web/repo/githttp.go
routers/web/repo/repo.go
services/gitdiff/gitdiff.go
services/pull/patch.go
services/pull/temp_repo.go
services/repository/files/patch.go
tests/integration/git_test.go

index 2a9c25add523771fda772293fc4b29c90aaa48da..9c1cb66f2a4dd895b86efc222c1fe25411605b34 100644 (file)
@@ -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.")
        }
 
index 90190a19db6424eb2b0b1853ab13812eada933fb..2bfd1110617e5be9f7eaca26ba79cdaca7845c10 100644 (file)
@@ -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}`)
index 69e1b08f93b462672f0fbfb411ef8634097bf30d..a9b2706f21739c7cd0f6cdb9bd1aa4074e5167e2 100644 (file)
@@ -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)
        }
 
index d96cef37c8d2efdb725227f21fba582b2783f435..86adaa79a667ccb318555456469afc3374c5b026 100644 (file)
@@ -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())
index e411269f7c50aecc2e5a3634de72994f81440a65..05ca26085553528bf43c29c4c30de97e3af09362 100644 (file)
@@ -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
index 3de9ff8cf456c9298d5173cd9f190222bc39c8bb..242d782e17789aac5ce2c7af2ffd5bea545cc5ff 100644 (file)
@@ -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
                }
index 33e5085005d2f3316ce2b0f7fb84fdff207a3c3c..82d30184dff7827f40fc3f007e6069ed47f6780c 100644 (file)
@@ -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
index 3585313f6ae388ae05cd84b1e180a87b9f26e8c3..7b10e6b66315511db1849be1dd216eee5cc0152d 100644 (file)
@@ -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")
index c5ba5117a786e3191d309ce602964fc45fc5d0e0..1c223018adddc1412f2cc3151b25f3dc93033982 100644 (file)
@@ -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)
        }
 
diff --git a/modules/git/repo_base.go b/modules/git/repo_base.go
deleted file mode 100644 (file)
index 6c148d9..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-// Copyright 2021 The Gitea Authors. All rights reserved.
-// SPDX-License-Identifier: MIT
-
-package git
-
-var isGogit bool
index 0cd07dcdc897ec9b635c8c7cf5af50ebfd2c0e39..a1127f4e6c5b9cf47d8302942f3c93af60b685da 100644 (file)
@@ -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 {
index 5511526e7821b1b5776d59e4cfcafa39534f1f10..bc241cdd7950070396123fb3c195e36e4c500eda 100644 (file)
@@ -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 {
index f9168bef7eec1d0d81fef4decd0988c9fb93201f..8c3285769e4fed548a432934a6570e2ca3d6fe1e 100644 (file)
@@ -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).
index 492438be379120eecd89d8364bce88a10cd93f85..087d5bcec4c2dea6e865f2ba02a5faebb740d9bc 100644 (file)
@@ -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)
                }
index 658b98feabd845d7c8cca6e64cf0d3a483997558..c37a93e73bfd95b341a23918ef9168d87d9c2988 100644 (file)
@@ -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)
index 030ef3c740d8826d7e571123284446fc48e74fcd..56c95cd1cab7c5dee44dc4085f09b8b23a386fef 100644 (file)
@@ -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)
index f35eb77d42e1ee80d66ff8a1695766efd57ba0d1..efdbc114ef4b70be64aa75da38ad2b61d5998dc9 100644 (file)
@@ -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()
index cee3bbdd121273be61ea6b99d3d37023a939c8e5..efb3f5831e4276189bfb826c50213a342bf3d985 100644 (file)
@@ -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
        }
index 85368a0aed4c1824f77490b46af25b8d979699c2..1c309865d7df0f8afdfc6bb663f78f659be20a4e 100644 (file)
@@ -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
                        }
 
index 48f80dbbf1cafe5c3fe66de32cd1ec3e72e10a49..fd8c73b62d8db2e8e21abd98077ffead80fba88c 100644 (file)
@@ -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
index ac5496ce91aec624bbd624de3dbe18d56ebcf490..caaca7f5211c81b3e05af6c4394aaabef2c77ffb 100644 (file)
@@ -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
        }
index 8fb6d930688f84e72ec1775f4bcd398bbd1a9309..f0579b56ea1377dbf4667fd37fefaa01c6a3ebd7 100644 (file)
@@ -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
                        }
 
index 4e448933c794e7de9a9a6f053232c2eb86684ea1..48be1c22968fbe4b041ccd366013d3101b22f348 100644 (file)
@@ -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)
index d115686491a4575d7c856fdcabb9e39a227efd53..3a35d24dfffd3e9781dbc8616bc2ef58529b2a60 100644 (file)
@@ -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 = ""
        }
index 12b79a06253d1b5b259690ff5795ebb155d0f8c6..981bc989fca4a1cc0ecf6ac5c3813e072512bde4 100644 (file)
@@ -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
        }
index 36bdbde55c7a37a41a8d0ee9e5dd1fee02397c8b..e5753178b89818cdc388944823cb9b8b3462821b 100644 (file)
@@ -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")
        }
index e5f7e2af965d9fd95ba934a77b84161925f2a1c0..ab0e7ffd36fdcc226bd3a8bbec4243cef8c9fa72 100644 (file)
@@ -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")
        }
 
index 818e1fa65350ac5eea43320a738b5c5a530c9da1..7f87aeda4bf403c5b112ccfc7d4adf1f8c0c0f2b 100644 (file)
@@ -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
                }