]> git.ipfire.org Git - thirdparty/git.git/blame - builtin/mktag.c
cache.h: remove dependence on hex.h; make other files include it explicitly
[thirdparty/git.git] / builtin / mktag.c
CommitLineData
c2e86add 1#include "builtin.h"
41771fa4 2#include "hex.h"
3f390a36 3#include "parse-options.h"
8e440259 4#include "tag.h"
47f351e9 5#include "replace-object.h"
cbd53a21 6#include "object-store.h"
acf9de4c 7#include "fsck.h"
acfc0133
ÆAB
8#include "config.h"
9
3f390a36 10static char const * const builtin_mktag_usage[] = {
959d670d 11 "git mktag",
3f390a36
ÆAB
12 NULL
13};
06ce7915 14static int option_strict = 1;
3f390a36 15
acfc0133
ÆAB
16static struct fsck_options fsck_options = FSCK_OPTIONS_STRICT;
17
acf9de4c
ÆAB
18static int mktag_fsck_error_func(struct fsck_options *o,
19 const struct object_id *oid,
20 enum object_type object_type,
1b32b59f 21 enum fsck_msg_type msg_type,
394d5d31 22 enum fsck_msg_id msg_id,
1b32b59f 23 const char *message)
ec4465ad 24{
acf9de4c
ÆAB
25 switch (msg_type) {
26 case FSCK_WARN:
06ce7915
ÆAB
27 if (!option_strict) {
28 fprintf_ln(stderr, _("warning: tag input does not pass fsck: %s"), message);
29 return 0;
30
31 }
32 /* fallthrough */
acf9de4c
ÆAB
33 case FSCK_ERROR:
34 /*
35 * We treat both warnings and errors as errors, things
36 * like missing "tagger" lines are "only" warnings
37 * under fsck, we've always considered them an error.
38 */
2aa9425f 39 fprintf_ln(stderr, _("error: tag input does not pass fsck: %s"), message);
acf9de4c
ÆAB
40 return 1;
41 default:
2aa9425f 42 BUG(_("%d (FSCK_IGNORE?) should never trigger this callback"),
acf9de4c 43 msg_type);
ec4465ad 44 }
ec4465ad
LT
45}
46
acf9de4c 47static int verify_object_in_tag(struct object_id *tagged_oid, int *tagged_type)
ec4465ad 48{
acf9de4c
ÆAB
49 int ret;
50 enum object_type type;
51 unsigned long size;
52 void *buffer;
53 const struct object_id *repl;
54
55 buffer = read_object_file(tagged_oid, &type, &size);
56 if (!buffer)
2aa9425f 57 die(_("could not read tagged object '%s'"),
acf9de4c
ÆAB
58 oid_to_hex(tagged_oid));
59 if (type != *tagged_type)
2aa9425f 60 die(_("object '%s' tagged as '%s', but is a '%s' type"),
acf9de4c
ÆAB
61 oid_to_hex(tagged_oid),
62 type_name(*tagged_type), type_name(type));
63
64 repl = lookup_replace_object(the_repository, tagged_oid);
0f156dbb 65 ret = check_object_signature(the_repository, repl, buffer, size,
44439c1c 66 *tagged_type);
acf9de4c 67 free(buffer);
c818566d 68
acf9de4c 69 return ret;
ec4465ad
LT
70}
71
112dd514 72int cmd_mktag(int argc, const char **argv, const char *prefix)
ec4465ad 73{
3f390a36 74 static struct option builtin_mktag_options[] = {
06ce7915
ÆAB
75 OPT_BOOL(0, "strict", &option_strict,
76 N_("enable more strict checking")),
3f390a36
ÆAB
77 OPT_END(),
78 };
f285a2d7 79 struct strbuf buf = STRBUF_INIT;
acf9de4c
ÆAB
80 struct object_id tagged_oid;
81 int tagged_type;
a09c985e 82 struct object_id result;
ec4465ad 83
3f390a36
ÆAB
84 argc = parse_options(argc, argv, NULL,
85 builtin_mktag_options,
86 builtin_mktag_usage, 0);
ec4465ad 87
dfe39487 88 if (strbuf_read(&buf, 0, 0) < 0)
2aa9425f 89 die_errno(_("could not read from stdin"));
ec4465ad 90
acf9de4c 91 fsck_options.error_func = mktag_fsck_error_func;
53692df2
ÆAB
92 fsck_set_msg_type_from_ids(&fsck_options, FSCK_MSG_EXTRA_HEADER_ENTRY,
93 FSCK_WARN);
acfc0133 94 /* config might set fsck.extraHeaderEntry=* again */
fb79f5bf 95 git_config(git_fsck_config, &fsck_options);
acf9de4c
ÆAB
96 if (fsck_tag_standalone(NULL, buf.buf, buf.len, &fsck_options,
97 &tagged_oid, &tagged_type))
2aa9425f 98 die(_("tag on stdin did not pass our strict fsck check"));
acf9de4c 99
ee213de2 100 if (verify_object_in_tag(&tagged_oid, &tagged_type) < 0)
2aa9425f 101 die(_("tag on stdin did not refer to a valid object"));
ec4465ad 102
c80d226a 103 if (write_object_file(buf.buf, buf.len, OBJ_TAG, &result) < 0)
2aa9425f 104 die(_("unable to write tag file"));
e7332f96 105
fd17f5b5 106 strbuf_release(&buf);
40ef015a 107 puts(oid_to_hex(&result));
ec4465ad
LT
108 return 0;
109}