From ff468ab5e426582b068586ce13d5a5348365e783 Mon Sep 17 00:00:00 2001 From: Gusted Date: Tue, 13 Feb 2024 09:03:22 +0100 Subject: [PATCH] [BUG] Workaround borked Git version - Backport #2335 - In Git version v2.43.1, the behavior of `GIT_FLUSH` was accidentially flipped. This causes Forgejo to hang on the `check-attr` command, because no output was being flushed. - Workaround this by detecting if Git v2.43.1 is used and set `GIT_FLUSH=0` thus getting the correct behavior. - Ref: https://lore.kernel.org/git/CABn0oJvg3M_kBW-u=j3QhKnO=6QOzk-YFTgonYw_UvFS1NTX4g@mail.gmail.com/ - Resolves #2333. (cherry picked from commit f68f88097491746c6d4a36dc8f9631f764f65ef1) --- modules/git/git.go | 20 +++++++++++++++++++- modules/git/repo_attribute.go | 8 +++++++- 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/modules/git/git.go b/modules/git/git.go index 5ace1dfb56..3281e592b4 100644 --- a/modules/git/git.go +++ b/modules/git/git.go @@ -34,7 +34,8 @@ var ( DefaultContext context.Context // SupportProcReceive version >= 2.29.0 - SupportProcReceive bool + SupportProcReceive bool + InvertedGitFlushEnv bool // 2.43.1 gitVersion *version.Version ) @@ -186,6 +187,8 @@ func InitFull(ctx context.Context) (err error) { } SupportProcReceive = CheckGitVersionAtLeast("2.29") == nil + InvertedGitFlushEnv = CheckGitVersionEqual("2.43.1") == nil + if setting.LFS.StartServer { if CheckGitVersionAtLeast("2.1.2") != nil { return errors.New("LFS server support requires Git >= 2.1.2") @@ -314,6 +317,21 @@ func CheckGitVersionAtLeast(atLeast string) error { return nil } +// CheckGitVersionEqual checks if the git version is equal to the constraint version. +func CheckGitVersionEqual(equal string) error { + if _, err := loadGitVersion(); err != nil { + return err + } + atLeastVersion, err := version.NewVersion(equal) + if err != nil { + return err + } + if !gitVersion.Equal(atLeastVersion) { + return fmt.Errorf("installed git binary version %s is not equal to %s", gitVersion.Original(), equal) + } + return nil +} + func configSet(key, value string) error { stdout, _, err := NewCommand(DefaultContext, "config", "--global", "--get").AddDynamicArguments(key).RunStdString(nil) if err != nil && !err.IsExitCode(1) { diff --git a/modules/git/repo_attribute.go b/modules/git/repo_attribute.go index 2b34f117f7..c482ad1c98 100644 --- a/modules/git/repo_attribute.go +++ b/modules/git/repo_attribute.go @@ -133,7 +133,13 @@ func (c *CheckAttributeReader) Init(ctx context.Context) error { c.env = append(c.env, "GIT_WORK_TREE="+c.WorkTree) } - c.env = append(c.env, "GIT_FLUSH=1") + // Version 2.43.1 has a bug where the behavior of `GIT_FLUSH` is flipped. + // Ref: https://lore.kernel.org/git/CABn0oJvg3M_kBW-u=j3QhKnO=6QOzk-YFTgonYw_UvFS1NTX4g@mail.gmail.com + if InvertedGitFlushEnv { + c.env = append(c.env, "GIT_FLUSH=0") + } else { + c.env = append(c.env, "GIT_FLUSH=1") + } c.cmd.AddDynamicArguments(c.Attributes...)