summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: 46d164b)
raw | patch | inline | side by side (parent: 46d164b)
author | Stephen Boyd <bebarino@gmail.com> | |
Mon, 23 Mar 2009 02:14:02 +0000 (19:14 -0700) | ||
committer | Junio C Hamano <gitster@pobox.com> | |
Mon, 23 Mar 2009 04:33:04 +0000 (21:33 -0700) |
reopen_stdout() usually takes the oneline subject of a commit,
appends the patch suffix, prepends the output directory (if any) and
then reopens stdout as the resulting file. Now the patch filename (the
oneline subject and the patch suffix) is created in
get_patch_filename() and passed to reopen_stdout() which prepends the
output directory and reopens stdout as that file.
The original function to get the oneline description,
get_oneline_for_filename(), has been renamed to get_patch_filename() to
reflect its new functionality.
Signed-off-by: Stephen Boyd <bebarino@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
appends the patch suffix, prepends the output directory (if any) and
then reopens stdout as the resulting file. Now the patch filename (the
oneline subject and the patch suffix) is created in
get_patch_filename() and passed to reopen_stdout() which prepends the
output directory and reopens stdout as that file.
The original function to get the oneline description,
get_oneline_for_filename(), has been renamed to get_patch_filename() to
reflect its new functionality.
Signed-off-by: Stephen Boyd <bebarino@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin-log.c | patch | blob | history |
diff --git a/builtin-log.c b/builtin-log.c
index c7a57725948553a955f49ab891aed3fbdd3aa33d..193de3ff2e4a0dd82f3ba05dc05cb30995718152 100644 (file)
--- a/builtin-log.c
+++ b/builtin-log.c
/* format-patch */
#define FORMAT_PATCH_NAME_MAX 64
-static int istitlechar(char c)
-{
- return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') ||
- (c >= '0' && c <= '9') || c == '.' || c == '_';
-}
-
static const char *fmt_patch_suffix = ".patch";
static int numbered = 0;
static int auto_number = 1;
}
-static const char *get_oneline_for_filename(struct commit *commit,
- int keep_subject)
+static void get_patch_filename(struct commit *commit, int nr,
+ const char *suffix, struct strbuf *buf)
{
- static char filename[PATH_MAX];
- char *sol;
- int len = 0;
- int suffix_len = strlen(fmt_patch_suffix) + 1;
-
- sol = strstr(commit->buffer, "\n\n");
- if (!sol)
- filename[0] = '\0';
- else {
- int j, space = 0;
-
- sol += 2;
- /* strip [PATCH] or [PATCH blabla] */
- if (!keep_subject && !prefixcmp(sol, "[PATCH")) {
- char *eos = strchr(sol + 6, ']');
- if (eos) {
- while (isspace(*eos))
- eos++;
- sol = eos;
- }
- }
+ int suffix_len = strlen(suffix) + 1;
+ int start_len = buf->len;
- for (j = 0;
- j < FORMAT_PATCH_NAME_MAX - suffix_len - 5 &&
- len < sizeof(filename) - suffix_len &&
- sol[j] && sol[j] != '\n';
- j++) {
- if (istitlechar(sol[j])) {
- if (space) {
- filename[len++] = '-';
- space = 0;
- }
- filename[len++] = sol[j];
- if (sol[j] == '.')
- while (sol[j + 1] == '.')
- j++;
- } else
- space = 1;
- }
- while (filename[len - 1] == '.'
- || filename[len - 1] == '-')
- len--;
- filename[len] = '\0';
+ strbuf_addf(buf, commit ? "%04d-" : "%d", nr);
+ if (commit) {
+ format_commit_message(commit, "%f", buf, DATE_NORMAL);
+ /*
+ * Replace characters at the end with the suffix if the
+ * filename is too long
+ */
+ if (buf->len + suffix_len > FORMAT_PATCH_NAME_MAX + start_len)
+ strbuf_splice(buf,
+ start_len + FORMAT_PATCH_NAME_MAX - suffix_len,
+ suffix_len, suffix, suffix_len);
+ else
+ strbuf_addstr(buf, suffix);
}
- return filename;
}
static FILE *realstdout = NULL;
static const char *output_directory = NULL;
static int outdir_offset;
-static int reopen_stdout(const char *oneline, int nr, struct rev_info *rev)
+static int reopen_stdout(const char *oneline, struct rev_info *rev)
{
char filename[PATH_MAX];
int len = 0;
filename[len++] = '/';
}
- if (!oneline)
- len += sprintf(filename + len, "%d", nr);
- else {
- len += sprintf(filename + len, "%04d-", nr);
- len += snprintf(filename + len, sizeof(filename) - len - 1
- - suffix_len, "%s", oneline);
- strcpy(filename + len, fmt_patch_suffix);
- }
+ strncpy(filename + len, oneline, PATH_MAX - len);
if (!DIFF_OPT_TST(&rev->diffopt, QUIET))
fprintf(realstdout, "%s\n", filename + outdir_offset);
const char *encoding = "utf-8";
struct diff_options opts;
int need_8bit_cte = 0;
+ char filename[PATH_MAX];
if (rev->commit_format != CMIT_FMT_EMAIL)
die("Cover letter needs email format");
- if (!use_stdout && reopen_stdout(numbered_files ?
- NULL : "cover-letter", 0, rev))
+ if (numbered_files)
+ sprintf(filename, "0");
+ else
+ sprintf(filename, "%04d-cover-letter%s", 0, fmt_patch_suffix);
+
+ if (!use_stdout && reopen_stdout(filename, rev))
return;
head_sha1 = sha1_to_hex(head->object.sha1);
struct patch_ids ids;
char *add_signoff = NULL;
struct strbuf buf = STRBUF_INIT;
+ struct strbuf patch_filename = STRBUF_INIT;
git_config(git_format_config, NULL);
init_revisions(&rev, prefix);
}
gen_message_id(&rev, sha1_to_hex(commit->object.sha1));
}
- if (!use_stdout && reopen_stdout(numbered_files ? NULL :
- get_oneline_for_filename(commit, keep_subject),
- rev.nr, &rev))
+
+ get_patch_filename(numbered_files ? NULL : commit, rev.nr,
+ fmt_patch_suffix, &patch_filename);
+ if (!use_stdout && reopen_stdout(patch_filename.buf, &rev))
die("Failed to create output files");
+ strbuf_setlen(&patch_filename, 0);
shown = log_tree_commit(&rev, commit);
free(commit->buffer);
commit->buffer = NULL;
if (!use_stdout)
fclose(stdout);
}
+ strbuf_release(&patch_filename);
free(list);
if (ignore_if_in_upstream)
free_patch_ids(&ids);