Merge branch 'dl/format-patch-notes-config'
authorJunio C Hamano <gitster@pobox.com>
Thu, 13 Jun 2019 20:19:42 +0000 (13:19 -0700)
committerJunio C Hamano <gitster@pobox.com>
Thu, 13 Jun 2019 20:19:42 +0000 (13:19 -0700)
"git format-patch" learns a configuration to set the default for
its --notes=<ref> option.

* dl/format-patch-notes-config:
format-patch: teach format.notes config option
git-format-patch.txt: document --no-notes option

1  2 
builtin/log.c
t/t4014-format-patch.sh
diff --combined builtin/log.c
index 147850dc731776f6da554435d80ff4dffbb27791,dad63cffc63eaac157f749de2379ac58e77cae76..7c8767d3bc781e132fdcb54edbfab2c856380e62
@@@ -779,6 -779,8 +779,8 @@@ enum 
  
  static int git_format_config(const char *var, const char *value, void *cb)
  {
+       struct rev_info *rev = cb;
        if (!strcmp(var, "format.headers")) {
                if (!value)
                        die(_("format.headers without value"));
                        from = NULL;
                return 0;
        }
+       if (!strcmp(var, "format.notes")) {
+               struct strbuf buf = STRBUF_INIT;
+               int b = git_parse_maybe_bool(value);
+               if (!b)
+                       return 0;
+               rev->show_notes = 1;
+               if (b < 0) {
+                       strbuf_addstr(&buf, value);
+                       expand_notes_ref(&buf);
+                       string_list_append(&rev->notes_opt.extra_notes_refs,
+                                       strbuf_detach(&buf, NULL));
+               } else {
+                       rev->notes_opt.use_default_notes = 1;
+               }
+               return 0;
+       }
  
        return git_log_config(var, value, cb);
  }
