From: Junio C Hamano Date: Mon, 25 Dec 2006 11:27:41 +0000 (-0800) Subject: Merge branch 'jc/skip-count' X-Git-Tag: v1.5.0-rc0~11 X-Git-Url: https://git.lorimer.id.au/gitweb.git/diff_plain/d4ada4876d5ab7b271857917231f6006f2160bca?hp=-c Merge branch 'jc/skip-count' * jc/skip-count: revision: --skip= --- d4ada4876d5ab7b271857917231f6006f2160bca diff --combined revision.c index 4dae5342eb,5dc1e70260..e7eccd9180 --- a/revision.c +++ b/revision.c @@@ -343,7 -343,6 +343,7 @@@ static void try_to_simplify_commit(stru static void add_parents_to_list(struct rev_info *revs, struct commit *commit, struct commit_list **list) { struct commit_list *parent = commit->parents; + unsigned left_flag; if (commit->object.flags & ADDED) return; @@@ -388,7 -387,6 +388,7 @@@ if (revs->no_walk) return; + left_flag = (commit->object.flags & SYMMETRIC_LEFT); parent = commit->parents; while (parent) { struct commit *p = parent->item; @@@ -396,7 -394,6 +396,7 @@@ parent = parent->next; parse_commit(p); + p->object.flags |= left_flag; if (p->object.flags & SEEN) continue; p->object.flags |= SEEN; @@@ -526,6 -523,7 +526,7 @@@ void init_revisions(struct rev_info *re revs->prefix = prefix; revs->max_age = -1; revs->min_age = -1; + revs->skip_count = -1; revs->max_count = -1; revs->prune_fn = NULL; @@@ -642,7 -640,7 +643,7 @@@ int handle_revision_arg(const char *arg add_pending_commit_list(revs, exclude, flags_exclude); free_commit_list(exclude); - a->object.flags |= flags; + a->object.flags |= flags | SYMMETRIC_LEFT; } else a->object.flags |= flags_exclude; b->object.flags |= flags; @@@ -762,6 -760,10 +763,10 @@@ int setup_revisions(int argc, const cha revs->max_count = atoi(arg + 12); continue; } + if (!strncmp(arg, "--skip=", 7)) { + revs->skip_count = atoi(arg + 7); + continue; + } /* accept -, like traditional "head" */ if ((*arg == '-') && isdigit(arg[1])) { revs->max_count = atoi(arg + 1); @@@ -852,10 -854,6 +857,10 @@@ revs->boundary = 1; continue; } + if (!strcmp(arg, "--left-right")) { + revs->left_right = 1; + continue; + } if (!strcmp(arg, "--objects")) { revs->tag_objects = 1; revs->tree_objects = 1; @@@ -1129,23 -1127,11 +1134,11 @@@ static int commit_match(struct commit * commit->buffer, strlen(commit->buffer)); } - struct commit *get_revision(struct rev_info *revs) + static struct commit *get_revision_1(struct rev_info *revs) { - struct commit_list *list = revs->commits; - - if (!list) + if (!revs->commits) return NULL; - /* Check the max_count ... */ - switch (revs->max_count) { - case -1: - break; - case 0: - return NULL; - default: - revs->max_count--; - } - do { struct commit_list *entry = revs->commits; struct commit *commit = entry->item; @@@ -1212,3 -1198,28 +1205,28 @@@ } while (revs->commits); return NULL; } + + struct commit *get_revision(struct rev_info *revs) + { + struct commit *c = NULL; + + if (0 < revs->skip_count) { + while ((c = get_revision_1(revs)) != NULL) { + if (revs->skip_count-- <= 0) + break; + } + } + + /* Check the max_count ... */ + switch (revs->max_count) { + case -1: + break; + case 0: + return NULL; + default: + revs->max_count--; + } + if (c) + return c; + return get_revision_1(revs); + } diff --combined revision.h index 4585463a44,81f522c35d..ec991e5c57 --- a/revision.h +++ b/revision.h @@@ -9,7 -9,6 +9,7 @@@ #define BOUNDARY (1u<<5) #define BOUNDARY_SHOW (1u<<6) #define ADDED (1u<<7) /* Parents already parsed and added? */ +#define SYMMETRIC_LEFT (1u<<8) struct rev_info; struct log_info; @@@ -41,7 -40,6 +41,7 @@@ struct rev_info limited:1, unpacked:1, /* see also ignore_packed below */ boundary:1, + left_right:1, parents:1; /* Diff flags */ @@@ -77,6 -75,7 +77,7 @@@ struct grep_opt *grep_filter; /* special limits */ + int skip_count; int max_count; unsigned long max_age; unsigned long min_age;