diff options
author | Junio C Hamano <junkio@cox.net> | 2006-03-27 23:58:34 -0800 |
---|---|---|
committer | Junio C Hamano <junkio@cox.net> | 2006-03-28 17:29:21 -0800 |
commit | 384e99a4a99820c34fe3600b2aad3f0185dd43db (patch) | |
tree | 88ff1150dafa6732dd8a6f8a75c59976222910a6 | |
parent | 9181ca2c2b1f2897baa67ff8e48b1984822115b5 (diff) | |
download | git-384e99a4a99820c34fe3600b2aad3f0185dd43db.tar.gz git-384e99a4a99820c34fe3600b2aad3f0185dd43db.tar.xz |
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>
-rw-r--r-- | rev-list.c | 6 | ||||
-rw-r--r-- | revision.c | 48 | ||||
-rw-r--r-- | revision.h | 4 |
3 files changed, 51 insertions, 7 deletions
diff --git a/rev-list.c b/rev-list.c index 0903edbcb..f3a989cce 100644 --- a/rev-list.c +++ b/rev-list.c @@ -7,9 +7,9 @@ #include "diff.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[] = "git-rev-list [OPTION] <commit-id>... [ -- paths... ]\n" @@ -51,6 +51,8 @@ static void show_commit(struct commit *commit) printf("%lu ", commit->date); if (commit_prefix[0]) fputs(commit_prefix, stdout); + if (commit->object.flags & BOUNDARY) + putchar('-'); fputs(sha1_to_hex(commit->object.sha1), stdout); if (show_parents) { struct commit_list *parents = commit->parents; diff --git a/revision.c b/revision.c index d7678cfab..745b0d2e1 100644 --- a/revision.c +++ b/revision.c @@ -419,6 +419,27 @@ static void limit_list(struct rev_info *revs) continue; 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; } @@ -591,6 +612,10 @@ int setup_revisions(int argc, const char **argv, struct rev_info *revs, const ch revs->no_merges = 1; continue; } + if (!strcmp(arg, "--boundary")) { + revs->boundary = 1; + continue; + } if (!strcmp(arg, "--objects")) { revs->tag_objects = 1; revs->tree_objects = 1; @@ -731,13 +756,17 @@ struct commit *get_revision(struct rev_info *revs) do { 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; if (revs->min_age != -1 && (commit->date > revs->min_age)) goto next; if (revs->max_age != -1 && (commit->date < revs->max_age)) return NULL; - if (revs->no_merges && commit->parents && commit->parents->next) + if (revs->no_merges && + commit->parents && commit->parents->next) goto next; if (revs->prune_fn && revs->dense) { if (!(commit->object.flags & TREECHANGE)) @@ -745,8 +774,19 @@ struct commit *get_revision(struct rev_info *revs) rewrite_parents(commit); } /* More to go? */ - if (revs->max_count) - pop_most_recent_commit(&revs->commits, SEEN); + 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); + } commit->object.flags |= SHOWN; return commit; next: diff --git a/revision.h b/revision.h index 6c2becad1..61e6bc9f4 100644 --- a/revision.h +++ b/revision.h @@ -6,6 +6,7 @@ #define TREECHANGE (1u<<2) #define SHOWN (1u<<3) #define TMP_MARK (1u<<4) /* for isolated cases; clean after use */ +#define BOUNDARY (1u<<5) struct rev_info; @@ -32,7 +33,8 @@ struct rev_info { blob_objects:1, edge_hint:1, limited:1, - unpacked:1; + unpacked:1, + boundary:1; /* special limits */ int max_count; |