Export some email and pretty-printing functions
These will be used for generating the cover letter in addition to the patch emails. Signed-off-by: Daniel Barkalow <barkalow@iabervon.org> Signed-off-by: Junio C Hamano <gitster@pobox.com>maint
							parent
							
								
									e1a3734621
								
							
						
					
					
						commit
						b02bd65f67
					
				
							
								
								
									
										15
									
								
								commit.h
								
								
								
								
							
							
						
						
									
										15
									
								
								commit.h
								
								
								
								
							|  | @ -71,6 +71,21 @@ extern void pretty_print_commit(enum cmit_fmt fmt, const struct commit*, | ||||||
|                                 int abbrev, const char *subject, |                                 int abbrev, const char *subject, | ||||||
|                                 const char *after_subject, enum date_mode, |                                 const char *after_subject, enum date_mode, | ||||||
| 				int non_ascii_present); | 				int non_ascii_present); | ||||||
|  | void pp_user_info(const char *what, enum cmit_fmt fmt, struct strbuf *sb, | ||||||
|  | 		   const char *line, enum date_mode dmode, | ||||||
|  | 		   const char *encoding); | ||||||
|  | void pp_title_line(enum cmit_fmt fmt, | ||||||
|  | 		   const char **msg_p, | ||||||
|  | 		   struct strbuf *sb, | ||||||
|  | 		   const char *subject, | ||||||
|  | 		   const char *after_subject, | ||||||
|  | 		   const char *encoding, | ||||||
|  | 		   int plain_non_ascii); | ||||||
|  | void pp_remainder(enum cmit_fmt fmt, | ||||||
|  | 		  const char **msg_p, | ||||||
|  | 		  struct strbuf *sb, | ||||||
|  | 		  int indent); | ||||||
|  |  | ||||||
|  |  | ||||||
| /** 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. | ||||||
|  |  | ||||||
							
								
								
									
										126
									
								
								log-tree.c
								
								
								
								
							
							
						
						
									
										126
									
								
								log-tree.c
								
								
								
								
							|  | @ -137,6 +137,72 @@ static int has_non_ascii(const char *s) | ||||||
| 	return 0; | 	return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | void log_write_email_headers(struct rev_info *opt, const char *name, | ||||||
|  | 			     const char **subject_p, const char **extra_headers_p) | ||||||
|  | { | ||||||
|  | 	const char *subject = NULL; | ||||||
|  | 	const char *extra_headers = opt->extra_headers; | ||||||
|  | 	if (opt->total > 0) { | ||||||
|  | 		static char buffer[64]; | ||||||
|  | 		snprintf(buffer, sizeof(buffer), | ||||||
|  | 			 "Subject: [%s %0*d/%d] ", | ||||||
|  | 			 opt->subject_prefix, | ||||||
|  | 			 digits_in_number(opt->total), | ||||||
|  | 			 opt->nr, opt->total); | ||||||
|  | 		subject = buffer; | ||||||
|  | 	} else if (opt->total == 0 && opt->subject_prefix && *opt->subject_prefix) { | ||||||
|  | 		static char buffer[256]; | ||||||
|  | 		snprintf(buffer, sizeof(buffer), | ||||||
|  | 			 "Subject: [%s] ", | ||||||
|  | 			 opt->subject_prefix); | ||||||
|  | 		subject = buffer; | ||||||
|  | 	} else { | ||||||
|  | 		subject = "Subject: "; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	printf("From %s Mon Sep 17 00:00:00 2001\n", name); | ||||||
|  | 	if (opt->message_id) | ||||||
|  | 		printf("Message-Id: <%s>\n", opt->message_id); | ||||||
|  | 	if (opt->ref_message_id) | ||||||
|  | 		printf("In-Reply-To: <%s>\nReferences: <%s>\n", | ||||||
|  | 		       opt->ref_message_id, opt->ref_message_id); | ||||||
|  | 	if (opt->mime_boundary) { | ||||||
|  | 		static char subject_buffer[1024]; | ||||||
|  | 		static char buffer[1024]; | ||||||
|  | 		snprintf(subject_buffer, sizeof(subject_buffer) - 1, | ||||||
|  | 			 "%s" | ||||||
|  | 			 "MIME-Version: 1.0\n" | ||||||
|  | 			 "Content-Type: multipart/mixed;" | ||||||
|  | 			 " boundary=\"%s%s\"\n" | ||||||
|  | 			 "\n" | ||||||
|  | 			 "This is a multi-part message in MIME " | ||||||
|  | 			 "format.\n" | ||||||
|  | 			 "--%s%s\n" | ||||||
|  | 			 "Content-Type: text/plain; " | ||||||
|  | 			 "charset=UTF-8; format=fixed\n" | ||||||
|  | 			 "Content-Transfer-Encoding: 8bit\n\n", | ||||||
|  | 			 extra_headers ? extra_headers : "", | ||||||
|  | 			 mime_boundary_leader, opt->mime_boundary, | ||||||
|  | 			 mime_boundary_leader, opt->mime_boundary); | ||||||
|  | 		extra_headers = subject_buffer; | ||||||
|  |  | ||||||
|  | 		snprintf(buffer, sizeof(buffer) - 1, | ||||||
|  | 			 "--%s%s\n" | ||||||
|  | 			 "Content-Type: text/x-patch;" | ||||||
|  | 			 " name=\"%s.diff\"\n" | ||||||
|  | 			 "Content-Transfer-Encoding: 8bit\n" | ||||||
|  | 			 "Content-Disposition: %s;" | ||||||
|  | 			 " filename=\"%s.diff\"\n\n", | ||||||
|  | 			 mime_boundary_leader, opt->mime_boundary, | ||||||
|  | 			 name, | ||||||
|  | 			 opt->no_inline ? "attachment" : "inline", | ||||||
|  | 			 name); | ||||||
|  | 		opt->diffopt.stat_sep = buffer; | ||||||
|  | 	} | ||||||
|  | 	*subject_p = subject; | ||||||
|  | 	*extra_headers_p = extra_headers; | ||||||
|  | } | ||||||
|  |  | ||||||
| void show_log(struct rev_info *opt, const char *sep) | void show_log(struct rev_info *opt, const char *sep) | ||||||
| { | { | ||||||
| 	struct strbuf msgbuf; | 	struct strbuf msgbuf; | ||||||
|  | @ -186,64 +252,8 @@ void show_log(struct rev_info *opt, const char *sep) | ||||||
| 	 */ | 	 */ | ||||||
|  |  | ||||||
| 	if (opt->commit_format == CMIT_FMT_EMAIL) { | 	if (opt->commit_format == CMIT_FMT_EMAIL) { | ||||||
| 		char *sha1 = sha1_to_hex(commit->object.sha1); | 		log_write_email_headers(opt, sha1_to_hex(commit->object.sha1), | ||||||
| 		if (opt->total > 0) { | 					&subject, &extra_headers); | ||||||
| 			static char buffer[64]; |  | ||||||
| 			snprintf(buffer, sizeof(buffer), |  | ||||||
| 					"Subject: [%s %0*d/%d] ", |  | ||||||
| 					opt->subject_prefix, |  | ||||||
| 					digits_in_number(opt->total), |  | ||||||
| 					opt->nr, opt->total); |  | ||||||
| 			subject = buffer; |  | ||||||
| 		} else if (opt->total == 0 && opt->subject_prefix && *opt->subject_prefix) { |  | ||||||
| 			static char buffer[256]; |  | ||||||
| 			snprintf(buffer, sizeof(buffer), |  | ||||||
| 					"Subject: [%s] ", |  | ||||||
| 					opt->subject_prefix); |  | ||||||
| 			subject = buffer; |  | ||||||
| 		} else { |  | ||||||
| 			subject = "Subject: "; |  | ||||||
| 		} |  | ||||||
|  |  | ||||||
| 		printf("From %s Mon Sep 17 00:00:00 2001\n", sha1); |  | ||||||
| 		if (opt->message_id) |  | ||||||
| 			printf("Message-Id: <%s>\n", opt->message_id); |  | ||||||
| 		if (opt->ref_message_id) |  | ||||||
| 			printf("In-Reply-To: <%s>\nReferences: <%s>\n", |  | ||||||
| 			       opt->ref_message_id, opt->ref_message_id); |  | ||||||
| 		if (opt->mime_boundary) { |  | ||||||
| 			static char subject_buffer[1024]; |  | ||||||
| 			static char buffer[1024]; |  | ||||||
| 			snprintf(subject_buffer, sizeof(subject_buffer) - 1, |  | ||||||
| 				 "%s" |  | ||||||
| 				 "MIME-Version: 1.0\n" |  | ||||||
| 				 "Content-Type: multipart/mixed;" |  | ||||||
| 				 " boundary=\"%s%s\"\n" |  | ||||||
| 				 "\n" |  | ||||||
| 				 "This is a multi-part message in MIME " |  | ||||||
| 				 "format.\n" |  | ||||||
| 				 "--%s%s\n" |  | ||||||
| 				 "Content-Type: text/plain; " |  | ||||||
| 				 "charset=UTF-8; format=fixed\n" |  | ||||||
| 				 "Content-Transfer-Encoding: 8bit\n\n", |  | ||||||
| 				 extra_headers ? extra_headers : "", |  | ||||||
| 				 mime_boundary_leader, opt->mime_boundary, |  | ||||||
| 				 mime_boundary_leader, opt->mime_boundary); |  | ||||||
| 			extra_headers = subject_buffer; |  | ||||||
|  |  | ||||||
| 			snprintf(buffer, sizeof(buffer) - 1, |  | ||||||
| 				 "--%s%s\n" |  | ||||||
| 				 "Content-Type: text/x-patch;" |  | ||||||
| 				 " name=\"%s.diff\"\n" |  | ||||||
| 				 "Content-Transfer-Encoding: 8bit\n" |  | ||||||
| 				 "Content-Disposition: %s;" |  | ||||||
| 				 " filename=\"%s.diff\"\n\n", |  | ||||||
| 				 mime_boundary_leader, opt->mime_boundary, |  | ||||||
| 				 sha1, |  | ||||||
| 				 opt->no_inline ? "attachment" : "inline", |  | ||||||
| 				 sha1); |  | ||||||
| 			opt->diffopt.stat_sep = buffer; |  | ||||||
| 		} |  | ||||||
| 	} else if (opt->commit_format != CMIT_FMT_USERFORMAT) { | 	} else if (opt->commit_format != CMIT_FMT_USERFORMAT) { | ||||||
| 		fputs(diff_get_color_opt(&opt->diffopt, DIFF_COMMIT), stdout); | 		fputs(diff_get_color_opt(&opt->diffopt, DIFF_COMMIT), stdout); | ||||||
| 		if (opt->commit_format != CMIT_FMT_ONELINE) | 		if (opt->commit_format != CMIT_FMT_ONELINE) | ||||||
|  |  | ||||||
|  | @ -13,5 +13,7 @@ int log_tree_commit(struct rev_info *, struct commit *); | ||||||
| int log_tree_opt_parse(struct rev_info *, const char **, int); | int log_tree_opt_parse(struct rev_info *, const char **, int); | ||||||
| void show_log(struct rev_info *opt, const char *sep); | void show_log(struct rev_info *opt, const char *sep); | ||||||
| void show_decorations(struct commit *commit); | void show_decorations(struct commit *commit); | ||||||
|  | void log_write_email_headers(struct rev_info *opt, const char *name, | ||||||
|  | 			     const char **subject_p, const char **extra_headers_p); | ||||||
|  |  | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
							
								
								
									
										12
									
								
								pretty.c
								
								
								
								
							
							
						
						
									
										12
									
								
								pretty.c
								
								
								
								
							|  | @ -110,7 +110,7 @@ needquote: | ||||||
| 	strbuf_addstr(sb, "?="); | 	strbuf_addstr(sb, "?="); | ||||||
| } | } | ||||||
|  |  | ||||||
| static void add_user_info(const char *what, enum cmit_fmt fmt, struct strbuf *sb, | void pp_user_info(const char *what, enum cmit_fmt fmt, struct strbuf *sb, | ||||||
| 		  const char *line, enum date_mode dmode, | 		  const char *line, enum date_mode dmode, | ||||||
| 		  const char *encoding) | 		  const char *encoding) | ||||||
| { | { | ||||||
|  | @ -295,7 +295,7 @@ static void format_person_part(struct strbuf *sb, char part, | ||||||
| 	/* | 	/* | ||||||
| 	 * If it does not even have a '<' and '>', that is | 	 * If it does not even have a '<' and '>', that is | ||||||
| 	 * quite a bogus commit author and we discard it; | 	 * quite a bogus commit author and we discard it; | ||||||
| 	 * this is in line with add_user_info() that is used | 	 * this is in line with pp_user_info() that is used | ||||||
| 	 * in the normal codepath.  When end points at the '<' | 	 * in the normal codepath.  When end points at the '<' | ||||||
| 	 * that we found, it should have matching '>' later, | 	 * that we found, it should have matching '>' later, | ||||||
| 	 * which means start (beginning of email address) must | 	 * which means start (beginning of email address) must | ||||||
|  | @ -643,17 +643,17 @@ static void pp_header(enum cmit_fmt fmt, | ||||||
| 		 */ | 		 */ | ||||||
| 		if (!memcmp(line, "author ", 7)) { | 		if (!memcmp(line, "author ", 7)) { | ||||||
| 			strbuf_grow(sb, linelen + 80); | 			strbuf_grow(sb, linelen + 80); | ||||||
| 			add_user_info("Author", fmt, sb, line + 7, dmode, encoding); | 			pp_user_info("Author", fmt, sb, line + 7, dmode, encoding); | ||||||
| 		} | 		} | ||||||
| 		if (!memcmp(line, "committer ", 10) && | 		if (!memcmp(line, "committer ", 10) && | ||||||
| 		    (fmt == CMIT_FMT_FULL || fmt == CMIT_FMT_FULLER)) { | 		    (fmt == CMIT_FMT_FULL || fmt == CMIT_FMT_FULLER)) { | ||||||
| 			strbuf_grow(sb, linelen + 80); | 			strbuf_grow(sb, linelen + 80); | ||||||
| 			add_user_info("Commit", fmt, sb, line + 10, dmode, encoding); | 			pp_user_info("Commit", fmt, sb, line + 10, dmode, encoding); | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
| static void pp_title_line(enum cmit_fmt fmt, | void pp_title_line(enum cmit_fmt fmt, | ||||||
| 		   const char **msg_p, | 		   const char **msg_p, | ||||||
| 		   struct strbuf *sb, | 		   struct strbuf *sb, | ||||||
| 		   const char *subject, | 		   const char *subject, | ||||||
|  | @ -708,7 +708,7 @@ static void pp_title_line(enum cmit_fmt fmt, | ||||||
| 	strbuf_release(&title); | 	strbuf_release(&title); | ||||||
| } | } | ||||||
|  |  | ||||||
| static void pp_remainder(enum cmit_fmt fmt, | void pp_remainder(enum cmit_fmt fmt, | ||||||
| 		  const char **msg_p, | 		  const char **msg_p, | ||||||
| 		  struct strbuf *sb, | 		  struct strbuf *sb, | ||||||
| 		  int indent) | 		  int indent) | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue
	
	 Daniel Barkalow
						Daniel Barkalow