提交 eea9c1e7 编写于 作者: D Denton Liu 提交者: Junio C Hamano

tag: advise on nested tags

Robert Dailey reported confusion on the mailing list about a nested
tag which was most likely created by mistake. Jeff King noted that
this isn't a very common case and creating a tag-to-a-tag can be a
user-error.

Suggest that it may be a mistake with an advice message when
creating such a tag.  Those who do want to create a tag that point
at another tag regularly can turn it off with the usual advice
mechanism.
Reported-by: NRobert Dailey <rcdailey.lists@gmail.com>
Helped-by: NJeff King <peff@peff.net>
Helped-by: NÆvar Arnfjörð Bjarmason <avarab@gmail.com>
Signed-off-by: NDenton Liu <liu.denton@gmail.com>
[jc: fixed test style and tweaked the log message]
Signed-off-by: NJunio C Hamano <gitster@pobox.com>
上级 01dc801a
...@@ -90,4 +90,6 @@ advice.*:: ...@@ -90,4 +90,6 @@ advice.*::
waitingForEditor:: waitingForEditor::
Print a message to the terminal whenever Git is waiting for Print a message to the terminal whenever Git is waiting for
editor input from the user. editor input from the user.
nestedTag::
Advice shown if a user attempts to recursively tag a tag object.
-- --
...@@ -26,6 +26,7 @@ int advice_ignored_hook = 1; ...@@ -26,6 +26,7 @@ int advice_ignored_hook = 1;
int advice_waiting_for_editor = 1; int advice_waiting_for_editor = 1;
int advice_graft_file_deprecated = 1; int advice_graft_file_deprecated = 1;
int advice_checkout_ambiguous_remote_branch_name = 1; int advice_checkout_ambiguous_remote_branch_name = 1;
int advice_nested_tag = 1;
static int advice_use_color = -1; static int advice_use_color = -1;
static char advice_colors[][COLOR_MAXLEN] = { static char advice_colors[][COLOR_MAXLEN] = {
...@@ -81,6 +82,7 @@ static struct { ...@@ -81,6 +82,7 @@ static struct {
{ "waitingForEditor", &advice_waiting_for_editor }, { "waitingForEditor", &advice_waiting_for_editor },
{ "graftFileDeprecated", &advice_graft_file_deprecated }, { "graftFileDeprecated", &advice_graft_file_deprecated },
{ "checkoutAmbiguousRemoteBranchName", &advice_checkout_ambiguous_remote_branch_name }, { "checkoutAmbiguousRemoteBranchName", &advice_checkout_ambiguous_remote_branch_name },
{ "nestedTag", &advice_nested_tag },
/* make this an alias for backward compatibility */ /* make this an alias for backward compatibility */
{ "pushNonFastForward", &advice_push_update_rejected } { "pushNonFastForward", &advice_push_update_rejected }
......
...@@ -26,6 +26,7 @@ extern int advice_ignored_hook; ...@@ -26,6 +26,7 @@ extern int advice_ignored_hook;
extern int advice_waiting_for_editor; extern int advice_waiting_for_editor;
extern int advice_graft_file_deprecated; extern int advice_graft_file_deprecated;
extern int advice_checkout_ambiguous_remote_branch_name; extern int advice_checkout_ambiguous_remote_branch_name;
extern int advice_nested_tag;
int git_default_advice_config(const char *var, const char *value); int git_default_advice_config(const char *var, const char *value);
__attribute__((format (printf, 1, 2))) __attribute__((format (printf, 1, 2)))
......
...@@ -206,7 +206,14 @@ struct create_tag_options { ...@@ -206,7 +206,14 @@ struct create_tag_options {
} cleanup_mode; } cleanup_mode;
}; };
static void create_tag(const struct object_id *object, const char *tag, static const char message_advice_nested_tag[] =
N_("You have created a nested tag. The object referred to by your new is\n"
"already a tag. If you meant to tag the object that it points to, use:\n"
"\n"
"\tgit tag -f %s %s^{}");
static void create_tag(const struct object_id *object, const char *object_ref,
const char *tag,
struct strbuf *buf, struct create_tag_options *opt, struct strbuf *buf, struct create_tag_options *opt,
struct object_id *prev, struct object_id *result) struct object_id *prev, struct object_id *result)
{ {
...@@ -218,6 +225,9 @@ static void create_tag(const struct object_id *object, const char *tag, ...@@ -218,6 +225,9 @@ static void create_tag(const struct object_id *object, const char *tag,
if (type <= OBJ_NONE) if (type <= OBJ_NONE)
die(_("bad object type.")); die(_("bad object type."));
if (type == OBJ_TAG && advice_nested_tag)
advise(_(message_advice_nested_tag), tag, object_ref);
strbuf_addf(&header, strbuf_addf(&header,
"object %s\n" "object %s\n"
"type %s\n" "type %s\n"
...@@ -551,7 +561,7 @@ int cmd_tag(int argc, const char **argv, const char *prefix) ...@@ -551,7 +561,7 @@ int cmd_tag(int argc, const char **argv, const char *prefix)
if (create_tag_object) { if (create_tag_object) {
if (force_sign_annotate && !annotate) if (force_sign_annotate && !annotate)
opt.sign = 1; opt.sign = 1;
create_tag(&object, tag, &buf, &opt, &prev, &object); create_tag(&object, object_ref, tag, &buf, &opt, &prev, &object);
} }
transaction = ref_transaction_begin(&err); transaction = ref_transaction_begin(&err);
......
...@@ -1700,6 +1700,17 @@ test_expect_success '--points-at finds annotated tags of tags' ' ...@@ -1700,6 +1700,17 @@ test_expect_success '--points-at finds annotated tags of tags' '
test_cmp expect actual test_cmp expect actual
' '
test_expect_success 'recursive tagging should give advice' '
sed -e "s/|$//" <<-EOF >expect &&
hint: You have created a nested tag. The object referred to by your new is
hint: already a tag. If you meant to tag the object that it points to, use:
hint: |
hint: git tag -f nested annotated-v4.0^{}
EOF
git tag -m nested nested annotated-v4.0 2>actual &&
test_i18ncmp expect actual
'
test_expect_success 'multiple --points-at are OR-ed together' ' test_expect_success 'multiple --points-at are OR-ed together' '
cat >expect <<-\EOF && cat >expect <<-\EOF &&
v2.0 v2.0
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册