aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--modules/git/attribute/checker.go7
-rw-r--r--modules/git/attribute/checker_test.go12
-rw-r--r--services/repository/files/upload.go7
3 files changed, 24 insertions, 2 deletions
diff --git a/modules/git/attribute/checker.go b/modules/git/attribute/checker.go
index c17006a154..167b31416e 100644
--- a/modules/git/attribute/checker.go
+++ b/modules/git/attribute/checker.go
@@ -39,7 +39,12 @@ func checkAttrCommand(gitRepo *git.Repository, treeish string, filenames, attrib
)
cancel = deleteTemporaryFile
}
- } // else: no treeish, assume it is a not a bare repo, read from working directory
+ } else {
+ // Read from existing index, in cases where the repo is bare and has an index,
+ // or the work tree contains unstaged changes that shouldn't affect the attribute check.
+ // It is caller's responsibility to add changed ".gitattributes" into the index if they want to respect the new changes.
+ cmd.AddArguments("--cached")
+ }
cmd.AddDynamicArguments(attributes...)
if len(filenames) > 0 {
diff --git a/modules/git/attribute/checker_test.go b/modules/git/attribute/checker_test.go
index 97db43460b..67fbda8918 100644
--- a/modules/git/attribute/checker_test.go
+++ b/modules/git/attribute/checker_test.go
@@ -57,8 +57,18 @@ func Test_Checker(t *testing.T) {
assert.Equal(t, expectedAttrs(), attrs["i-am-a-python.p"])
})
+ t.Run("Run git check-attr in bare repository using index", func(t *testing.T) {
+ attrs, err := CheckAttributes(t.Context(), gitRepo, "", CheckAttributeOpts{
+ Filenames: []string{"i-am-a-python.p"},
+ Attributes: LinguistAttributes,
+ })
+ assert.NoError(t, err)
+ assert.Len(t, attrs, 1)
+ assert.Equal(t, expectedAttrs(), attrs["i-am-a-python.p"])
+ })
+
if !git.DefaultFeatures().SupportCheckAttrOnBare {
- t.Skip("git version 2.40 is required to support run check-attr on bare repo")
+ t.Skip("git version 2.40 is required to support run check-attr on bare repo without using index")
return
}
diff --git a/services/repository/files/upload.go b/services/repository/files/upload.go
index f348cb68ab..68a071cd28 100644
--- a/services/repository/files/upload.go
+++ b/services/repository/files/upload.go
@@ -107,6 +107,7 @@ func UploadRepoFiles(ctx context.Context, repo *repo_model.Repository, doer *use
}
var attributesMap map[string]*attribute.Attributes
+ // when uploading to an empty repo, the old branch doesn't exist, but some "global gitattributes" or "info/attributes" may exist
if setting.LFS.StartServer {
attributesMap, err = attribute.CheckAttributes(ctx, t.gitRepo, "" /* use temp repo's working dir */, attribute.CheckAttributeOpts{
Attributes: []string{attribute.Filter},
@@ -118,6 +119,12 @@ func UploadRepoFiles(ctx context.Context, repo *repo_model.Repository, doer *use
}
// Copy uploaded files into repository.
+ // TODO: there is a small problem: when uploading LFS files with ".gitattributes", the "check-attr" runs before this loop,
+ // so LFS files are not able to be added as LFS objects. Ideally we need to do in 3 steps in the future:
+ // 1. Add ".gitattributes" to git index
+ // 2. Run "check-attr" (the previous attribute.CheckAttributes call)
+ // 3. Add files to git index (this loop)
+ // This problem is trivial so maybe no need to spend too much time on it at the moment.
for i := range infos {
if err := copyUploadedLFSFileIntoRepository(ctx, &infos[i], attributesMap, t, opts.TreePath); err != nil {
return err