Merge branch 'st/tag'
authorJunio C Hamano <gitster@pobox.com>
Thu, 13 Nov 2008 05:49:25 +0000 (21:49 -0800)
committerJunio C Hamano <gitster@pobox.com>
Thu, 13 Nov 2008 05:49:25 +0000 (21:49 -0800)
* st/tag:
tag: Add more tests about mixing incompatible modes and options
tag: Check that options are only allowed in the appropriate mode

1  2 
builtin-tag.c
t/t7004-tag.sh
diff --combined builtin-tag.c
index 84db156e63681de6322019b9b9ffa15371c443b1,50cafc814d3774bf358288c23cafbf2cbcecf673..d339971fab896bda0297f04a4f3961bae27b21be
@@@ -125,7 -125,7 +125,7 @@@ static int for_each_tag_name(const cha
  static int delete_tag(const char *name, const char *ref,
                                const unsigned char *sha1)
  {
 -      if (delete_ref(ref, sha1))
 +      if (delete_ref(ref, sha1, 0))
                return 1;
        printf("Deleted tag '%s'\n", name);
        return 0;
@@@ -283,7 -283,7 +283,7 @@@ static void create_tag(const unsigned c
                int fd;
  
                /* write the template message before editing: */
 -              path = xstrdup(git_path("TAG_EDITMSG"));
 +              path = git_pathdup("TAG_EDITMSG");
                fd = open(path, O_CREAT | O_TRUNC | O_WRONLY, 0600);
                if (fd < 0)
                        die("could not create file '%s': %s",
@@@ -338,13 -338,13 +338,13 @@@ static int parse_msg_arg(const struct o
  
  int cmd_tag(int argc, const char **argv, const char *prefix)
  {
 -      struct strbuf buf;
 +      struct strbuf buf = STRBUF_INIT;
        unsigned char object[20], prev[20];
        char ref[PATH_MAX];
        const char *object_ref, *tag;
        struct ref_lock *lock;
  
-       int annotate = 0, sign = 0, force = 0, lines = 0,
+       int annotate = 0, sign = 0, force = 0, lines = -1,
                list = 0, delete = 0, verify = 0;
        const char *msgfile = NULL, *keyid = NULL;
        struct msg_arg msg = { 0, STRBUF_INIT };
        }
        if (sign)
                annotate = 1;
+       if (argc == 0 && !(delete || verify))
+               list = 1;
  
+       if ((annotate || msg.given || msgfile || force) &&
+           (list || delete || verify))
+               usage_with_options(git_tag_usage, options);
+       if (list + delete + verify > 1)
+               usage_with_options(git_tag_usage, options);
        if (list)
-               return list_tags(argv[0], lines);
+               return list_tags(argv[0], lines == -1 ? 0 : lines);
+       if (lines != -1)
+               die("-n option is only allowed with -l.");
        if (delete)
                return for_each_tag_name(argv, delete_tag);
        if (verify)
                return for_each_tag_name(argv, verify_tag);
  
 -      strbuf_init(&buf, 0);
        if (msg.given || msgfile) {
                if (msg.given && msgfile)
                        die("only one -F or -m option is allowed.");
                }
        }
  
-       if (argc == 0) {
-               if (annotate)
-                       usage_with_options(git_tag_usage, options);
-               return list_tags(NULL, lines);
-       }
        tag = argv[0];
  
        object_ref = argc == 2 ? argv[1] : "HEAD";
diff --combined t/t7004-tag.sh
index f0edbf1a76739177943006461b853ec17e8bbb2b,c616deb0d0315acc41da93a81145494bc9f455c1..f377fea4bb1d32c95096defb9fb08b291b67dbff
@@@ -625,7 -625,7 +625,7 @@@ esa
  # Name and email: C O Mitter <committer@example.com>
  # No password given, to enable non-interactive operation.
  
 -cp -R ../t7004 ./gpghome
 +cp -R "$TEST_DIRECTORY"/t7004 ./gpghome
  chmod 0700 gpghome
  GNUPGHOME="$(pwd)/gpghome"
  export GNUPGHOME
@@@ -1090,4 -1090,15 +1090,15 @@@ test_expect_success 'filename for the m
        git cat-file tag tag-from-subdir-2 | grep "in sub directory"
  '
  
+ # mixing modes and options:
+ test_expect_success 'mixing incompatibles modes and options is forbidden' '
+       test_must_fail git tag -a
+       test_must_fail git tag -l -v
+       test_must_fail git tag -n 100
+       test_must_fail git tag -l -m msg
+       test_must_fail git tag -l -F some file
+       test_must_fail git tag -v -s
+ '
  test_done