Felipe Contreras <felipe.contreras@xxxxxxxxx> writes: > 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@xxxxxxxxx> > --- Makes sense. > sha1_name.c | 42 +++++++++++++++++++++++------------------- > 1 file changed, 23 insertions(+), 19 deletions(-) > > diff --git a/sha1_name.c b/sha1_name.c > index 93c4e8c..76e3219 100644 > --- a/sha1_name.c > +++ b/sha1_name.c > @@ -965,6 +965,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 > @@ -998,25 +1019,8 @@ int interpret_branch_name(const char *name, struct strbuf *buf) > return len; /* syntax Ok, not enough switches */ > if (len > 0 && len == namelen) > return len; /* consumed all */ > - else if (len > 0) { > - /* 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 (len > 0) > + return reinterpret(name, namelen, len, buf); > > cp = strchr(name, '@'); > if (!cp) -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html