for-each-ref: always check stat_tracking_info()'s return value
commitb6160d950c9ef168d0f7d7c9b2812f280e5b88fb
authorRaphael Kubo da Costa <raphael.kubo.da.costa@intel.com>
Mon, 5 Jan 2015 09:58:55 +0000 (5 11:58 +0200)
committerJunio C Hamano <gitster@pobox.com>
Mon, 12 Jan 2015 23:10:46 +0000 (12 15:10 -0800)
treeff477be184149287796005aeb522288174d658ae
parent9a8c2b67cd5a51666f2c0ce3fbbdb08b97b79b3d
for-each-ref: always check stat_tracking_info()'s return value

The code handling %(upstream:track) and %(upstream:trackshort)
assumed that it always had a valid branch that had been sanitized
earlier in populate_value(), and thus did not check the return value
of the call to stat_tracking_info().

While there is indeed some sanitization code that basically
corresponds to stat_tracking_info() returning 0 (no base branch
set), the function can also return -1 when the base branch did exist
but has since then been deleted.

In this case, num_ours and num_theirs had undefined values and a
call to `git for-each-ref --format="%(upstream:track)"` could print
spurious values such as

  [behind -111794512]
  [ahead 38881640, behind 5103867]

even for repositories with one single commit.

Verify stat_tracking_info()'s return value and do not print anything
if it returns -1. This behavior also matches the documentation ("has
no effect if the ref does not have tracking information associated
with it").

Helped-by: Eric Sunshine <sunshine@sunshineco.com>
Helped-by: Jeff King <peff@peff.net>
Signed-off-by: Raphael Kubo da Costa <raphael.kubo.da.costa@intel.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin/for-each-ref.c
t/t6300-for-each-ref.sh