@@@ -1435,7 -1453,7 +1453,7 @@@ static void prepare_bases(struct base_t
                struct object_id *patch_id;
                if (*commit_base_at(&commit_base, commit))
                        continue;
 -              if (commit_patch_id(commit, &diffopt, &oid, 0))
 +              if (commit_patch_id(commit, &diffopt, &oid, 0, 1))
                        die(_("cannot get patch id"));
                ALLOC_GROW(bases->patch_id, bases->nr_patch_id + 1, bases->alloc_patch_id);
                patch_id = bases->patch_id + bases->nr_patch_id;
@@@ -1617,8 -1635,8 +1635,8 @@@ int cmd_format_patch(int argc, const ch
        extra_to.strdup_strings = 1;
        extra_cc.strdup_strings = 1;
        init_log_defaults();
-       git_config(git_format_config, NULL);
        repo_init_revisions(the_repository, &rev, prefix);
+       git_config(git_format_config, &rev);
        rev.commit_format = CMIT_FMT_EMAIL;
        rev.expand_tabs_in_log_default = 0;
        rev.verbose_header = 1;
diff --combined t/t4014-format-patch.sh
index 7a5833a4b275473be0095140b92a4946cc9a4e09,4d5719fe2c1fec661f33bd927dd02c6769f68e45..ca7debf1d4c0b5f73301b2f8a35490b77c167a61
@@@ -36,27 -36,8 +36,27 @@@ test_expect_success setup 
        git checkout master &&
        git diff-tree -p C2 | git apply --index &&
        test_tick &&
 -      git commit -m "Master accepts moral equivalent of #2"
 +      git commit -m "Master accepts moral equivalent of #2" &&
  
 +      git checkout side &&
 +      git checkout -b patchid &&
 +      for i in 5 6 1 2 3 A 4 B C 7 8 9 10 D E F; do echo "$i"; done >file2 &&
 +      for i in 1 2 3 A 4 B C 7 8 9 10 D E F 5 6; do echo "$i"; done >file3 &&
 +      for i in 8 9 10; do echo "$i"; done >file &&
 +      git add file file2 file3 &&
 +      test_tick &&
 +      git commit -m "patchid 1" &&
 +      for i in 4 A B 7 8 9 10; do echo "$i"; done >file2 &&
 +      for i in 8 9 10 5 6; do echo "$i"; done >file3 &&
 +      git add file2 file3 &&
 +      test_tick &&
 +      git commit -m "patchid 2" &&
 +      for i in 10 5 6; do echo "$i"; done >file &&
 +      git add file &&
 +      test_tick &&
 +      git commit -m "patchid 3" &&
 +
 +      git checkout master
  '
  
  test_expect_success "format-patch --ignore-if-in-upstream" '
@@@ -757,6 -738,76 +757,76 @@@ test_expect_success 'format-patch --not
        sed "1,/^---$/d" out | grep "test message"
  '
  
+ test_expect_success 'format-patch notes output control' '
+       git notes add -m "notes config message" HEAD &&
+       test_when_finished git notes remove HEAD &&
+       git format-patch -1 --stdout >out &&
+       ! grep "notes config message" out &&
+       git format-patch -1 --stdout --notes >out &&
+       grep "notes config message" out &&
+       git format-patch -1 --stdout --no-notes >out &&
+       ! grep "notes config message" out &&
+       git format-patch -1 --stdout --notes --no-notes >out &&
+       ! grep "notes config message" out &&
+       git format-patch -1 --stdout --no-notes --notes >out &&
+       grep "notes config message" out &&
+       test_config format.notes true &&
+       git format-patch -1 --stdout >out &&
+       grep "notes config message" out &&
+       git format-patch -1 --stdout --notes >out &&
+       grep "notes config message" out &&
+       git format-patch -1 --stdout --no-notes >out &&
+       ! grep "notes config message" out &&
+       git format-patch -1 --stdout --notes --no-notes >out &&
+       ! grep "notes config message" out &&
+       git format-patch -1 --stdout --no-notes --notes >out &&
+       grep "notes config message" out
+ '
+ test_expect_success 'format-patch with multiple notes refs' '
+       git notes --ref note1 add -m "this is note 1" HEAD &&
+       test_when_finished git notes --ref note1 remove HEAD &&
+       git notes --ref note2 add -m "this is note 2" HEAD &&
+       test_when_finished git notes --ref note2 remove HEAD &&
+       git format-patch -1 --stdout >out &&
+       ! grep "this is note 1" out &&
+       ! grep "this is note 2" out &&
+       git format-patch -1 --stdout --notes=note1 >out &&
+       grep "this is note 1" out &&
+       ! grep "this is note 2" out &&
+       git format-patch -1 --stdout --notes=note2 >out &&
+       ! grep "this is note 1" out &&
+       grep "this is note 2" out &&
+       git format-patch -1 --stdout --notes=note1 --notes=note2 >out &&
+       grep "this is note 1" out &&
+       grep "this is note 2" out &&
+       test_config format.notes note1 &&
+       git format-patch -1 --stdout >out &&
+       grep "this is note 1" out &&
+       ! grep "this is note 2" out &&
+       git format-patch -1 --stdout --no-notes >out &&
+       ! grep "this is note 1" out &&
+       ! grep "this is note 2" out &&
+       git format-patch -1 --stdout --notes=note2 >out &&
+       grep "this is note 1" out &&
+       grep "this is note 2" out &&
+       git format-patch -1 --stdout --no-notes --notes=note2 >out &&
+       ! grep "this is note 1" out &&
+       grep "this is note 2" out &&
+       git config --add format.notes note2 &&
+       git format-patch -1 --stdout >out &&
+       grep "this is note 1" out &&
+       grep "this is note 2" out &&
+       git format-patch -1 --stdout --no-notes >out &&
+       ! grep "this is note 1" out &&
+       ! grep "this is note 2" out
+ '
  echo "fatal: --name-only does not make sense" > expect.name-only
  echo "fatal: --name-status does not make sense" > expect.name-status
  echo "fatal: --check does not make sense" > expect.check
@@@ -1578,7 -1629,7 +1648,7 @@@ test_expect_success 'format-patch -o ov
  '
  
  test_expect_success 'format-patch --base' '
 -      git checkout side &&
 +      git checkout patchid &&
        git format-patch --stdout --base=HEAD~3 -1 | tail -n 7 >actual1 &&
        git format-patch --stdout --base=HEAD~3 HEAD~.. | tail -n 7 >actual2 &&
        echo >expected &&
        echo "prerequisite-patch-id: $(git show --patch HEAD~1 | git patch-id --stable | awk "{print \$1}")" >>expected &&
        signature >> expected &&
        test_cmp expected actual1 &&
 -      test_cmp expected actual2
 +      test_cmp expected actual2 &&
 +      echo >fail &&
 +      echo "base-commit: $(git rev-parse HEAD~3)" >>fail &&
 +      echo "prerequisite-patch-id: $(git show --patch HEAD~2 | git patch-id --unstable | awk "{print \$1}")" >>fail &&
 +      echo "prerequisite-patch-id: $(git show --patch HEAD~1 | git patch-id --unstable | awk "{print \$1}")" >>fail &&
 +      signature >> fail &&
 +      ! test_cmp fail actual1 &&
 +      ! test_cmp fail actual2
  '
  
  test_expect_success 'format-patch --base errors out when base commit is in revision list' '