diff options
| author | Junio C Hamano <junkio@cox.net> | 2007-02-27 02:27:26 -0800 | 
|---|---|---|
| committer | Junio C Hamano <junkio@cox.net> | 2007-02-27 02:27:26 -0800 | 
| commit | 88459358cdd70246e805b0ee7db7fffb9564f80e (patch) | |
| tree | 2bbb9cc6508fb5eb33e0d2fe1f70c5ada0bb7334 /builtin-log.c | |
| parent | fee7c2c71d9e35b2f54aa3631072bd7f73bb7b4c (diff) | |
| parent | 0ab179504a17907c395a4009f7c23d2f71bba1d3 (diff) | |
| download | git-88459358cdd70246e805b0ee7db7fffb9564f80e.tar.gz | |
Merge branch 'np/types' into jc/fetch
* np/types: (253 commits)
  get rid of lookup_object_type()
  convert object type handling from a string to a number
  formalize typename(), and add its reverse type_from_string()
  sha1_file.c: don't ignore an error condition in sha1_loose_object_info()
  sha1_file.c: cleanup "offset" usage
  sha1_file.c: cleanup hdr usage
  git-apply: do not fix whitespaces on context lines.
  diff --cc: integer overflow given a 2GB-or-larger file
  mailinfo: do not get confused with logical lines that are too long.
  Documentation: link in 1.5.0.2 material to the top documentation page.
  Documentation: document remote.<name>.tagopt
  GIT 1.5.0.2
  git-remote: support remotes with a dot in the name
  Documentation: describe "-f/-t/-m" options to "git-remote add"
  diff --cc: fix display of symlink conflicts during a merge.
  merge-recursive: fix longstanding bug in merging symlinks
  merge-index: fix longstanding bug in merging symlinks
  diff --cached: give more sensible error message when HEAD is yet to be created.
  Update tests to use test-chmtime
  Add test-chmtime: a utility to change mtime on files
  ...
