use struct sha1_array in diff_tree_combined()
Maintaining an array of hashes is easier using sha1_array than open-coding it. This patch also fixes a leak of the SHA1 array in diff_tree_combined_merge(). Signed-off-by: René Scharfe <rene.scharfe@lsrfire.ath.cx> Signed-off-by: Junio C Hamano <gitster@pobox.com>maint
							parent
							
								
									ee22802493
								
							
						
					
					
						commit
						0041f09de6
					
				|  | @ -14,6 +14,7 @@ | ||||||
| #include "log-tree.h" | #include "log-tree.h" | ||||||
| #include "builtin.h" | #include "builtin.h" | ||||||
| #include "submodule.h" | #include "submodule.h" | ||||||
|  | #include "sha1-array.h" | ||||||
|  |  | ||||||
| struct blobinfo { | struct blobinfo { | ||||||
| 	unsigned char sha1[20]; | 	unsigned char sha1[20]; | ||||||
|  | @ -169,7 +170,7 @@ static int builtin_diff_combined(struct rev_info *revs, | ||||||
| 				 struct object_array_entry *ent, | 				 struct object_array_entry *ent, | ||||||
| 				 int ents) | 				 int ents) | ||||||
| { | { | ||||||
| 	const unsigned char (*parent)[20]; | 	struct sha1_array parents = SHA1_ARRAY_INIT; | ||||||
| 	int i; | 	int i; | ||||||
|  |  | ||||||
| 	if (argc > 1) | 	if (argc > 1) | ||||||
|  | @ -177,12 +178,11 @@ static int builtin_diff_combined(struct rev_info *revs, | ||||||
|  |  | ||||||
| 	if (!revs->dense_combined_merges && !revs->combine_merges) | 	if (!revs->dense_combined_merges && !revs->combine_merges) | ||||||
| 		revs->dense_combined_merges = revs->combine_merges = 1; | 		revs->dense_combined_merges = revs->combine_merges = 1; | ||||||
| 	parent = xmalloc(ents * sizeof(*parent)); | 	for (i = 1; i < ents; i++) | ||||||
| 	for (i = 0; i < ents; i++) | 		sha1_array_append(&parents, ent[i].item->sha1); | ||||||
| 		hashcpy((unsigned char *)(parent + i), ent[i].item->sha1); | 	diff_tree_combined(ent[0].item->sha1, &parents, | ||||||
| 	diff_tree_combined(parent[0], parent + 1, ents - 1, |  | ||||||
| 			   revs->dense_combined_merges, revs); | 			   revs->dense_combined_merges, revs); | ||||||
| 	free((void *)parent); | 	sha1_array_clear(&parents); | ||||||
| 	return 0; | 	return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | @ -8,6 +8,7 @@ | ||||||
| #include "log-tree.h" | #include "log-tree.h" | ||||||
| #include "refs.h" | #include "refs.h" | ||||||
| #include "userdiff.h" | #include "userdiff.h" | ||||||
|  | #include "sha1-array.h" | ||||||
|  |  | ||||||
| static struct combine_diff_path *intersect_paths(struct combine_diff_path *curr, int n, int num_parent) | static struct combine_diff_path *intersect_paths(struct combine_diff_path *curr, int n, int num_parent) | ||||||
| { | { | ||||||
|  | @ -1116,15 +1117,14 @@ static void handle_combined_callback(struct diff_options *opt, | ||||||
| } | } | ||||||
|  |  | ||||||
| void diff_tree_combined(const unsigned char *sha1, | void diff_tree_combined(const unsigned char *sha1, | ||||||
| 			const unsigned char parent[][20], | 			const struct sha1_array *parents, | ||||||
| 			int num_parent, |  | ||||||
| 			int dense, | 			int dense, | ||||||
| 			struct rev_info *rev) | 			struct rev_info *rev) | ||||||
| { | { | ||||||
| 	struct diff_options *opt = &rev->diffopt; | 	struct diff_options *opt = &rev->diffopt; | ||||||
| 	struct diff_options diffopts; | 	struct diff_options diffopts; | ||||||
| 	struct combine_diff_path *p, *paths = NULL; | 	struct combine_diff_path *p, *paths = NULL; | ||||||
| 	int i, num_paths, needsep, show_log_first; | 	int i, num_paths, needsep, show_log_first, num_parent = parents->nr; | ||||||
|  |  | ||||||
| 	diffopts = *opt; | 	diffopts = *opt; | ||||||
| 	diffopts.output_format = DIFF_FORMAT_NO_OUTPUT; | 	diffopts.output_format = DIFF_FORMAT_NO_OUTPUT; | ||||||
|  | @ -1144,7 +1144,7 @@ void diff_tree_combined(const unsigned char *sha1, | ||||||
| 			diffopts.output_format = stat_opt; | 			diffopts.output_format = stat_opt; | ||||||
| 		else | 		else | ||||||
| 			diffopts.output_format = DIFF_FORMAT_NO_OUTPUT; | 			diffopts.output_format = DIFF_FORMAT_NO_OUTPUT; | ||||||
| 		diff_tree_sha1(parent[i], sha1, "", &diffopts); | 		diff_tree_sha1(parents->sha1[i], sha1, "", &diffopts); | ||||||
| 		diffcore_std(&diffopts); | 		diffcore_std(&diffopts); | ||||||
| 		paths = intersect_paths(paths, i, num_parent); | 		paths = intersect_paths(paths, i, num_parent); | ||||||
|  |  | ||||||
|  | @ -1199,22 +1199,14 @@ void diff_tree_combined(const unsigned char *sha1, | ||||||
| void diff_tree_combined_merge(const unsigned char *sha1, | void diff_tree_combined_merge(const unsigned char *sha1, | ||||||
| 			     int dense, struct rev_info *rev) | 			     int dense, struct rev_info *rev) | ||||||
| { | { | ||||||
| 	int num_parent; |  | ||||||
| 	const unsigned char (*parent)[20]; |  | ||||||
| 	struct commit *commit = lookup_commit(sha1); | 	struct commit *commit = lookup_commit(sha1); | ||||||
| 	struct commit_list *parents; | 	struct commit_list *parent = commit->parents; | ||||||
|  | 	struct sha1_array parents = SHA1_ARRAY_INIT; | ||||||
|  |  | ||||||
| 	/* count parents */ | 	while (parent) { | ||||||
| 	for (parents = commit->parents, num_parent = 0; | 		sha1_array_append(&parents, parent->item->object.sha1); | ||||||
| 	     parents; | 		parent = parent->next; | ||||||
| 	     parents = parents->next, num_parent++) | 	} | ||||||
| 		; /* nothing */ | 	diff_tree_combined(sha1, &parents, dense, rev); | ||||||
|  | 	sha1_array_clear(&parents); | ||||||
| 	parent = xmalloc(num_parent * sizeof(*parent)); |  | ||||||
| 	for (parents = commit->parents, num_parent = 0; |  | ||||||
| 	     parents; |  | ||||||
| 	     parents = parents->next, num_parent++) |  | ||||||
| 		hashcpy((unsigned char *)(parent + num_parent), |  | ||||||
| 			parents->item->object.sha1); |  | ||||||
| 	diff_tree_combined(sha1, parent, num_parent, dense, rev); |  | ||||||
| } | } | ||||||
|  |  | ||||||
							
								
								
									
										3
									
								
								diff.h
								
								
								
								
							
							
						
						
									
										3
									
								
								diff.h
								
								
								
								
							|  | @ -12,6 +12,7 @@ struct diff_queue_struct; | ||||||
| struct strbuf; | struct strbuf; | ||||||
| struct diff_filespec; | struct diff_filespec; | ||||||
| struct userdiff_driver; | struct userdiff_driver; | ||||||
|  | struct sha1_array; | ||||||
|  |  | ||||||
| typedef void (*change_fn_t)(struct diff_options *options, | typedef void (*change_fn_t)(struct diff_options *options, | ||||||
| 		 unsigned old_mode, unsigned new_mode, | 		 unsigned old_mode, unsigned new_mode, | ||||||
|  | @ -195,7 +196,7 @@ struct combine_diff_path { | ||||||
| extern void show_combined_diff(struct combine_diff_path *elem, int num_parent, | extern void show_combined_diff(struct combine_diff_path *elem, int num_parent, | ||||||
| 			      int dense, struct rev_info *); | 			      int dense, struct rev_info *); | ||||||
|  |  | ||||||
| extern void diff_tree_combined(const unsigned char *sha1, const unsigned char parent[][20], int num_parent, int dense, struct rev_info *rev); | extern void diff_tree_combined(const unsigned char *sha1, const struct sha1_array *parents, int dense, struct rev_info *rev); | ||||||
|  |  | ||||||
| extern void diff_tree_combined_merge(const unsigned char *sha1, int, struct rev_info *); | extern void diff_tree_combined_merge(const unsigned char *sha1, int, struct rev_info *); | ||||||
|  |  | ||||||
|  |  | ||||||
							
								
								
									
										14
									
								
								submodule.c
								
								
								
								
							
							
						
						
									
										14
									
								
								submodule.c
								
								
								
								
							|  | @ -373,15 +373,11 @@ static void collect_submodules_from_diff(struct diff_queue_struct *q, | ||||||
|  |  | ||||||
| static void commit_need_pushing(struct commit *commit, struct commit_list *parent, int *needs_pushing) | static void commit_need_pushing(struct commit *commit, struct commit_list *parent, int *needs_pushing) | ||||||
| { | { | ||||||
| 	const unsigned char (*parents)[20]; | 	struct sha1_array parents = SHA1_ARRAY_INIT; | ||||||
| 	unsigned int i, n; |  | ||||||
| 	struct rev_info rev; | 	struct rev_info rev; | ||||||
|  |  | ||||||
| 	n = commit_list_count(parent); | 	while (parent) { | ||||||
| 	parents = xmalloc(n * sizeof(*parents)); | 		sha1_array_append(&parents, parent->item->object.sha1); | ||||||
|  |  | ||||||
| 	for (i = 0; i < n; i++) { |  | ||||||
| 		hashcpy((unsigned char *)(parents + i), parent->item->object.sha1); |  | ||||||
| 		parent = parent->next; | 		parent = parent->next; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | @ -389,9 +385,9 @@ static void commit_need_pushing(struct commit *commit, struct commit_list *paren | ||||||
| 	rev.diffopt.output_format |= DIFF_FORMAT_CALLBACK; | 	rev.diffopt.output_format |= DIFF_FORMAT_CALLBACK; | ||||||
| 	rev.diffopt.format_callback = collect_submodules_from_diff; | 	rev.diffopt.format_callback = collect_submodules_from_diff; | ||||||
| 	rev.diffopt.format_callback_data = needs_pushing; | 	rev.diffopt.format_callback_data = needs_pushing; | ||||||
| 	diff_tree_combined(commit->object.sha1, parents, n, 1, &rev); | 	diff_tree_combined(commit->object.sha1, &parents, 1, &rev); | ||||||
|  |  | ||||||
| 	free((void *)parents); | 	sha1_array_clear(&parents); | ||||||
| } | } | ||||||
|  |  | ||||||
| int check_submodule_needs_pushing(unsigned char new_sha1[20], const char *remotes_name) | int check_submodule_needs_pushing(unsigned char new_sha1[20], const char *remotes_name) | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue
	
	 René Scharfe
						René Scharfe