]> git.ipfire.org Git - thirdparty/git.git/commitdiff
Merge branch 'jk/open-dotgitx-with-nofollow'
authorJunio C Hamano <gitster@pobox.com>
Mon, 22 Mar 2021 21:00:22 +0000 (14:00 -0700)
committerJunio C Hamano <gitster@pobox.com>
Mon, 22 Mar 2021 21:00:22 +0000 (14:00 -0700)
It does not make sense to make ".gitattributes", ".gitignore" and
".mailmap" symlinks, as they are supposed to be usable from the
object store (think: bare repositories where HEAD:.mailmap etc. are
used).  When these files are symbolic links, we used to read the
contents of the files pointed by them by mistake, which has been
corrected.

* jk/open-dotgitx-with-nofollow:
  mailmap: do not respect symlinks for in-tree .mailmap
  exclude: do not respect symlinks for in-tree .gitignore
  attr: do not respect symlinks for in-tree .gitattributes
  exclude: add flags parameter to add_patterns()
  attr: convert "macro_ok" into a flags field
  add open_nofollow() helper

1  2 
attr.c
dir.c
git-compat-util.h
mailmap.c
t/t0008-ignores.sh
t/t4203-mailmap.sh

diff --cc attr.c
index 59a8d8af1ae821223dd70fc61949406f1a384e4c,a28177915b489c17692959950700a87213651eb9..ac8ec7ce51e39e33dd47f561044b406616240155
--- 1/attr.c
--- 2/attr.c
+++ b/attr.c
@@@ -670,9 -674,10 +674,10 @@@ static struct attr_stack *read_attr_fro
        const char *line;
        int lineno = 0;
  
 -      res = xcalloc(1, sizeof(*res));
 +      CALLOC_ARRAY(res, 1);
        while ((line = *(list++)) != NULL)
-               handle_attr_line(res, line, "[builtin]", ++lineno, 1);
+               handle_attr_line(res, line, "[builtin]", ++lineno,
+                                READ_ATTR_MACRO_OK);
        return res;
  }
  
@@@ -705,9 -711,18 +711,18 @@@ static struct attr_stack *read_attr_fro
        char buf[2048];
        int lineno = 0;
  
-       if (!fp)
+       if (flags & READ_ATTR_NOFOLLOW)
+               fd = open_nofollow(path, O_RDONLY);
+       else
+               fd = open(path, O_RDONLY);
+       if (fd < 0) {
+               warn_on_fopen_errors(path);
                return NULL;
 -      res = xcalloc(1, sizeof(*res));
+       }
+       fp = xfdopen(fd, "r");
 +      CALLOC_ARRAY(res, 1);
        while (fgets(buf, sizeof(buf), fp)) {
                char *bufp = buf;
                if (!lineno)
diff --cc dir.c
Simple merge
Simple merge
diff --cc mailmap.c
index 183a2f65ee98d53704ee35ae1ec76f44b679a406,7ac966107ebab7fab8ad25fbc32d8e8f78a7c31c..d1f7c0d272d81ca00bfef33c80a02b9d7da997cf
+++ b/mailmap.c
@@@ -225,11 -235,12 +235,13 @@@ int read_mailmap(struct string_list *ma
        if (!git_mailmap_blob && is_bare_repository())
                git_mailmap_blob = "HEAD:.mailmap";
  
 -      err |= read_mailmap_file(map, ".mailmap",
 -                               startup_info->have_repository ?
 -                               MAILMAP_NOFOLLOW : 0);
 +      if (!startup_info->have_repository || !is_bare_repository())
-               err |= read_mailmap_file(map, ".mailmap");
++              err |= read_mailmap_file(map, ".mailmap",
++                                       startup_info->have_repository ?
++                                       MAILMAP_NOFOLLOW : 0);
        if (startup_info->have_repository)
                err |= read_mailmap_blob(map, git_mailmap_blob);
-       err |= read_mailmap_file(map, git_mailmap_file);
+       err |= read_mailmap_file(map, git_mailmap_file, 0);
        return err;
  }
  
Simple merge
index 93caf9a46d9ce7e729fb805629b611296efd972f,96a4e6132f082997b9e0e92da492765a3d636cda..d8e73742341117c1d480342478a88de7ab102f59
@@@ -889,47 -889,35 +889,78 @@@ test_expect_success 'empty syntax: setu
        test_cmp expect actual
  '
  
 +test_expect_success 'set up mailmap location tests' '
 +      git init --bare loc-bare &&
 +      git --git-dir=loc-bare --work-tree=. commit \
 +              --allow-empty -m foo --author="Orig <orig@example.com>" &&
 +      echo "New <new@example.com> <orig@example.com>" >loc-bare/.mailmap
 +'
 +
 +test_expect_success 'bare repo with --work-tree finds mailmap at top-level' '
 +      git -C loc-bare --work-tree=. log -1 --format=%aE >actual &&
 +      echo new@example.com >expect &&
 +      test_cmp expect actual
 +'
 +
 +test_expect_success 'bare repo does not look in current directory' '
 +      git -C loc-bare log -1 --format=%aE >actual &&
 +      echo orig@example.com >expect &&
 +      test_cmp expect actual
 +'
 +
 +test_expect_success 'non-git shortlog respects mailmap in current dir' '
 +      git --git-dir=loc-bare log -1 >input &&
 +      nongit cp "$TRASH_DIRECTORY/loc-bare/.mailmap" . &&
 +      nongit git shortlog -s <input >actual &&
 +      echo "     1    New" >expect &&
 +      test_cmp expect actual
 +'
 +
 +test_expect_success 'shortlog on stdin respects mailmap from repo' '
 +      cp loc-bare/.mailmap . &&
 +      git shortlog -s <input >actual &&
 +      echo "     1    New" >expect &&
 +      test_cmp expect actual
 +'
 +
 +test_expect_success 'find top-level mailmap from subdir' '
 +      git clone loc-bare loc-wt &&
 +      cp loc-bare/.mailmap loc-wt &&
 +      mkdir loc-wt/subdir &&
 +      git -C loc-wt/subdir log -1 --format=%aE >actual &&
 +      echo new@example.com >expect &&
 +      test_cmp expect actual
 +'
 +
+ test_expect_success SYMLINKS 'set up symlink tests' '
+       git commit --allow-empty -m foo --author="Orig <orig@example.com>" &&
+       echo "New <new@example.com> <orig@example.com>" >map &&
+       rm -f .mailmap
+ '
+ test_expect_success SYMLINKS 'symlinks respected in mailmap.file' '
+       test_when_finished "rm symlink" &&
+       ln -s map symlink &&
+       git -c mailmap.file="$(pwd)/symlink" log -1 --format=%aE >actual &&
+       echo "new@example.com" >expect &&
+       test_cmp expect actual
+ '
+ test_expect_success SYMLINKS 'symlinks respected in non-repo shortlog' '
+       git log -1 >input &&
+       test_when_finished "nongit rm .mailmap" &&
+       nongit ln -sf "$TRASH_DIRECTORY/map" .mailmap &&
+       nongit git shortlog -s <input >actual &&
+       echo "     1    New" >expect &&
+       test_cmp expect actual
+ '
+ test_expect_success SYMLINKS 'symlinks not respected in-tree' '
+       test_when_finished "rm .mailmap" &&
+       ln -s map .mailmap &&
+       git log -1 --format=%aE >actual &&
+       echo "orig@example.com" >expect&&
+       test_cmp expect actual
+ '
  test_done