Merge branch 'jc/check-attr-honor-working-tree' into maint
authorJunio C Hamano <gitster@pobox.com>
Tue, 18 Mar 2014 21:03:03 +0000 (14:03 -0700)
committerJunio C Hamano <gitster@pobox.com>
Tue, 18 Mar 2014 21:03:03 +0000 (14:03 -0700)
"git check-attr" when working on a repository with a working tree
did not work well when the working tree was specified via the
--work-tree (and obviously with --git-dir) option.

* jc/check-attr-honor-working-tree:
check-attr: move to the top of working tree when in non-bare repository
t0003: do not chdir the whole test process

1  2 
builtin/check-attr.c
t/t0003-attributes.sh
diff --combined builtin/check-attr.c
index e9af7b2bfb932d75cdface880be9814885068a50,f29d6c33e90455a3e3c0d7d5f6316570f4f64c78..5600ec3f6165ae04682f30481142452438f856af
@@@ -13,14 -13,14 +13,14 @@@ N_("git check-attr --stdin [-z] [-a | -
  NULL
  };
  
 -static int null_term_line;
 +static int nul_term_line;
  
  static const struct option check_attr_options[] = {
 -      OPT_BOOLEAN('a', "all", &all_attrs, N_("report all attributes set on file")),
 -      OPT_BOOLEAN(0,  "cached", &cached_attrs, N_("use .gitattributes only from the index")),
 -      OPT_BOOLEAN(0 , "stdin", &stdin_paths, N_("read file names from stdin")),
 -      OPT_BOOLEAN('z', NULL, &null_term_line,
 -              N_("input paths are terminated by a null character")),
 +      OPT_BOOL('a', "all", &all_attrs, N_("report all attributes set on file")),
 +      OPT_BOOL(0,  "cached", &cached_attrs, N_("use .gitattributes only from the index")),
 +      OPT_BOOL(0 , "stdin", &stdin_paths, N_("read file names from stdin")),
 +      OPT_BOOL('z', NULL, &nul_term_line,
 +               N_("terminate input and output records by a NUL character")),
        OPT_END()
  };
  
@@@ -38,16 -38,8 +38,16 @@@ static void output_attr(int cnt, struc
                else if (ATTR_UNSET(value))
                        value = "unspecified";
  
 -              quote_c_style(file, NULL, stdout, 0);
 -              printf(": %s: %s\n", git_attr_name(check[j].attr), value);
 +              if (nul_term_line) {
 +                      printf("%s%c" /* path */
 +                             "%s%c" /* attrname */
 +                             "%s%c" /* attrvalue */,
 +                             file, 0, git_attr_name(check[j].attr), 0, value, 0);
 +              } else {
 +                      quote_c_style(file, NULL, stdout, 0);
 +                      printf(": %s: %s\n", git_attr_name(check[j].attr), value);
 +              }
 +
        }
  }
  
