Move copy_note_for_rewrite + friends from builtin/notes.c to notes-utils.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>

Johan Herland committed Jun 12, 2013 at 02:13 UTC 49c2470400bbb695b953abeb4e6737be747317af
6 files changed +159 -146
Makefile
+2
@@ -682,6 +682,7 @@ LIB_H += merge-recursive.h
682 LIB_H += mergesort.h
683 LIB_H += notes-cache.h
684 LIB_H += notes-merge.h
685 +LIB_H += notes-utils.h
686 LIB_H += notes.h
687 LIB_H += object.h
688 LIB_H += pack-refs.h
@@ -815,6 +816,7 @@ LIB_OBJS += name-hash.o
816 LIB_OBJS += notes.o
817 LIB_OBJS += notes-cache.o
818 LIB_OBJS += notes-merge.o
819 +LIB_OBJS += notes-utils.o
820 LIB_OBJS += object.o
821 LIB_OBJS += pack-check.o
822 LIB_OBJS += pack-refs.o
builtin.h
-16
@@ -5,7 +5,6 @@
5 #include "strbuf.h"
6 #include "cache.h"
7 #include "commit.h"
8 -#include "notes.h"
8
9 #define DEFAULT_MERGE_LOG_LEN 20
10
@@ -23,21 +22,6 @@ struct fmt_merge_msg_opts {
22 extern int fmt_merge_msg(struct strbuf *in, struct strbuf *out,
23 struct fmt_merge_msg_opts *);
24
26 -struct notes_rewrite_cfg {
27 - struct notes_tree **trees;
28 - const char *cmd;
29 - int enabled;
30 - combine_notes_fn combine;
31 - struct string_list *refs;
32 - int refs_from_env;
33 - int mode_from_env;
34 -};
35 -
36 -struct notes_rewrite_cfg *init_copy_notes_for_rewrite(const char *cmd);
37 -int copy_note_for_rewrite(struct notes_rewrite_cfg *c,
38 - const unsigned char *from_obj, const unsigned char *to_obj);
39 -void finish_copy_notes_for_rewrite(struct notes_rewrite_cfg *c, const char *msg);
40 -
25 extern int textconv_object(const char *path, unsigned mode, const unsigned char *sha1, int sha1_valid, char **buf, unsigned long *buf_size);
26
27 extern int cmd_add(int argc, const char **argv, const char *prefix);
builtin/commit.c
+1
@@ -29,6 +29,7 @@
29 #include "gpg-interface.h"
30 #include "column.h"
31 #include "sequencer.h"
32 +#include "notes-utils.h"
33
34 static const char * const builtin_commit_usage[] = {
35 N_("git commit [options] [--] <pathspec>..."),
builtin/notes.c
+1 -130
@@ -18,9 +18,7 @@
18 #include "parse-options.h"
19 #include "string-list.h"
20 #include "notes-merge.h"
21 -
22 -static void commit_notes(struct notes_tree *t, const char *msg);
23 -static combine_notes_fn parse_combine_notes_fn(const char *v);
21 +#include "notes-utils.h"
22
23 static const char * const git_notes_usage[] = {
24 N_("git notes [--ref <notes_ref>] [list [<object>]]"),
@@ -287,133 +285,6 @@ static int parse_reedit_arg(const struct option *opt, const char *arg, int unset
285 return parse_reuse_arg(opt, arg, unset);
286 }
287
290 -static void commit_notes(struct notes_tree *t, const char *msg)
291 -{
292 - struct strbuf buf = STRBUF_INIT;
293 - unsigned char commit_sha1[20];
294 -
295 - if (!t)
296 - t = &default_notes_tree;
297 - if (!t->initialized || !t->ref || !*t->ref)
298 - die(_("Cannot commit uninitialized/unreferenced notes tree"));
299 - if (!t->dirty)
300 - return; /* don't have to commit an unchanged tree */
301 -
302 - /* Prepare commit message and reflog message */
303 - strbuf_addstr(&buf, msg);
304 - if (buf.buf[buf.len - 1] != '\n')
305 - strbuf_addch(&buf, '\n'); /* Make sure msg ends with newline */
306 -
307 - create_notes_commit(t, NULL, &buf, commit_sha1);
308 - strbuf_insert(&buf, 0, "notes: ", 7); /* commit message starts at index 7 */
309 - update_ref(buf.buf, t->ref, commit_sha1, NULL, 0, DIE_ON_ERR);
310 -
311 - strbuf_release(&buf);
312 -}
313 -
314 -static combine_notes_fn parse_combine_notes_fn(const char *v)
315 -{
316 - if (!strcasecmp(v, "overwrite"))
317 - return combine_notes_overwrite;
318 - else if (!strcasecmp(v, "ignore"))
319 - return combine_notes_ignore;
320 - else if (!strcasecmp(v, "concatenate"))
321 - return combine_notes_concatenate;
322 - else if (!strcasecmp(v, "cat_sort_uniq"))
323 - return combine_notes_cat_sort_uniq;
324 - else
325 - return NULL;
326 -}
327 -
328 -static int notes_rewrite_config(const char *k, const char *v, void *cb)
329 -{
330 - struct notes_rewrite_cfg *c = cb;
331 - if (!prefixcmp(k, "notes.rewrite.") && !strcmp(k+14, c->cmd)) {
332 - c->enabled = git_config_bool(k, v);
333 - return 0;
334 - } else if (!c->mode_from_env && !strcmp(k, "notes.rewritemode")) {
335 - if (!v)
336 - config_error_nonbool(k);
337 - c->combine = parse_combine_notes_fn(v);
338 - if (!c->combine) {
339 - error(_("Bad notes.rewriteMode value: '%s'"), v);
340 - return 1;
341 - }
342 - return 0;
343 - } else if (!c->refs_from_env && !strcmp(k, "notes.rewriteref")) {
344 - /* note that a refs/ prefix is implied in the
345 - * underlying for_each_glob_ref */
346 - if (!prefixcmp(v, "refs/notes/"))
347 - string_list_add_refs_by_glob(c->refs, v);
348 - else
349 - warning(_("Refusing to rewrite notes in %s"
350 - " (outside of refs/notes/)"), v);
351 - return 0;
352 - }
353 -
354 - return 0;
355 -}
356 -
357 -
358 -struct notes_rewrite_cfg *init_copy_notes_for_rewrite(const char *cmd)
359 -{
360 - struct notes_rewrite_cfg *c = xmalloc(sizeof(struct notes_rewrite_cfg));
361 - const char *rewrite_mode_env = getenv(GIT_NOTES_REWRITE_MODE_ENVIRONMENT);
362 - const char *rewrite_refs_env = getenv(GIT_NOTES_REWRITE_REF_ENVIRONMENT);
363 - c->cmd = cmd;
364 - c->enabled = 1;
365 - c->combine = combine_notes_concatenate;
366 - c->refs = xcalloc(1, sizeof(struct string_list));
367 - c->refs->strdup_strings = 1;
368 - c->refs_from_env = 0;
369 - c->mode_from_env = 0;
370 - if (rewrite_mode_env) {
371 - c->mode_from_env = 1;
372 - c->combine = parse_combine_notes_fn(rewrite_mode_env);
373 - if (!c->combine)
374 - /* TRANSLATORS: The first %s is the name of the
375 - environment variable, the second %s is its value */
376 - error(_("Bad %s value: '%s'"), GIT_NOTES_REWRITE_MODE_ENVIRONMENT,
377 - rewrite_mode_env);
378 - }
379 - if (rewrite_refs_env) {
380 - c->refs_from_env = 1;
381 - string_list_add_refs_from_colon_sep(c->refs, rewrite_refs_env);
382 - }
383 - git_config(notes_rewrite_config, c);
384 - if (!c->enabled || !c->refs->nr) {
385 - string_list_clear(c->refs, 0);
386 - free(c->refs);
387 - free(c);
388 - return NULL;
389 - }
390 - c->trees = load_notes_trees(c->refs);
391 - string_list_clear(c->refs, 0);
392 - free(c->refs);
393 - return c;
394 -}
395 -
396 -int copy_note_for_rewrite(struct notes_rewrite_cfg *c,
397 - const unsigned char *from_obj, const unsigned char *to_obj)
398 -{
399 - int ret = 0;
400 - int i;
401 - for (i = 0; c->trees[i]; i++)
402 - ret = copy_note(c->trees[i], from_obj, to_obj, 1, c->combine) || ret;
403 - return ret;
404 -}
405 -
406 -void finish_copy_notes_for_rewrite(struct notes_rewrite_cfg *c, const char *msg)
407 -{
408 - int i;
409 - for (i = 0; c->trees[i]; i++) {
410 - commit_notes(c->trees[i], msg);
411 - free_notes(c->trees[i]);
412 - }
413 - free(c->trees);
414 - free(c);
415 -}
416 -
288 static int notes_copy_from_stdin(int force, const char *rewrite_cmd)
289 {
290 struct strbuf buf = STRBUF_INIT;
notes-utils.c new
+132
@@ -0,0 +1,132 @@
1 +#include "cache.h"
2 +#include "commit.h"
3 +#include "refs.h"
4 +#include "notes-utils.h"
5 +#include "notes-merge.h" /* for create_notes_commit() */
6 +
7 +void commit_notes(struct notes_tree *t, const char *msg)
8 +{
9 + struct strbuf buf = STRBUF_INIT;
10 + unsigned char commit_sha1[20];
11 +
12 + if (!t)
13 + t = &default_notes_tree;
14 + if (!t->initialized || !t->ref || !*t->ref)
15 + die(_("Cannot commit uninitialized/unreferenced notes tree"));
16 + if (!t->dirty)
17 + return; /* don't have to commit an unchanged tree */
18 +
19 + /* Prepare commit message and reflog message */
20 + strbuf_addstr(&buf, msg);
21 + if (buf.buf[buf.len - 1] != '\n')
22 + strbuf_addch(&buf, '\n'); /* Make sure msg ends with newline */
23 +
24 + create_notes_commit(t, NULL, &buf, commit_sha1);
25 + strbuf_insert(&buf, 0, "notes: ", 7); /* commit message starts at index 7 */
26 + update_ref(buf.buf, t->ref, commit_sha1, NULL, 0, DIE_ON_ERR);
27 +
28 + strbuf_release(&buf);
29 +}
30 +
31 +static combine_notes_fn parse_combine_notes_fn(const char *v)
32 +{
33 + if (!strcasecmp(v, "overwrite"))
34 + return combine_notes_overwrite;
35 + else if (!strcasecmp(v, "ignore"))
36 + return combine_notes_ignore;
37 + else if (!strcasecmp(v, "concatenate"))
38 + return combine_notes_concatenate;
39 + else if (!strcasecmp(v, "cat_sort_uniq"))
40 + return combine_notes_cat_sort_uniq;
41 + else
42 + return NULL;
43 +}
44 +
45 +static int notes_rewrite_config(const char *k, const char *v, void *cb)
46 +{
47 + struct notes_rewrite_cfg *c = cb;
48 + if (!prefixcmp(k, "notes.rewrite.") && !strcmp(k+14, c->cmd)) {
49 + c->enabled = git_config_bool(k, v);
50 + return 0;
51 + } else if (!c->mode_from_env && !strcmp(k, "notes.rewritemode")) {
52 + if (!v)
53 + config_error_nonbool(k);
54 + c->combine = parse_combine_notes_fn(v);
55 + if (!c->combine) {
56 + error(_("Bad notes.rewriteMode value: '%s'"), v);
57 + return 1;
58 + }
59 + return 0;
60 + } else if (!c->refs_from_env && !strcmp(k, "notes.rewriteref")) {
61 + /* note that a refs/ prefix is implied in the
62 + * underlying for_each_glob_ref */
63 + if (!prefixcmp(v, "refs/notes/"))
64 + string_list_add_refs_by_glob(c->refs, v);
65 + else
66 + warning(_("Refusing to rewrite notes in %s"
67 + " (outside of refs/notes/)"), v);
68 + return 0;
69 + }
70 +
71 + return 0;
72 +}
73 +
74 +
75 +struct notes_rewrite_cfg *init_copy_notes_for_rewrite(const char *cmd)
76 +{
77 + struct notes_rewrite_cfg *c = xmalloc(sizeof(struct notes_rewrite_cfg));
78 + const char *rewrite_mode_env = getenv(GIT_NOTES_REWRITE_MODE_ENVIRONMENT);
79 + const char *rewrite_refs_env = getenv(GIT_NOTES_REWRITE_REF_ENVIRONMENT);
80 + c->cmd = cmd;
81 + c->enabled = 1;
82 + c->combine = combine_notes_concatenate;
83 + c->refs = xcalloc(1, sizeof(struct string_list));
84 + c->refs->strdup_strings = 1;
85 + c->refs_from_env = 0;
86 + c->mode_from_env = 0;
87 + if (rewrite_mode_env) {
88 + c->mode_from_env = 1;
89 + c->combine = parse_combine_notes_fn(rewrite_mode_env);
90 + if (!c->combine)
91 + /* TRANSLATORS: The first %s is the name of the
92 + environment variable, the second %s is its value */
93 + error(_("Bad %s value: '%s'"), GIT_NOTES_REWRITE_MODE_ENVIRONMENT,
94 + rewrite_mode_env);
95 + }
96 + if (rewrite_refs_env) {
97 + c->refs_from_env = 1;
98 + string_list_add_refs_from_colon_sep(c->refs, rewrite_refs_env);
99 + }
100 + git_config(notes_rewrite_config, c);
101 + if (!c->enabled || !c->refs->nr) {
102 + string_list_clear(c->refs, 0);
103 + free(c->refs);
104 + free(c);
105 + return NULL;
106 + }
107 + c->trees = load_notes_trees(c->refs);
108 + string_list_clear(c->refs, 0);
109 + free(c->refs);
110 + return c;
111 +}
112 +
113 +int copy_note_for_rewrite(struct notes_rewrite_cfg *c,
114 + const unsigned char *from_obj, const unsigned char *to_obj)
115 +{
116 + int ret = 0;
117 + int i;
118 + for (i = 0; c->trees[i]; i++)
119 + ret = copy_note(c->trees[i], from_obj, to_obj, 1, c->combine) || ret;
120 + return ret;
121 +}
122 +
123 +void finish_copy_notes_for_rewrite(struct notes_rewrite_cfg *c, const char *msg)
124 +{
125 + int i;
126 + for (i = 0; c->trees[i]; i++) {
127 + commit_notes(c->trees[i], msg);
128 + free_notes(c->trees[i]);
129 + }
130 + free(c->trees);
131 + free(c);
132 +}
notes-utils.h new
+23
@@ -0,0 +1,23 @@
1 +#ifndef NOTES_UTILS_H
2 +#define NOTES_UTILS_H
3 +
4 +#include "notes.h"
5 +
6 +void commit_notes(struct notes_tree *t, const char *msg);
7 +
8 +struct notes_rewrite_cfg {
9 + struct notes_tree **trees;
10 + const char *cmd;
11 + int enabled;
12 + combine_notes_fn combine;
13 + struct string_list *refs;
14 + int refs_from_env;
15 + int mode_from_env;
16 +};
17 +
18 +struct notes_rewrite_cfg *init_copy_notes_for_rewrite(const char *cmd);
19 +int copy_note_for_rewrite(struct notes_rewrite_cfg *c,
20 + const unsigned char *from_obj, const unsigned char *to_obj);
21 +void finish_copy_notes_for_rewrite(struct notes_rewrite_cfg *c, const char *msg);
22 +
23 +#endif