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, | ||||
|                                 const char *after_subject, enum date_mode, | ||||
| 				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 | ||||
|  * 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; | ||||
| } | ||||
|  | ||||
| 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) | ||||
| { | ||||
| 	struct strbuf msgbuf; | ||||
|  | @ -186,64 +252,8 @@ void show_log(struct rev_info *opt, const char *sep) | |||
| 	 */ | ||||
|  | ||||
| 	if (opt->commit_format == CMIT_FMT_EMAIL) { | ||||
| 		char *sha1 = sha1_to_hex(commit->object.sha1); | ||||
| 		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", 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; | ||||
| 		} | ||||
| 		log_write_email_headers(opt, sha1_to_hex(commit->object.sha1), | ||||
| 					&subject, &extra_headers); | ||||
| 	} else if (opt->commit_format != CMIT_FMT_USERFORMAT) { | ||||
| 		fputs(diff_get_color_opt(&opt->diffopt, DIFF_COMMIT), stdout); | ||||
| 		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); | ||||
| void show_log(struct rev_info *opt, const char *sep); | ||||
| 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 | ||||
|  |  | |||
							
								
								
									
										12
									
								
								pretty.c
								
								
								
								
							
							
						
						
									
										12
									
								
								pretty.c
								
								
								
								
							|  | @ -110,7 +110,7 @@ needquote: | |||
| 	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 *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 | ||||
| 	 * 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 '<' | ||||
| 	 * that we found, it should have matching '>' later, | ||||
| 	 * 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)) { | ||||
| 			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) && | ||||
| 		    (fmt == CMIT_FMT_FULL || fmt == CMIT_FMT_FULLER)) { | ||||
| 			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, | ||||
| 		   struct strbuf *sb, | ||||
| 		   const char *subject, | ||||
|  | @ -708,7 +708,7 @@ static void pp_title_line(enum cmit_fmt fmt, | |||
| 	strbuf_release(&title); | ||||
| } | ||||
|  | ||||
| static void pp_remainder(enum cmit_fmt fmt, | ||||
| void pp_remainder(enum cmit_fmt fmt, | ||||
| 		  const char **msg_p, | ||||
| 		  struct strbuf *sb, | ||||
| 		  int indent) | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	 Daniel Barkalow
						Daniel Barkalow