diff options
Diffstat (limited to 'range-diff.c')
| -rw-r--r-- | range-diff.c | 30 | 
1 files changed, 21 insertions, 9 deletions
| diff --git a/range-diff.c b/range-diff.c index 8a2dcbee32..57edff40a8 100644 --- a/range-diff.c +++ b/range-diff.c @@ -39,7 +39,7 @@ struct patch_util {   * as struct object_id (will need to be free()d).   */  static int read_patches(const char *range, struct string_list *list, -			const struct strvec *other_arg, +			const struct strvec *log_arg,  			unsigned int include_merges)  {  	struct child_process cp = CHILD_PROCESS_INIT; @@ -69,8 +69,8 @@ static int read_patches(const char *range, struct string_list *list,  	if (!include_merges)  		strvec_push(&cp.args, "--no-merges");  	strvec_push(&cp.args, range); -	if (other_arg) -		strvec_pushv(&cp.args, other_arg->v); +	if (log_arg) +		strvec_pushv(&cp.args, log_arg->v);  	cp.out = -1;  	cp.no_stdin = 1;  	cp.git_cmd = 1; @@ -325,13 +325,24 @@ static int diffsize(const char *a, const char *b)  }  static void get_correspondences(struct string_list *a, struct string_list *b, -				int creation_factor) +				int creation_factor, size_t max_memory)  {  	int n = a->nr + b->nr;  	int *cost, c, *a2b, *b2a;  	int i, j; - -	ALLOC_ARRAY(cost, st_mult(n, n)); +	size_t cost_size = st_mult(n, n); +	size_t cost_bytes = st_mult(sizeof(int), cost_size); +	if (cost_bytes >= max_memory) { +		struct strbuf cost_str = STRBUF_INIT; +		struct strbuf max_str = STRBUF_INIT; +		strbuf_humanise_bytes(&cost_str, cost_bytes); +		strbuf_humanise_bytes(&max_str, max_memory); +		die(_("range-diff: unable to compute the range-diff, since it " +		      "exceeds the maximum memory for the cost matrix: %s " +		      "(%"PRIuMAX" bytes) needed, limited to %s (%"PRIuMAX" bytes)"), +		    cost_str.buf, (uintmax_t)cost_bytes, max_str.buf, (uintmax_t)max_memory); +	} +	ALLOC_ARRAY(cost, cost_size);  	ALLOC_ARRAY(a2b, n);  	ALLOC_ARRAY(b2a, n); @@ -583,15 +594,16 @@ int show_range_diff(const char *range1, const char *range2,  	if (range_diff_opts->left_only && range_diff_opts->right_only)  		res = error(_("options '%s' and '%s' cannot be used together"), "--left-only", "--right-only"); -	if (!res && read_patches(range1, &branch1, range_diff_opts->other_arg, include_merges)) +	if (!res && read_patches(range1, &branch1, range_diff_opts->log_arg, include_merges))  		res = error(_("could not parse log for '%s'"), range1); -	if (!res && read_patches(range2, &branch2, range_diff_opts->other_arg, include_merges)) +	if (!res && read_patches(range2, &branch2, range_diff_opts->log_arg, include_merges))  		res = error(_("could not parse log for '%s'"), range2);  	if (!res) {  		find_exact_matches(&branch1, &branch2);  		get_correspondences(&branch1, &branch2, -				    range_diff_opts->creation_factor); +				    range_diff_opts->creation_factor, +				    range_diff_opts->max_memory);  		output(&branch1, &branch2, range_diff_opts);  	} | 
