cherry-pick: make sure all input objects are commits
When a single argument was a non-commit, the error message used to be: fatal: BUG: expected exactly one commit from walk For multiple arguments, when none of the arguments was a commit, the error was: fatal: empty commit set passed Finally, when some of the arguments were non-commits, we ignored those arguments. Fix this bug and make sure all arguments are commits, and for the first non-commit, error out with: fatal: <name>: Can't cherry-pick a <type> Signed-off-by: Miklos Vajna <vmiklos@suse.cz> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
		 Miklos Vajna
					Miklos Vajna
				
			
				
					committed by
					
						 Junio C Hamano
						Junio C Hamano
					
				
			
			
				
	
			
			
			 Junio C Hamano
						Junio C Hamano
					
				
			
						parent
						
							fa7285dc3d
						
					
				
				
					commit
					21246dbb9e
				
			
							
								
								
									
										18
									
								
								sequencer.c
									
									
									
									
									
								
							
							
						
						
									
										18
									
								
								sequencer.c
									
									
									
									
									
								
							| @ -1047,6 +1047,7 @@ int sequencer_pick_revisions(struct replay_opts *opts) | |||||||
| { | { | ||||||
| 	struct commit_list *todo_list = NULL; | 	struct commit_list *todo_list = NULL; | ||||||
| 	unsigned char sha1[20]; | 	unsigned char sha1[20]; | ||||||
|  | 	int i; | ||||||
|  |  | ||||||
| 	if (opts->subcommand == REPLAY_NONE) | 	if (opts->subcommand == REPLAY_NONE) | ||||||
| 		assert(opts->revs); | 		assert(opts->revs); | ||||||
| @ -1067,6 +1068,23 @@ int sequencer_pick_revisions(struct replay_opts *opts) | |||||||
| 	if (opts->subcommand == REPLAY_CONTINUE) | 	if (opts->subcommand == REPLAY_CONTINUE) | ||||||
| 		return sequencer_continue(opts); | 		return sequencer_continue(opts); | ||||||
|  |  | ||||||
|  | 	for (i = 0; i < opts->revs->pending.nr; i++) { | ||||||
|  | 		unsigned char sha1[20]; | ||||||
|  | 		const char *name = opts->revs->pending.objects[i].name; | ||||||
|  |  | ||||||
|  | 		/* This happens when using --stdin. */ | ||||||
|  | 		if (!strlen(name)) | ||||||
|  | 			continue; | ||||||
|  |  | ||||||
|  | 		if (!get_sha1(name, sha1)) { | ||||||
|  | 			enum object_type type = sha1_object_info(sha1, NULL); | ||||||
|  |  | ||||||
|  | 			if (type > 0 && type != OBJ_COMMIT) | ||||||
|  | 				die(_("%s: can't cherry-pick a %s"), name, typename(type)); | ||||||
|  | 		} else | ||||||
|  | 			die(_("%s: bad revision"), name); | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 	/* | 	/* | ||||||
| 	 * If we were called as "git cherry-pick <commit>", just | 	 * If we were called as "git cherry-pick <commit>", just | ||||||
| 	 * cherry-pick/revert it, set CHERRY_PICK_HEAD / | 	 * cherry-pick/revert it, set CHERRY_PICK_HEAD / | ||||||
|  | |||||||
| @ -55,6 +55,12 @@ one | |||||||
| two" | two" | ||||||
| ' | ' | ||||||
|  |  | ||||||
|  | test_expect_success 'cherry-pick three one two: fails' ' | ||||||
|  | 	git checkout -f master && | ||||||
|  | 	git reset --hard first && | ||||||
|  | 	test_must_fail git cherry-pick three one two: | ||||||
|  | ' | ||||||
|  |  | ||||||
| test_expect_success 'output to keep user entertained during multi-pick' ' | test_expect_success 'output to keep user entertained during multi-pick' ' | ||||||
| 	cat <<-\EOF >expected && | 	cat <<-\EOF >expected && | ||||||
| 	[master OBJID] second | 	[master OBJID] second | ||||||
|  | |||||||
		Reference in New Issue
	
	Block a user