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>maint
							parent
							
								
									54851157ac
								
							
						
					
					
						commit
						d5db6c9ee7
					
				|  | @ -10,6 +10,7 @@ SYNOPSIS | |||
| -------- | ||||
| [verse] | ||||
| 'git-rev-list' [ \--max-count=number ] | ||||
| 	     [ \--skip=number ] | ||||
| 	     [ \--max-age=timestamp ] | ||||
| 	     [ \--min-age=timestamp ] | ||||
| 	     [ \--sparse ] | ||||
|  | @ -139,6 +140,10 @@ limiting may be applied. | |||
|  | ||||
| 	Limit the number of commits output. | ||||
|  | ||||
| --skip='number':: | ||||
|  | ||||
| 	Skip 'number' commits before starting to show the commit output. | ||||
|  | ||||
| --since='date', --after='date':: | ||||
|  | ||||
| 	Show commits more recent than a specific date. | ||||
|  |  | |||
							
								
								
									
										46
									
								
								revision.c
								
								
								
								
							
							
						
						
									
										46
									
								
								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); | ||||
| } | ||||
|  |  | |||
|  | @ -75,6 +75,7 @@ struct rev_info { | |||
| 	struct grep_opt	*grep_filter; | ||||
|  | ||||
| 	/* special limits */ | ||||
| 	int skip_count; | ||||
| 	int max_count; | ||||
| 	unsigned long max_age; | ||||
| 	unsigned long min_age; | ||||
|  |  | |||
|  | @ -0,0 +1,51 @@ | |||
| #!/bin/sh | ||||
|  | ||||
| test_description='git-rev-list --max-count and --skip test' | ||||
|  | ||||
| . ./test-lib.sh | ||||
|  | ||||
| test_expect_success 'setup' ' | ||||
|     for n in 1 2 3 4 5 ; do \ | ||||
|         echo $n > a ; \ | ||||
|         git add a ; \ | ||||
|         git commit -m "$n" ; \ | ||||
|     done | ||||
| ' | ||||
|  | ||||
| test_expect_success 'no options' ' | ||||
|     test $(git-rev-list HEAD | wc -l) = 5 | ||||
| ' | ||||
|  | ||||
| test_expect_success '--max-count' ' | ||||
|     test $(git-rev-list HEAD --max-count=0 | wc -l) = 0 && | ||||
|     test $(git-rev-list HEAD --max-count=3 | wc -l) = 3 && | ||||
|     test $(git-rev-list HEAD --max-count=5 | wc -l) = 5 && | ||||
|     test $(git-rev-list HEAD --max-count=10 | wc -l) = 5 | ||||
| ' | ||||
|  | ||||
| test_expect_success '--max-count all forms' ' | ||||
|     test $(git-rev-list HEAD --max-count=1 | wc -l) = 1 && | ||||
|     test $(git-rev-list HEAD -1 | wc -l) = 1 && | ||||
|     test $(git-rev-list HEAD -n1 | wc -l) = 1 && | ||||
|     test $(git-rev-list HEAD -n 1 | wc -l) = 1 | ||||
| ' | ||||
|  | ||||
| test_expect_success '--skip' ' | ||||
|     test $(git-rev-list HEAD --skip=0 | wc -l) = 5 && | ||||
|     test $(git-rev-list HEAD --skip=3 | wc -l) = 2 && | ||||
|     test $(git-rev-list HEAD --skip=5 | wc -l) = 0 && | ||||
|     test $(git-rev-list HEAD --skip=10 | wc -l) = 0 | ||||
| ' | ||||
|  | ||||
| test_expect_success '--skip --max-count' ' | ||||
|     test $(git-rev-list HEAD --skip=0 --max-count=0 | wc -l) = 0 && | ||||
|     test $(git-rev-list HEAD --skip=0 --max-count=10 | wc -l) = 5 && | ||||
|     test $(git-rev-list HEAD --skip=3 --max-count=0 | wc -l) = 0 && | ||||
|     test $(git-rev-list HEAD --skip=3 --max-count=1 | wc -l) = 1 && | ||||
|     test $(git-rev-list HEAD --skip=3 --max-count=2 | wc -l) = 2 && | ||||
|     test $(git-rev-list HEAD --skip=3 --max-count=10 | wc -l) = 2 && | ||||
|     test $(git-rev-list HEAD --skip=5 --max-count=10 | wc -l) = 0 && | ||||
|     test $(git-rev-list HEAD --skip=10 --max-count=10 | wc -l) = 0 | ||||
| ' | ||||
|  | ||||
| test_done | ||||
		Loading…
	
		Reference in New Issue
	
	 Junio C Hamano
						Junio C Hamano