Diffstat (limited to 'builtin-log.c')
| -rw-r--r-- | builtin-log.c | 44 | 
1 files changed, 29 insertions, 15 deletions
| diff --git a/builtin-log.c b/builtin-log.c index af2de54371..1c9f7d02a8 100644 --- a/builtin-log.c +++ b/builtin-log.c @@ -32,7 +32,7 @@ static void cmd_log_init(int argc, const char **argv, const char *prefix,  		rev->always_show_header = 0;  	for (i = 1; i < argc; i++) {  		const char *arg = argv[i]; -		if (!strncmp(arg, "--encoding=", 11)) { +		if (!prefixcmp(arg, "--encoding=")) {  			arg += 11;  			if (strcmp(arg, "none"))  				git_log_output_encoding = strdup(arg); @@ -89,8 +89,8 @@ int cmd_whatchanged(int argc, const char **argv, const char *prefix)  static int show_object(const unsigned char *sha1, int suppress_header)  {  	unsigned long size; -	char type[20]; -	char *buf = read_sha1_file(sha1, type, &size); +	enum object_type type; +	char *buf = read_sha1_file(sha1, &type, &size);  	int offset = 0;  	if (!buf) @@ -224,6 +224,9 @@ int cmd_log(int argc, const char **argv, const char *prefix)  	return cmd_log_walk(&rev);  } +/* format-patch */ +#define FORMAT_PATCH_NAME_MAX 64 +  static int istitlechar(char c)  {  	return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || @@ -264,15 +267,18 @@ static int git_format_config(const char *var, const char *value)  static FILE *realstdout = NULL;  static const char *output_directory = NULL; -static void reopen_stdout(struct commit *commit, int nr, int keep_subject) +static int reopen_stdout(struct commit *commit, int nr, int keep_subject)  { -	char filename[1024]; +	char filename[PATH_MAX];  	char *sol;  	int len = 0; -	int suffix_len = strlen(fmt_patch_suffix) + 10; /* ., NUL and slop */ +	int suffix_len = strlen(fmt_patch_suffix) + 1;  	if (output_directory) { -		strlcpy(filename, output_directory, 1000); +		if (strlen(output_directory) >= +		    sizeof(filename) - FORMAT_PATCH_NAME_MAX - suffix_len) +			return error("name of output directory is too long"); +		strlcpy(filename, output_directory, sizeof(filename) - suffix_len);  		len = strlen(filename);  		if (filename[len - 1] != '/')  			filename[len++] = '/'; @@ -287,7 +293,7 @@ static void reopen_stdout(struct commit *commit, int nr, int keep_subject)  		sol += 2;  		/* strip [PATCH] or [PATCH blabla] */ -		if (!keep_subject && !strncmp(sol, "[PATCH", 6)) { +		if (!keep_subject && !prefixcmp(sol, "[PATCH")) {  			char *eos = strchr(sol + 6, ']');  			if (eos) {  				while (isspace(*eos)) @@ -297,7 +303,8 @@ static void reopen_stdout(struct commit *commit, int nr, int keep_subject)  		}  		for (j = 0; -		     len < sizeof(filename) - suffix_len && +		     j < FORMAT_PATCH_NAME_MAX - suffix_len - 5 && +			     len < sizeof(filename) - suffix_len &&  			     sol[j] && sol[j] != '\n';  		     j++) {  			if (istitlechar(sol[j])) { @@ -314,10 +321,16 @@ static void reopen_stdout(struct commit *commit, int nr, int keep_subject)  		}  		while (filename[len - 1] == '.' || filename[len - 1] == '-')  			len--; +		filename[len] = 0;  	} +	if (len + suffix_len >= sizeof(filename)) +		return error("Patch pathname too long");  	strcpy(filename + len, fmt_patch_suffix);  	fprintf(realstdout, "%s\n", filename); -	freopen(filename, "w", stdout); +	if (freopen(filename, "w", stdout) == NULL) +		return error("Cannot open patch file %s",filename); +	return 0; +  }  static int get_patch_id(struct commit *commit, struct diff_options *options, @@ -435,7 +448,7 @@ int cmd_format_patch(int argc, const char **argv, const char *prefix)  		else if (!strcmp(argv[i], "-n") ||  				!strcmp(argv[i], "--numbered"))  			numbered = 1; -		else if (!strncmp(argv[i], "--start-number=", 15)) +		else if (!prefixcmp(argv[i], "--start-number="))  			start_number = strtol(argv[i] + 15, NULL, 10);  		else if (!strcmp(argv[i], "--start-number")) {  			i++; @@ -471,13 +484,13 @@ int cmd_format_patch(int argc, const char **argv, const char *prefix)  		}  		else if (!strcmp(argv[i], "--attach"))  			rev.mime_boundary = git_version_string; -		else if (!strncmp(argv[i], "--attach=", 9)) +		else if (!prefixcmp(argv[i], "--attach="))  			rev.mime_boundary = argv[i] + 9;  		else if (!strcmp(argv[i], "--ignore-if-in-upstream"))  			ignore_if_in_upstream = 1;  		else if (!strcmp(argv[i], "--thread"))  			thread = 1; -		else if (!strncmp(argv[i], "--in-reply-to=", 14)) +		else if (!prefixcmp(argv[i], "--in-reply-to="))  			in_reply_to = argv[i] + 14;  		else if (!strcmp(argv[i], "--in-reply-to")) {  			i++; @@ -485,7 +498,7 @@ int cmd_format_patch(int argc, const char **argv, const char *prefix)  				die("Need a Message-Id for --in-reply-to");  			in_reply_to = argv[i];  		} -		else if (!strncmp(argv[i], "--suffix=", 9)) +		else if (!prefixcmp(argv[i], "--suffix="))  			fmt_patch_suffix = argv[i] + 9;  		else  			argv[j++] = argv[i]; @@ -573,7 +586,8 @@ int cmd_format_patch(int argc, const char **argv, const char *prefix)  			rev.message_id = message_id;  		}  		if (!use_stdout) -			reopen_stdout(commit, rev.nr, keep_subject); +			if (reopen_stdout(commit, rev.nr, keep_subject)) +				die("Failed to create output files");  		shown = log_tree_commit(&rev, commit);  		free(commit->buffer);  		commit->buffer = NULL; | 
