Skip to content

Commit f501939

Browse files
committed
Ensure that git 1.7.2 works on tests
1 parent d6841c5 commit f501939

File tree

9 files changed

+90
-31
lines changed

9 files changed

+90
-31
lines changed

integrations/git_test.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,7 @@ func standardCommitAndPushTest(t *testing.T, dstPath string) (little, big string
136136
func lfsCommitAndPushTest(t *testing.T, dstPath string) (littleLFS, bigLFS string) {
137137
t.Run("LFS", func(t *testing.T) {
138138
PrintCurrentTest(t)
139+
setting.CheckLFSVersion()
139140
if !setting.LFS.StartServer {
140141
t.Skip()
141142
return
@@ -190,6 +191,7 @@ func rawTest(t *testing.T, ctx *APITestContext, little, big, littleLFS, bigLFS s
190191
resp := session.MakeRequest(t, req, http.StatusOK)
191192
assert.Equal(t, littleSize, resp.Body.Len())
192193

194+
setting.CheckLFSVersion()
193195
if setting.LFS.StartServer {
194196
req = NewRequest(t, "GET", path.Join("/", username, reponame, "/raw/branch/master/", littleLFS))
195197
resp = session.MakeRequest(t, req, http.StatusOK)
@@ -226,6 +228,7 @@ func mediaTest(t *testing.T, ctx *APITestContext, little, big, littleLFS, bigLFS
226228
resp := session.MakeRequestNilResponseRecorder(t, req, http.StatusOK)
227229
assert.Equal(t, littleSize, resp.Length)
228230

231+
setting.CheckLFSVersion()
229232
if setting.LFS.StartServer {
230233
req = NewRequest(t, "GET", path.Join("/", username, reponame, "/media/branch/master/", littleLFS))
231234
resp = session.MakeRequestNilResponseRecorder(t, req, http.StatusOK)

integrations/lfs_getobject_test.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,11 @@ func storeObjectInRepo(t *testing.T, repositoryID int64, content *[]byte) string
5858

5959
func doLfs(t *testing.T, content *[]byte, expectGzip bool) {
6060
prepareTestEnv(t)
61+
setting.CheckLFSVersion()
62+
if !setting.LFS.StartServer {
63+
t.Skip()
64+
return
65+
}
6166
repo, err := models.GetRepositoryByOwnerAndName("user2", "repo1")
6267
assert.NoError(t, err)
6368
oid := storeObjectInRepo(t, repo.ID, content)

models/repo.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1054,7 +1054,7 @@ func CleanUpMigrateInfo(repo *Repository) (*Repository, error) {
10541054
}
10551055
}
10561056

1057-
_, err := git.NewCommand("remote", "remove", "origin").RunInDir(repoPath)
1057+
_, err := git.NewCommand("remote", "rm", "origin").RunInDir(repoPath)
10581058
if err != nil && !strings.HasPrefix(err.Error(), "exit status 128 - fatal: No such remote ") {
10591059
return repo, fmt.Errorf("CleanUpMigrateInfo: %v", err)
10601060
}

modules/git/repo_tree.go

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,13 @@
66
package git
77

88
import (
9+
"bytes"
910
"fmt"
1011
"os"
1112
"strings"
1213
"time"
14+
15+
"github.com/mcuadros/go-version"
1316
)
1417

1518
func (repo *Repository) getTree(id SHA1) (*Tree, error) {
@@ -61,6 +64,11 @@ type CommitTreeOpts struct {
6164

6265
// CommitTree creates a commit from a given tree id for the user with provided message
6366
func (repo *Repository) CommitTree(sig *Signature, tree *Tree, opts CommitTreeOpts) (SHA1, error) {
67+
binVersion, err := BinVersion()
68+
if err != nil {
69+
return SHA1{}, err
70+
}
71+
6472
commitTimeStr := time.Now().Format(time.RFC3339)
6573

6674
// Because this may call hooks we should pass in the environment
@@ -78,20 +86,24 @@ func (repo *Repository) CommitTree(sig *Signature, tree *Tree, opts CommitTreeOp
7886
cmd.AddArguments("-p", parent)
7987
}
8088

81-
cmd.AddArguments("-m", opts.Message)
89+
messageBytes := new(bytes.Buffer)
90+
_, _ = messageBytes.WriteString(opts.Message)
91+
_, _ = messageBytes.WriteString("\n")
8292

8393
if opts.KeyID != "" {
8494
cmd.AddArguments(fmt.Sprintf("-S%s", opts.KeyID))
8595
}
8696

87-
if opts.NoGPGSign {
97+
if version.Compare(binVersion, "2.0.0", ">=") && opts.NoGPGSign {
8898
cmd.AddArguments("--no-gpg-sign")
8999
}
90100

91-
res, err := cmd.RunInDirWithEnv(repo.Path, env)
101+
stdout := new(bytes.Buffer)
102+
stderr := new(bytes.Buffer)
103+
err = cmd.RunInDirTimeoutEnvFullPipeline(env, -1, repo.Path, stdout, stderr, messageBytes)
92104

93105
if err != nil {
94-
return SHA1{}, err
106+
return SHA1{}, concatenateError(err, stderr.String())
95107
}
96-
return NewIDFromString(strings.TrimSpace(res))
108+
return NewIDFromString(strings.TrimSpace(stdout.String()))
97109
}

modules/process/manager.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
// Copyright 2014 The Gogs Authors. All rights reserved.
2+
// Copyright 2019 The Gitea Authors. All rights reserved.
23
// Use of this source code is governed by a MIT-style
34
// license that can be found in the LICENSE file.
45

@@ -9,6 +10,7 @@ import (
910
"context"
1011
"errors"
1112
"fmt"
13+
"io"
1214
"os/exec"
1315
"sync"
1416
"time"
@@ -93,6 +95,14 @@ func (pm *Manager) ExecDir(timeout time.Duration, dir, desc, cmdName string, arg
9395
// Returns its complete stdout and stderr
9496
// outputs and an error, if any (including timeout)
9597
func (pm *Manager) ExecDirEnv(timeout time.Duration, dir, desc string, env []string, cmdName string, args ...string) (string, string, error) {
98+
return pm.ExecDirEnvStdIn(timeout, dir, desc, env, nil, cmdName, args...)
99+
}
100+
101+
// ExecDirEnvStdIn runs a command in given path and environment variables with provided stdIN, and waits for its completion
102+
// up to the given timeout (or DefaultTimeout if -1 is given).
103+
// Returns its complete stdout and stderr
104+
// outputs and an error, if any (including timeout)
105+
func (pm *Manager) ExecDirEnvStdIn(timeout time.Duration, dir, desc string, env []string, stdIn io.Reader, cmdName string, args ...string) (string, string, error) {
96106
if timeout == -1 {
97107
timeout = 60 * time.Second
98108
}
@@ -108,6 +118,10 @@ func (pm *Manager) ExecDirEnv(timeout time.Duration, dir, desc string, env []str
108118
cmd.Env = env
109119
cmd.Stdout = stdOut
110120
cmd.Stderr = stdErr
121+
if stdIn != nil {
122+
cmd.Stdin = stdIn
123+
}
124+
111125
if err := cmd.Start(); err != nil {
112126
return "", "", err
113127
}

modules/pull/merge.go

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -136,17 +136,21 @@ func Merge(pr *models.PullRequest, doer *models.User, baseGitRepo *git.Repositor
136136
return fmt.Errorf("Writing sparse-checkout file to %s: %v", sparseCheckoutListPath, err)
137137
}
138138

139-
gitConfigCommand := func() *git.Command {
139+
gitConfigCommand := func() func() *git.Command {
140140
binVersion, err := git.BinVersion()
141141
if err != nil {
142142
log.Fatal("Error retrieving git version: %v", err)
143143
}
144144

145-
if version.Compare(binVersion, "1.9.2", ">=") {
146-
return git.NewCommand("config", "--local")
145+
if version.Compare(binVersion, "1.8.0", ">=") {
146+
return func() *git.Command {
147+
return git.NewCommand("config", "--local")
148+
}
147149
}
148-
return git.NewCommand("config")
149-
}
150+
return func() *git.Command {
151+
return git.NewCommand("config")
152+
}
153+
}()
150154

151155
// Switch off LFS process (set required, clean and smudge here also)
152156
if err := gitConfigCommand().AddArguments("filter.lfs.process", "").RunInDirPipeline(tmpBasePath, nil, &errbuf); err != nil {

modules/repofiles/temp_repo.go

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import (
2020
"code.gitea.io/gitea/modules/log"
2121
"code.gitea.io/gitea/modules/process"
2222
"code.gitea.io/gitea/modules/setting"
23+
"github.com/mcuadros/go-version"
2324
)
2425

2526
// TemporaryUploadRepository is a type to wrap our upload repositories as a shallow clone
@@ -263,11 +264,15 @@ func (t *TemporaryUploadRepository) CommitTree(author, committer *models.User, t
263264
"GIT_COMMITTER_EMAIL="+committerSig.Email,
264265
"GIT_COMMITTER_DATE="+commitTimeStr,
265266
)
266-
commitHash, stderr, err := process.GetManager().ExecDirEnv(5*time.Minute,
267+
messageBytes := new(bytes.Buffer)
268+
_, _ = messageBytes.WriteString(message)
269+
_, _ = messageBytes.WriteString("\n")
270+
commitHash, stderr, err := process.GetManager().ExecDirEnvStdIn(5*time.Minute,
267271
t.basePath,
268272
fmt.Sprintf("commitTree (git commit-tree): %s", t.basePath),
269273
env,
270-
git.GitExecutable, "commit-tree", treeHash, "-p", "HEAD", "-m", message)
274+
messageBytes,
275+
git.GitExecutable, "commit-tree", treeHash, "-p", "HEAD")
271276
if err != nil {
272277
return "", fmt.Errorf("git commit-tree: %s", stderr)
273278
}
@@ -327,14 +332,26 @@ func (t *TemporaryUploadRepository) DiffIndex() (diff *models.Diff, err error) {
327332

328333
// CheckAttribute checks the given attribute of the provided files
329334
func (t *TemporaryUploadRepository) CheckAttribute(attribute string, args ...string) (map[string]map[string]string, error) {
335+
binVersion, err := git.BinVersion()
336+
if err != nil {
337+
log.Fatal("Error retrieving git version: %v", err)
338+
}
339+
330340
stdOut := new(bytes.Buffer)
331341
stdErr := new(bytes.Buffer)
332342

333343
timeout := 5 * time.Minute
334344
ctx, cancel := context.WithTimeout(context.Background(), timeout)
335345
defer cancel()
336346

337-
cmdArgs := []string{"check-attr", "-z", attribute, "--cached", "--"}
347+
cmdArgs := []string{"check-attr", "-z", attribute}
348+
349+
// git check-attr --cached first appears in git 1.8.0
350+
if version.Compare(binVersion, "1.8.0", ">=") {
351+
cmdArgs = append(cmdArgs, "--cached")
352+
}
353+
cmdArgs = append(cmdArgs, "--")
354+
338355
for _, arg := range args {
339356
if arg != "" {
340357
cmdArgs = append(cmdArgs, arg)
@@ -352,7 +369,7 @@ func (t *TemporaryUploadRepository) CheckAttribute(attribute string, args ...str
352369
}
353370

354371
pid := process.GetManager().Add(desc, cmd)
355-
err := cmd.Wait()
372+
err = cmd.Wait()
356373
process.GetManager().Remove(pid)
357374

358375
if err != nil {

modules/repofiles/update.go

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -313,12 +313,6 @@ func CreateOrUpdateRepoFile(repo *models.Repository, doer *models.User, opts *Up
313313
}
314314
}
315315

316-
// Check there is no way this can return multiple infos
317-
filename2attribute2info, err := t.CheckAttribute("filter", treePath)
318-
if err != nil {
319-
return nil, err
320-
}
321-
322316
content := opts.Content
323317
if bom {
324318
content = string(base.UTF8BOM) + content
@@ -341,16 +335,23 @@ func CreateOrUpdateRepoFile(repo *models.Repository, doer *models.User, opts *Up
341335
opts.Content = content
342336
var lfsMetaObject *models.LFSMetaObject
343337

344-
if setting.LFS.StartServer && filename2attribute2info[treePath] != nil && filename2attribute2info[treePath]["filter"] == "lfs" {
345-
// OK so we are supposed to LFS this data!
346-
oid, err := models.GenerateLFSOid(strings.NewReader(opts.Content))
338+
if setting.LFS.StartServer {
339+
// Check there is no way this can return multiple infos
340+
filename2attribute2info, err := t.CheckAttribute("filter", treePath)
347341
if err != nil {
348342
return nil, err
349343
}
350-
lfsMetaObject = &models.LFSMetaObject{Oid: oid, Size: int64(len(opts.Content)), RepositoryID: repo.ID}
351-
content = lfsMetaObject.Pointer()
352-
}
353344

345+
if filename2attribute2info[treePath] != nil && filename2attribute2info[treePath]["filter"] == "lfs" {
346+
// OK so we are supposed to LFS this data!
347+
oid, err := models.GenerateLFSOid(strings.NewReader(opts.Content))
348+
if err != nil {
349+
return nil, err
350+
}
351+
lfsMetaObject = &models.LFSMetaObject{Oid: oid, Size: int64(len(opts.Content)), RepositoryID: repo.ID}
352+
content = lfsMetaObject.Pointer()
353+
}
354+
}
354355
// Add the object to the database
355356
objectHash, err := t.HashObject(strings.NewReader(content))
356357
if err != nil {

modules/repofiles/upload.go

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -74,9 +74,12 @@ func UploadRepoFiles(repo *models.Repository, doer *models.User, opts *UploadRep
7474
infos[i] = uploadInfo{upload: upload}
7575
}
7676

77-
filename2attribute2info, err := t.CheckAttribute("filter", names...)
78-
if err != nil {
79-
return err
77+
var filename2attribute2info map[string]map[string]string
78+
if setting.LFS.StartServer {
79+
filename2attribute2info, err = t.CheckAttribute("filter", names...)
80+
if err != nil {
81+
return err
82+
}
8083
}
8184

8285
// Copy uploaded files into repository.
@@ -88,7 +91,7 @@ func UploadRepoFiles(repo *models.Repository, doer *models.User, opts *UploadRep
8891
defer file.Close()
8992

9093
var objectHash string
91-
if filename2attribute2info[uploadInfo.upload.Name] != nil && filename2attribute2info[uploadInfo.upload.Name]["filter"] == "lfs" {
94+
if setting.LFS.StartServer && filename2attribute2info[uploadInfo.upload.Name] != nil && filename2attribute2info[uploadInfo.upload.Name]["filter"] == "lfs" {
9295
// Handle LFS
9396
// FIXME: Inefficient! this should probably happen in models.Upload
9497
oid, err := models.GenerateLFSOid(file)

0 commit comments

Comments
 (0)