Previously interpret_branch_name would see @{-1} and stop parsing, leaving the @{u} as cruft that provoked an error. Instead, we should recurse if there is more to parse. Signed-off-by: Jeff King <peff@xxxxxxxx> --- A straight repost of the previous "how about this" patch, but marking successful tests. sha1_name.c | 24 ++++++++++++++++++++++-- t/t1508-at-combinations.sh | 4 ++-- 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/sha1_name.c b/sha1_name.c index c7f1510..00fc415 100644 --- a/sha1_name.c +++ b/sha1_name.c @@ -881,8 +881,28 @@ int interpret_branch_name(const char *name, struct strbuf *buf) if (!len) return len; /* syntax Ok, not enough switches */ - if (0 < len) - return len; /* consumed from the front */ + 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; + } + cp = strchr(name, '@'); if (!cp) return -1; diff --git a/t/t1508-at-combinations.sh b/t/t1508-at-combinations.sh index 59f0463..2a46af2 100755 --- a/t/t1508-at-combinations.sh +++ b/t/t1508-at-combinations.sh @@ -43,8 +43,8 @@ check "@{-1}" old-two check "@{-1}@{1}" old-one check "@{u}" upstream-two check "@{u}@{1}" upstream-one -fail check "@{-1}@{u}" master-two -fail check "@{-1}@{u}@{1}" master-one +check "@{-1}@{u}" master-two +check "@{-1}@{u}@{1}" master-one fail nonsense "@{u}@{-1}" nonsense "@{1}@{u}" -- 1.7.0.rc0.41.g538720 -- 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