diff options
author | Felipe Contreras <felipe.contreras@gmail.com> | 2013-05-07 17:04:30 -0500 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2013-05-08 12:13:12 -0700 |
commit | 7a0a49a7ca787433255280b66e7652b56f7beb6e (patch) | |
tree | 46573322a5d99e78ed729b843134edd8059fc169 /sha1_name.c | |
parent | 83d16bc7bec92ea3f705f559c5a13589cb7c1f92 (diff) | |
download | git-7a0a49a7ca787433255280b66e7652b56f7beb6e.tar.gz |
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.c | 42 |
1 files changed, 23 insertions, 19 deletions
diff --git a/sha1_name.c b/sha1_name.c index 446cc62c4e..f60c951234 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) |