Browse Source

rev-list --boundary

With the new --boundary flag, the output from rev-list includes
the UNINTERESING commits at the boundary, which are usually not
shown.  Their object names are prefixed with '-'.

For example, with this graph:

              C side
             /
	A---B---D master

You would get something like this:

	$ git rev-list --boundary --header --parents side..master
	D B
        tree D^{tree}
        parent B
        ... log message for commit D here ...
        \0-B A
        tree B^{tree}
        parent A
        ... log message for commit B here ...
        \0

Signed-off-by: Junio C Hamano <junkio@cox.net>
maint
Junio C Hamano 19 years ago
parent
commit
384e99a4a9
  1. 6
      rev-list.c
  2. 46
      revision.c
  3. 4
      revision.h

6
rev-list.c

@ -7,9 +7,9 @@
#include "diff.h" #include "diff.h"
#include "revision.h" #include "revision.h"


/* bits #0-4 in revision.h */ /* bits #0-5 in revision.h */


#define COUNTED (1u<<5) #define COUNTED (1u<<6)


static const char rev_list_usage[] = static const char rev_list_usage[] =
"git-rev-list [OPTION] <commit-id>... [ -- paths... ]\n" "git-rev-list [OPTION] <commit-id>... [ -- paths... ]\n"
@ -51,6 +51,8 @@ static void show_commit(struct commit *commit)
printf("%lu ", commit->date); printf("%lu ", commit->date);
if (commit_prefix[0]) if (commit_prefix[0])
fputs(commit_prefix, stdout); fputs(commit_prefix, stdout);
if (commit->object.flags & BOUNDARY)
putchar('-');
fputs(sha1_to_hex(commit->object.sha1), stdout); fputs(sha1_to_hex(commit->object.sha1), stdout);
if (show_parents) { if (show_parents) {
struct commit_list *parents = commit->parents; struct commit_list *parents = commit->parents;

46
revision.c

@ -419,6 +419,27 @@ static void limit_list(struct rev_info *revs)
continue; continue;
p = &commit_list_insert(commit, p)->next; p = &commit_list_insert(commit, p)->next;
} }
if (revs->boundary) {
list = newlist;
while (list) {
struct commit *commit = list->item;
struct object *obj = &commit->object;
struct commit_list *parent = commit->parents;
if (obj->flags & (UNINTERESTING|BOUNDARY)) {
list = list->next;
continue;
}
while (parent) {
struct commit *pcommit = parent->item;
parent = parent->next;
if (!(pcommit->object.flags & UNINTERESTING))
continue;
pcommit->object.flags |= BOUNDARY;
p = &commit_list_insert(pcommit, p)->next;
}
list = list->next;
}
}
revs->commits = newlist; revs->commits = newlist;
} }


@ -591,6 +612,10 @@ int setup_revisions(int argc, const char **argv, struct rev_info *revs, const ch
revs->no_merges = 1; revs->no_merges = 1;
continue; continue;
} }
if (!strcmp(arg, "--boundary")) {
revs->boundary = 1;
continue;
}
if (!strcmp(arg, "--objects")) { if (!strcmp(arg, "--objects")) {
revs->tag_objects = 1; revs->tag_objects = 1;
revs->tree_objects = 1; revs->tree_objects = 1;
@ -731,13 +756,17 @@ struct commit *get_revision(struct rev_info *revs)
do { do {
struct commit *commit = revs->commits->item; struct commit *commit = revs->commits->item;


if (commit->object.flags & (UNINTERESTING|SHOWN)) if (commit->object.flags & SHOWN)
goto next;
if (!(commit->object.flags & BOUNDARY) &&
(commit->object.flags & UNINTERESTING))
goto next; goto next;
if (revs->min_age != -1 && (commit->date > revs->min_age)) if (revs->min_age != -1 && (commit->date > revs->min_age))
goto next; goto next;
if (revs->max_age != -1 && (commit->date < revs->max_age)) if (revs->max_age != -1 && (commit->date < revs->max_age))
return NULL; return NULL;
if (revs->no_merges && commit->parents && commit->parents->next) if (revs->no_merges &&
commit->parents && commit->parents->next)
goto next; goto next;
if (revs->prune_fn && revs->dense) { if (revs->prune_fn && revs->dense) {
if (!(commit->object.flags & TREECHANGE)) if (!(commit->object.flags & TREECHANGE))
@ -745,8 +774,19 @@ struct commit *get_revision(struct rev_info *revs)
rewrite_parents(commit); rewrite_parents(commit);
} }
/* More to go? */ /* More to go? */
if (revs->max_count) if (revs->max_count) {
if (commit->object.flags & BOUNDARY) {
/* this is already uninteresting,
* so there is no point popping its
* parents into the list.
*/
struct commit_list *it = revs->commits;
revs->commits = it->next;
free(it);
}
else
pop_most_recent_commit(&revs->commits, SEEN); pop_most_recent_commit(&revs->commits, SEEN);
}
commit->object.flags |= SHOWN; commit->object.flags |= SHOWN;
return commit; return commit;
next: next:

4
revision.h

@ -6,6 +6,7 @@
#define TREECHANGE (1u<<2) #define TREECHANGE (1u<<2)
#define SHOWN (1u<<3) #define SHOWN (1u<<3)
#define TMP_MARK (1u<<4) /* for isolated cases; clean after use */ #define TMP_MARK (1u<<4) /* for isolated cases; clean after use */
#define BOUNDARY (1u<<5)


struct rev_info; struct rev_info;


@ -32,7 +33,8 @@ struct rev_info {
blob_objects:1, blob_objects:1,
edge_hint:1, edge_hint:1,
limited:1, limited:1,
unpacked:1; unpacked:1,
boundary:1;


/* special limits */ /* special limits */
int max_count; int max_count;

Loading…
Cancel
Save