tag.c 15.3 KB
Newer Older
C
Carlos Rica 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13
/*
 * Builtin "git tag"
 *
 * Copyright (c) 2007 Kristian Høgsberg <krh@redhat.com>,
 *                    Carlos Rica <jasampler@gmail.com>
 * Based on git-tag.sh and mktag.c by Linus Torvalds.
 */

#include "cache.h"
#include "builtin.h"
#include "refs.h"
#include "tag.h"
#include "run-command.h"
14
#include "parse-options.h"
J
Jeff King 已提交
15 16
#include "diff.h"
#include "revision.h"
17
#include "gpg-interface.h"
T
Tom Grennan 已提交
18
#include "sha1-array.h"
N
Nguyễn Thái Ngọc Duy 已提交
19
#include "column.h"
20
#include "ref-filter.h"
21 22

static const char * const git_tag_usage[] = {
23
	N_("git tag [-a | -s | -u <key-id>] [-f] [-m <msg> | -F <file>] <tagname> [<head>]"),
24
	N_("git tag -d <tagname>..."),
25
	N_("git tag -l [-n[<num>]] [--contains <commit>] [--no-contains <commit>] [--points-at <object>]"
26
		"\n\t\t[--format=<format>] [--[no-]merged [<commit>]] [<pattern>...]"),
27
	N_("git tag -v [--format=<format>] <tagname>..."),
28 29
	NULL
};
C
Carlos Rica 已提交
30

N
Nguyễn Thái Ngọc Duy 已提交
31
static unsigned int colopts;
32
static int force_sign_annotate;
T
Tom Grennan 已提交
33

34
static int list_tags(struct ref_filter *filter, struct ref_sorting *sorting, const char *format)
35
{
36
	struct ref_array array;
37
	char *to_free = NULL;
38
	int i;
C
Carlos Rica 已提交
39

40
	memset(&array, 0, sizeof(array));
J
Jake Goulding 已提交
41

42 43
	if (filter->lines == -1)
		filter->lines = 0;
T
Tom Grennan 已提交
44

45 46 47
	if (!format) {
		if (filter->lines) {
			to_free = xstrfmt("%s %%(contents:lines=%d)",
48
					  "%(align:15)%(refname:lstrip=2)%(end)",
49 50 51
					  filter->lines);
			format = to_free;
		} else
52
			format = "%(refname:lstrip=2)";
C
Carlos Rica 已提交
53 54
	}

K
Karthik Nayak 已提交
55
	verify_ref_format(format);
56
	filter->with_commit_tag_algo = 1;
K
Karthik Nayak 已提交
57 58
	filter_refs(&array, filter, FILTER_REFS_TAGS);
	ref_array_sort(sorting, &array);
C
Carlos Rica 已提交
59

K
Karthik Nayak 已提交
60 61 62 63
	for (i = 0; i < array.nr; i++)
		show_ref_array_item(array.items[i], format, 0);
	ref_array_clear(&array);
	free(to_free);
64

C
Carlos Rica 已提交
65 66 67
	return 0;
}

68
typedef int (*each_tag_name_fn)(const char *name, const char *ref,
69
				const unsigned char *sha1, const void *cb_data);
C
Carlos Rica 已提交
70

71 72
static int for_each_tag_name(const char **argv, each_tag_name_fn fn,
			     const void *cb_data)
C
Carlos Rica 已提交
73 74 75 76 77 78 79 80 81
{
	const char **p;
	char ref[PATH_MAX];
	int had_error = 0;
	unsigned char sha1[20];

	for (p = argv; *p; p++) {
		if (snprintf(ref, sizeof(ref), "refs/tags/%s", *p)
					>= sizeof(ref)) {
82
			error(_("tag name too long: %.*s..."), 50, *p);
C
Carlos Rica 已提交
83 84 85
			had_error = 1;
			continue;
		}
86
		if (read_ref(ref, sha1)) {
87
			error(_("tag '%s' not found."), *p);
C
Carlos Rica 已提交
88 89 90
			had_error = 1;
			continue;
		}
91
		if (fn(*p, ref, sha1, cb_data))
C
Carlos Rica 已提交
92 93 94 95 96 97
			had_error = 1;
	}
	return had_error;
}

static int delete_tag(const char *name, const char *ref,
98
		      const unsigned char *sha1, const void *cb_data)
