convert logmsg_reencode to get_commit_buffer
Like the callsites in the previous commit, logmsg_reencode already falls back to read_sha1_file when necessary. However, I split its conversion out into its own commit because it's a bit more complex. We return either: 1. The original commit->buffer 2. A newly allocated buffer from read_sha1_file 3. A reencoded buffer (based on either 1 or 2 above). while trying to do as few extra reads/allocations as possible. Callers currently free the result with logmsg_free, but we can simplify this by pointing them straight to unuse_commit_buffer. This is a slight layering violation, in that we may be passing a buffer from (3). However, since the end result is to free() anything except (1), which is unlikely to change, and because this makes the interface much simpler, it's a reasonable bending of the rules. Signed-off-by: Jeff King <peff@peff.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>maint
							parent
							
								
									ba41c1c93f
								
							
						
					
					
						commit
						b66103c3ba
					
				|  | @ -1416,7 +1416,7 @@ static void get_commit_info(struct commit *commit, | ||||||
| 		    &ret->author_time, &ret->author_tz); | 		    &ret->author_time, &ret->author_tz); | ||||||
|  |  | ||||||
| 	if (!detailed) { | 	if (!detailed) { | ||||||
| 		logmsg_free(message, commit); | 		unuse_commit_buffer(commit, message); | ||||||
| 		return; | 		return; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | @ -1430,7 +1430,7 @@ static void get_commit_info(struct commit *commit, | ||||||
| 	else | 	else | ||||||
| 		strbuf_addf(&ret->summary, "(%s)", sha1_to_hex(commit->object.sha1)); | 		strbuf_addf(&ret->summary, "(%s)", sha1_to_hex(commit->object.sha1)); | ||||||
|  |  | ||||||
| 	logmsg_free(message, commit); | 	unuse_commit_buffer(commit, message); | ||||||
| } | } | ||||||
|  |  | ||||||
| /* | /* | ||||||
|  |  | ||||||
|  | @ -109,7 +109,7 @@ static void print_new_head_line(struct commit *commit) | ||||||
| 	} | 	} | ||||||
| 	else | 	else | ||||||
| 		printf("\n"); | 		printf("\n"); | ||||||
| 	logmsg_free(msg, commit); | 	unuse_commit_buffer(commit, msg); | ||||||
| } | } | ||||||
|  |  | ||||||
| static void update_index_from_diff(struct diff_queue_struct *q, | static void update_index_from_diff(struct diff_queue_struct *q, | ||||||
|  |  | ||||||
							
								
								
									
										1
									
								
								commit.h
								
								
								
								
							
							
						
						
									
										1
									
								
								commit.h
								
								
								
								
							|  | @ -156,7 +156,6 @@ struct rev_info; /* in revision.h, it circularly uses enum cmit_fmt */ | ||||||
| extern const char *logmsg_reencode(const struct commit *commit, | extern const char *logmsg_reencode(const struct commit *commit, | ||||||
| 				   char **commit_encoding, | 				   char **commit_encoding, | ||||||
| 				   const char *output_encoding); | 				   const char *output_encoding); | ||||||
| extern void logmsg_free(const char *msg, const struct commit *commit); |  | ||||||
| extern void get_commit_format(const char *arg, struct rev_info *); | extern void get_commit_format(const char *arg, struct rev_info *); | ||||||
| extern const char *format_subject(struct strbuf *sb, const char *msg, | extern const char *format_subject(struct strbuf *sb, const char *msg, | ||||||
| 				  const char *line_separator); | 				  const char *line_separator); | ||||||
|  |  | ||||||
							
								
								
									
										40
									
								
								pretty.c
								
								
								
								
							
							
						
						
									
										40
									
								
								pretty.c
								
								
								
								
							|  | @ -613,22 +613,9 @@ const char *logmsg_reencode(const struct commit *commit, | ||||||
| 	static const char *utf8 = "UTF-8"; | 	static const char *utf8 = "UTF-8"; | ||||||
| 	const char *use_encoding; | 	const char *use_encoding; | ||||||
| 	char *encoding; | 	char *encoding; | ||||||
| 	char *msg = commit->buffer; | 	const char *msg = get_commit_buffer(commit); | ||||||
| 	char *out; | 	char *out; | ||||||
|  |  | ||||||
| 	if (!msg) { |  | ||||||
| 		enum object_type type; |  | ||||||
| 		unsigned long size; |  | ||||||
|  |  | ||||||
| 		msg = read_sha1_file(commit->object.sha1, &type, &size); |  | ||||||
| 		if (!msg) |  | ||||||
| 			die("Cannot read commit object %s", |  | ||||||
| 			    sha1_to_hex(commit->object.sha1)); |  | ||||||
| 		if (type != OBJ_COMMIT) |  | ||||||
| 			die("Expected commit for '%s', got %s", |  | ||||||
| 			    sha1_to_hex(commit->object.sha1), typename(type)); |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	if (!output_encoding || !*output_encoding) { | 	if (!output_encoding || !*output_encoding) { | ||||||
| 		if (commit_encoding) | 		if (commit_encoding) | ||||||
| 			*commit_encoding = | 			*commit_encoding = | ||||||
|  | @ -652,12 +639,13 @@ const char *logmsg_reencode(const struct commit *commit, | ||||||
| 		 * Otherwise, we still want to munge the encoding header in the | 		 * Otherwise, we still want to munge the encoding header in the | ||||||
| 		 * result, which will be done by modifying the buffer. If we | 		 * result, which will be done by modifying the buffer. If we | ||||||
| 		 * are using a fresh copy, we can reuse it. But if we are using | 		 * are using a fresh copy, we can reuse it. But if we are using | ||||||
| 		 * the cached copy from commit->buffer, we need to duplicate it | 		 * the cached copy from get_commit_buffer, we need to duplicate it | ||||||
| 		 * to avoid munging commit->buffer. | 		 * to avoid munging the cached copy. | ||||||
| 		 */ | 		 */ | ||||||
| 		out = msg; | 		if (msg == get_cached_commit_buffer(commit)) | ||||||
| 		if (out == commit->buffer) | 			out = xstrdup(msg); | ||||||
| 			out = xstrdup(out); | 		else | ||||||
|  | 			out = (char *)msg; | ||||||
| 	} | 	} | ||||||
| 	else { | 	else { | ||||||
| 		/* | 		/* | ||||||
|  | @ -667,8 +655,8 @@ const char *logmsg_reencode(const struct commit *commit, | ||||||
| 		 * copy, we can free it. | 		 * copy, we can free it. | ||||||
| 		 */ | 		 */ | ||||||
| 		out = reencode_string(msg, output_encoding, use_encoding); | 		out = reencode_string(msg, output_encoding, use_encoding); | ||||||
| 		if (out && msg != commit->buffer) | 		if (out) | ||||||
| 			free(msg); | 			unuse_commit_buffer(commit, msg); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	/* | 	/* | ||||||
|  | @ -687,12 +675,6 @@ const char *logmsg_reencode(const struct commit *commit, | ||||||
| 	return out ? out : msg; | 	return out ? out : msg; | ||||||
| } | } | ||||||
|  |  | ||||||
| void logmsg_free(const char *msg, const struct commit *commit) |  | ||||||
| { |  | ||||||
| 	if (msg != commit->buffer) |  | ||||||
| 		free((void *)msg); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| static int mailmap_name(const char **email, size_t *email_len, | static int mailmap_name(const char **email, size_t *email_len, | ||||||
| 			const char **name, size_t *name_len) | 			const char **name, size_t *name_len) | ||||||
| { | { | ||||||
|  | @ -1531,7 +1513,7 @@ void format_commit_message(const struct commit *commit, | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	free(context.commit_encoding); | 	free(context.commit_encoding); | ||||||
| 	logmsg_free(context.message, commit); | 	unuse_commit_buffer(commit, context.message); | ||||||
| 	free(context.signature_check.gpg_output); | 	free(context.signature_check.gpg_output); | ||||||
| 	free(context.signature_check.signer); | 	free(context.signature_check.signer); | ||||||
| } | } | ||||||
|  | @ -1767,7 +1749,7 @@ void pretty_print_commit(struct pretty_print_context *pp, | ||||||
| 	if (pp->fmt == CMIT_FMT_EMAIL && sb->len <= beginning_of_body) | 	if (pp->fmt == CMIT_FMT_EMAIL && sb->len <= beginning_of_body) | ||||||
| 		strbuf_addch(sb, '\n'); | 		strbuf_addch(sb, '\n'); | ||||||
|  |  | ||||||
| 	logmsg_free(reencoded, commit); | 	unuse_commit_buffer(commit, reencoded); | ||||||
| } | } | ||||||
|  |  | ||||||
| void pp_commit_easy(enum cmit_fmt fmt, const struct commit *commit, | void pp_commit_easy(enum cmit_fmt fmt, const struct commit *commit, | ||||||
|  |  | ||||||
|  | @ -2844,7 +2844,7 @@ static int commit_match(struct commit *commit, struct rev_info *opt) | ||||||
| 		retval = grep_buffer(&opt->grep_filter, | 		retval = grep_buffer(&opt->grep_filter, | ||||||
| 				     (char *)message, strlen(message)); | 				     (char *)message, strlen(message)); | ||||||
| 	strbuf_release(&buf); | 	strbuf_release(&buf); | ||||||
| 	logmsg_free(message, commit); | 	unuse_commit_buffer(commit, message); | ||||||
| 	return retval; | 	return retval; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | @ -154,7 +154,7 @@ static int get_message(struct commit *commit, struct commit_message *out) | ||||||
| static void free_message(struct commit *commit, struct commit_message *msg) | static void free_message(struct commit *commit, struct commit_message *msg) | ||||||
| { | { | ||||||
| 	free(msg->parent_label); | 	free(msg->parent_label); | ||||||
| 	logmsg_free(msg->message, commit); | 	unuse_commit_buffer(commit, msg->message); | ||||||
| } | } | ||||||
|  |  | ||||||
| static void write_cherry_pick_head(struct commit *commit, const char *pseudoref) | static void write_cherry_pick_head(struct commit *commit, const char *pseudoref) | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue
	
	 Jeff King
						Jeff King