summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: 9181ca2)
raw | patch | inline | side by side (parent: 9181ca2)
author | Junio C Hamano <junkio@cox.net> | |
Tue, 28 Mar 2006 07:58:34 +0000 (23:58 -0800) | ||
committer | Junio C Hamano <junkio@cox.net> | |
Wed, 29 Mar 2006 01:29:21 +0000 (17:29 -0800) |
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>
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>
rev-list.c | patch | blob | history | |
revision.c | patch | blob | history | |
revision.h | patch | blob | history |
diff --git a/rev-list.c b/rev-list.c
index 0903edbcb549c43200e43896584a58f1539f0d55..f3a989ccede991744061728532c25efbcb1716d5 100644 (file)
--- a/rev-list.c
+++ b/rev-list.c
#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"
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 d7678cfab4b18082bacee706cb119018b39643a0..745b0d2e10b0b712731b84ccb9337d7c82cba043 100644 (file)
--- a/revision.c
+++ b/revision.c
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;
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))
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 6c2becad1394829142a3775a43097f65de4e524a..61e6bc9f4b12973b7faa69f63cb6986e9e19a080 100644 (file)
--- a/revision.h
+++ b/revision.h
#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;
blob_objects:1,
edge_hint:1,
limited:1,
- unpacked:1;
+ unpacked:1,
+ boundary:1;
/* special limits */
int max_count;