@@ -1880,45 +1880,35 @@ int resolve_remote_symref(struct ref *ref, struct ref *list)
18801880}
18811881
18821882/*
1883- * Lookup the upstream branch for the given branch and if present, optionally
1884- * compute the commit ahead/behind values for the pair.
1883+ * Compute the commit ahead/behind values for the pair branch_name, base.
18851884 *
18861885 * If abf is AHEAD_BEHIND_FULL, compute the full ahead/behind and return the
18871886 * counts in *num_ours and *num_theirs. If abf is AHEAD_BEHIND_QUICK, skip
18881887 * the (potentially expensive) a/b computation (*num_ours and *num_theirs are
18891888 * set to zero).
18901889 *
1891- * The name of the upstream branch (or NULL if no upstream is defined) is
1892- * returned via *upstream_name, if it is not itself NULL.
1893- *
1894- * Returns -1 if num_ours and num_theirs could not be filled in (e.g., no
1895- * upstream defined, or ref does not exist). Returns 0 if the commits are
1896- * identical. Returns 1 if commits are different.
1890+ * Returns -1 if num_ours and num_theirs could not be filled in (e.g., ref
1891+ * does not exist). Returns 0 if the commits are identical. Returns 1 if
1892+ * commits are different.
18971893 */
1898- int stat_tracking_info (struct branch * branch , int * num_ours , int * num_theirs ,
1899- const char * * upstream_name , enum ahead_behind_flags abf )
1894+
1895+ static int stat_branch_pair (const char * branch_name , const char * base ,
1896+ int * num_ours , int * num_theirs ,
1897+ enum ahead_behind_flags abf )
19001898{
19011899 struct object_id oid ;
19021900 struct commit * ours , * theirs ;
19031901 struct rev_info revs ;
1904- const char * base ;
19051902 struct argv_array argv = ARGV_ARRAY_INIT ;
19061903
1907- /* Cannot stat unless we are marked to build on top of somebody else. */
1908- base = branch_get_upstream (branch , NULL );
1909- if (upstream_name )
1910- * upstream_name = base ;
1911- if (!base )
1912- return -1 ;
1913-
19141904 /* Cannot stat if what we used to build on no longer exists */
19151905 if (read_ref (base , & oid ))
19161906 return -1 ;
19171907 theirs = lookup_commit_reference (the_repository , & oid );
19181908 if (!theirs )
19191909 return -1 ;
19201910
1921- if (read_ref (branch -> refname , & oid ))
1911+ if (read_ref (branch_name , & oid ))
19221912 return -1 ;
19231913 ours = lookup_commit_reference (the_repository , & oid );
19241914 if (!ours )
@@ -1932,7 +1922,7 @@ int stat_tracking_info(struct branch *branch, int *num_ours, int *num_theirs,
19321922 if (abf == AHEAD_BEHIND_QUICK )
19331923 return 1 ;
19341924 if (abf != AHEAD_BEHIND_FULL )
1935- BUG ("stat_tracking_info : invalid abf '%d'" , abf );
1925+ BUG ("stat_branch_pair : invalid abf '%d'" , abf );
19361926
19371927 /* Run "rev-list --left-right ours...theirs" internally... */
19381928 argv_array_push (& argv , "" ); /* ignored */
@@ -1966,6 +1956,42 @@ int stat_tracking_info(struct branch *branch, int *num_ours, int *num_theirs,
19661956 return 1 ;
19671957}
19681958
1959+ /*
1960+ * Lookup the tracking branch for the given branch and if present, optionally
1961+ * compute the commit ahead/behind values for the pair.
1962+ *
1963+ * If for_push is true, the tracking branch refers to the push branch,
1964+ * otherwise it refers to the upstream branch.
1965+ *
1966+ * The name of the tracking branch (or NULL if it is not defined) is
1967+ * returned via *tracking_name, if it is not itself NULL.
1968+ *
1969+ * If abf is AHEAD_BEHIND_FULL, compute the full ahead/behind and return the
1970+ * counts in *num_ours and *num_theirs. If abf is AHEAD_BEHIND_QUICK, skip
1971+ * the (potentially expensive) a/b computation (*num_ours and *num_theirs are
1972+ * set to zero).
1973+ *
1974+ * Returns -1 if num_ours and num_theirs could not be filled in (e.g., no
1975+ * upstream defined, or ref does not exist). Returns 0 if the commits are
1976+ * identical. Returns 1 if commits are different.
1977+ */
1978+ int stat_tracking_info (struct branch * branch , int * num_ours , int * num_theirs ,
1979+ const char * * tracking_name , int for_push ,
1980+ enum ahead_behind_flags abf )
1981+ {
1982+ const char * base ;
1983+
1984+ /* Cannot stat unless we are marked to build on top of somebody else. */
1985+ base = for_push ? branch_get_push (branch , NULL ) :
1986+ branch_get_upstream (branch , NULL );
1987+ if (tracking_name )
1988+ * tracking_name = base ;
1989+ if (!base )
1990+ return -1 ;
1991+
1992+ return stat_branch_pair (branch -> refname , base , num_ours , num_theirs , abf );
1993+ }
1994+
19691995/*
19701996 * Return true when there is anything to report, otherwise false.
19711997 */
@@ -1977,7 +2003,7 @@ int format_tracking_info(struct branch *branch, struct strbuf *sb,
19772003 char * base ;
19782004 int upstream_is_gone = 0 ;
19792005
1980- sti = stat_tracking_info (branch , & ours , & theirs , & full_base , abf );
2006+ sti = stat_tracking_info (branch , & ours , & theirs , & full_base , 0 , abf );
19812007 if (sti < 0 ) {
19822008 if (!full_base )
19832009 return 0 ;
0 commit comments