static void normalize_checkout_opts( git_rebase *rebase, git_commit *current_commit, git_checkout_options *checkout_opts, const git_checkout_options *given_checkout_opts) { if (given_checkout_opts != NULL) memcpy(checkout_opts, given_checkout_opts, sizeof(git_checkout_options)); else { git_checkout_options default_checkout_opts = GIT_CHECKOUT_OPTIONS_INIT; default_checkout_opts.checkout_strategy = GIT_CHECKOUT_SAFE; memcpy(checkout_opts, &default_checkout_opts, sizeof(git_checkout_options)); } if (!checkout_opts->ancestor_label) checkout_opts->ancestor_label = "ancestor"; if (rebase->type == GIT_REBASE_TYPE_MERGE) { if (!checkout_opts->our_label) checkout_opts->our_label = rebase->onto_name; if (!checkout_opts->their_label) checkout_opts->their_label = git_commit_summary(current_commit); } else { Rf_error( "Error in 'normalize_checkout_opts': Unexpected error. Please report at" " https://github.com/ropensci/git2r/issues"); } }
static void assert_email_match( const char *expected, const char *oidstr, git_diff_format_email_options *opts) { git_oid oid; git_commit *commit = NULL; git_diff *diff = NULL; git_buf buf = GIT_BUF_INIT; git_oid_fromstr(&oid, oidstr); cl_git_pass(git_commit_lookup(&commit, repo, &oid)); opts->id = git_commit_id(commit); opts->author = git_commit_author(commit); if (!opts->summary) opts->summary = git_commit_summary(commit); cl_git_pass(git_diff__commit(&diff, repo, commit, NULL)); cl_git_pass(git_diff_format_email(&buf, diff, opts)); cl_assert_equal_s(expected, git_buf_cstr(&buf)); git_buf_clear(&buf); cl_git_pass(git_diff_commit_as_email( &buf, repo, commit, 1, 1, opts->flags, NULL)); cl_assert_equal_s(expected, git_buf_cstr(&buf)); git_diff_free(diff); git_commit_free(commit); git_buf_free(&buf); }
void test_diff_format_email__invalid_no(void) { git_oid oid; git_commit *commit = NULL; git_diff *diff = NULL; git_diff_format_email_options opts = GIT_DIFF_FORMAT_EMAIL_OPTIONS_INIT; git_buf buf = GIT_BUF_INIT; git_oid_fromstr(&oid, "9264b96c6d104d0e07ae33d3007b6a48246c6f92"); cl_git_pass(git_commit_lookup(&commit, repo, &oid)); opts.id = git_commit_id(commit); opts.author = git_commit_author(commit); opts.summary = git_commit_summary(commit); opts.patch_no = 2; opts.total_patches = 1; cl_git_pass(git_diff__commit(&diff, repo, commit, NULL)); cl_git_fail(git_diff_format_email(&buf, diff, &opts)); cl_git_fail(git_diff_commit_as_email(&buf, repo, commit, 2, 1, 0, NULL)); cl_git_fail(git_diff_commit_as_email(&buf, repo, commit, 0, 0, 0, NULL)); git_diff_free(diff); git_commit_free(commit); git_buf_free(&buf); }
static void normalize_checkout_opts( git_rebase *rebase, git_commit *current_commit, git_checkout_options *checkout_opts, const git_checkout_options *given_checkout_opts) { if (given_checkout_opts != NULL) memcpy(checkout_opts, given_checkout_opts, sizeof(git_checkout_options)); else { git_checkout_options default_checkout_opts = GIT_CHECKOUT_OPTIONS_INIT; default_checkout_opts.checkout_strategy = GIT_CHECKOUT_SAFE; memcpy(checkout_opts, &default_checkout_opts, sizeof(git_checkout_options)); } if (!checkout_opts->ancestor_label) checkout_opts->ancestor_label = "ancestor"; if (rebase->type == GIT_REBASE_TYPE_MERGE) { if (!checkout_opts->our_label) checkout_opts->our_label = rebase->onto_name; if (!checkout_opts->their_label) checkout_opts->their_label = git_commit_summary(current_commit); } else { abort(); } }
/** * Init slots in S4 class git_commit * * @param source a commit object * @param repo S4 class git_repository that contains the blob * @param dest S4 class git_commit to initialize * @return void */ void git2r_commit_init(git_commit *source, SEXP repo, SEXP dest) { const char *message; const char *summary; const git_signature *author; const git_signature *committer; char sha[GIT_OID_HEXSZ + 1]; git_oid_fmt(sha, git_commit_id(source)); sha[GIT_OID_HEXSZ] = '\0'; SET_SLOT(dest, Rf_install("sha"), mkString(sha)); author = git_commit_author(source); if (author) git2r_signature_init(author, GET_SLOT(dest, Rf_install("author"))); committer = git_commit_committer(source); if (committer) git2r_signature_init(committer, GET_SLOT(dest, Rf_install("committer"))); summary = git_commit_summary(source); if (summary) SET_SLOT(dest, Rf_install("summary"), mkString(summary)); message = git_commit_message(source); if (message) SET_SLOT(dest, Rf_install("message"), mkString(message)); SET_SLOT(dest, Rf_install("repo"), repo); }
int git_reference__update_for_commit( git_repository *repo, git_reference *ref, const char *ref_name, const git_oid *id, const git_signature *committer, const char *operation) { git_reference *ref_new = NULL; git_commit *commit = NULL; git_buf reflog_msg = GIT_BUF_INIT; int error; if ((error = git_commit_lookup(&commit, repo, id)) < 0 || (error = git_buf_printf(&reflog_msg, "%s%s: %s", operation ? operation : "commit", git_commit_parentcount(commit) == 0 ? " (initial)" : "", git_commit_summary(commit))) < 0) goto done; if (ref) error = git_reference_set_target( &ref_new, ref, id, committer, git_buf_cstr(&reflog_msg)); else error = git_reference__update_terminal( repo, ref_name, id, committer, git_buf_cstr(&reflog_msg)); done: git_reference_free(ref_new); git_buf_free(&reflog_msg); git_commit_free(commit); return error; }
int git_revert( git_repository *repo, git_commit *commit, const git_revert_options *given_opts) { git_revert_options opts; git_reference *our_ref = NULL; git_commit *our_commit = NULL; char commit_oidstr[GIT_OID_HEXSZ + 1]; const char *commit_msg; git_buf their_label = GIT_BUF_INIT; git_index *index = NULL; git_indexwriter indexwriter = GIT_INDEXWRITER_INIT; int error; assert(repo && commit); GITERR_CHECK_VERSION(given_opts, GIT_REVERT_OPTIONS_VERSION, "git_revert_options"); if ((error = git_repository__ensure_not_bare(repo, "revert")) < 0) return error; git_oid_fmt(commit_oidstr, git_commit_id(commit)); commit_oidstr[GIT_OID_HEXSZ] = '\0'; if ((commit_msg = git_commit_summary(commit)) == NULL) { error = -1; goto on_error; } if ((error = git_buf_printf(&their_label, "parent of %.7s... %s", commit_oidstr, commit_msg)) < 0 || (error = revert_normalize_opts(repo, &opts, given_opts, git_buf_cstr(&their_label))) < 0 || (error = git_indexwriter_init_for_operation(&indexwriter, repo, &opts.checkout_opts.checkout_strategy)) < 0 || (error = write_revert_head(repo, commit_oidstr)) < 0 || (error = write_merge_msg(repo, commit_oidstr, commit_msg)) < 0 || (error = git_repository_head(&our_ref, repo)) < 0 || (error = git_reference_peel((git_object **)&our_commit, our_ref, GIT_OBJ_COMMIT)) < 0 || (error = git_revert_commit(&index, repo, commit, our_commit, opts.mainline, &opts.merge_opts)) < 0 || (error = git_merge__check_result(repo, index)) < 0 || (error = git_merge__append_conflicts_to_merge_msg(repo, index)) < 0 || (error = git_checkout_index(repo, index, &opts.checkout_opts)) < 0 || (error = git_indexwriter_commit(&indexwriter)) < 0) goto on_error; goto done; on_error: revert_state_cleanup(repo); done: git_indexwriter_cleanup(&indexwriter); git_index_free(index); git_commit_free(our_commit); git_reference_free(our_ref); git_buf_free(&their_label); return error; }
void assert_commit_summary(const char *expected, const char *given) { git_commit *dummy; cl_assert(dummy = git__calloc(1, sizeof(struct git_commit))); dummy->raw_message = git__strdup(given); cl_assert_equal_s(expected, git_commit_summary(dummy)); git_commit__free(dummy); }
int git_cherry_pick( git_repository *repo, git_commit *commit, const git_cherry_pick_options *given_opts) { git_cherry_pick_options opts; git_reference *our_ref = NULL; git_commit *our_commit = NULL; char commit_oidstr[GIT_OID_HEXSZ + 1]; const char *commit_msg, *commit_summary; git_buf their_label = GIT_BUF_INIT; git_index *index_new = NULL; int error = 0; assert(repo && commit); GITERR_CHECK_VERSION(given_opts, GIT_CHERRY_PICK_OPTIONS_VERSION, "git_cherry_pick_options"); if ((error = git_repository__ensure_not_bare(repo, "cherry-pick")) < 0) return error; if ((commit_msg = git_commit_message(commit)) == NULL || (commit_summary = git_commit_summary(commit)) == NULL) { error = -1; goto on_error; } git_oid_nfmt(commit_oidstr, sizeof(commit_oidstr), git_commit_id(commit)); if ((error = write_merge_msg(repo, commit_msg)) < 0 || (error = git_buf_printf(&their_label, "%.7s... %s", commit_oidstr, commit_summary)) < 0 || (error = cherry_pick_normalize_opts(repo, &opts, given_opts, git_buf_cstr(&their_label))) < 0 || (error = write_cherry_pick_head(repo, commit_oidstr)) < 0 || (error = git_repository_head(&our_ref, repo)) < 0 || (error = git_reference_peel((git_object **)&our_commit, our_ref, GIT_OBJ_COMMIT)) < 0 || (error = git_cherry_pick_commit(&index_new, repo, commit, our_commit, opts.mainline, &opts.merge_opts)) < 0 || (error = git_merge__check_result(repo, index_new)) < 0 || (error = git_merge__append_conflicts_to_merge_msg(repo, index_new)) < 0 || (error = git_checkout_index(repo, index_new, &opts.checkout_opts)) < 0) goto on_error; goto done; on_error: cherry_pick_state_cleanup(repo); done: git_index_free(index_new); git_commit_free(our_commit); git_reference_free(our_ref); git_buf_free(&their_label); return error; }
/* * call-seq: * commit.summary -> summary * * Return the short summary message of this commit. * * In Ruby 1.9+, the returned string will be encoded with the encoding * specified in the +Encoding+ header of the commit, if available. * * commit.message #=> "add a lot of RDoc docs\n\nthis includes docs for commit and blob" * commit.summary #=> "add a lot of RDoc docs" */ static VALUE rb_git_commit_summary_GET(VALUE self) { git_commit *commit; rb_encoding *encoding = rb_utf8_encoding(); const char *encoding_name; const char *summary; Data_Get_Struct(self, git_commit, commit); summary = git_commit_summary(commit); encoding_name = git_commit_message_encoding(commit); if (encoding_name != NULL) encoding = rb_enc_find(encoding_name); return rb_enc_str_new(summary, strlen(summary), encoding); }
static void normalize_checkout_options_for_apply( git_checkout_options *checkout_opts, git_rebase *rebase, git_commit *current_commit) { memcpy(checkout_opts, &rebase->options.checkout_options, sizeof(git_checkout_options)); if (!checkout_opts->ancestor_label) checkout_opts->ancestor_label = "ancestor"; if (rebase->type == GIT_REBASE_TYPE_MERGE) { if (!checkout_opts->our_label) checkout_opts->our_label = rebase->onto_name; if (!checkout_opts->their_label) checkout_opts->their_label = git_commit_summary(current_commit); } else { abort(); } }
int git_reference__update_for_commit( git_repository *repo, git_reference *ref, const char *ref_name, const git_oid *id, const char *operation) { git_reference *ref_new = NULL; git_commit *commit = NULL; git_buf reflog_msg = GIT_BUF_INIT; const git_signature *who; int error; if ((error = git_commit_lookup(&commit, repo, id)) < 0 || (error = git_buf_printf(&reflog_msg, "%s%s: %s", operation ? operation : "commit", git_commit_parentcount(commit) == 0 ? " (initial)" : "", git_commit_summary(commit))) < 0) goto done; who = git_commit_committer(commit); if (ref) { if ((error = ensure_is_an_updatable_direct_reference(ref)) < 0) return error; error = reference__create(&ref_new, repo, ref->name, id, NULL, 1, who, git_buf_cstr(&reflog_msg), &ref->target.oid, NULL); } else error = git_reference__update_terminal( repo, ref_name, id, who, git_buf_cstr(&reflog_msg)); done: git_reference_free(ref_new); git_buf_free(&reflog_msg); git_commit_free(commit); return error; }
std::string Commit::summary() const { const char* ret = git_commit_summary(get()); return std::string(ret); }
void test_diff_format_email__multiple(void) { git_oid oid; git_commit *commit = NULL; git_diff *diff = NULL; git_diff_format_email_options opts = GIT_DIFF_FORMAT_EMAIL_OPTIONS_INIT; git_buf buf = GIT_BUF_INIT; const char *email = "From 10808fe9c9be5a190c0ba68d1a002233fb363508 Mon Sep 17 00:00:00 2001\n" \ "From: Jacques Germishuys <*****@*****.**>\n" \ "Date: Thu, 10 Apr 2014 19:37:05 +0200\n" \ "Subject: [PATCH 1/2] Added file2.txt file3.txt\n" \ "\n" \ "---\n" \ " file2.txt | 5 +++++\n" \ " file3.txt | 5 +++++\n" \ " 2 files changed, 10 insertions(+), 0 deletions(-)\n" \ " create mode 100644 file2.txt\n" \ " create mode 100644 file3.txt\n" \ "\n" \ "diff --git a/file2.txt b/file2.txt\n" \ "new file mode 100644\n" \ "index 0000000..e909123\n" \ "--- /dev/null\n" \ "+++ b/file2.txt\n" \ "@@ -0,0 +1,5 @@\n" \ "+file2\n" \ "+file2\n" \ "+file2\n" \ "+file2\n" \ "+file2\n" \ "diff --git a/file3.txt b/file3.txt\n" \ "new file mode 100644\n" \ "index 0000000..9435022\n" \ "--- /dev/null\n" \ "+++ b/file3.txt\n" \ "@@ -0,0 +1,5 @@\n" \ "+file3\n" \ "+file3\n" \ "+file3\n" \ "+file3\n" \ "+file3\n" \ "--\n" \ "libgit2 " LIBGIT2_VERSION "\n" \ "\n" \ "From 873806f6f27e631eb0b23e4b56bea2bfac14a373 Mon Sep 17 00:00:00 2001\n" \ "From: Jacques Germishuys <*****@*****.**>\n" \ "Date: Thu, 10 Apr 2014 19:37:36 +0200\n" \ "Subject: [PATCH 2/2] Modified file2.txt, file3.txt\n" \ "\n" \ "---\n" \ " file2.txt | 2 +-\n" \ " file3.txt | 2 +-\n" \ " 2 files changed, 2 insertions(+), 2 deletions(-)\n" \ "\n" \ "diff --git a/file2.txt b/file2.txt\n" \ "index e909123..7aff11d 100644\n" \ "--- a/file2.txt\n" \ "+++ b/file2.txt\n" \ "@@ -1,5 +1,5 @@\n" \ " file2\n" \ " file2\n" \ " file2\n" \ "-file2\n" \ "+file2!\n" \ " file2\n" \ "diff --git a/file3.txt b/file3.txt\n" \ "index 9435022..9a2d780 100644\n" \ "--- a/file3.txt\n" \ "+++ b/file3.txt\n" \ "@@ -1,5 +1,5 @@\n" \ " file3\n" \ "-file3\n" \ "+file3!\n" \ " file3\n" \ " file3\n" \ " file3\n" \ "--\n" \ "libgit2 " LIBGIT2_VERSION "\n" \ "\n"; git_oid_fromstr(&oid, "10808fe9c9be5a190c0ba68d1a002233fb363508"); cl_git_pass(git_commit_lookup(&commit, repo, &oid)); opts.id = git_commit_id(commit); opts.author = git_commit_author(commit); opts.summary = git_commit_summary(commit); opts.patch_no = 1; opts.total_patches = 2; cl_git_pass(git_diff__commit(&diff, repo, commit, NULL)); cl_git_pass(git_diff_format_email(&buf, diff, &opts)); git_diff_free(diff); git_commit_free(commit); diff = NULL; commit = NULL; git_oid_fromstr(&oid, "873806f6f27e631eb0b23e4b56bea2bfac14a373"); cl_git_pass(git_commit_lookup(&commit, repo, &oid)); opts.id = git_commit_id(commit); opts.author = git_commit_author(commit); opts.summary = git_commit_summary(commit); opts.patch_no = 2; opts.total_patches = 2; cl_git_pass(git_diff__commit(&diff, repo, commit, NULL)); cl_git_pass(git_diff_format_email(&buf, diff, &opts)); cl_assert_equal_s(email, git_buf_cstr(&buf)); git_diff_free(diff); git_commit_free(commit); git_buf_free(&buf); }
int luagi_commit_summary( lua_State *L ) { git_commit** commit = checkcommit( L ); lua_pushstring( L, git_commit_summary( *commit )); return 1; }