forked from gitster/git
-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Move copy_note_for_rewrite + friends from builtin/notes.c to notes-ut…
…ils.c This is a pure code movement of the machinery for copying notes to rewritten objects. This code was located in builtin/notes.c for historical reasons. In order to make it available to builtin/commit.c it was declared in builtin.h. This was more of an accident of history than a concious design, and we now want to make this machinery more widely available. Hence, this patch moves the code into the new notes-utils.[hc] files which are included into libgit.a. Except for adjusting #includes accordingly, this patch merely moves the relevant functions verbatim into the new files. Cc: Thomas Rast <trast@inf.ethz.ch> Signed-off-by: Johan Herland <johan@herland.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>
- Loading branch information
Showing
6 changed files
with
159 additions
and
146 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,132 @@ | ||
#include "cache.h" | ||
#include "commit.h" | ||
#include "refs.h" | ||
#include "notes-utils.h" | ||
#include "notes-merge.h" /* for create_notes_commit() */ | ||
|
||
void commit_notes(struct notes_tree *t, const char *msg) | ||
{ | ||
struct strbuf buf = STRBUF_INIT; | ||
unsigned char commit_sha1[20]; | ||
|
||
if (!t) | ||
t = &default_notes_tree; | ||
if (!t->initialized || !t->ref || !*t->ref) | ||
die(_("Cannot commit uninitialized/unreferenced notes tree")); | ||
if (!t->dirty) | ||
return; /* don't have to commit an unchanged tree */ | ||
|
||
/* Prepare commit message and reflog message */ | ||
strbuf_addstr(&buf, msg); | ||
if (buf.buf[buf.len - 1] != '\n') | ||
strbuf_addch(&buf, '\n'); /* Make sure msg ends with newline */ | ||
|
||
create_notes_commit(t, NULL, &buf, commit_sha1); | ||
strbuf_insert(&buf, 0, "notes: ", 7); /* commit message starts at index 7 */ | ||
update_ref(buf.buf, t->ref, commit_sha1, NULL, 0, DIE_ON_ERR); | ||
|
||
strbuf_release(&buf); | ||
} | ||
|
||
static combine_notes_fn parse_combine_notes_fn(const char *v) | ||
{ | ||
if (!strcasecmp(v, "overwrite")) | ||
return combine_notes_overwrite; | ||
else if (!strcasecmp(v, "ignore")) | ||
return combine_notes_ignore; | ||
else if (!strcasecmp(v, "concatenate")) | ||
return combine_notes_concatenate; | ||
else if (!strcasecmp(v, "cat_sort_uniq")) | ||
return combine_notes_cat_sort_uniq; | ||
else | ||
return NULL; | ||
} | ||
|
||
static int notes_rewrite_config(const char *k, const char *v, void *cb) | ||
{ | ||
struct notes_rewrite_cfg *c = cb; | ||
if (!prefixcmp(k, "notes.rewrite.") && !strcmp(k+14, c->cmd)) { | ||
c->enabled = git_config_bool(k, v); | ||
return 0; | ||
} else if (!c->mode_from_env && !strcmp(k, "notes.rewritemode")) { | ||
if (!v) | ||
config_error_nonbool(k); | ||
c->combine = parse_combine_notes_fn(v); | ||
if (!c->combine) { | ||
error(_("Bad notes.rewriteMode value: '%s'"), v); | ||
return 1; | ||
} | ||
return 0; | ||
} else if (!c->refs_from_env && !strcmp(k, "notes.rewriteref")) { | ||
/* note that a refs/ prefix is implied in the | ||
* underlying for_each_glob_ref */ | ||
if (!prefixcmp(v, "refs/notes/")) | ||
string_list_add_refs_by_glob(c->refs, v); | ||
else | ||
warning(_("Refusing to rewrite notes in %s" | ||
" (outside of refs/notes/)"), v); | ||
return 0; | ||
} | ||
|
||
return 0; | ||
} | ||
|
||
|
||
struct notes_rewrite_cfg *init_copy_notes_for_rewrite(const char *cmd) | ||
{ | ||
struct notes_rewrite_cfg *c = xmalloc(sizeof(struct notes_rewrite_cfg)); | ||
const char *rewrite_mode_env = getenv(GIT_NOTES_REWRITE_MODE_ENVIRONMENT); | ||
const char *rewrite_refs_env = getenv(GIT_NOTES_REWRITE_REF_ENVIRONMENT); | ||
c->cmd = cmd; | ||
c->enabled = 1; | ||
c->combine = combine_notes_concatenate; | ||
c->refs = xcalloc(1, sizeof(struct string_list)); | ||
c->refs->strdup_strings = 1; | ||
c->refs_from_env = 0; | ||
c->mode_from_env = 0; | ||
if (rewrite_mode_env) { | ||
c->mode_from_env = 1; | ||
c->combine = parse_combine_notes_fn(rewrite_mode_env); | ||
if (!c->combine) | ||
/* TRANSLATORS: The first %s is the name of the | ||
environment variable, the second %s is its value */ | ||
error(_("Bad %s value: '%s'"), GIT_NOTES_REWRITE_MODE_ENVIRONMENT, | ||
rewrite_mode_env); | ||
} | ||
if (rewrite_refs_env) { | ||
c->refs_from_env = 1; | ||
string_list_add_refs_from_colon_sep(c->refs, rewrite_refs_env); | ||
} | ||
git_config(notes_rewrite_config, c); | ||
if (!c->enabled || !c->refs->nr) { | ||
string_list_clear(c->refs, 0); | ||
free(c->refs); | ||
free(c); | ||
return NULL; | ||
} | ||
c->trees = load_notes_trees(c->refs); | ||
string_list_clear(c->refs, 0); | ||
free(c->refs); | ||
return c; | ||
} | ||
|
||
int copy_note_for_rewrite(struct notes_rewrite_cfg *c, | ||
const unsigned char *from_obj, const unsigned char *to_obj) | ||
{ | ||
int ret = 0; | ||
int i; | ||
for (i = 0; c->trees[i]; i++) | ||
ret = copy_note(c->trees[i], from_obj, to_obj, 1, c->combine) || ret; | ||
return ret; | ||
} | ||
|
||
void finish_copy_notes_for_rewrite(struct notes_rewrite_cfg *c, const char *msg) | ||
{ | ||
int i; | ||
for (i = 0; c->trees[i]; i++) { | ||
commit_notes(c->trees[i], msg); | ||
free_notes(c->trees[i]); | ||
} | ||
free(c->trees); | ||
free(c); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,23 @@ | ||
#ifndef NOTES_UTILS_H | ||
#define NOTES_UTILS_H | ||
|
||
#include "notes.h" | ||
|
||
void commit_notes(struct notes_tree *t, const char *msg); | ||
|
||
struct notes_rewrite_cfg { | ||
struct notes_tree **trees; | ||
const char *cmd; | ||
int enabled; | ||
combine_notes_fn combine; | ||
struct string_list *refs; | ||
int refs_from_env; | ||
int mode_from_env; | ||
}; | ||
|
||
struct notes_rewrite_cfg *init_copy_notes_for_rewrite(const char *cmd); | ||
int copy_note_for_rewrite(struct notes_rewrite_cfg *c, | ||
const unsigned char *from_obj, const unsigned char *to_obj); | ||
void finish_copy_notes_for_rewrite(struct notes_rewrite_cfg *c, const char *msg); | ||
|
||
#endif |