C
Carlos Rica 已提交
99
{
100
	if (delete_ref(NULL, ref, sha1, 0))
C
Carlos Rica 已提交
101
		return 1;
102
	printf(_("Deleted tag '%s' (was %s)\n"), name, find_unique_abbrev(sha1, DEFAULT_ABBREV));
C
Carlos Rica 已提交
103 104 105 106
	return 0;
}

static int verify_tag(const char *name, const char *ref,
107
		      const unsigned char *sha1, const void *cb_data)
C
Carlos Rica 已提交
108
{
109 110 111 112 113 114 115 116 117 118 119 120 121 122
	int flags;
	const char *fmt_pretty = cb_data;
	flags = GPG_VERIFY_VERBOSE;

	if (fmt_pretty)
		flags = GPG_VERIFY_OMIT_STATUS;

	if (gpg_verify_tag(sha1, name, flags))
		return -1;

	if (fmt_pretty)
		pretty_print_ref(name, sha1, fmt_pretty);

	return 0;
C
Carlos Rica 已提交
123 124
}

125
static int do_sign(struct strbuf *buffer)
C
Carlos Rica 已提交
126
{
127
	return sign_buffer(buffer, buffer, get_signing_key());
C
Carlos Rica 已提交
128 129 130
}

static const char tag_template[] =
131
	N_("\nWrite a message for tag:\n  %s\n"
J
Junio C Hamano 已提交
132
	"Lines starting with '%c' will be ignored.\n");
133 134

static const char tag_template_nocleanup[] =
135
	N_("\nWrite a message for tag:\n  %s\n"
J
Junio C Hamano 已提交
136 137
	"Lines starting with '%c' will be kept; you may remove them"
	" yourself if you want to.\n");
C
Carlos Rica 已提交
138

K
Karthik Nayak 已提交
139 140
/* Parse arg given and add it the ref_sorting array */
static int parse_sorting_string(const char *arg, struct ref_sorting **sorting_tail)
141
{
K
Karthik Nayak 已提交
142 143
	struct ref_sorting *s;
	int len;
144

K
Karthik Nayak 已提交
145 146 147
	s = xcalloc(1, sizeof(*s));
	s->next = *sorting_tail;
	*sorting_tail = s;
148

K
Karthik Nayak 已提交
149 150 151
	if (*arg == '-') {
		s->reverse = 1;
		arg++;
152
	}
K
Karthik Nayak 已提交
153 154 155
	if (skip_prefix(arg, "version:", &arg) ||
	    skip_prefix(arg, "v:", &arg))
		s->version = 1;
156

K
Karthik Nayak 已提交
157 158
	len = strlen(arg);
	s->atom = parse_ref_filter_atom(arg, arg+len);
159 160 161 162

	return 0;
}

163
static int git_tag_config(const char *var, const char *value, void *cb)
C
Carlos Rica 已提交
164
{
165
	int status;
K
Karthik Nayak 已提交
166
	struct ref_sorting **sorting_tail = (struct ref_sorting **)cb;
167 168 169 170

	if (!strcmp(var, "tag.sort")) {
		if (!value)
			return config_error_nonbool(var);
K
Karthik Nayak 已提交
171
		parse_sorting_string(value, sorting_tail);
172 173 174 175
		return 0;
	}

	status = git_gpg_config(var, value, cb);
176 177
	if (status)
		return status;
178 179 180 181 182
	if (!strcmp(var, "tag.forcesignannotated")) {
		force_sign_annotate = git_config_bool(var, value);
		return 0;
	}

183
	if (starts_with(var, "column."))
N
Nguyễn Thái Ngọc Duy 已提交
184
		return git_column_config(var, value, "tag", &colopts);
185
	return git_default_config(var, value, cb);
C
Carlos Rica 已提交
186 187
}

188 189 190 191
static void write_tag_body(int fd, const unsigned char *sha1)
{
	unsigned long size;
	enum object_type type;
192
	char *buf, *sp;
193 194 195 196 197 198 199 200 201 202 203 204

	buf = read_sha1_file(sha1, &type, &size);
	if (!buf)
		return;
	/* skip header */
	sp = strstr(buf, "\n\n");

	if (!sp || !size || type != OBJ_TAG) {
		free(buf);
		return;
	}
	sp += 2; /* skip the 2 LFs */
205
	write_or_die(fd, sp, parse_signature(sp, buf + size - sp));
206 207 208 209

	free(buf);
}

