graph.c: infinite loop in git whatchanged --graph -m
Running "whatchanged --graph -m" on a simple two-head merges can fall into infinite loop. Signed-off-by: Michał Kiedrowicz <michal.kiedrowicz@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>maint
							parent
							
								
									0ce2e396ee
								
							
						
					
					
						commit
						656197ad38
					
				|  | @ -33,11 +33,11 @@ The following utility functions are wrappers around `graph_next_line()` and | |||
| They can all be called with a NULL graph argument, in which case no graph | ||||
| output will be printed. | ||||
|  | ||||
| * `graph_show_commit()` calls `graph_next_line()` until it returns non-zero. | ||||
|   This prints all graph lines up to, and including, the line containing this | ||||
|   commit.  Output is printed to stdout.  The last line printed does not contain | ||||
|   a terminating newline.  This should not be called if the commit line has | ||||
|   already been printed, or it will loop forever. | ||||
| * `graph_show_commit()` calls `graph_next_line()` and | ||||
|   `graph_is_commit_finished()` until one of them return non-zero.  This prints | ||||
|   all graph lines up to, and including, the line containing this commit. | ||||
|   Output is printed to stdout.  The last line printed does not contain a | ||||
|   terminating newline. | ||||
|  | ||||
| * `graph_show_oneline()` calls `graph_next_line()` and prints the result to | ||||
|   stdout.  The line printed does not contain a terminating newline. | ||||
|  |  | |||
							
								
								
									
										2
									
								
								graph.c
								
								
								
								
							
							
						
						
									
										2
									
								
								graph.c
								
								
								
								
							|  | @ -1199,7 +1199,7 @@ void graph_show_commit(struct git_graph *graph) | |||
| 	if (!graph) | ||||
| 		return; | ||||
|  | ||||
| 	while (!shown_commit_line) { | ||||
| 	while (!shown_commit_line && !graph_is_commit_finished(graph)) { | ||||
| 		shown_commit_line = graph_next_line(graph, &msgbuf); | ||||
| 		fwrite(msgbuf.buf, sizeof(char), msgbuf.len, stdout); | ||||
| 		if (!shown_commit_line) | ||||
|  |  | |||
|  | @ -264,6 +264,16 @@ test_expect_success 'log --graph with merge' ' | |||
| 	test_cmp expect actual | ||||
| ' | ||||
|  | ||||
| test_expect_success 'log --raw --graph -m with merge' ' | ||||
| 	git log --raw --graph --oneline -m master | head -n 500 >actual && | ||||
| 	grep "initial" actual | ||||
| ' | ||||
|  | ||||
| test_expect_success 'diff-tree --graph' ' | ||||
| 	git diff-tree --graph master^ | head -n 500 >actual && | ||||
| 	grep "one" actual | ||||
| ' | ||||
|  | ||||
| cat > expect <<\EOF | ||||
| *   commit master | ||||
| |\  Merge: A B | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	 Michał Kiedrowicz
						Michał Kiedrowicz