summaryrefslogtreecommitdiff
path: root/sha1_name.c
diff options
context:
space:
mode:
authorFelipe Contreras <felipe.contreras@gmail.com>2013-05-07 22:04:30 (GMT)
committerJunio C Hamano <gitster@pobox.com>2013-05-08 19:13:12 (GMT)
commit7a0a49a7ca787433255280b66e7652b56f7beb6e (patch)
tree46573322a5d99e78ed729b843134edd8059fc169 /sha1_name.c
parent83d16bc7bec92ea3f705f559c5a13589cb7c1f92 (diff)
downloadgit-7a0a49a7ca787433255280b66e7652b56f7beb6e.zip
git-7a0a49a7ca787433255280b66e7652b56f7beb6e.tar.gz
git-7a0a49a7ca787433255280b66e7652b56f7beb6e.tar.bz2
sha1_name: refactor reinterpret()
This code essentially replaces part of ref with another ref, for example '@{-1}@{u}' is replaced with 'master@{u}', but this can be reused for other purposes other than nth prior checkouts. Signed-off-by: Felipe Contreras <felipe.contreras@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'sha1_name.c')
-rw-r--r--sha1_name.c42
1 files changed, 23 insertions, 19 deletions
diff --git a/sha1_name.c b/sha1_name.c
index 446cc62..f60c951 100644
--- a/sha1_name.c
+++ b/sha1_name.c
@@ -972,6 +972,27 @@ int get_sha1_mb(const char *name, unsigned char *sha1)
return st;
}
+static int reinterpret(const char *name, int namelen, int len, struct strbuf *buf)
+{
+ /* we have extra data, which might need further processing */
+ struct strbuf tmp = STRBUF_INIT;
+ int used = buf->len;
+ int ret;
+
+ strbuf_add(buf, name + len, namelen - len);
+ ret = interpret_branch_name(buf->buf, &tmp);
+ /* that data was not interpreted, remove our cruft */
+ if (ret < 0) {
+ strbuf_setlen(buf, used);
+ return len;
+ }
+ strbuf_reset(buf);
+ strbuf_addbuf(buf, &tmp);
+ strbuf_release(&tmp);
+ /* tweak for size of {-N} versus expanded ref name */
+ return ret - used + len;
+}
+
/*
* This reads short-hand syntax that not only evaluates to a commit
* object name, but also can act as if the end user spelled the name
@@ -1005,25 +1026,8 @@ int interpret_branch_name(const char *name, struct strbuf *buf)
return len; /* syntax Ok, not enough switches */
if (0 < len && len == namelen)
return len; /* consumed all */
- else if (0 < len) {
- /* we have extra data, which might need further processing */
- struct strbuf tmp = STRBUF_INIT;
- int used = buf->len;
- int ret;
-
- strbuf_add(buf, name + len, namelen - len);
- ret = interpret_branch_name(buf->buf, &tmp);
- /* that data was not interpreted, remove our cruft */
- if (ret < 0) {
- strbuf_setlen(buf, used);
- return len;
- }
- strbuf_reset(buf);
- strbuf_addbuf(buf, &tmp);
- strbuf_release(&tmp);
- /* tweak for size of {-N} versus expanded ref name */
- return ret - used + len;
- }
+ else if (0 < len)
+ return reinterpret(name, namelen, len, buf);
cp = strchr(name, '@');
if (!cp)