210 211 212
static int build_tag_object(struct strbuf *buf, int sign, unsigned char *result)
{
	if (sign && do_sign(buf) < 0)
213
		return error(_("unable to sign the tag"));
214
	if (write_sha1_file(buf->buf, buf->len, tag_type, result) < 0)
215
		return error(_("unable to write tag file"));
216 217 218
	return 0;
}

219 220 221 222 223 224 225 226 227 228
struct create_tag_options {
	unsigned int message_given:1;
	unsigned int sign;
	enum {
		CLEANUP_NONE,
		CLEANUP_SPACE,
		CLEANUP_ALL
	} cleanup_mode;
};

C
Carlos Rica 已提交
229
static void create_tag(const unsigned char *object, const char *tag,
230
		       struct strbuf *buf, struct create_tag_options *opt,
231
		       unsigned char *prev, unsigned char *result)
C
Carlos Rica 已提交
232 233
{
	enum object_type type;
234 235
	char header_buf[1024];
	int header_len;
236
	char *path = NULL;
C
Carlos Rica 已提交
237 238

	type = sha1_object_info(object, NULL);
239
	if (type <= OBJ_NONE)
240
	    die(_("bad object type."));
C
Carlos Rica 已提交
241 242 243 244 245 246 247 248 249

	header_len = snprintf(header_buf, sizeof(header_buf),
			  "object %s\n"
			  "type %s\n"
			  "tag %s\n"
			  "tagger %s\n\n",
			  sha1_to_hex(object),
			  typename(type),
			  tag,
250
			  git_committer_info(IDENT_STRICT));
C
Carlos Rica 已提交
251

252
	if (header_len > sizeof(header_buf) - 1)
253
		die(_("tag header too big."));
C
Carlos Rica 已提交
254

255
	if (!opt->message_given) {
C
Carlos Rica 已提交
256 257 258
		int fd;

		/* write the template message before editing: */
259
		path = git_pathdup("TAG_EDITMSG");
C
Carlos Rica 已提交
260 261
		fd = open(path, O_CREAT | O_TRUNC | O_WRONLY, 0600);
		if (fd < 0)
262
			die_errno(_("could not create file '%s'"), path);
263

J
Junio C Hamano 已提交
264
		if (!is_null_sha1(prev)) {
265
			write_tag_body(fd, prev);
J
Junio C Hamano 已提交
266 267 268 269
		} else {
			struct strbuf buf = STRBUF_INIT;
			strbuf_addch(&buf, '\n');
			if (opt->cleanup_mode == CLEANUP_ALL)
270
				strbuf_commented_addf(&buf, _(tag_template), tag, comment_line_char);
J
Junio C Hamano 已提交
271
			else
272
				strbuf_commented_addf(&buf, _(tag_template_nocleanup), tag, comment_line_char);
J
Junio C Hamano 已提交
273 274 275
			write_or_die(fd, buf.buf, buf.len);
			strbuf_release(&buf);
		}
C
Carlos Rica 已提交
276 277
		close(fd);

S
Stephan Beyer 已提交
278 279
		if (launch_editor(path, buf, NULL)) {
			fprintf(stderr,
280
			_("Please supply the message using either -m or -F option.\n"));
S
Stephan Beyer 已提交
281 282
			exit(1);
		}
C
Carlos Rica 已提交
283 284
	}

285
	if (opt->cleanup_mode != CLEANUP_NONE)
286
		strbuf_stripspace(buf, opt->cleanup_mode == CLEANUP_ALL);
C
Carlos Rica 已提交
287

288
	if (!opt->message_given && !buf->len)
289
		die(_("no tag message?"));
C
Carlos Rica 已提交
290

291
	strbuf_insert(buf, 0, header_buf, header_len);
C
Carlos Rica 已提交
292

293
	if (build_tag_object(buf, opt->sign, result) < 0) {
294
		if (path)
295
			fprintf(stderr, _("The tag message has been left in %s\n"),
296 297 298 299
				path);
		exit(128);
	}
	if (path) {
300
		unlink_or_warn(path);
301 302
		free(path);
	}
C
Carlos Rica 已提交
303 304
}

