diff options
author | Junio C Hamano <junkio@cox.net> | 2006-12-19 18:25:32 -0800 |
---|---|---|
committer | Junio C Hamano <junkio@cox.net> | 2006-12-20 11:26:11 -0800 |
commit | d5db6c9ee79cfa1794d75847b8376430f08b203f (patch) | |
tree | 2ee917ce3959b7fd6d6e5bfc15c0e986a6c5b615 /revision.c | |
parent | 54851157acf707eb953eada2a84830897dde5c1d (diff) | |
download | git-d5db6c9ee79cfa1794d75847b8376430f08b203f.tar.gz |
revision: --skip=<n>
This adds --skip=<n> option to revision traversal machinery.
Documentation and test were added by Robert Fitzsimons.
Signed-off-by: Robert Fitzsimons <robfitz@273k.net>
Signed-off-by: Junio C Hamano <junkio@cox.net>
Diffstat (limited to 'revision.c')
-rw-r--r-- | revision.c | 46 |
1 files changed, 32 insertions, 14 deletions
diff --git a/revision.c b/revision.c index 7b6f91f83e..5dc1e70260 100644 --- a/revision.c +++ b/revision.c @@ -523,6 +523,7 @@ void init_revisions(struct rev_info *revs, const char *prefix) revs->prefix = prefix; revs->max_age = -1; revs->min_age = -1; + revs->skip_count = -1; revs->max_count = -1; revs->prune_fn = NULL; @@ -759,6 +760,10 @@ int setup_revisions(int argc, const char **argv, struct rev_info *revs, const ch revs->max_count = atoi(arg + 12); continue; } + if (!strncmp(arg, "--skip=", 7)) { + revs->skip_count = atoi(arg + 7); + continue; + } /* accept -<digit>, like traditional "head" */ if ((*arg == '-') && isdigit(arg[1])) { revs->max_count = atoi(arg + 1); @@ -1122,23 +1127,11 @@ static int commit_match(struct commit *commit, struct rev_info *opt) 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; @@ -1205,3 +1198,28 @@ struct commit *get_revision(struct rev_info *revs) } 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); +} |