[PATCH] Allow multiple date-ordered lists
Make pop_most_recent_commit() return the same objects multiple times, but only if called with different bits to mark. This is necessary to make merge-base work again. Signed-Off-By: Daniel Barkalow <barkalow@iabervon.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>maint
							parent
							
								
									4056c09114
								
							
						
					
					
						commit
						58e28af6a4
					
				
							
								
								
									
										6
									
								
								commit.c
								
								
								
								
							
							
						
						
									
										6
									
								
								commit.c
								
								
								
								
							|  | @ -114,7 +114,8 @@ void sort_by_date(struct commit_list **list) | ||||||
| 	*list = ret; | 	*list = ret; | ||||||
| } | } | ||||||
|  |  | ||||||
| struct commit *pop_most_recent_commit(struct commit_list **list) | struct commit *pop_most_recent_commit(struct commit_list **list, | ||||||
|  | 				      unsigned int mark) | ||||||
| { | { | ||||||
| 	struct commit *ret = (*list)->item; | 	struct commit *ret = (*list)->item; | ||||||
| 	struct commit_list *parents = ret->parents; | 	struct commit_list *parents = ret->parents; | ||||||
|  | @ -125,8 +126,9 @@ struct commit *pop_most_recent_commit(struct commit_list **list) | ||||||
|  |  | ||||||
| 	while (parents) { | 	while (parents) { | ||||||
| 		struct commit *commit = parents->item; | 		struct commit *commit = parents->item; | ||||||
| 		if (!commit->object.parsed) { |  | ||||||
| 		parse_commit(commit); | 		parse_commit(commit); | ||||||
|  | 		if (!(commit->object.flags & mark)) { | ||||||
|  | 			commit->object.flags |= mark; | ||||||
| 			insert_by_date(list, commit); | 			insert_by_date(list, commit); | ||||||
| 		} | 		} | ||||||
| 		parents = parents->next; | 		parents = parents->next; | ||||||
|  |  | ||||||
							
								
								
									
										3
									
								
								commit.h
								
								
								
								
							
							
						
						
									
										3
									
								
								commit.h
								
								
								
								
							|  | @ -31,6 +31,7 @@ void sort_by_date(struct commit_list **list); | ||||||
| /** Removes the first commit from a list sorted by date, and adds all | /** Removes the first commit from a list sorted by date, and adds all | ||||||
|  * of its parents. |  * of its parents. | ||||||
|  **/ |  **/ | ||||||
| struct commit *pop_most_recent_commit(struct commit_list **list); | struct commit *pop_most_recent_commit(struct commit_list **list,  | ||||||
|  | 				      unsigned int mark); | ||||||
|  |  | ||||||
| #endif /* COMMIT_H */ | #endif /* COMMIT_H */ | ||||||
|  |  | ||||||
							
								
								
									
										24
									
								
								merge-base.c
								
								
								
								
							
							
						
						
									
										24
									
								
								merge-base.c
								
								
								
								
							|  | @ -7,28 +7,10 @@ static struct commit *process_list(struct commit_list **list_p, int this_mark, | ||||||
| { | { | ||||||
| 	struct commit *item = (*list_p)->item; | 	struct commit *item = (*list_p)->item; | ||||||
|  |  | ||||||
| 	if (item->object.flags & this_mark) { | 	if (item->object.flags & other_mark) { | ||||||
| 		/* |  | ||||||
| 		  printf("%d already seen %s %x\n", |  | ||||||
| 		  this_mark |  | ||||||
| 		  sha1_to_hex(posn->parent->sha1), |  | ||||||
| 		  posn->parent->flags); |  | ||||||
| 		*/ |  | ||||||
| 		/* do nothing; this indicates that this side |  | ||||||
| 		 * split and reformed, and we only need to |  | ||||||
| 		 * mark it once. |  | ||||||
| 		 */ |  | ||||||
| 		*list_p = (*list_p)->next; |  | ||||||
| 	} else if (item->object.flags & other_mark) { |  | ||||||
| 		return item; | 		return item; | ||||||
| 	} else { | 	} else { | ||||||
| 		/* | 		pop_most_recent_commit(list_p, this_mark); | ||||||
| 		  printf("%d based on %s\n", |  | ||||||
| 		  this_mark, |  | ||||||
| 		  sha1_to_hex(posn->parent->sha1)); |  | ||||||
| 		*/ |  | ||||||
| 		pop_most_recent_commit(list_p); |  | ||||||
| 		item->object.flags |= this_mark; |  | ||||||
| 	} | 	} | ||||||
| 	return NULL; | 	return NULL; | ||||||
| } | } | ||||||
|  | @ -39,7 +21,9 @@ struct commit *common_ancestor(struct commit *rev1, struct commit *rev2) | ||||||
| 	struct commit_list *rev2list = NULL; | 	struct commit_list *rev2list = NULL; | ||||||
|  |  | ||||||
| 	commit_list_insert(rev1, &rev1list); | 	commit_list_insert(rev1, &rev1list); | ||||||
|  | 	rev1->object.flags |= 0x1; | ||||||
| 	commit_list_insert(rev2, &rev2list); | 	commit_list_insert(rev2, &rev2list); | ||||||
|  | 	rev2->object.flags |= 0x2; | ||||||
|  |  | ||||||
| 	parse_commit(rev1); | 	parse_commit(rev1); | ||||||
| 	parse_commit(rev2); | 	parse_commit(rev2); | ||||||
|  |  | ||||||
|  | @ -16,7 +16,7 @@ int main(int argc, char **argv) | ||||||
|  |  | ||||||
| 	commit_list_insert(commit, &list); | 	commit_list_insert(commit, &list); | ||||||
| 	do { | 	do { | ||||||
| 		struct commit *commit = pop_most_recent_commit(&list); | 		struct commit *commit = pop_most_recent_commit(&list, 0x1); | ||||||
| 		printf("%s\n", sha1_to_hex(commit->object.sha1)); | 		printf("%s\n", sha1_to_hex(commit->object.sha1)); | ||||||
| 	} while (list); | 	} while (list); | ||||||
| 	return 0; | 	return 0; | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue
	
	 Daniel Barkalow
						Daniel Barkalow