Signed-off-by: Stefan Beller <sbeller@xxxxxxxxxx> --- remote.c | 40 +--------------------------------------- revision.c | 45 +++++++++++++++++++++++++++++++++++++++++++++ revision.h | 7 +++++++ 3 files changed, 53 insertions(+), 39 deletions(-) diff --git a/remote.c b/remote.c index 685e776a65..60c689383a 100644 --- a/remote.c +++ b/remote.c @@ -1990,9 +1990,7 @@ int stat_tracking_info(struct branch *branch, int *num_ours, int *num_theirs, { struct object_id oid; struct commit *ours, *theirs; - struct rev_info revs; const char *base; - struct argv_array argv = ARGV_ARRAY_INIT; /* Cannot stat unless we are marked to build on top of somebody else. */ base = branch_get_upstream(branch, NULL); @@ -2014,43 +2012,7 @@ int stat_tracking_info(struct branch *branch, int *num_ours, int *num_theirs, if (!ours) return -1; - /* are we the same? */ - if (theirs == ours) { - *num_theirs = *num_ours = 0; - return 0; - } - - /* Run "rev-list --left-right ours...theirs" internally... */ - argv_array_push(&argv, ""); /* ignored */ - argv_array_push(&argv, "--left-right"); - argv_array_pushf(&argv, "%s...%s", - oid_to_hex(&ours->object.oid), - oid_to_hex(&theirs->object.oid)); - argv_array_push(&argv, "--"); - - init_revisions(&revs, NULL); - setup_revisions(argv.argc, argv.argv, &revs, NULL); - if (prepare_revision_walk(&revs)) - die("revision walk setup failed"); - - /* ... and count the commits on each side. */ - *num_ours = 0; - *num_theirs = 0; - while (1) { - struct commit *c = get_revision(&revs); - if (!c) - break; - if (c->object.flags & SYMMETRIC_LEFT) - (*num_ours)++; - else - (*num_theirs)++; - } - - /* clear object flags smudged by the above traversal */ - clear_commit_marks(ours, ALL_REV_FLAGS); - clear_commit_marks(theirs, ALL_REV_FLAGS); - - argv_array_clear(&argv); + compare_commits(ours, theirs, num_ours, num_theirs); return 0; } diff --git a/revision.c b/revision.c index 99c95c19b0..fe1faf2628 100644 --- a/revision.c +++ b/revision.c @@ -1159,6 +1159,51 @@ int ref_excluded(struct string_list *ref_excludes, const char *path) return 0; } +void compare_commits(struct commit *ours, struct commit *theirs, + int *num_ours, int *num_theirs) +{ + struct rev_info revs; + struct argv_array argv = ARGV_ARRAY_INIT; + + /* are we the same? */ + if (theirs == ours) { + *num_theirs = *num_ours = 0; + return; + } + + /* Run "rev-list --left-right ours...theirs" internally... */ + argv_array_push(&argv, ""); /* ignored */ + argv_array_push(&argv, "--left-right"); + argv_array_pushf(&argv, "%s...%s", + oid_to_hex(&ours->object.oid), + oid_to_hex(&theirs->object.oid)); + argv_array_push(&argv, "--"); + + init_revisions(&revs, NULL); + setup_revisions(argv.argc, argv.argv, &revs, NULL); + if (prepare_revision_walk(&revs)) + die("revision walk setup failed"); + + /* ... and count the commits on each side. */ + *num_ours = 0; + *num_theirs = 0; + while (1) { + struct commit *c = get_revision(&revs); + if (!c) + break; + if (c->object.flags & SYMMETRIC_LEFT) + (*num_ours)++; + else + (*num_theirs)++; + } + + /* clear object flags smudged by the above traversal */ + clear_commit_marks(ours, ALL_REV_FLAGS); + clear_commit_marks(theirs, ALL_REV_FLAGS); + + argv_array_clear(&argv); +} + static int handle_one_ref(const char *path, const struct object_id *oid, int flag, void *cb_data) { diff --git a/revision.h b/revision.h index 54761200ad..3ff6a5190b 100644 --- a/revision.h +++ b/revision.h @@ -324,4 +324,11 @@ extern int rewrite_parents(struct rev_info *revs, struct commit *commit, */ extern struct commit_list *get_saved_parents(struct rev_info *revs, const struct commit *commit); +/* + * Compute the number of commits between 'one' and 'two' storing the number + * of commits in their parent DAG ncluded in each but not the other. + */ +extern void compare_commits(struct commit *one, struct commit *two, + int *num_one, int *num_two); + #endif -- 2.15.0.128.g40905b34bf.dirty