From mboxrd@z Thu Jan 1 00:00:00 1970 From: Raphael Kubo da Costa Subject: [PATCH] for-each-ref: Always check stat_tracking_info()'s return value. Date: Fri, 2 Jan 2015 22:28:41 +0200 Message-ID: <1420230521-8365-1-git-send-email-raphael.kubo.da.costa@intel.com> Cc: Raphael Kubo da Costa To: git@vger.kernel.org X-From: git-owner@vger.kernel.org Fri Jan 02 21:28:51 2015 Return-path: Envelope-to: gcvg-git-2@plane.gmane.org Received: from vger.kernel.org ([209.132.180.67]) by plane.gmane.org with esmtp (Exim 4.69) (envelope-from ) id 1Y78q1-0005R5-Qm for gcvg-git-2@plane.gmane.org; Fri, 02 Jan 2015 21:28:50 +0100 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752491AbbABU2p (ORCPT ); Fri, 2 Jan 2015 15:28:45 -0500 Received: from mga11.intel.com ([192.55.52.93]:36623 "EHLO mga11.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750783AbbABU2n (ORCPT ); Fri, 2 Jan 2015 15:28:43 -0500 Received: from orsmga001.jf.intel.com ([10.7.209.18]) by fmsmga102.fm.intel.com with ESMTP; 02 Jan 2015 12:28:43 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.07,685,1413270000"; d="scan'208";a="631888098" Received: from jgruddoc-mobl.ger.corp.intel.com (HELO rkubodac-mobl1.ger.corp.intel.com) ([10.252.21.23]) by orsmga001.jf.intel.com with ESMTP; 02 Jan 2015 12:28:41 -0800 X-Mailer: git-send-email 2.1.4 Sender: git-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org Archived-At: The code handling %(upstream:track) and %(upstream:trackshort) assumed 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. We now properly 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"). Signed-off-by: Raphael Kubo da Costa --- v2: Use `test_when_finished' to clean up the "parent_gone" branch. builtin/for-each-ref.c | 11 +++++++++-- t/t6300-for-each-ref.sh | 15 +++++++++++++++ 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/builtin/for-each-ref.c b/builtin/for-each-ref.c index 603a90e..52e6323 100644 --- a/builtin/for-each-ref.c +++ b/builtin/for-each-ref.c @@ -717,7 +717,10 @@ static void populate_value(struct refinfo *ref) starts_with(name, "upstream")) { char buf[40]; - stat_tracking_info(branch, &num_ours, &num_theirs); + if (stat_tracking_info(branch, &num_ours, + &num_theirs) != 1) + continue; + if (!num_ours && !num_theirs) v->s = ""; else if (!num_ours) { @@ -735,7 +738,11 @@ static void populate_value(struct refinfo *ref) } else if (!strcmp(formatp, "trackshort") && starts_with(name, "upstream")) { assert(branch); - stat_tracking_info(branch, &num_ours, &num_theirs); + + if (stat_tracking_info(branch, &num_ours, + &num_theirs) != 1) + continue; + if (!num_ours && !num_theirs) v->s = "="; else if (!num_ours) diff --git a/t/t6300-for-each-ref.sh b/t/t6300-for-each-ref.sh index bda354c..df9c3bd 100755 --- a/t/t6300-for-each-ref.sh +++ b/t/t6300-for-each-ref.sh @@ -335,6 +335,21 @@ test_expect_success 'Check that :track[short] cannot be used with other atoms' ' ' cat >expected <actual && + git for-each-ref --format="%(upstream:trackshort)" refs/heads/parent_gone >>actual && + test_when_finished "git branch -D parent_gone" && + test_cmp expected actual +' + +cat >expected <