Browse Source

stat_tracking_info(): clear object flags used during counting

When left-right traversal counts the commits in a diverged history, it
leaves the flags in the commits smudged, and we need to clear them before
we return.  Otherwise the caller cannot inspect other branches with this
function again.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
maint
Junio C Hamano 17 years ago
parent
commit
c0234b2ef6
  1. 4
      remote.c
  2. 1
      revision.h
  3. 70
      t/t6040-tracking-info.sh

4
remote.c

@ -1295,6 +1295,10 @@ int stat_tracking_info(struct branch *branch, int *num_ours, int *num_theirs)
else else
(*num_theirs)++; (*num_theirs)++;
} }

/* clear object flags smudged by the above traversal */
clear_commit_marks(ours, ALL_REV_FLAGS);
clear_commit_marks(theirs, ALL_REV_FLAGS);
return 1; return 1;
} }



1
revision.h

@ -11,6 +11,7 @@
#define ADDED (1u<<7) /* Parents already parsed and added? */ #define ADDED (1u<<7) /* Parents already parsed and added? */
#define SYMMETRIC_LEFT (1u<<8) #define SYMMETRIC_LEFT (1u<<8)
#define TOPOSORT (1u<<9) /* In the active toposort list.. */ #define TOPOSORT (1u<<9) /* In the active toposort list.. */
#define ALL_REV_FLAGS ((1u<<10)-1)


struct rev_info; struct rev_info;
struct log_info; struct log_info;

70
t/t6040-tracking-info.sh

@ -0,0 +1,70 @@
#!/bin/sh

test_description='remote tracking stats'

. ./test-lib.sh

advance () {
echo "$1" >"$1" &&
git add "$1" &&
test_tick &&
git commit -m "$1"
}

test_expect_success setup '
for i in a b c;
do
advance $i || break
done &&
git clone . test &&
(
cd test &&
git checkout -b b1 origin &&
git reset --hard HEAD^ &&
advance d &&
git checkout -b b2 origin &&
git reset --hard b1 &&
git checkout -b b3 origin &&
git reset --hard HEAD^ &&
git checkout -b b4 origin &&
advance e &&
advance f
)
'

script='s/^..\(b.\)[ 0-9a-f]*\[\([^]]*\)\].*/\1 \2/p'
cat >expect <<\EOF
b1 ahead 1, behind 1
b2 ahead 1, behind 1
b3 behind 1
b4 ahead 2
EOF

test_expect_success 'branch -v' '
(
cd test &&
git branch -v
) |
sed -n -e "$script" >actual &&
test_cmp expect actual
'

test_expect_success 'checkout' '
(
cd test && git checkout b1
) >actual &&
grep -e "have 1 and 1 different" actual
'

test_expect_success 'status' '
(
cd test &&
git checkout b1 >/dev/null &&
# reports nothing to commit
test_must_fail git status
) >actual &&
grep -e "have 1 and 1 different" actual
'


test_done
Loading…
Cancel
Save