305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352
static void create_reflog_msg(const unsigned char *sha1, struct strbuf *sb)
{
	enum object_type type;
	struct commit *c;
	char *buf;
	unsigned long size;
	int subject_len = 0;
	const char *subject_start;

	char *rla = getenv("GIT_REFLOG_ACTION");
	if (rla) {
		strbuf_addstr(sb, rla);
	} else {
		strbuf_addstr(sb, _("tag: tagging "));
		strbuf_add_unique_abbrev(sb, sha1, DEFAULT_ABBREV);
	}

	strbuf_addstr(sb, " (");
	type = sha1_object_info(sha1, NULL);
	switch (type) {
	default:
		strbuf_addstr(sb, _("object of unknown type"));
		break;
	case OBJ_COMMIT:
		if ((buf = read_sha1_file(sha1, &type, &size)) != NULL) {
			subject_len = find_commit_subject(buf, &subject_start);
			strbuf_insert(sb, sb->len, subject_start, subject_len);
		} else {
			strbuf_addstr(sb, _("commit object"));
		}
		free(buf);

		if ((c = lookup_commit_reference(sha1)) != NULL)
			strbuf_addf(sb, ", %s", show_date(c->date, 0, DATE_MODE(SHORT)));
		break;
	case OBJ_TREE:
		strbuf_addstr(sb, _("tree object"));
		break;
	case OBJ_BLOB:
		strbuf_addstr(sb, _("blob object"));
		break;
	case OBJ_TAG:
		strbuf_addstr(sb, _("other tag object"));
		break;
	}
	strbuf_addch(sb, ')');
}

353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370
struct msg_arg {
	int given;
	struct strbuf buf;
};

static int parse_msg_arg(const struct option *opt, const char *arg, int unset)
{
	struct msg_arg *msg = opt->value;

	if (!arg)
		return -1;
	if (msg->buf.len)
		strbuf_addstr(&(msg->buf), "\n\n");
	strbuf_addstr(&(msg->buf), arg);
	msg->given = 1;
	return 0;
}

M
Michael Schubert 已提交
371 372 373
static int strbuf_check_tag_ref(struct strbuf *sb, const char *name)
{
	if (name[0] == '-')
374
		return -1;
M
Michael Schubert 已提交
375 376 377 378

	strbuf_reset(sb);
	strbuf_addf(sb, "refs/tags/%s", name);

379
	return check_refname_format(sb->buf, 0);
M
Michael Schubert 已提交
380 381
}

