diff --git a/rev-list.c b/rev-list.c
index abb611f8b50a97b96981bec606a2eb85b8888596..f41adebd8a1b3b4c08231714fd7261eae09d8cbc 100644 (file)
--- a/rev-list.c
+++ b/rev-list.c
#define SEEN (1u << 0)
#define INTERESTING (1u << 1)
#define COUNTED (1u << 2)
-#define SHOWN (LAST_EPOCH_FLAG << 2)
+#define SHOWN (1u << 3)
+#define DUPCHECK (1u << 4)
static const char rev_list_usage[] =
"usage: git-rev-list [OPTION] commit-id <commit-id>\n"
" --max-count=nr\n"
" --max-age=epoch\n"
" --min-age=epoch\n"
+ " --bisect\n"
+ " --objects\n"
+ " --unpacked\n"
" --header\n"
" --pretty\n"
" --merge-order [ --show-breaks ]";
+static int unpacked = 0;
static int bisect_list = 0;
static int tag_objects = 0;
static int tree_objects = 0;
static int merge_order = 0;
static int show_breaks = 0;
static int stop_traversal = 0;
+static int topo_order = 0;
static void show_commit(struct commit *commit)
{
static char pretty_header[16384];
pretty_print_commit(commit_format, commit->buffer, ~0, pretty_header, sizeof(pretty_header));
printf("%s%c", pretty_header, hdr_termination);
- }
+ }
+ fflush(stdout);
}
static int filter_commit(struct commit * commit)
struct commit *commit = pop_most_recent_commit(&list, SEEN);
struct object *obj = &commit->object;
+ if (unpacked && has_sha1_pack(obj->sha1))
+ obj->flags |= UNINTERESTING;
if (obj->flags & UNINTERESTING) {
mark_parents_uninteresting(commit);
if (everybody_uninteresting(list))
@@ -406,8 +415,10 @@ static struct commit *get_commit_reference(const char *name, unsigned int flags)
int main(int argc, char **argv)
{
struct commit_list *list = NULL;
+ struct commit_list *(*insert)(struct commit *, struct commit_list **);
int i, limited = 0;
+ insert = insert_by_date;
for (i = 1 ; i < argc; i++) {
int flags;
char *arg = argv[i];
blob_objects = 1;
continue;
}
- if (!strncmp(arg, "--merge-order", 13)) {
+ if (!strcmp(arg, "--unpacked")) {
+ unpacked = 1;
+ limited = 1;
+ continue;
+ }
+ if (!strcmp(arg, "--merge-order")) {
merge_order = 1;
+ insert = commit_list_insert;
continue;
}
- if (!strncmp(arg, "--show-breaks", 13)) {
+ if (!strcmp(arg, "--show-breaks")) {
show_breaks = 1;
continue;
}
+ if (!strcmp(arg, "--topo-order")) {
+ topo_order = 1;
+ continue;
+ }
flags = 0;
if (*arg == '^') {
commit = get_commit_reference(arg, flags);
if (!commit)
continue;
- commit_list_insert(commit, &list);
+ if (commit->object.flags & DUPCHECK)
+ continue;
+ commit->object.flags |= DUPCHECK;
+ insert(commit, &list);
}
if (!merge_order) {
if (limited)
list = limit_list(list);
+ if (topo_order)
+ sort_in_topological_order(&list);
show_commit_list(list);
} else {
if (sort_list_in_merge_order(list, &process_commit)) {