summaryrefslogtreecommitdiff
path: root/src/email.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/email.c')
-rw-r--r--src/email.c299
1 files changed, 0 insertions, 299 deletions
diff --git a/src/email.c b/src/email.c
deleted file mode 100644
index df63b6ec3..000000000
--- a/src/email.c
+++ /dev/null
@@ -1,299 +0,0 @@
-/*
- * Copyright (C) the libgit2 contributors. All rights reserved.
- *
- * This file is part of libgit2, distributed under the GNU GPL v2 with
- * a Linking Exception. For full terms see the included COPYING file.
- */
-
-#include "email.h"
-
-#include "buffer.h"
-#include "common.h"
-#include "diff_generate.h"
-
-#include "git2/email.h"
-#include "git2/patch.h"
-#include "git2/version.h"
-
-/*
- * Git uses a "magic" timestamp to indicate that an email message
- * is from `git format-patch` (or our equivalent).
- */
-#define EMAIL_TIMESTAMP "Mon Sep 17 00:00:00 2001"
-
-GIT_INLINE(int) include_prefix(
- size_t patch_count,
- git_email_create_options *opts)
-{
- return ((!opts->subject_prefix || *opts->subject_prefix) ||
- (opts->flags & GIT_EMAIL_CREATE_ALWAYS_NUMBER) != 0 ||
- opts->reroll_number ||
- (patch_count > 1 && !(opts->flags & GIT_EMAIL_CREATE_OMIT_NUMBERS)));
-}
-
-static int append_prefix(
- git_buf *out,
- size_t patch_idx,
- size_t patch_count,
- git_email_create_options *opts)
-{
- const char *subject_prefix = opts->subject_prefix ?
- opts->subject_prefix : "PATCH";
-
- git_buf_putc(out, '[');
-
- if (*subject_prefix)
- git_buf_puts(out, subject_prefix);
-
- if (opts->reroll_number) {
- if (*subject_prefix)
- git_buf_putc(out, ' ');
-
- git_buf_printf(out, "v%" PRIuZ, opts->reroll_number);
- }
-
- if ((opts->flags & GIT_EMAIL_CREATE_ALWAYS_NUMBER) != 0 ||
- (patch_count > 1 && !(opts->flags & GIT_EMAIL_CREATE_OMIT_NUMBERS))) {
- size_t start_number = opts->start_number ?
- opts->start_number : 1;
-
- if (*subject_prefix || opts->reroll_number)
- git_buf_putc(out, ' ');
-
- git_buf_printf(out, "%" PRIuZ "/%" PRIuZ,
- patch_idx + (start_number - 1),
- patch_count + (start_number - 1));
- }
-
- git_buf_puts(out, "]");
-
- return git_buf_oom(out) ? -1 : 0;
-}
-
-static int append_subject(
- git_buf *out,
- size_t patch_idx,
- size_t patch_count,
- const char *summary,
- git_email_create_options *opts)
-{
- bool prefix = include_prefix(patch_count, opts);
- size_t summary_len = summary ? strlen(summary) : 0;
- int error;
-
- if (summary_len) {
- const char *nl = strchr(summary, '\n');
-
- if (nl)
- summary_len = (nl - summary);
- }
-
- if ((error = git_buf_puts(out, "Subject: ")) < 0)
- return error;
-
- if (prefix &&
- (error = append_prefix(out, patch_idx, patch_count, opts)) < 0)
- return error;
-
- if (prefix && summary_len && (error = git_buf_putc(out, ' ')) < 0)
- return error;
-
- if (summary_len &&
- (error = git_buf_put(out, summary, summary_len)) < 0)
- return error;
-
- return git_buf_putc(out, '\n');
-}
-
-static int append_header(
- git_buf *out,
- size_t patch_idx,
- size_t patch_count,
- const git_oid *commit_id,
- const char *summary,
- const git_signature *author,
- git_email_create_options *opts)
-{
- char id[GIT_OID_HEXSZ];
- char date[GIT_DATE_RFC2822_SZ];
- int error;
-
- if ((error = git_oid_fmt(id, commit_id)) < 0 ||
- (error = git_buf_printf(out, "From %.*s %s\n", GIT_OID_HEXSZ, id, EMAIL_TIMESTAMP)) < 0 ||
- (error = git_buf_printf(out, "From: %s <%s>\n", author->name, author->email)) < 0 ||
- (error = git__date_rfc2822_fmt(date, sizeof(date), &author->when)) < 0 ||
- (error = git_buf_printf(out, "Date: %s\n", date)) < 0 ||
- (error = append_subject(out, patch_idx, patch_count, summary, opts)) < 0)
- return error;
-
- if ((error = git_buf_putc(out, '\n')) < 0)
- return error;
-
- return 0;
-}
-
-static int append_body(git_buf *out, const char *body)
-{
- size_t body_len;
- int error;
-
- if (!body)
- return 0;
-
- body_len = strlen(body);
-
- if ((error = git_buf_puts(out, body)) < 0)
- return error;
-
- if (body_len && body[body_len - 1] != '\n')
- error = git_buf_putc(out, '\n');
-
- return error;
-}
-
-static int append_diffstat(git_buf *out, git_diff *diff)
-{
- git_diff_stats *stats = NULL;
- unsigned int format_flags;
- int error;
-
- format_flags = GIT_DIFF_STATS_FULL | GIT_DIFF_STATS_INCLUDE_SUMMARY;
-
- if ((error = git_diff_get_stats(&stats, diff)) == 0 &&
- (error = git_diff_stats_to_buf(out, stats, format_flags, 0)) == 0)
- error = git_buf_putc(out, '\n');
-
- git_diff_stats_free(stats);
- return error;
-}
-
-static int append_patches(git_buf *out, git_diff *diff)
-{
- size_t i, deltas;
- int error = 0;
-
- deltas = git_diff_num_deltas(diff);
-
- for (i = 0; i < deltas; ++i) {
- git_patch *patch = NULL;
-
- if ((error = git_patch_from_diff(&patch, diff, i)) >= 0)
- error = git_patch_to_buf(out, patch);
-
- git_patch_free(patch);
-
- if (error < 0)
- break;
- }
-
- return error;
-}
-
-int git_email__append_from_diff(
- git_buf *out,
- git_diff *diff,
- size_t patch_idx,
- size_t patch_count,
- const git_oid *commit_id,
- const char *summary,
- const char *body,
- const git_signature *author,
- const git_email_create_options *given_opts)
-{
- git_email_create_options opts = GIT_EMAIL_CREATE_OPTIONS_INIT;
- int error;
-
- GIT_ASSERT_ARG(out);
- GIT_ASSERT_ARG(diff);
- GIT_ASSERT_ARG(!patch_idx || patch_idx <= patch_count);
- GIT_ASSERT_ARG(commit_id);
- GIT_ASSERT_ARG(author);
-
- GIT_ERROR_CHECK_VERSION(given_opts,
- GIT_EMAIL_CREATE_OPTIONS_VERSION,
- "git_email_create_options");
-
- if (given_opts)
- memcpy(&opts, given_opts, sizeof(git_email_create_options));
-
- git_buf_sanitize(out);
-
- if ((error = append_header(out, patch_idx, patch_count, commit_id, summary, author, &opts)) == 0 &&
- (error = append_body(out, body)) == 0 &&
- (error = git_buf_puts(out, "---\n")) == 0 &&
- (error = append_diffstat(out, diff)) == 0 &&
- (error = append_patches(out, diff)) == 0)
- error = git_buf_puts(out, "--\nlibgit2 " LIBGIT2_VERSION "\n\n");
-
- return error;
-}
-
-int git_email_create_from_diff(
- git_buf *out,
- git_diff *diff,
- size_t patch_idx,
- size_t patch_count,
- const git_oid *commit_id,
- const char *summary,
- const char *body,
- const git_signature *author,
- const git_email_create_options *given_opts)
-{
- int error;
-
- git_buf_sanitize(out);
- git_buf_clear(out);
-
- error = git_email__append_from_diff(out, diff, patch_idx,
- patch_count, commit_id, summary, body, author,
- given_opts);
-
- return error;
-}
-
-int git_email_create_from_commit(
- git_buf *out,
- git_commit *commit,
- const git_email_create_options *given_opts)
-{
- git_email_create_options opts = GIT_EMAIL_CREATE_OPTIONS_INIT;
- git_diff *diff = NULL;
- git_repository *repo;
- git_diff_options *diff_opts;
- git_diff_find_options *find_opts;
- const git_signature *author;
- const char *summary, *body;
- const git_oid *commit_id;
- int error = -1;
-
- GIT_ASSERT_ARG(out);
- GIT_ASSERT_ARG(commit);
-
- GIT_ERROR_CHECK_VERSION(given_opts,
- GIT_EMAIL_CREATE_OPTIONS_VERSION,
- "git_email_create_options");
-
- if (given_opts)
- memcpy(&opts, given_opts, sizeof(git_email_create_options));
-
- repo = git_commit_owner(commit);
- author = git_commit_author(commit);
- summary = git_commit_summary(commit);
- body = git_commit_body(commit);
- commit_id = git_commit_id(commit);
- diff_opts = &opts.diff_opts;
- find_opts = &opts.diff_find_opts;
-
- if ((error = git_diff__commit(&diff, repo, commit, diff_opts)) < 0)
- goto done;
-
- if ((opts.flags & GIT_EMAIL_CREATE_NO_RENAMES) == 0 &&
- (error = git_diff_find_similar(diff, find_opts)) < 0)
- goto done;
-
- error = git_email_create_from_diff(out, diff, 1, 1, commit_id, summary, body, author, &opts);
-
-done:
- git_diff_free(diff);
- return error;
-}