C
Carlos Rica 已提交
382 383
int cmd_tag(int argc, const char **argv, const char *prefix)
{
384
	struct strbuf buf = STRBUF_INIT;
M
Michael Schubert 已提交
385
	struct strbuf ref = STRBUF_INIT;
386
	struct strbuf reflog_msg = STRBUF_INIT;
C
Carlos Rica 已提交
387 388
	unsigned char object[20], prev[20];
	const char *object_ref, *tag;
389 390
	struct create_tag_options opt;
	char *cleanup_arg = NULL;
391
	int create_reflog = 0;
392
	int annotate = 0, force = 0;
393
	int cmdmode = 0, create_tag_object = 0;
394
	const char *msgfile = NULL, *keyid = NULL;
395
	struct msg_arg msg = { 0, STRBUF_INIT };
396 397
	struct ref_transaction *transaction;
	struct strbuf err = STRBUF_INIT;
398
	struct ref_filter filter;
K
Karthik Nayak 已提交
399
	static struct ref_sorting *sorting = NULL, **sorting_tail = &sorting;
400
	const char *format = NULL;
401
	int icase = 0;
402
	struct option options[] = {
J
Junio C Hamano 已提交
403
		OPT_CMDMODE('l', "list", &cmdmode, N_("list tag names"), 'l'),
404
		{ OPTION_INTEGER, 'n', NULL, &filter.lines, N_("n"),
405
				N_("print <n> lines of each tag message"),
406
				PARSE_OPT_OPTARG, NULL, 1 },
J
Junio C Hamano 已提交
407 408
		OPT_CMDMODE('d', "delete", &cmdmode, N_("delete tags"), 'd'),
		OPT_CMDMODE('v', "verify", &cmdmode, N_("verify tags"), 'v'),
409

410
		OPT_GROUP(N_("Tag creation options")),
411
		OPT_BOOL('a', "annotate", &annotate,
412 413 414 415
					N_("annotated tag, needs a message")),
		OPT_CALLBACK('m', "message", &msg, N_("message"),
			     N_("tag message"), parse_msg_arg),
		OPT_FILENAME('F', "file", &msgfile, N_("read message from file")),
416
		OPT_BOOL('s', "sign", &opt.sign, N_("annotated and GPG-signed tag")),
417 418
		OPT_STRING(0, "cleanup", &cleanup_arg, N_("mode"),
			N_("how to strip spaces and #comments from message")),
419
		OPT_STRING('u', "local-user", &keyid, N_("key-id"),
420 421
					N_("use another key to sign the tag")),
		OPT__FORCE(&force, N_("replace the tag if exists")),
422
		OPT_BOOL(0, "create-reflog", &create_reflog, N_("create a reflog")),
423 424

		OPT_GROUP(N_("Tag listing options")),
425
		OPT_COLUMN(0, "column", &colopts, N_("show tag list in columns")),
426
		OPT_CONTAINS(&filter.with_commit, N_("print only tags that contain the commit")),
427
		OPT_NO_CONTAINS(&filter.no_commit, N_("print only tags that don't contain the commit")),
428
		OPT_WITH(&filter.with_commit, N_("print only tags that contain the commit")),
429
		OPT_WITHOUT(&filter.no_commit, N_("print only tags that don't contain the commit")),
430 431
		OPT_MERGED(&filter, N_("print only tags that are merged")),
		OPT_NO_MERGED(&filter, N_("print only tags that are not merged")),
K
Karthik Nayak 已提交
432 433
		OPT_CALLBACK(0 , "sort", sorting_tail, N_("key"),
			     N_("field name to sort on"), &parse_opt_ref_sorting),
J
Jake Goulding 已提交
434
		{
435
			OPTION_CALLBACK, 0, "points-at", &filter.points_at, N_("object"),
436 437
			N_("print only tags of the object"), PARSE_OPT_LASTARG_DEFAULT,
			parse_opt_object_name, (intptr_t) "HEAD"
T
Tom Grennan 已提交
438
		},
439
		OPT_STRING(  0 , "format", &format, N_("format"), N_("format to use for the output")),
440
		OPT_BOOL('i', "ignore-case", &icase, N_("sorting and filtering are case insensitive")),
441 442 443
		OPT_END()
	};

444 445
	setup_ref_filter_porcelain_msg();

K
Karthik Nayak 已提交
446
	git_config(git_tag_config, sorting_tail);
C
Carlos Rica 已提交
447

448
	memset(&opt, 0, sizeof(opt));
449 450
	memset(&filter, 0, sizeof(filter));
	filter.lines = -1;
451

452
	argc = parse_options(argc, argv, prefix, options, git_tag_usage, 0);
C
Carlos Rica 已提交
453

L
Linus Torvalds 已提交
454
	if (keyid) {
455
		opt.sign = 1;
456
		set_signing_key(keyid);
L
Linus Torvalds 已提交
457
	}
458 459
	create_tag_object = (opt.sign || annotate || msg.given || msgfile);

460 461 462
	if (!cmdmode) {
		if (argc == 0)
			cmdmode = 'l';
463
		else if (filter.with_commit || filter.no_commit ||
464 465 466 467
			 filter.points_at.nr || filter.merge_commit ||
			 filter.lines != -1)
			cmdmode = 'l';
	}
468

469
	if ((create_tag_object || force) && (cmdmode != 0))
470 471
		usage_with_options(git_tag_usage, options);

N
Nguyễn Thái Ngọc Duy 已提交
472
	finalize_colopts(&colopts, -1);
473
	if (cmdmode == 'l' && filter.lines != -1) {
N
Nguyễn Thái Ngọc Duy 已提交
474 475 476 477
		if (explicitly_enable_column(colopts))
			die(_("--column and -n are incompatible"));
		colopts = 0;
	}
K
Karthik Nayak 已提交
478 479
	if (!sorting)
		sorting = ref_default_sorting();
480 481
	sorting->ignore_case = icase;
	filter.ignore_case = icase;
J
Junio C Hamano 已提交
482
	if (cmdmode == 'l') {
N
Nguyễn Thái Ngọc Duy 已提交
483 484 485 486 487 488 489
		int ret;
		if (column_active(colopts)) {
			struct column_options copts;
			memset(&copts, 0, sizeof(copts));
			copts.padding = 2;
			run_column_filter(colopts, &copts);
		}
490
		filter.name_patterns = argv;
491
		ret = list_tags(&filter, sorting, format);
N
Nguyễn Thái Ngọc Duy 已提交
492 493 494 495
		if (column_active(colopts))
			stop_column_filter();
		return ret;
	}
496
	if (filter.lines != -1)
497
		die(_("-n option is only allowed in list mode"));
498
	if (filter.with_commit)
499
		die(_("--contains option is only allowed in list mode"));
500 501
	if (filter.no_commit)
		die(_("--no-contains option is only allowed in list mode"));
502
	if (filter.points_at.nr)
503
		die(_("--points-at option is only allowed in list mode"));
504
	if (filter.merge_commit)
505
		die(_("--merged and --no-merged options are only allowed in list mode"));
J
Junio C Hamano 已提交
506
	if (cmdmode == 'd')
507 508 509 510 511 512
		return for_each_tag_name(argv, delete_tag, NULL);
	if (cmdmode == 'v') {
		if (format)
			verify_ref_format(format);
		return for_each_tag_name(argv, verify_tag, format);
	}
513

514 515
	if (msg.given || msgfile) {
		if (msg.given && msgfile)
516
			die(_("only one -F or -m option is allowed."));
517 518
		if (msg.given)
			strbuf_addbuf(&buf, &(msg.buf));
519 520
		else {
			if (!strcmp(msgfile, "-")) {
521
				if (strbuf_read(&buf, 0, 1024) < 0)
522
					die_errno(_("cannot read '%s'"), msgfile);
523
			} else {
524
				if (strbuf_read_file(&buf, msgfile, 1024) < 0)
525
					die_errno(_("could not open or read '%s'"),
526
						msgfile);
C
Carlos Rica 已提交
527 528 529 530
			}
		}
	}

531
	tag = argv[0];
C
Carlos Rica 已提交
532

533 534
	object_ref = argc == 2 ? argv[1] : "HEAD";
	if (argc > 2)
535
		die(_("too many params"));
C
Carlos Rica 已提交
536 537

	if (get_sha1(object_ref, object))
538
		die(_("Failed to resolve '%s' as a valid ref."), object_ref);
C
Carlos Rica 已提交
539

M
Michael Schubert 已提交
540
	if (strbuf_check_tag_ref(&ref, tag))
541
		die(_("'%s' is not a valid tag name."), tag);
C
Carlos Rica 已提交
542

543
	if (read_ref(ref.buf, prev))
C
Carlos Rica 已提交
544 545
		hashclr(prev);
	else if (!force)
546
		die(_("tag '%s' already exists"), tag);
C
Carlos Rica 已提交
547

548 549 550 551 552 553 554 555 556 557 558
	opt.message_given = msg.given || msgfile;

	if (!cleanup_arg || !strcmp(cleanup_arg, "strip"))
		opt.cleanup_mode = CLEANUP_ALL;
	else if (!strcmp(cleanup_arg, "verbatim"))
		opt.cleanup_mode = CLEANUP_NONE;
	else if (!strcmp(cleanup_arg, "whitespace"))
		opt.cleanup_mode = CLEANUP_SPACE;
	else
		die(_("Invalid cleanup mode %s"), cleanup_arg);

559 560
	create_reflog_msg(object, &reflog_msg);

561 562 563
	if (create_tag_object) {
		if (force_sign_annotate && !annotate)
			opt.sign = 1;
564
		create_tag(object, tag, &buf, &opt, prev, object);
565
	}
C
Carlos Rica 已提交
566

567 568 569
	transaction = ref_transaction_begin(&err);
	if (!transaction ||
	    ref_transaction_update(transaction, ref.buf, object, prev,
570
				   create_reflog ? REF_FORCE_CREATE_REFLOG : 0,
571
				   reflog_msg.buf, &err) ||
572
	    ref_transaction_commit(transaction, &err))
573 574
		die("%s", err.buf);
	ref_transaction_free(transaction);
575
	if (force && !is_null_sha1(prev) && hashcmp(prev, object))
576
		printf(_("Updated tag '%s' (was %s)\n"), tag, find_unique_abbrev(prev, DEFAULT_ABBREV));
C
Carlos Rica 已提交
577

578
	strbuf_release(&err);
579
	strbuf_release(&buf);
M
Michael Schubert 已提交
580
	strbuf_release(&ref);
581
	strbuf_release(&reflog_msg);
C
Carlos Rica 已提交
582 583
	return 0;
}