author | Junio C Hamano <gitster@pobox.com> | |
Thu, 30 Jun 2011 00:03:12 +0000 (17:03 -0700) | ||
committer | Junio C Hamano <gitster@pobox.com> | |
Thu, 30 Jun 2011 00:03:12 +0000 (17:03 -0700) |
* jc/maint-1.7.3-checkout-describe:
checkout -b <name>: correctly detect existing branch
checkout -b <name>: correctly detect existing branch
builtin/checkout.c | patch | blob | history | |
refs.c | patch | blob | history | |
refs.h | patch | blob | history | |
t/t2018-checkout-branch.sh | patch | blob | history |
diff --git a/builtin/checkout.c b/builtin/checkout.c
index 015730fbd5c66eb60c3999ffbfaf33f07b841315..f152adf9ab71287e02e9e85c0b84aae096e5bec7 100644 (file)
--- a/builtin/checkout.c
+++ b/builtin/checkout.c
if (strbuf_check_branch_ref(&buf, opts.new_branch))
die(_("git checkout: we do not like '%s' as a branch name."),
opts.new_branch);
- if (!get_sha1(buf.buf, rev)) {
+ if (ref_exists(buf.buf)) {
opts.branch_exists = 1;
if (!opts.new_branch_force)
die(_("git checkout: branch %s already exists"),
index b10419a69815ef1c005915f3606c992659e60c77..3a8789d3857d17a3a0a94ba2750e9f22857b8667 100644 (file)
--- a/refs.c
+++ b/refs.c
return 0;
}
+int ref_exists(char *refname)
+{
+ unsigned char sha1[20];
+ return !!resolve_ref(refname, sha1, 1, NULL);
+}
+
struct ref *find_ref_by_name(const struct ref *list, const char *name)
{
for ( ; list; list = list->next)
index 5e7a9a59f5f6b687d15eb37a11696433bdc8f15c..5de06e57e7a9644a7dd51832552e9d1afa53c8cd 100644 (file)
--- a/refs.h
+++ b/refs.h
*/
extern void add_extra_ref(const char *refname, const unsigned char *sha1, int flags);
extern void clear_extra_refs(void);
+extern int ref_exists(char *);
extern int peel_ref(const char *, unsigned char *);
index fa69016381b0196c49472af51e36948ec7c5a2a9..a42e03967b1df3001df24089f2c50008c092ac51 100755 (executable)
@@ -169,4 +169,15 @@ test_expect_success 'checkout -f -B to an existing branch with mergeable changes
test_must_fail test_dirty_mergeable
'
+test_expect_success 'checkout -b <describe>' '
+ git tag -f -m "First commit" initial initial &&
+ git checkout -f change1 &&
+ name=$(git describe) &&
+ git checkout -b $name &&
+ git diff --exit-code change1 &&
+ echo "refs/heads/$name" >expect &&
+ git symbolic-ref HEAD >actual &&
+ test_cmp expect actual
+'
+
test_done