@@@ -73,7 -65,7 +73,7 @@@ static void check_attr_stdin_paths(cons
        struct git_attr_check *check)
  {
        struct strbuf buf, nbuf;
 -      int line_termination = null_term_line ? 0 : '\n';
 +      int line_termination = nul_term_line ? 0 : '\n';
  
        strbuf_init(&buf, 0);
        strbuf_init(&nbuf, 0);
@@@ -102,6 -94,9 +102,9 @@@ int cmd_check_attr(int argc, const cha
        struct git_attr_check *check;
        int cnt, i, doubledash, filei;
  
+       if (!is_bare_repository())
+               setup_work_tree();
        git_config(git_default_config, NULL);
  
        argc = parse_options(argc, argv, prefix, check_attr_options,
diff --combined t/t0003-attributes.sh
index b9d79476e20b4ddf0f9e85c672df2061fb910f9d,6e6aef598836b6405006390aac5c5f11901de54d..f0fbb425545019a6275a347a5826f6ba2977d394
@@@ -13,6 -13,7 +13,6 @@@ attr_check () 
        test_line_count = 0 err
  }
  
 -
  test_expect_success 'setup' '
        mkdir -p a/b/d a/c b &&
        (
@@@ -195,88 -196,58 +195,106 @@@ test_expect_success 'root subdir attrib
        attr_check subdir/a/i unspecified
  '
  
 +test_expect_success 'negative patterns' '
 +      echo "!f test=bar" >.gitattributes &&
 +      git check-attr test -- '"'"'!f'"'"' 2>errors &&
 +      test_i18ngrep "Negative patterns are ignored" errors
 +'
 +
 +test_expect_success 'patterns starting with exclamation' '
 +      echo "\!f test=foo" >.gitattributes &&
 +      attr_check "!f" foo
 +'
 +
 +test_expect_success '"**" test' '
 +      echo "**/f foo=bar" >.gitattributes &&
 +      cat <<\EOF >expect &&
 +f: foo: bar
 +a/f: foo: bar
 +a/b/f: foo: bar
 +a/b/c/f: foo: bar
 +EOF
 +      git check-attr foo -- "f" >actual 2>err &&
 +      git check-attr foo -- "a/f" >>actual 2>>err &&
 +      git check-attr foo -- "a/b/f" >>actual 2>>err &&
 +      git check-attr foo -- "a/b/c/f" >>actual 2>>err &&
 +      test_cmp expect actual &&
 +      test_line_count = 0 err
 +'
 +
 +test_expect_success '"**" with no slashes test' '
 +      echo "a**f foo=bar" >.gitattributes &&
 +      git check-attr foo -- "f" >actual &&
 +      cat <<\EOF >expect &&
 +f: foo: unspecified
 +af: foo: bar
 +axf: foo: bar
 +a/f: foo: unspecified
 +a/b/f: foo: unspecified
 +a/b/c/f: foo: unspecified
 +EOF
 +      git check-attr foo -- "f" >actual 2>err &&
 +      git check-attr foo -- "af" >>actual 2>err &&
 +      git check-attr foo -- "axf" >>actual 2>err &&
 +      git check-attr foo -- "a/f" >>actual 2>>err &&
 +      git check-attr foo -- "a/b/f" >>actual 2>>err &&
 +      git check-attr foo -- "a/b/c/f" >>actual 2>>err &&
 +      test_cmp expect actual &&
 +      test_line_count = 0 err
 +'
 +
+ test_expect_success 'using --git-dir and --work-tree' '
+       mkdir unreal real &&
+       git init real &&
+       echo "file test=in-real" >real/.gitattributes &&
+       (
+               cd unreal &&
+               attr_check file in-real "--git-dir ../real/.git --work-tree ../real"
+       )
+ '
  test_expect_success 'setup bare' '
-       git clone --bare . bare.git &&
-       cd bare.git
+       git clone --bare . bare.git
  '
  
  test_expect_success 'bare repository: check that .gitattribute is ignored' '
        (
-               echo "f test=f"
-               echo "a/i test=a/i"
-       ) >.gitattributes &&
-       attr_check f unspecified &&
-       attr_check a/f unspecified &&
-       attr_check a/c/f unspecified &&
-       attr_check a/i unspecified &&
-       attr_check subdir/a/i unspecified
+               cd bare.git &&
+               (
+                       echo "f test=f"
+                       echo "a/i test=a/i"
+               ) >.gitattributes &&
+               attr_check f unspecified &&
+               attr_check a/f unspecified &&
+               attr_check a/c/f unspecified &&
+               attr_check a/i unspecified &&
+               attr_check subdir/a/i unspecified
+       )
  '
  
  test_expect_success 'bare repository: check that --cached honors index' '
-       GIT_INDEX_FILE=../.git/index \
-       git check-attr --cached --stdin --all <../stdin-all |
-       sort >actual &&
-       test_cmp ../specified-all actual
+       (
+               cd bare.git &&
+               GIT_INDEX_FILE=../.git/index \
+               git check-attr --cached --stdin --all <../stdin-all |
+               sort >actual &&
+               test_cmp ../specified-all actual
+       )
  '
  
  test_expect_success 'bare repository: test info/attributes' '
        (
-               echo "f test=f"
-               echo "a/i test=a/i"
-       ) >info/attributes &&
-       attr_check f f &&
-       attr_check a/f f &&
-       attr_check a/c/f f &&
-       attr_check a/i a/i &&
-       attr_check subdir/a/i unspecified
+               cd bare.git &&
+               (
+                       echo "f test=f"
+                       echo "a/i test=a/i"
+               ) >info/attributes &&
+               attr_check f f &&
+               attr_check a/f f &&
+               attr_check a/c/f f &&
+               attr_check a/i a/i &&
+               attr_check subdir/a/i unspecified
+       )
  '
  
  test_done