aboutsummaryrefslogtreecommitdiff
path: root/sha1_name.c
diff options
context:
space:
mode:
authorJunio C Hamano <gitster@pobox.com>2013-07-12 10:09:50 -0700
committerJunio C Hamano <gitster@pobox.com>2013-07-12 10:09:50 -0700
commitee6e5843c11ca5cba0d5ce964325a3b529299e0d (patch)
treeb55e9ef8df9450ae6c760132fd4aa3f7277e4f7c /sha1_name.c
parent8b8dfd5132ce91f632b5303c39cda2dfe30790f1 (diff)
parent798c35fcd8a71a094ca68ac05d81e08c5ac8166d (diff)
downloadgit-ee6e5843c11ca5cba0d5ce964325a3b529299e0d.tar.gz
git-ee6e5843c11ca5cba0d5ce964325a3b529299e0d.tar.xz
Merge branch 'nd/warn-ambiguous-object-name' into jk/cat-file-batch-optim
* nd/warn-ambiguous-object-name: get_sha1: warn about full or short object names that look like refs
Diffstat (limited to 'sha1_name.c')
-rw-r--r--sha1_name.c25
1 files changed, 23 insertions, 2 deletions
diff --git a/sha1_name.c b/sha1_name.c
index 3820f28ae..a1e0f804d 100644
--- a/sha1_name.c
+++ b/sha1_name.c
@@ -435,12 +435,31 @@ static int get_sha1_1(const char *name, int len, unsigned char *sha1, unsigned l
static int get_sha1_basic(const char *str, int len, unsigned char *sha1)
{
static const char *warn_msg = "refname '%.*s' is ambiguous.";
+ static const char *object_name_msg = N_(
+ "Git normally never creates a ref that ends with 40 hex characters\n"
+ "because it will be ignored when you just specify 40-hex. These refs\n"
+ "may be created by mistake. For example,\n"
+ "\n"
+ " git checkout -b $br $(git rev-parse ...)\n"
+ "\n"
+ "where \"$br\" is somehow empty and a 40-hex ref is created. Please\n"
+ "examine these refs and maybe delete them. Turn this message off by\n"
+ "running \"git config advice.object_name_warning false\"");
+ unsigned char tmp_sha1[20];
char *real_ref = NULL;
int refs_found = 0;
int at, reflog_len;
- if (len == 40 && !get_sha1_hex(str, sha1))
+ if (len == 40 && !get_sha1_hex(str, sha1)) {
+ refs_found = dwim_ref(str, len, tmp_sha1, &real_ref);
+ if (refs_found > 0 && warn_ambiguous_refs) {
+ warning(warn_msg, len, str);
+ if (advice_object_name_warning)
+ fprintf(stderr, "%s\n", _(object_name_msg));
+ }
+ free(real_ref);
return 0;
+ }
/* basic@{time or number or -number} format to query ref-log */
reflog_len = at = 0;
@@ -481,7 +500,9 @@ static int get_sha1_basic(const char *str, int len, unsigned char *sha1)
if (!refs_found)
return -1;
- if (warn_ambiguous_refs && refs_found > 1)
+ if (warn_ambiguous_refs &&
+ (refs_found > 1 ||
+ !get_short_sha1(str, len, tmp_sha1, GET_SHA1_QUIETLY)))
warning(warn_msg, len, str);
if (reflog_len) {