1#include "../cache.h" 2#include "../config.h" 3#include "../refs.h" 4#include "refs-internal.h" 5#include "ref-cache.h" 6#include "packed-backend.h" 7#include "../iterator.h" 8#include "../dir-iterator.h" 9#include "../lockfile.h" 10#include "../object.h" 11#include "../dir.h" 12#include "../chdir-notify.h" 13#include "worktree.h" 14 15/* 16 * This backend uses the following flags in `ref_update::flags` for 17 * internal bookkeeping purposes. Their numerical values must not 18 * conflict with REF_NO_DEREF, REF_FORCE_CREATE_REFLOG, REF_HAVE_NEW, 19 * REF_HAVE_OLD, or REF_IS_PRUNING, which are also stored in 20 * `ref_update::flags`. 21 */ 22 23/* 24 * Used as a flag in ref_update::flags when a loose ref is being 25 * pruned. This flag must only be used when REF_NO_DEREF is set. 26 */ 27#define REF_IS_PRUNING (1 << 4) 28 29/* 30 * Flag passed to lock_ref_sha1_basic() telling it to tolerate broken 31 * refs (i.e., because the reference is about to be deleted anyway). 32 */ 33#define REF_DELETING (1 << 5) 34 35/* 36 * Used as a flag in ref_update::flags when the lockfile needs to be 37 * committed. 38 */ 39#define REF_NEEDS_COMMIT (1 << 6) 40 41/* 42 * Used as a flag in ref_update::flags when we want to log a ref 43 * update but not actually perform it. This is used when a symbolic 44 * ref update is split up. 45 */ 46#define REF_LOG_ONLY (1 << 7) 47 48/* 49 * Used as a flag in ref_update::flags when the ref_update was via an 50 * update to HEAD. 51 */ 52#define REF_UPDATE_VIA_HEAD (1 << 8) 53 54/* 55 * Used as a flag in ref_update::flags when the loose reference has 56 * been deleted. 57 */ 58#define REF_DELETED_LOOSE (1 << 9) 59 60struct ref_lock { 61 char *ref_name; 62 struct lock_file lk; 63 struct object_id old_oid; 64}; 65 66struct files_ref_store { 67 struct ref_store base; 68 unsigned int store_flags; 69 70 char *gitdir; 71 char *gitcommondir; 72 73 struct ref_cache *loose; 74 75 struct ref_store *packed_ref_store; 76}; 77 78static void clear_loose_ref_cache(struct files_ref_store *refs) 79{ 80 if (refs->loose) { 81 free_ref_cache(refs->loose); 82 refs->loose = NULL; 83 } 84} 85 86/* 87 * Create a new submodule ref cache and add it to the internal 88 * set of caches. 89 */ 90static struct ref_store *files_ref_store_create(const char *gitdir, 91 unsigned int flags) 92{ 93 struct files_ref_store *refs = xcalloc(1, sizeof(*refs)); 94 struct ref_store *ref_store = (struct ref_store *)refs; 95 struct strbuf sb = STRBUF_INIT; 96 97 base_ref_store_init(ref_store, &refs_be_files); 98 refs->store_flags = flags; 99 100 refs->gitdir = xstrdup(gitdir); 101 get_common_dir_noenv(&sb, gitdir); 102 refs->gitcommondir = strbuf_detach(&sb, NULL); 103 strbuf_addf(&sb, "%s/packed-refs", refs->gitcommondir); 104 refs->packed_ref_store = packed_ref_store_create(sb.buf, flags); 105 strbuf_release(&sb); 106 107 chdir_notify_reparent("files-backend $GIT_DIR", 108 &refs->gitdir); 109 chdir_notify_reparent("files-backend $GIT_COMMONDIR", 110 &refs->gitcommondir); 111 112 return ref_store; 113} 114 115/* 116 * Die if refs is not the main ref store. caller is used in any 117 * necessary error messages. 118 */ 119static void files_assert_main_repository(struct files_ref_store *refs, 120 const char *caller) 121{ 122 if (refs->store_flags & REF_STORE_MAIN) 123 return; 124 125 BUG("operation %s only allowed for main ref store", caller); 126} 127 128/* 129 * Downcast ref_store to files_ref_store. Die if ref_store is not a 130 * files_ref_store. required_flags is compared with ref_store's 131 * store_flags to ensure the ref_store has all required capabilities. 132 * "caller" is used in any necessary error messages. 133 */ 134static struct files_ref_store *files_downcast(struct ref_store *ref_store, 135 unsigned int required_flags, 136 const char *caller) 137{ 138 struct files_ref_store *refs; 139 140 if (ref_store->be != &refs_be_files) 141 BUG("ref_store is type \"%s\" not \"files\" in %s", 142 ref_store->be->name, caller); 143 144 refs = (struct files_ref_store *)ref_store; 145 146 if ((refs->store_flags & required_flags) != required_flags) 147 BUG("operation %s requires abilities 0x%x, but only have 0x%x", 148 caller, required_flags, refs->store_flags); 149 150 return refs; 151} 152 153static void files_reflog_path_other_worktrees(struct files_ref_store *refs, 154 struct strbuf *sb, 155 const char *refname) 156{ 157 const char *real_ref; 158 const char *worktree_name; 159 int length; 160 161 if (parse_worktree_ref(refname, &worktree_name, &length, &real_ref)) 162 BUG("refname %s is not a other-worktree ref", refname); 163 164 if (worktree_name) 165 strbuf_addf(sb, "%s/worktrees/%.*s/logs/%s", refs->gitcommondir, 166 length, worktree_name, real_ref); 167 else 168 strbuf_addf(sb, "%s/logs/%s", refs->gitcommondir, 169 real_ref); 170} 171 172static void files_reflog_path(struct files_ref_store *refs, 173 struct strbuf *sb, 174 const char *refname) 175{ 176 switch (ref_type(refname)) { 177 case REF_TYPE_PER_WORKTREE: 178 case REF_TYPE_PSEUDOREF: 179 strbuf_addf(sb, "%s/logs/%s", refs->gitdir, refname); 180 break; 181 case REF_TYPE_OTHER_PSEUDOREF: 182 case REF_TYPE_MAIN_PSEUDOREF: 183 files_reflog_path_other_worktrees(refs, sb, refname); 184 break; 185 case REF_TYPE_NORMAL: 186 strbuf_addf(sb, "%s/logs/%s", refs->gitcommondir, refname); 187 break; 188 default: 189 BUG("unknown ref type %d of ref %s", 190 ref_type(refname), refname); 191 } 192} 193 194static void files_ref_path(struct files_ref_store *refs, 195 struct strbuf *sb, 196 const char *refname) 197{ 198 switch (ref_type(refname)) { 199 case REF_TYPE_PER_WORKTREE: 200 case REF_TYPE_PSEUDOREF: 201 strbuf_addf(sb, "%s/%s", refs->gitdir, refname); 202 break; 203 case REF_TYPE_MAIN_PSEUDOREF: 204 if (!skip_prefix(refname, "main-worktree/", &refname)) 205 BUG("ref %s is not a main pseudoref", refname); 206 /* fallthrough */ 207 case REF_TYPE_OTHER_PSEUDOREF: 208 case REF_TYPE_NORMAL: 209 strbuf_addf(sb, "%s/%s", refs->gitcommondir, refname); 210 break; 211 default: 212 BUG("unknown ref type %d of ref %s", 213 ref_type(refname), refname); 214 } 215} 216 217/* 218 * Manually add refs/bisect, refs/rewritten and refs/worktree, which, being 219 * per-worktree, might not appear in the directory listing for 220 * refs/ in the main repo. 221 */ 222static void add_per_worktree_entries_to_dir(struct ref_dir *dir, const char *dirname) 223{ 224 const char *prefixes[] = { "refs/bisect/", "refs/worktree/", "refs/rewritten/" }; 225 int ip; 226 227 if (strcmp(dirname, "refs/")) 228 return; 229 230 for (ip = 0; ip < ARRAY_SIZE(prefixes); ip++) { 231 const char *prefix = prefixes[ip]; 232 int prefix_len = strlen(prefix); 233 struct ref_entry *child_entry; 234 int pos; 235 236 pos = search_ref_dir(dir, prefix, prefix_len); 237 if (pos >= 0) 238 continue; 239 child_entry = create_dir_entry(dir->cache, prefix, prefix_len, 1); 240 add_entry_to_dir(dir, child_entry); 241 } 242} 243 244/* 245 * Read the loose references from the namespace dirname into dir 246 * (without recursing). dirname must end with '/'. dir must be the 247 * directory entry corresponding to dirname. 248 */ 249static void loose_fill_ref_dir(struct ref_store *ref_store, 250 struct ref_dir *dir, const char *dirname) 251{ 252 struct files_ref_store *refs = 253 files_downcast(ref_store, REF_STORE_READ, "fill_ref_dir"); 254 DIR *d; 255 struct dirent *de; 256 int dirnamelen = strlen(dirname); 257 struct strbuf refname; 258 struct strbuf path = STRBUF_INIT; 259 size_t path_baselen; 260 261 files_ref_path(refs, &path, dirname); 262 path_baselen = path.len; 263 264 d = opendir(path.buf); 265 if (!d) { 266 strbuf_release(&path); 267 return; 268 } 269 270 strbuf_init(&refname, dirnamelen + 257); 271 strbuf_add(&refname, dirname, dirnamelen); 272 273 while ((de = readdir(d)) != NULL) { 274 struct object_id oid; 275 struct stat st; 276 int flag; 277 278 if (de->d_name[0] == '.') 279 continue; 280 if (ends_with(de->d_name, ".lock")) 281 continue; 282 strbuf_addstr(&refname, de->d_name); 283 strbuf_addstr(&path, de->d_name); 284 if (stat(path.buf, &st) < 0) { 285 ; /* silently ignore */ 286 } else if (S_ISDIR(st.st_mode)) { 287 strbuf_addch(&refname, '/'); 288 add_entry_to_dir(dir, 289 create_dir_entry(dir->cache, refname.buf, 290 refname.len, 1)); 291 } else { 292 if (!refs_resolve_ref_unsafe(&refs->base, 293 refname.buf, 294 RESOLVE_REF_READING, 295 &oid, &flag)) { 296 oidclr(&oid); 297 flag |= REF_ISBROKEN; 298 } else if (is_null_oid(&oid)) { 299 /* 300 * It is so astronomically unlikely 301 * that null_oid is the OID of an 302 * actual object that we consider its 303 * appearance in a loose reference 304 * file to be repo corruption 305 * (probably due to a software bug). 306 */ 307 flag |= REF_ISBROKEN; 308 } 309 310 if (check_refname_format(refname.buf, 311 REFNAME_ALLOW_ONELEVEL)) { 312 if (!refname_is_safe(refname.buf)) 313 die("loose refname is dangerous: %s", refname.buf); 314 oidclr(&oid); 315 flag |= REF_BAD_NAME | REF_ISBROKEN; 316 } 317 add_entry_to_dir(dir, 318 create_ref_entry(refname.buf, &oid, flag)); 319 } 320 strbuf_setlen(&refname, dirnamelen); 321 strbuf_setlen(&path, path_baselen); 322 } 323 strbuf_release(&refname); 324 strbuf_release(&path); 325 closedir(d); 326 327 add_per_worktree_entries_to_dir(dir, dirname); 328} 329 330static struct ref_cache *get_loose_ref_cache(struct files_ref_store *refs) 331{ 332 if (!refs->loose) { 333 /* 334 * Mark the top-level directory complete because we 335 * are about to read the only subdirectory that can 336 * hold references: 337 */ 338 refs->loose = create_ref_cache(&refs->base, loose_fill_ref_dir); 339 340 /* We're going to fill the top level ourselves: */ 341 refs->loose->root->flag &= ~REF_INCOMPLETE; 342 343 /* 344 * Add an incomplete entry for "refs/" (to be filled 345 * lazily): 346 */ 347 add_entry_to_dir(get_ref_dir(refs->loose->root), 348 create_dir_entry(refs->loose, "refs/", 5, 1)); 349 } 350 return refs->loose; 351} 352 353static int files_read_raw_ref(struct ref_store *ref_store, 354 const char *refname, struct object_id *oid, 355 struct strbuf *referent, unsigned int *type) 356{ 357 struct files_ref_store *refs = 358 files_downcast(ref_store, REF_STORE_READ, "read_raw_ref"); 359 struct strbuf sb_contents = STRBUF_INIT; 360 struct strbuf sb_path = STRBUF_INIT; 361 const char *path; 362 const char *buf; 363 const char *p; 364 struct stat st; 365 int fd; 366 int ret = -1; 367 int save_errno; 368 int remaining_retries = 3; 369 370 *type = 0; 371 strbuf_reset(&sb_path); 372 373 files_ref_path(refs, &sb_path, refname); 374 375 path = sb_path.buf; 376 377stat_ref: 378 /* 379 * We might have to loop back here to avoid a race 380 * condition: first we lstat() the file, then we try 381 * to read it as a link or as a file. But if somebody 382 * changes the type of the file (file <-> directory 383 * <-> symlink) between the lstat() and reading, then 384 * we don't want to report that as an error but rather 385 * try again starting with the lstat(). 386 * 387 * We'll keep a count of the retries, though, just to avoid 388 * any confusing situation sending us into an infinite loop. 389 */ 390 391 if (remaining_retries-- <= 0) 392 goto out; 393 394 if (lstat(path, &st) < 0) { 395 if (errno != ENOENT) 396 goto out; 397 if (refs_read_raw_ref(refs->packed_ref_store, refname, 398 oid, referent, type)) { 399 errno = ENOENT; 400 goto out; 401 } 402 ret = 0; 403 goto out; 404 } 405 406 /* Follow "normalized" - ie "refs/.." symlinks by hand */ 407 if (S_ISLNK(st.st_mode)) { 408 strbuf_reset(&sb_contents); 409 if (strbuf_readlink(&sb_contents, path, st.st_size) < 0) { 410 if (errno == ENOENT || errno == EINVAL) 411 /* inconsistent with lstat; retry */ 412 goto stat_ref; 413 else 414 goto out; 415 } 416 if (starts_with(sb_contents.buf, "refs/") && 417 !check_refname_format(sb_contents.buf, 0)) { 418 strbuf_swap(&sb_contents, referent); 419 *type |= REF_ISSYMREF; 420 ret = 0; 421 goto out; 422 } 423 /* 424 * It doesn't look like a refname; fall through to just 425 * treating it like a non-symlink, and reading whatever it 426 * points to. 427 */ 428 } 429 430 /* Is it a directory? */ 431 if (S_ISDIR(st.st_mode)) { 432 /* 433 * Even though there is a directory where the loose 434 * ref is supposed to be, there could still be a 435 * packed ref: 436 */ 437 if (refs_read_raw_ref(refs->packed_ref_store, refname, 438 oid, referent, type)) { 439 errno = EISDIR; 440 goto out; 441 } 442 ret = 0; 443 goto out; 444 } 445 446 /* 447 * Anything else, just open it and try to use it as 448 * a ref 449 */ 450 fd = open(path, O_RDONLY); 451 if (fd < 0) { 452 if (errno == ENOENT && !S_ISLNK(st.st_mode)) 453 /* inconsistent with lstat; retry */ 454 goto stat_ref; 455 else 456 goto out; 457 } 458 strbuf_reset(&sb_contents); 459 if (strbuf_read(&sb_contents, fd, 256) < 0) { 460 int save_errno = errno; 461 close(fd); 462 errno = save_errno; 463 goto out; 464 } 465 close(fd); 466 strbuf_rtrim(&sb_contents); 467 buf = sb_contents.buf; 468 if (starts_with(buf, "ref:")) { 469 buf += 4; 470 while (isspace(*buf)) 471 buf++; 472 473 strbuf_reset(referent); 474 strbuf_addstr(referent, buf); 475 *type |= REF_ISSYMREF; 476 ret = 0; 477 goto out; 478 } 479 480 /* 481 * Please note that FETCH_HEAD has additional 482 * data after the sha. 483 */ 484 if (parse_oid_hex(buf, oid, &p) || 485 (*p != '\0' && !isspace(*p))) { 486 *type |= REF_ISBROKEN; 487 errno = EINVAL; 488 goto out; 489 } 490 491 ret = 0; 492 493out: 494 save_errno = errno; 495 strbuf_release(&sb_path); 496 strbuf_release(&sb_contents); 497 errno = save_errno; 498 return ret; 499} 500 501static void unlock_ref(struct ref_lock *lock) 502{ 503 rollback_lock_file(&lock->lk); 504 free(lock->ref_name); 505 free(lock); 506} 507 508/* 509 * Lock refname, without following symrefs, and set *lock_p to point 510 * at a newly-allocated lock object. Fill in lock->old_oid, referent, 511 * and type similarly to read_raw_ref(). 512 * 513 * The caller must verify that refname is a "safe" reference name (in 514 * the sense of refname_is_safe()) before calling this function. 515 * 516 * If the reference doesn't already exist, verify that refname doesn't 517 * have a D/F conflict with any existing references. extras and skip 518 * are passed to refs_verify_refname_available() for this check. 519 * 520 * If mustexist is not set and the reference is not found or is 521 * broken, lock the reference anyway but clear old_oid. 522 * 523 * Return 0 on success. On failure, write an error message to err and 524 * return TRANSACTION_NAME_CONFLICT or TRANSACTION_GENERIC_ERROR. 525 * 526 * Implementation note: This function is basically 527 * 528 * lock reference 529 * read_raw_ref() 530 * 531 * but it includes a lot more code to 532 * - Deal with possible races with other processes 533 * - Avoid calling refs_verify_refname_available() when it can be 534 * avoided, namely if we were successfully able to read the ref 535 * - Generate informative error messages in the case of failure 536 */ 537static int lock_raw_ref(struct files_ref_store *refs, 538 const char *refname, int mustexist, 539 const struct string_list *extras, 540 const struct string_list *skip, 541 struct ref_lock **lock_p, 542 struct strbuf *referent, 543 unsigned int *type, 544 struct strbuf *err) 545{ 546 struct ref_lock *lock; 547 struct strbuf ref_file = STRBUF_INIT; 548 int attempts_remaining = 3; 549 int ret = TRANSACTION_GENERIC_ERROR; 550 551 assert(err); 552 files_assert_main_repository(refs, "lock_raw_ref"); 553 554 *type = 0; 555 556 /* First lock the file so it can't change out from under us. */ 557 558 *lock_p = lock = xcalloc(1, sizeof(*lock)); 559 560 lock->ref_name = xstrdup(refname); 561 files_ref_path(refs, &ref_file, refname); 562 563retry: 564 switch (safe_create_leading_directories(ref_file.buf)) { 565 case SCLD_OK: 566 break; /* success */ 567 case SCLD_EXISTS: 568 /* 569 * Suppose refname is "refs/foo/bar". We just failed 570 * to create the containing directory, "refs/foo", 571 * because there was a non-directory in the way. This 572 * indicates a D/F conflict, probably because of 573 * another reference such as "refs/foo". There is no 574 * reason to expect this error to be transitory. 575 */ 576 if (refs_verify_refname_available(&refs->base, refname, 577 extras, skip, err)) { 578 if (mustexist) { 579 /* 580 * To the user the relevant error is 581 * that the "mustexist" reference is 582 * missing: 583 */ 584 strbuf_reset(err); 585 strbuf_addf(err, "unable to resolve reference '%s'", 586 refname); 587 } else { 588 /* 589 * The error message set by 590 * refs_verify_refname_available() is 591 * OK. 592 */ 593 ret = TRANSACTION_NAME_CONFLICT; 594 } 595 } else { 596 /* 597 * The file that is in the way isn't a loose 598 * reference. Report it as a low-level 599 * failure. 600 */ 601 strbuf_addf(err, "unable to create lock file %s.lock; " 602 "non-directory in the way", 603 ref_file.buf); 604 } 605 goto error_return; 606 case SCLD_VANISHED: 607 /* Maybe another process was tidying up. Try again. */ 608 if (--attempts_remaining > 0) 609 goto retry; 610 /* fall through */ 611 default: 612 strbuf_addf(err, "unable to create directory for %s", 613 ref_file.buf); 614 goto error_return; 615 } 616 617 if (hold_lock_file_for_update_timeout( 618 &lock->lk, ref_file.buf, LOCK_NO_DEREF, 619 get_files_ref_lock_timeout_ms()) < 0) { 620 if (errno == ENOENT && --attempts_remaining > 0) { 621 /* 622 * Maybe somebody just deleted one of the 623 * directories leading to ref_file. Try 624 * again: 625 */ 626 goto retry; 627 } else { 628 unable_to_lock_message(ref_file.buf, errno, err); 629 goto error_return; 630 } 631 } 632 633 /* 634 * Now we hold the lock and can read the reference without 635 * fear that its value will change. 636 */ 637 638 if (files_read_raw_ref(&refs->base, refname, 639 &lock->old_oid, referent, type)) { 640 if (errno == ENOENT) { 641 if (mustexist) { 642 /* Garden variety missing reference. */ 643 strbuf_addf(err, "unable to resolve reference '%s'", 644 refname); 645 goto error_return; 646 } else { 647 /* 648 * Reference is missing, but that's OK. We 649 * know that there is not a conflict with 650 * another loose reference because 651 * (supposing that we are trying to lock 652 * reference "refs/foo/bar"): 653 * 654 * - We were successfully able to create 655 * the lockfile refs/foo/bar.lock, so we 656 * know there cannot be a loose reference 657 * named "refs/foo". 658 * 659 * - We got ENOENT and not EISDIR, so we 660 * know that there cannot be a loose 661 * reference named "refs/foo/bar/baz". 662 */ 663 } 664 } else if (errno == EISDIR) { 665 /* 666 * There is a directory in the way. It might have 667 * contained references that have been deleted. If 668 * we don't require that the reference already 669 * exists, try to remove the directory so that it 670 * doesn't cause trouble when we want to rename the 671 * lockfile into place later. 672 */ 673 if (mustexist) { 674 /* Garden variety missing reference. */ 675 strbuf_addf(err, "unable to resolve reference '%s'", 676 refname); 677 goto error_return; 678 } else if (remove_dir_recursively(&ref_file, 679 REMOVE_DIR_EMPTY_ONLY)) { 680 if (refs_verify_refname_available( 681 &refs->base, refname, 682 extras, skip, err)) { 683 /* 684 * The error message set by 685 * verify_refname_available() is OK. 686 */ 687 ret = TRANSACTION_NAME_CONFLICT; 688 goto error_return; 689 } else { 690 /* 691 * We can't delete the directory, 692 * but we also don't know of any 693 * references that it should 694 * contain. 695 */ 696 strbuf_addf(err, "there is a non-empty directory '%s' " 697 "blocking reference '%s'", 698 ref_file.buf, refname); 699 goto error_return; 700 } 701 } 702 } else if (errno == EINVAL && (*type & REF_ISBROKEN)) { 703 strbuf_addf(err, "unable to resolve reference '%s': " 704 "reference broken", refname); 705 goto error_return; 706 } else { 707 strbuf_addf(err, "unable to resolve reference '%s': %s", 708 refname, strerror(errno)); 709 goto error_return; 710 } 711 712 /* 713 * If the ref did not exist and we are creating it, 714 * make sure there is no existing packed ref that 715 * conflicts with refname: 716 */ 717 if (refs_verify_refname_available( 718 refs->packed_ref_store, refname, 719 extras, skip, err)) 720 goto error_return; 721 } 722 723 ret = 0; 724 goto out; 725 726error_return: 727 unlock_ref(lock); 728 *lock_p = NULL; 729 730out: 731 strbuf_release(&ref_file); 732 return ret; 733} 734 735struct files_ref_iterator { 736 struct ref_iterator base; 737 738 struct ref_iterator *iter0; 739 unsigned int flags; 740}; 741 742static int files_ref_iterator_advance(struct ref_iterator *ref_iterator) 743{ 744 struct files_ref_iterator *iter = 745 (struct files_ref_iterator *)ref_iterator; 746 int ok; 747 748 while ((ok = ref_iterator_advance(iter->iter0)) == ITER_OK) { 749 if (iter->flags & DO_FOR_EACH_PER_WORKTREE_ONLY && 750 ref_type(iter->iter0->refname) != REF_TYPE_PER_WORKTREE) 751 continue; 752 753 if (!(iter->flags & DO_FOR_EACH_INCLUDE_BROKEN) && 754 !ref_resolves_to_object(iter->iter0->refname, 755 iter->iter0->oid, 756 iter->iter0->flags)) 757 continue; 758 759 iter->base.refname = iter->iter0->refname; 760 iter->base.oid = iter->iter0->oid; 761 iter->base.flags = iter->iter0->flags; 762 return ITER_OK; 763 } 764 765 iter->iter0 = NULL; 766 if (ref_iterator_abort(ref_iterator) != ITER_DONE) 767 ok = ITER_ERROR; 768 769 return ok; 770} 771 772static int files_ref_iterator_peel(struct ref_iterator *ref_iterator, 773 struct object_id *peeled) 774{ 775 struct files_ref_iterator *iter = 776 (struct files_ref_iterator *)ref_iterator; 777 778 return ref_iterator_peel(iter->iter0, peeled); 779} 780 781static int files_ref_iterator_abort(struct ref_iterator *ref_iterator) 782{ 783 struct files_ref_iterator *iter = 784 (struct files_ref_iterator *)ref_iterator; 785 int ok = ITER_DONE; 786 787 if (iter->iter0) 788 ok = ref_iterator_abort(iter->iter0); 789 790 base_ref_iterator_free(ref_iterator); 791 return ok; 792} 793 794static struct ref_iterator_vtable files_ref_iterator_vtable = { 795 files_ref_iterator_advance, 796 files_ref_iterator_peel, 797 files_ref_iterator_abort 798}; 799 800static struct ref_iterator *files_ref_iterator_begin( 801 struct ref_store *ref_store, 802 const char *prefix, unsigned int flags) 803{ 804 struct files_ref_store *refs; 805 struct ref_iterator *loose_iter, *packed_iter, *overlay_iter; 806 struct files_ref_iterator *iter; 807 struct ref_iterator *ref_iterator; 808 unsigned int required_flags = REF_STORE_READ; 809 810 if (!(flags & DO_FOR_EACH_INCLUDE_BROKEN)) 811 required_flags |= REF_STORE_ODB; 812 813 refs = files_downcast(ref_store, required_flags, "ref_iterator_begin"); 814 815 /* 816 * We must make sure that all loose refs are read before 817 * accessing the packed-refs file; this avoids a race 818 * condition if loose refs are migrated to the packed-refs 819 * file by a simultaneous process, but our in-memory view is 820 * from before the migration. We ensure this as follows: 821 * First, we call start the loose refs iteration with its 822 * `prime_ref` argument set to true. This causes the loose 823 * references in the subtree to be pre-read into the cache. 824 * (If they've already been read, that's OK; we only need to 825 * guarantee that they're read before the packed refs, not 826 * *how much* before.) After that, we call 827 * packed_ref_iterator_begin(), which internally checks 828 * whether the packed-ref cache is up to date with what is on 829 * disk, and re-reads it if not. 830 */ 831 832 loose_iter = cache_ref_iterator_begin(get_loose_ref_cache(refs), 833 prefix, 1); 834 835 /* 836 * The packed-refs file might contain broken references, for 837 * example an old version of a reference that points at an 838 * object that has since been garbage-collected. This is OK as 839 * long as there is a corresponding loose reference that 840 * overrides it, and we don't want to emit an error message in 841 * this case. So ask the packed_ref_store for all of its 842 * references, and (if needed) do our own check for broken 843 * ones in files_ref_iterator_advance(), after we have merged 844 * the packed and loose references. 845 */ 846 packed_iter = refs_ref_iterator_begin( 847 refs->packed_ref_store, prefix, 0, 848 DO_FOR_EACH_INCLUDE_BROKEN); 849 850 overlay_iter = overlay_ref_iterator_begin(loose_iter, packed_iter); 851 852 iter = xcalloc(1, sizeof(*iter)); 853 ref_iterator = &iter->base; 854 base_ref_iterator_init(ref_iterator, &files_ref_iterator_vtable, 855 overlay_iter->ordered); 856 iter->iter0 = overlay_iter; 857 iter->flags = flags; 858 859 return ref_iterator; 860} 861 862/* 863 * Verify that the reference locked by lock has the value old_oid 864 * (unless it is NULL). Fail if the reference doesn't exist and 865 * mustexist is set. Return 0 on success. On error, write an error 866 * message to err, set errno, and return a negative value. 867 */ 868static int verify_lock(struct ref_store *ref_store, struct ref_lock *lock, 869 const struct object_id *old_oid, int mustexist, 870 struct strbuf *err) 871{ 872 assert(err); 873 874 if (refs_read_ref_full(ref_store, lock->ref_name, 875 mustexist ? RESOLVE_REF_READING : 0, 876 &lock->old_oid, NULL)) { 877 if (old_oid) { 878 int save_errno = errno; 879 strbuf_addf(err, "can't verify ref '%s'", lock->ref_name); 880 errno = save_errno; 881 return -1; 882 } else { 883 oidclr(&lock->old_oid); 884 return 0; 885 } 886 } 887 if (old_oid && !oideq(&lock->old_oid, old_oid)) { 888 strbuf_addf(err, "ref '%s' is at %s but expected %s", 889 lock->ref_name, 890 oid_to_hex(&lock->old_oid), 891 oid_to_hex(old_oid)); 892 errno = EBUSY; 893 return -1; 894 } 895 return 0; 896} 897 898static int remove_empty_directories(struct strbuf *path) 899{ 900 /* 901 * we want to create a file but there is a directory there; 902 * if that is an empty directory (or a directory that contains 903 * only empty directories), remove them. 904 */ 905 return remove_dir_recursively(path, REMOVE_DIR_EMPTY_ONLY); 906} 907 908static int create_reflock(const char *path, void *cb) 909{ 910 struct lock_file *lk = cb; 911 912 return hold_lock_file_for_update_timeout( 913 lk, path, LOCK_NO_DEREF, 914 get_files_ref_lock_timeout_ms()) < 0 ? -1 : 0; 915} 916 917/* 918 * Locks a ref returning the lock on success and NULL on failure. 919 * On failure errno is set to something meaningful. 920 */ 921static struct ref_lock *lock_ref_oid_basic(struct files_ref_store *refs, 922 const char *refname, 923 const struct object_id *old_oid, 924 const struct string_list *extras, 925 const struct string_list *skip, 926 unsigned int flags, int *type, 927 struct strbuf *err) 928{ 929 struct strbuf ref_file = STRBUF_INIT; 930 struct ref_lock *lock; 931 int last_errno = 0; 932 int mustexist = (old_oid && !is_null_oid(old_oid)); 933 int resolve_flags = RESOLVE_REF_NO_RECURSE; 934 int resolved; 935 936 files_assert_main_repository(refs, "lock_ref_oid_basic"); 937 assert(err); 938 939 lock = xcalloc(1, sizeof(struct ref_lock)); 940 941 if (mustexist) 942 resolve_flags |= RESOLVE_REF_READING; 943 if (flags & REF_DELETING) 944 resolve_flags |= RESOLVE_REF_ALLOW_BAD_NAME; 945 946 files_ref_path(refs, &ref_file, refname); 947 resolved = !!refs_resolve_ref_unsafe(&refs->base, 948 refname, resolve_flags, 949 &lock->old_oid, type); 950 if (!resolved && errno == EISDIR) { 951 /* 952 * we are trying to lock foo but we used to 953 * have foo/bar which now does not exist; 954 * it is normal for the empty directory 'foo' 955 * to remain. 956 */ 957 if (remove_empty_directories(&ref_file)) { 958 last_errno = errno; 959 if (!refs_verify_refname_available( 960 &refs->base, 961 refname, extras, skip, err)) 962 strbuf_addf(err, "there are still refs under '%s'", 963 refname); 964 goto error_return; 965 } 966 resolved = !!refs_resolve_ref_unsafe(&refs->base, 967 refname, resolve_flags, 968 &lock->old_oid, type); 969 } 970 if (!resolved) { 971 last_errno = errno; 972 if (last_errno != ENOTDIR || 973 !refs_verify_refname_available(&refs->base, refname, 974 extras, skip, err)) 975 strbuf_addf(err, "unable to resolve reference '%s': %s", 976 refname, strerror(last_errno)); 977 978 goto error_return; 979 } 980 981 /* 982 * If the ref did not exist and we are creating it, make sure 983 * there is no existing packed ref whose name begins with our 984 * refname, nor a packed ref whose name is a proper prefix of 985 * our refname. 986 */ 987 if (is_null_oid(&lock->old_oid) && 988 refs_verify_refname_available(refs->packed_ref_store, refname, 989 extras, skip, err)) { 990 last_errno = ENOTDIR; 991 goto error_return; 992 } 993 994 lock->ref_name = xstrdup(refname); 995 996 if (raceproof_create_file(ref_file.buf, create_reflock, &lock->lk)) { 997 last_errno = errno; 998 unable_to_lock_message(ref_file.buf, errno, err); 999 goto error_return;1000 }10011002 if (verify_lock(&refs->base, lock, old_oid, mustexist, err)) {1003 last_errno = errno;1004 goto error_return;1005 }1006 goto out;10071008 error_return:1009 unlock_ref(lock);1010 lock = NULL;10111012 out:1013 strbuf_release(&ref_file);1014 errno = last_errno;1015 return lock;1016}10171018struct ref_to_prune {1019 struct ref_to_prune *next;1020 struct object_id oid;1021 char name[FLEX_ARRAY];1022};10231024enum {1025 REMOVE_EMPTY_PARENTS_REF = 0x01,1026 REMOVE_EMPTY_PARENTS_REFLOG = 0x021027};10281029/*1030 * Remove empty parent directories associated with the specified1031 * reference and/or its reflog, but spare [logs/]refs/ and immediate1032 * subdirs. flags is a combination of REMOVE_EMPTY_PARENTS_REF and/or1033 * REMOVE_EMPTY_PARENTS_REFLOG.1034 */1035static void try_remove_empty_parents(struct files_ref_store *refs,1036 const char *refname,1037 unsigned int flags)1038{1039 struct strbuf buf = STRBUF_INIT;1040 struct strbuf sb = STRBUF_INIT;1041 char *p, *q;1042 int i;10431044 strbuf_addstr(&buf, refname);1045 p = buf.buf;1046 for (i = 0; i < 2; i++) { /* refs/{heads,tags,...}/ */1047 while (*p && *p != '/')1048 p++;1049 /* tolerate duplicate slashes; see check_refname_format() */1050 while (*p == '/')1051 p++;1052 }1053 q = buf.buf + buf.len;1054 while (flags & (REMOVE_EMPTY_PARENTS_REF | REMOVE_EMPTY_PARENTS_REFLOG)) {1055 while (q > p && *q != '/')1056 q--;1057 while (q > p && *(q-1) == '/')1058 q--;1059 if (q == p)1060 break;1061 strbuf_setlen(&buf, q - buf.buf);10621063 strbuf_reset(&sb);1064 files_ref_path(refs, &sb, buf.buf);1065 if ((flags & REMOVE_EMPTY_PARENTS_REF) && rmdir(sb.buf))1066 flags &= ~REMOVE_EMPTY_PARENTS_REF;10671068 strbuf_reset(&sb);1069 files_reflog_path(refs, &sb, buf.buf);1070 if ((flags & REMOVE_EMPTY_PARENTS_REFLOG) && rmdir(sb.buf))1071 flags &= ~REMOVE_EMPTY_PARENTS_REFLOG;1072 }1073 strbuf_release(&buf);1074 strbuf_release(&sb);1075}10761077/* make sure nobody touched the ref, and unlink */1078static void prune_ref(struct files_ref_store *refs, struct ref_to_prune *r)1079{1080 struct ref_transaction *transaction;1081 struct strbuf err = STRBUF_INIT;1082 int ret = -1;10831084 if (check_refname_format(r->name, 0))1085 return;10861087 transaction = ref_store_transaction_begin(&refs->base, &err);1088 if (!transaction)1089 goto cleanup;1090 ref_transaction_add_update(1091 transaction, r->name,1092 REF_NO_DEREF | REF_HAVE_NEW | REF_HAVE_OLD | REF_IS_PRUNING,1093 &null_oid, &r->oid, NULL);1094 if (ref_transaction_commit(transaction, &err))1095 goto cleanup;10961097 ret = 0;10981099cleanup:1100 if (ret)1101 error("%s", err.buf);1102 strbuf_release(&err);1103 ref_transaction_free(transaction);1104 return;1105}11061107/*1108 * Prune the loose versions of the references in the linked list1109 * `*refs_to_prune`, freeing the entries in the list as we go.1110 */1111static void prune_refs(struct files_ref_store *refs, struct ref_to_prune **refs_to_prune)1112{1113 while (*refs_to_prune) {1114 struct ref_to_prune *r = *refs_to_prune;1115 *refs_to_prune = r->next;1116 prune_ref(refs, r);1117 free(r);1118 }1119}11201121/*1122 * Return true if the specified reference should be packed.1123 */1124static int should_pack_ref(const char *refname,1125 const struct object_id *oid, unsigned int ref_flags,1126 unsigned int pack_flags)1127{1128 /* Do not pack per-worktree refs: */1129 if (ref_type(refname) != REF_TYPE_NORMAL)1130 return 0;11311132 /* Do not pack non-tags unless PACK_REFS_ALL is set: */1133 if (!(pack_flags & PACK_REFS_ALL) && !starts_with(refname, "refs/tags/"))1134 return 0;11351136 /* Do not pack symbolic refs: */1137 if (ref_flags & REF_ISSYMREF)1138 return 0;11391140 /* Do not pack broken refs: */1141 if (!ref_resolves_to_object(refname, oid, ref_flags))1142 return 0;11431144 return 1;1145}11461147static int files_pack_refs(struct ref_store *ref_store, unsigned int flags)1148{1149 struct files_ref_store *refs =1150 files_downcast(ref_store, REF_STORE_WRITE | REF_STORE_ODB,1151 "pack_refs");1152 struct ref_iterator *iter;1153 int ok;1154 struct ref_to_prune *refs_to_prune = NULL;1155 struct strbuf err = STRBUF_INIT;1156 struct ref_transaction *transaction;11571158 transaction = ref_store_transaction_begin(refs->packed_ref_store, &err);1159 if (!transaction)1160 return -1;11611162 packed_refs_lock(refs->packed_ref_store, LOCK_DIE_ON_ERROR, &err);11631164 iter = cache_ref_iterator_begin(get_loose_ref_cache(refs), NULL, 0);1165 while ((ok = ref_iterator_advance(iter)) == ITER_OK) {1166 /*1167 * If the loose reference can be packed, add an entry1168 * in the packed ref cache. If the reference should be1169 * pruned, also add it to refs_to_prune.1170 */1171 if (!should_pack_ref(iter->refname, iter->oid, iter->flags,1172 flags))1173 continue;11741175 /*1176 * Add a reference creation for this reference to the1177 * packed-refs transaction:1178 */1179 if (ref_transaction_update(transaction, iter->refname,1180 iter->oid, NULL,1181 REF_NO_DEREF, NULL, &err))1182 die("failure preparing to create packed reference %s: %s",1183 iter->refname, err.buf);11841185 /* Schedule the loose reference for pruning if requested. */1186 if ((flags & PACK_REFS_PRUNE)) {1187 struct ref_to_prune *n;1188 FLEX_ALLOC_STR(n, name, iter->refname);1189 oidcpy(&n->oid, iter->oid);1190 n->next = refs_to_prune;1191 refs_to_prune = n;1192 }1193 }1194 if (ok != ITER_DONE)1195 die("error while iterating over references");11961197 if (ref_transaction_commit(transaction, &err))1198 die("unable to write new packed-refs: %s", err.buf);11991200 ref_transaction_free(transaction);12011202 packed_refs_unlock(refs->packed_ref_store);12031204 prune_refs(refs, &refs_to_prune);1205 strbuf_release(&err);1206 return 0;1207}12081209static int files_delete_refs(struct ref_store *ref_store, const char *msg,1210 struct string_list *refnames, unsigned int flags)1211{1212 struct files_ref_store *refs =1213 files_downcast(ref_store, REF_STORE_WRITE, "delete_refs");1214 struct strbuf err = STRBUF_INIT;1215 int i, result = 0;12161217 if (!refnames->nr)1218 return 0;12191220 if (packed_refs_lock(refs->packed_ref_store, 0, &err))1221 goto error;12221223 if (refs_delete_refs(refs->packed_ref_store, msg, refnames, flags)) {1224 packed_refs_unlock(refs->packed_ref_store);1225 goto error;1226 }12271228 packed_refs_unlock(refs->packed_ref_store);12291230 for (i = 0; i < refnames->nr; i++) {1231 const char *refname = refnames->items[i].string;12321233 if (refs_delete_ref(&refs->base, msg, refname, NULL, flags))1234 result |= error(_("could not remove reference %s"), refname);1235 }12361237 strbuf_release(&err);1238 return result;12391240error:1241 /*1242 * If we failed to rewrite the packed-refs file, then it is1243 * unsafe to try to remove loose refs, because doing so might1244 * expose an obsolete packed value for a reference that might1245 * even point at an object that has been garbage collected.1246 */1247 if (refnames->nr == 1)1248 error(_("could not delete reference %s: %s"),1249 refnames->items[0].string, err.buf);1250 else1251 error(_("could not delete references: %s"), err.buf);12521253 strbuf_release(&err);1254 return -1;1255}12561257/*1258 * People using contrib's git-new-workdir have .git/logs/refs ->1259 * /some/other/path/.git/logs/refs, and that may live on another device.1260 *1261 * IOW, to avoid cross device rename errors, the temporary renamed log must1262 * live into logs/refs.1263 */1264#define TMP_RENAMED_LOG "refs/.tmp-renamed-log"12651266struct rename_cb {1267 const char *tmp_renamed_log;1268 int true_errno;1269};12701271static int rename_tmp_log_callback(const char *path, void *cb_data)1272{1273 struct rename_cb *cb = cb_data;12741275 if (rename(cb->tmp_renamed_log, path)) {1276 /*1277 * rename(a, b) when b is an existing directory ought1278 * to result in ISDIR, but Solaris 5.8 gives ENOTDIR.1279 * Sheesh. Record the true errno for error reporting,1280 * but report EISDIR to raceproof_create_file() so1281 * that it knows to retry.1282 */1283 cb->true_errno = errno;1284 if (errno == ENOTDIR)1285 errno = EISDIR;1286 return -1;1287 } else {1288 return 0;1289 }1290}12911292static int rename_tmp_log(struct files_ref_store *refs, const char *newrefname)1293{1294 struct strbuf path = STRBUF_INIT;1295 struct strbuf tmp = STRBUF_INIT;1296 struct rename_cb cb;1297 int ret;12981299 files_reflog_path(refs, &path, newrefname);1300 files_reflog_path(refs, &tmp, TMP_RENAMED_LOG);1301 cb.tmp_renamed_log = tmp.buf;1302 ret = raceproof_create_file(path.buf, rename_tmp_log_callback, &cb);1303 if (ret) {1304 if (errno == EISDIR)1305 error("directory not empty: %s", path.buf);1306 else1307 error("unable to move logfile %s to %s: %s",1308 tmp.buf, path.buf,1309 strerror(cb.true_errno));1310 }13111312 strbuf_release(&path);1313 strbuf_release(&tmp);1314 return ret;1315}13161317static int write_ref_to_lockfile(struct ref_lock *lock,1318 const struct object_id *oid, struct strbuf *err);1319static int commit_ref_update(struct files_ref_store *refs,1320 struct ref_lock *lock,1321 const struct object_id *oid, const char *logmsg,1322 struct strbuf *err);13231324static int files_copy_or_rename_ref(struct ref_store *ref_store,1325 const char *oldrefname, const char *newrefname,1326 const char *logmsg, int copy)1327{1328 struct files_ref_store *refs =1329 files_downcast(ref_store, REF_STORE_WRITE, "rename_ref");1330 struct object_id oid, orig_oid;1331 int flag = 0, logmoved = 0;1332 struct ref_lock *lock;1333 struct stat loginfo;1334 struct strbuf sb_oldref = STRBUF_INIT;1335 struct strbuf sb_newref = STRBUF_INIT;1336 struct strbuf tmp_renamed_log = STRBUF_INIT;1337 int log, ret;1338 struct strbuf err = STRBUF_INIT;13391340 files_reflog_path(refs, &sb_oldref, oldrefname);1341 files_reflog_path(refs, &sb_newref, newrefname);1342 files_reflog_path(refs, &tmp_renamed_log, TMP_RENAMED_LOG);13431344 log = !lstat(sb_oldref.buf, &loginfo);1345 if (log && S_ISLNK(loginfo.st_mode)) {1346 ret = error("reflog for %s is a symlink", oldrefname);1347 goto out;1348 }13491350 if (!refs_resolve_ref_unsafe(&refs->base, oldrefname,1351 RESOLVE_REF_READING | RESOLVE_REF_NO_RECURSE,1352 &orig_oid, &flag)) {1353 ret = error("refname %s not found", oldrefname);1354 goto out;1355 }13561357 if (flag & REF_ISSYMREF) {1358 if (copy)1359 ret = error("refname %s is a symbolic ref, copying it is not supported",1360 oldrefname);1361 else1362 ret = error("refname %s is a symbolic ref, renaming it is not supported",1363 oldrefname);1364 goto out;1365 }1366 if (!refs_rename_ref_available(&refs->base, oldrefname, newrefname)) {1367 ret = 1;1368 goto out;1369 }13701371 if (!copy && log && rename(sb_oldref.buf, tmp_renamed_log.buf)) {1372 ret = error("unable to move logfile logs/%s to logs/"TMP_RENAMED_LOG": %s",1373 oldrefname, strerror(errno));1374 goto out;1375 }13761377 if (copy && log && copy_file(tmp_renamed_log.buf, sb_oldref.buf, 0644)) {1378 ret = error("unable to copy logfile logs/%s to logs/"TMP_RENAMED_LOG": %s",1379 oldrefname, strerror(errno));1380 goto out;1381 }13821383 if (!copy && refs_delete_ref(&refs->base, logmsg, oldrefname,1384 &orig_oid, REF_NO_DEREF)) {1385 error("unable to delete old %s", oldrefname);1386 goto rollback;1387 }13881389 /*1390 * Since we are doing a shallow lookup, oid is not the1391 * correct value to pass to delete_ref as old_oid. But that1392 * doesn't matter, because an old_oid check wouldn't add to1393 * the safety anyway; we want to delete the reference whatever1394 * its current value.1395 */1396 if (!copy && !refs_read_ref_full(&refs->base, newrefname,1397 RESOLVE_REF_READING | RESOLVE_REF_NO_RECURSE,1398 &oid, NULL) &&1399 refs_delete_ref(&refs->base, NULL, newrefname,1400 NULL, REF_NO_DEREF)) {1401 if (errno == EISDIR) {1402 struct strbuf path = STRBUF_INIT;1403 int result;14041405 files_ref_path(refs, &path, newrefname);1406 result = remove_empty_directories(&path);1407 strbuf_release(&path);14081409 if (result) {1410 error("Directory not empty: %s", newrefname);1411 goto rollback;1412 }1413 } else {1414 error("unable to delete existing %s", newrefname);1415 goto rollback;1416 }1417 }14181419 if (log && rename_tmp_log(refs, newrefname))1420 goto rollback;14211422 logmoved = log;14231424 lock = lock_ref_oid_basic(refs, newrefname, NULL, NULL, NULL,1425 REF_NO_DEREF, NULL, &err);1426 if (!lock) {1427 if (copy)1428 error("unable to copy '%s' to '%s': %s", oldrefname, newrefname, err.buf);1429 else1430 error("unable to rename '%s' to '%s': %s", oldrefname, newrefname, err.buf);1431 strbuf_release(&err);1432 goto rollback;1433 }1434 oidcpy(&lock->old_oid, &orig_oid);14351436 if (write_ref_to_lockfile(lock, &orig_oid, &err) ||1437 commit_ref_update(refs, lock, &orig_oid, logmsg, &err)) {1438 error("unable to write current sha1 into %s: %s", newrefname, err.buf);1439 strbuf_release(&err);1440 goto rollback;1441 }14421443 ret = 0;1444 goto out;14451446 rollback:1447 lock = lock_ref_oid_basic(refs, oldrefname, NULL, NULL, NULL,1448 REF_NO_DEREF, NULL, &err);1449 if (!lock) {1450 error("unable to lock %s for rollback: %s", oldrefname, err.buf);1451 strbuf_release(&err);1452 goto rollbacklog;1453 }14541455 flag = log_all_ref_updates;1456 log_all_ref_updates = LOG_REFS_NONE;1457 if (write_ref_to_lockfile(lock, &orig_oid, &err) ||1458 commit_ref_update(refs, lock, &orig_oid, NULL, &err)) {1459 error("unable to write current sha1 into %s: %s", oldrefname, err.buf);1460 strbuf_release(&err);1461 }1462 log_all_ref_updates = flag;14631464 rollbacklog:1465 if (logmoved && rename(sb_newref.buf, sb_oldref.buf))1466 error("unable to restore logfile %s from %s: %s",1467 oldrefname, newrefname, strerror(errno));1468 if (!logmoved && log &&1469 rename(tmp_renamed_log.buf, sb_oldref.buf))1470 error("unable to restore logfile %s from logs/"TMP_RENAMED_LOG": %s",1471 oldrefname, strerror(errno));1472 ret = 1;1473 out:1474 strbuf_release(&sb_newref);1475 strbuf_release(&sb_oldref);1476 strbuf_release(&tmp_renamed_log);14771478 return ret;1479}14801481static int files_rename_ref(struct ref_store *ref_store,1482 const char *oldrefname, const char *newrefname,1483 const char *logmsg)1484{1485 return files_copy_or_rename_ref(ref_store, oldrefname,1486 newrefname, logmsg, 0);1487}14881489static int files_copy_ref(struct ref_store *ref_store,1490 const char *oldrefname, const char *newrefname,1491 const char *logmsg)1492{1493 return files_copy_or_rename_ref(ref_store, oldrefname,1494 newrefname, logmsg, 1);1495}14961497static int close_ref_gently(struct ref_lock *lock)1498{1499 if (close_lock_file_gently(&lock->lk))1500 return -1;1501 return 0;1502}15031504static int commit_ref(struct ref_lock *lock)1505{1506 char *path = get_locked_file_path(&lock->lk);1507 struct stat st;15081509 if (!lstat(path, &st) && S_ISDIR(st.st_mode)) {1510 /*1511 * There is a directory at the path we want to rename1512 * the lockfile to. Hopefully it is empty; try to1513 * delete it.1514 */1515 size_t len = strlen(path);1516 struct strbuf sb_path = STRBUF_INIT;15171518 strbuf_attach(&sb_path, path, len, len);15191520 /*1521 * If this fails, commit_lock_file() will also fail1522 * and will report the problem.1523 */1524 remove_empty_directories(&sb_path);1525 strbuf_release(&sb_path);1526 } else {1527 free(path);1528 }15291530 if (commit_lock_file(&lock->lk))1531 return -1;1532 return 0;1533}15341535static int open_or_create_logfile(const char *path, void *cb)1536{1537 int *fd = cb;15381539 *fd = open(path, O_APPEND | O_WRONLY | O_CREAT, 0666);1540 return (*fd < 0) ? -1 : 0;1541}15421543/*1544 * Create a reflog for a ref. If force_create = 0, only create the1545 * reflog for certain refs (those for which should_autocreate_reflog1546 * returns non-zero). Otherwise, create it regardless of the reference1547 * name. If the logfile already existed or was created, return 0 and1548 * set *logfd to the file descriptor opened for appending to the file.1549 * If no logfile exists and we decided not to create one, return 0 and1550 * set *logfd to -1. On failure, fill in *err, set *logfd to -1, and1551 * return -1.1552 */1553static int log_ref_setup(struct files_ref_store *refs,1554 const char *refname, int force_create,1555 int *logfd, struct strbuf *err)1556{1557 struct strbuf logfile_sb = STRBUF_INIT;1558 char *logfile;15591560 files_reflog_path(refs, &logfile_sb, refname);1561 logfile = strbuf_detach(&logfile_sb, NULL);15621563 if (force_create || should_autocreate_reflog(refname)) {1564 if (raceproof_create_file(logfile, open_or_create_logfile, logfd)) {1565 if (errno == ENOENT)1566 strbuf_addf(err, "unable to create directory for '%s': "1567 "%s", logfile, strerror(errno));1568 else if (errno == EISDIR)1569 strbuf_addf(err, "there are still logs under '%s'",1570 logfile);1571 else1572 strbuf_addf(err, "unable to append to '%s': %s",1573 logfile, strerror(errno));15741575 goto error;1576 }1577 } else {1578 *logfd = open(logfile, O_APPEND | O_WRONLY, 0666);1579 if (*logfd < 0) {1580 if (errno == ENOENT || errno == EISDIR) {1581 /*1582 * The logfile doesn't already exist,1583 * but that is not an error; it only1584 * means that we won't write log1585 * entries to it.1586 */1587 ;1588 } else {1589 strbuf_addf(err, "unable to append to '%s': %s",1590 logfile, strerror(errno));1591 goto error;1592 }1593 }1594 }15951596 if (*logfd >= 0)1597 adjust_shared_perm(logfile);15981599 free(logfile);1600 return 0;16011602error:1603 free(logfile);1604 return -1;1605}16061607static int files_create_reflog(struct ref_store *ref_store,1608 const char *refname, int force_create,1609 struct strbuf *err)1610{1611 struct files_ref_store *refs =1612 files_downcast(ref_store, REF_STORE_WRITE, "create_reflog");1613 int fd;16141615 if (log_ref_setup(refs, refname, force_create, &fd, err))1616 return -1;16171618 if (fd >= 0)1619 close(fd);16201621 return 0;1622}16231624static int log_ref_write_fd(int fd, const struct object_id *old_oid,1625 const struct object_id *new_oid,1626 const char *committer, const char *msg)1627{1628 struct strbuf sb = STRBUF_INIT;1629 int ret = 0;16301631 strbuf_addf(&sb, "%s %s %s", oid_to_hex(old_oid), oid_to_hex(new_oid), committer);1632 if (msg && *msg)1633 copy_reflog_msg(&sb, msg);1634 strbuf_addch(&sb, '\n');1635 if (write_in_full(fd, sb.buf, sb.len) < 0)1636 ret = -1;1637 strbuf_release(&sb);1638 return ret;1639}16401641static int files_log_ref_write(struct files_ref_store *refs,1642 const char *refname, const struct object_id *old_oid,1643 const struct object_id *new_oid, const char *msg,1644 int flags, struct strbuf *err)1645{1646 int logfd, result;16471648 if (log_all_ref_updates == LOG_REFS_UNSET)1649 log_all_ref_updates = is_bare_repository() ? LOG_REFS_NONE : LOG_REFS_NORMAL;16501651 result = log_ref_setup(refs, refname,1652 flags & REF_FORCE_CREATE_REFLOG,1653 &logfd, err);16541655 if (result)1656 return result;16571658 if (logfd < 0)1659 return 0;1660 result = log_ref_write_fd(logfd, old_oid, new_oid,1661 git_committer_info(0), msg);1662 if (result) {1663 struct strbuf sb = STRBUF_INIT;1664 int save_errno = errno;16651666 files_reflog_path(refs, &sb, refname);1667 strbuf_addf(err, "unable to append to '%s': %s",1668 sb.buf, strerror(save_errno));1669 strbuf_release(&sb);1670 close(logfd);1671 return -1;1672 }1673 if (close(logfd)) {1674 struct strbuf sb = STRBUF_INIT;1675 int save_errno = errno;16761677 files_reflog_path(refs, &sb, refname);1678 strbuf_addf(err, "unable to append to '%s': %s",1679 sb.buf, strerror(save_errno));1680 strbuf_release(&sb);1681 return -1;1682 }1683 return 0;1684}16851686/*1687 * Write oid into the open lockfile, then close the lockfile. On1688 * errors, rollback the lockfile, fill in *err and return -1.1689 */1690static int write_ref_to_lockfile(struct ref_lock *lock,1691 const struct object_id *oid, struct strbuf *err)1692{1693 static char term = '\n';1694 struct object *o;1695 int fd;16961697 o = parse_object(the_repository, oid);1698 if (!o) {1699 strbuf_addf(err,1700 "trying to write ref '%s' with nonexistent object %s",1701 lock->ref_name, oid_to_hex(oid));1702 unlock_ref(lock);1703 return -1;1704 }1705 if (o->type != OBJ_COMMIT && is_branch(lock->ref_name)) {1706 strbuf_addf(err,1707 "trying to write non-commit object %s to branch '%s'",1708 oid_to_hex(oid), lock->ref_name);1709 unlock_ref(lock);1710 return -1;1711 }1712 fd = get_lock_file_fd(&lock->lk);1713 if (write_in_full(fd, oid_to_hex(oid), the_hash_algo->hexsz) < 0 ||1714 write_in_full(fd, &term, 1) < 0 ||1715 close_ref_gently(lock) < 0) {1716 strbuf_addf(err,1717 "couldn't write '%s'", get_lock_file_path(&lock->lk));1718 unlock_ref(lock);1719 return -1;1720 }1721 return 0;1722}17231724/*1725 * Commit a change to a loose reference that has already been written1726 * to the loose reference lockfile. Also update the reflogs if1727 * necessary, using the specified lockmsg (which can be NULL).1728 */1729static int commit_ref_update(struct files_ref_store *refs,1730 struct ref_lock *lock,1731 const struct object_id *oid, const char *logmsg,1732 struct strbuf *err)1733{1734 files_assert_main_repository(refs, "commit_ref_update");17351736 clear_loose_ref_cache(refs);1737 if (files_log_ref_write(refs, lock->ref_name,1738 &lock->old_oid, oid,1739 logmsg, 0, err)) {1740 char *old_msg = strbuf_detach(err, NULL);1741 strbuf_addf(err, "cannot update the ref '%s': %s",1742 lock->ref_name, old_msg);1743 free(old_msg);1744 unlock_ref(lock);1745 return -1;1746 }17471748 if (strcmp(lock->ref_name, "HEAD") != 0) {1749 /*1750 * Special hack: If a branch is updated directly and HEAD1751 * points to it (may happen on the remote side of a push1752 * for example) then logically the HEAD reflog should be1753 * updated too.1754 * A generic solution implies reverse symref information,1755 * but finding all symrefs pointing to the given branch1756 * would be rather costly for this rare event (the direct1757 * update of a branch) to be worth it. So let's cheat and1758 * check with HEAD only which should cover 99% of all usage1759 * scenarios (even 100% of the default ones).1760 */1761 int head_flag;1762 const char *head_ref;17631764 head_ref = refs_resolve_ref_unsafe(&refs->base, "HEAD",1765 RESOLVE_REF_READING,1766 NULL, &head_flag);1767 if (head_ref && (head_flag & REF_ISSYMREF) &&1768 !strcmp(head_ref, lock->ref_name)) {1769 struct strbuf log_err = STRBUF_INIT;1770 if (files_log_ref_write(refs, "HEAD",1771 &lock->old_oid, oid,1772 logmsg, 0, &log_err)) {1773 error("%s", log_err.buf);1774 strbuf_release(&log_err);1775 }1776 }1777 }17781779 if (commit_ref(lock)) {1780 strbuf_addf(err, "couldn't set '%s'", lock->ref_name);1781 unlock_ref(lock);1782 return -1;1783 }17841785 unlock_ref(lock);1786 return 0;1787}17881789static int create_ref_symlink(struct ref_lock *lock, const char *target)1790{1791 int ret = -1;1792#ifndef NO_SYMLINK_HEAD1793 char *ref_path = get_locked_file_path(&lock->lk);1794 unlink(ref_path);1795 ret = symlink(target, ref_path);1796 free(ref_path);17971798 if (ret)1799 fprintf(stderr, "no symlink - falling back to symbolic ref\n");1800#endif1801 return ret;1802}18031804static void update_symref_reflog(struct files_ref_store *refs,1805 struct ref_lock *lock, const char *refname,1806 const char *target, const char *logmsg)1807{1808 struct strbuf err = STRBUF_INIT;1809 struct object_id new_oid;1810 if (logmsg &&1811 !refs_read_ref_full(&refs->base, target,1812 RESOLVE_REF_READING, &new_oid, NULL) &&1813 files_log_ref_write(refs, refname, &lock->old_oid,1814 &new_oid, logmsg, 0, &err)) {1815 error("%s", err.buf);1816 strbuf_release(&err);1817 }1818}18191820static int create_symref_locked(struct files_ref_store *refs,1821 struct ref_lock *lock, const char *refname,1822 const char *target, const char *logmsg)1823{1824 if (prefer_symlink_refs && !create_ref_symlink(lock, target)) {1825 update_symref_reflog(refs, lock, refname, target, logmsg);1826 return 0;1827 }18281829 if (!fdopen_lock_file(&lock->lk, "w"))1830 return error("unable to fdopen %s: %s",1831 lock->lk.tempfile->filename.buf, strerror(errno));18321833 update_symref_reflog(refs, lock, refname, target, logmsg);18341835 /* no error check; commit_ref will check ferror */1836 fprintf(lock->lk.tempfile->fp, "ref: %s\n", target);1837 if (commit_ref(lock) < 0)1838 return error("unable to write symref for %s: %s", refname,1839 strerror(errno));1840 return 0;1841}18421843static int files_create_symref(struct ref_store *ref_store,1844 const char *refname, const char *target,1845 const char *logmsg)1846{1847 struct files_ref_store *refs =1848 files_downcast(ref_store, REF_STORE_WRITE, "create_symref");1849 struct strbuf err = STRBUF_INIT;1850 struct ref_lock *lock;1851 int ret;18521853 lock = lock_ref_oid_basic(refs, refname, NULL,1854 NULL, NULL, REF_NO_DEREF, NULL,1855 &err);1856 if (!lock) {1857 error("%s", err.buf);1858 strbuf_release(&err);1859 return -1;1860 }18611862 ret = create_symref_locked(refs, lock, refname, target, logmsg);1863 unlock_ref(lock);1864 return ret;1865}18661867static int files_reflog_exists(struct ref_store *ref_store,1868 const char *refname)1869{1870 struct files_ref_store *refs =1871 files_downcast(ref_store, REF_STORE_READ, "reflog_exists");1872 struct strbuf sb = STRBUF_INIT;1873 struct stat st;1874 int ret;18751876 files_reflog_path(refs, &sb, refname);1877 ret = !lstat(sb.buf, &st) && S_ISREG(st.st_mode);1878 strbuf_release(&sb);1879 return ret;1880}18811882static int files_delete_reflog(struct ref_store *ref_store,1883 const char *refname)1884{1885 struct files_ref_store *refs =1886 files_downcast(ref_store, REF_STORE_WRITE, "delete_reflog");1887 struct strbuf sb = STRBUF_INIT;1888 int ret;18891890 files_reflog_path(refs, &sb, refname);1891 ret = remove_path(sb.buf);1892 strbuf_release(&sb);1893 return ret;1894}18951896static int show_one_reflog_ent(struct strbuf *sb, each_reflog_ent_fn fn, void *cb_data)1897{1898 struct object_id ooid, noid;1899 char *email_end, *message;1900 timestamp_t timestamp;1901 int tz;1902 const char *p = sb->buf;19031904 /* old SP new SP name <email> SP time TAB msg LF */1905 if (!sb->len || sb->buf[sb->len - 1] != '\n' ||1906 parse_oid_hex(p, &ooid, &p) || *p++ != ' ' ||1907 parse_oid_hex(p, &noid, &p) || *p++ != ' ' ||1908 !(email_end = strchr(p, '>')) ||1909 email_end[1] != ' ' ||1910 !(timestamp = parse_timestamp(email_end + 2, &message, 10)) ||1911 !message || message[0] != ' ' ||1912 (message[1] != '+' && message[1] != '-') ||1913 !isdigit(message[2]) || !isdigit(message[3]) ||1914 !isdigit(message[4]) || !isdigit(message[5]))1915 return 0; /* corrupt? */1916 email_end[1] = '\0';1917 tz = strtol(message + 1, NULL, 10);1918 if (message[6] != '\t')1919 message += 6;1920 else1921 message += 7;1922 return fn(&ooid, &noid, p, timestamp, tz, message, cb_data);1923}19241925static char *find_beginning_of_line(char *bob, char *scan)1926{1927 while (bob < scan && *(--scan) != '\n')1928 ; /* keep scanning backwards */1929 /*1930 * Return either beginning of the buffer, or LF at the end of1931 * the previous line.1932 */1933 return scan;1934}19351936static int files_for_each_reflog_ent_reverse(struct ref_store *ref_store,1937 const char *refname,1938 each_reflog_ent_fn fn,1939 void *cb_data)1940{1941 struct files_ref_store *refs =1942 files_downcast(ref_store, REF_STORE_READ,1943 "for_each_reflog_ent_reverse");1944 struct strbuf sb = STRBUF_INIT;1945 FILE *logfp;1946 long pos;1947 int ret = 0, at_tail = 1;19481949 files_reflog_path(refs, &sb, refname);1950 logfp = fopen(sb.buf, "r");1951 strbuf_release(&sb);1952 if (!logfp)1953 return -1;19541955 /* Jump to the end */1956 if (fseek(logfp, 0, SEEK_END) < 0)1957 ret = error("cannot seek back reflog for %s: %s",1958 refname, strerror(errno));1959 pos = ftell(logfp);1960 while (!ret && 0 < pos) {1961 int cnt;1962 size_t nread;1963 char buf[BUFSIZ];1964 char *endp, *scanp;19651966 /* Fill next block from the end */1967 cnt = (sizeof(buf) < pos) ? sizeof(buf) : pos;1968 if (fseek(logfp, pos - cnt, SEEK_SET)) {1969 ret = error("cannot seek back reflog for %s: %s",1970 refname, strerror(errno));1971 break;1972 }1973 nread = fread(buf, cnt, 1, logfp);1974 if (nread != 1) {1975 ret = error("cannot read %d bytes from reflog for %s: %s",1976 cnt, refname, strerror(errno));1977 break;1978 }1979 pos -= cnt;19801981 scanp = endp = buf + cnt;1982 if (at_tail && scanp[-1] == '\n')1983 /* Looking at the final LF at the end of the file */1984 scanp--;1985 at_tail = 0;19861987 while (buf < scanp) {1988 /*1989 * terminating LF of the previous line, or the beginning1990 * of the buffer.1991 */1992 char *bp;19931994 bp = find_beginning_of_line(buf, scanp);19951996 if (*bp == '\n') {1997 /*1998 * The newline is the end of the previous line,1999 * so we know we have complete line starting2000 * at (bp + 1). Prefix it onto any prior data2001 * we collected for the line and process it.2002 */2003 strbuf_splice(&sb, 0, 0, bp + 1, endp - (bp + 1));2004 scanp = bp;2005 endp = bp + 1;2006 ret = show_one_reflog_ent(&sb, fn, cb_data);2007 strbuf_reset(&sb);2008 if (ret)2009 break;2010 } else if (!pos) {2011 /*2012 * We are at the start of the buffer, and the2013 * start of the file; there is no previous2014 * line, and we have everything for this one.2015 * Process it, and we can end the loop.2016 */2017 strbuf_splice(&sb, 0, 0, buf, endp - buf);2018 ret = show_one_reflog_ent(&sb, fn, cb_data);2019 strbuf_reset(&sb);2020 break;2021 }20222023 if (bp == buf) {2024 /*2025 * We are at the start of the buffer, and there2026 * is more file to read backwards. Which means2027 * we are in the middle of a line. Note that we2028 * may get here even if *bp was a newline; that2029 * just means we are at the exact end of the2030 * previous line, rather than some spot in the2031 * middle.2032 *2033 * Save away what we have to be combined with2034 * the data from the next read.2035 */2036 strbuf_splice(&sb, 0, 0, buf, endp - buf);2037 break;2038 }2039 }20402041 }2042 if (!ret && sb.len)2043 BUG("reverse reflog parser had leftover data");20442045 fclose(logfp);2046 strbuf_release(&sb);2047 return ret;2048}20492050static int files_for_each_reflog_ent(struct ref_store *ref_store,2051 const char *refname,2052 each_reflog_ent_fn fn, void *cb_data)2053{2054 struct files_ref_store *refs =2055 files_downcast(ref_store, REF_STORE_READ,2056 "for_each_reflog_ent");2057 FILE *logfp;2058 struct strbuf sb = STRBUF_INIT;2059 int ret = 0;20602061 files_reflog_path(refs, &sb, refname);2062 logfp = fopen(sb.buf, "r");2063 strbuf_release(&sb);2064 if (!logfp)2065 return -1;20662067 while (!ret && !strbuf_getwholeline(&sb, logfp, '\n'))2068 ret = show_one_reflog_ent(&sb, fn, cb_data);2069 fclose(logfp);2070 strbuf_release(&sb);2071 return ret;2072}20732074struct files_reflog_iterator {2075 struct ref_iterator base;20762077 struct ref_store *ref_store;2078 struct dir_iterator *dir_iterator;2079 struct object_id oid;2080};20812082static int files_reflog_iterator_advance(struct ref_iterator *ref_iterator)2083{2084 struct files_reflog_iterator *iter =2085 (struct files_reflog_iterator *)ref_iterator;2086 struct dir_iterator *diter = iter->dir_iterator;2087 int ok;20882089 while ((ok = dir_iterator_advance(diter)) == ITER_OK) {2090 int flags;20912092 if (!S_ISREG(diter->st.st_mode))2093 continue;2094 if (diter->basename[0] == '.')2095 continue;2096 if (ends_with(diter->basename, ".lock"))2097 continue;20982099 if (refs_read_ref_full(iter->ref_store,2100 diter->relative_path, 0,2101 &iter->oid, &flags)) {2102 error("bad ref for %s", diter->path.buf);2103 continue;2104 }21052106 iter->base.refname = diter->relative_path;2107 iter->base.oid = &iter->oid;2108 iter->base.flags = flags;2109 return ITER_OK;2110 }21112112 iter->dir_iterator = NULL;2113 if (ref_iterator_abort(ref_iterator) == ITER_ERROR)2114 ok = ITER_ERROR;2115 return ok;2116}21172118static int files_reflog_iterator_peel(struct ref_iterator *ref_iterator,2119 struct object_id *peeled)2120{2121 BUG("ref_iterator_peel() called for reflog_iterator");2122}21232124static int files_reflog_iterator_abort(struct ref_iterator *ref_iterator)2125{2126 struct files_reflog_iterator *iter =2127 (struct files_reflog_iterator *)ref_iterator;2128 int ok = ITER_DONE;21292130 if (iter->dir_iterator)2131 ok = dir_iterator_abort(iter->dir_iterator);21322133 base_ref_iterator_free(ref_iterator);2134 return ok;2135}21362137static struct ref_iterator_vtable files_reflog_iterator_vtable = {2138 files_reflog_iterator_advance,2139 files_reflog_iterator_peel,2140 files_reflog_iterator_abort2141};21422143static struct ref_iterator *reflog_iterator_begin(struct ref_store *ref_store,2144 const char *gitdir)2145{2146 struct files_reflog_iterator *iter = xcalloc(1, sizeof(*iter));2147 struct ref_iterator *ref_iterator = &iter->base;2148 struct strbuf sb = STRBUF_INIT;21492150 base_ref_iterator_init(ref_iterator, &files_reflog_iterator_vtable, 0);2151 strbuf_addf(&sb, "%s/logs", gitdir);2152 iter->dir_iterator = dir_iterator_begin(sb.buf);2153 iter->ref_store = ref_store;2154 strbuf_release(&sb);21552156 return ref_iterator;2157}21582159static enum iterator_selection reflog_iterator_select(2160 struct ref_iterator *iter_worktree,2161 struct ref_iterator *iter_common,2162 void *cb_data)2163{2164 if (iter_worktree) {2165 /*2166 * We're a bit loose here. We probably should ignore2167 * common refs if they are accidentally added as2168 * per-worktree refs.2169 */2170 return ITER_SELECT_0;2171 } else if (iter_common) {2172 if (ref_type(iter_common->refname) == REF_TYPE_NORMAL)2173 return ITER_SELECT_1;21742175 /*2176 * The main ref store may contain main worktree's2177 * per-worktree refs, which should be ignored2178 */2179 return ITER_SKIP_1;2180 } else2181 return ITER_DONE;2182}21832184static struct ref_iterator *files_reflog_iterator_begin(struct ref_store *ref_store)2185{2186 struct files_ref_store *refs =2187 files_downcast(ref_store, REF_STORE_READ,2188 "reflog_iterator_begin");21892190 if (!strcmp(refs->gitdir, refs->gitcommondir)) {2191 return reflog_iterator_begin(ref_store, refs->gitcommondir);2192 } else {2193 return merge_ref_iterator_begin(2194 0,2195 reflog_iterator_begin(ref_store, refs->gitdir),2196 reflog_iterator_begin(ref_store, refs->gitcommondir),2197 reflog_iterator_select, refs);2198 }2199}22002201/*2202 * If update is a direct update of head_ref (the reference pointed to2203 * by HEAD), then add an extra REF_LOG_ONLY update for HEAD.2204 */2205static int split_head_update(struct ref_update *update,2206 struct ref_transaction *transaction,2207 const char *head_ref,2208 struct string_list *affected_refnames,2209 struct strbuf *err)2210{2211 struct string_list_item *item;2212 struct ref_update *new_update;22132214 if ((update->flags & REF_LOG_ONLY) ||2215 (update->flags & REF_IS_PRUNING) ||2216 (update->flags & REF_UPDATE_VIA_HEAD))2217 return 0;22182219 if (strcmp(update->refname, head_ref))2220 return 0;22212222 /*2223 * First make sure that HEAD is not already in the2224 * transaction. This check is O(lg N) in the transaction2225 * size, but it happens at most once per transaction.2226 */2227 if (string_list_has_string(affected_refnames, "HEAD")) {2228 /* An entry already existed */2229 strbuf_addf(err,2230 "multiple updates for 'HEAD' (including one "2231 "via its referent '%s') are not allowed",2232 update->refname);2233 return TRANSACTION_NAME_CONFLICT;2234 }22352236 new_update = ref_transaction_add_update(2237 transaction, "HEAD",2238 update->flags | REF_LOG_ONLY | REF_NO_DEREF,2239 &update->new_oid, &update->old_oid,2240 update->msg);22412242 /*2243 * Add "HEAD". This insertion is O(N) in the transaction2244 * size, but it happens at most once per transaction.2245 * Add new_update->refname instead of a literal "HEAD".2246 */2247 if (strcmp(new_update->refname, "HEAD"))2248 BUG("%s unexpectedly not 'HEAD'", new_update->refname);2249 item = string_list_insert(affected_refnames, new_update->refname);2250 item->util = new_update;22512252 return 0;2253}22542255/*2256 * update is for a symref that points at referent and doesn't have2257 * REF_NO_DEREF set. Split it into two updates:2258 * - The original update, but with REF_LOG_ONLY and REF_NO_DEREF set2259 * - A new, separate update for the referent reference2260 * Note that the new update will itself be subject to splitting when2261 * the iteration gets to it.2262 */2263static int split_symref_update(struct ref_update *update,2264 const char *referent,2265 struct ref_transaction *transaction,2266 struct string_list *affected_refnames,2267 struct strbuf *err)2268{2269 struct string_list_item *item;2270 struct ref_update *new_update;2271 unsigned int new_flags;22722273 /*2274 * First make sure that referent is not already in the2275 * transaction. This check is O(lg N) in the transaction2276 * size, but it happens at most once per symref in a2277 * transaction.2278 */2279 if (string_list_has_string(affected_refnames, referent)) {2280 /* An entry already exists */2281 strbuf_addf(err,2282 "multiple updates for '%s' (including one "2283 "via symref '%s') are not allowed",2284 referent, update->refname);2285 return TRANSACTION_NAME_CONFLICT;2286 }22872288 new_flags = update->flags;2289 if (!strcmp(update->refname, "HEAD")) {2290 /*2291 * Record that the new update came via HEAD, so that2292 * when we process it, split_head_update() doesn't try2293 * to add another reflog update for HEAD. Note that2294 * this bit will be propagated if the new_update2295 * itself needs to be split.2296 */2297 new_flags |= REF_UPDATE_VIA_HEAD;2298 }22992300 new_update = ref_transaction_add_update(2301 transaction, referent, new_flags,2302 &update->new_oid, &update->old_oid,2303 update->msg);23042305 new_update->parent_update = update;23062307 /*2308 * Change the symbolic ref update to log only. Also, it2309 * doesn't need to check its old OID value, as that will be2310 * done when new_update is processed.2311 */2312 update->flags |= REF_LOG_ONLY | REF_NO_DEREF;2313 update->flags &= ~REF_HAVE_OLD;23142315 /*2316 * Add the referent. This insertion is O(N) in the transaction2317 * size, but it happens at most once per symref in a2318 * transaction. Make sure to add new_update->refname, which will2319 * be valid as long as affected_refnames is in use, and NOT2320 * referent, which might soon be freed by our caller.2321 */2322 item = string_list_insert(affected_refnames, new_update->refname);2323 if (item->util)2324 BUG("%s unexpectedly found in affected_refnames",2325 new_update->refname);2326 item->util = new_update;23272328 return 0;2329}23302331/*2332 * Return the refname under which update was originally requested.2333 */2334static const char *original_update_refname(struct ref_update *update)2335{2336 while (update->parent_update)2337 update = update->parent_update;23382339 return update->refname;2340}23412342/*2343 * Check whether the REF_HAVE_OLD and old_oid values stored in update2344 * are consistent with oid, which is the reference's current value. If2345 * everything is OK, return 0; otherwise, write an error message to2346 * err and return -1.2347 */2348static int check_old_oid(struct ref_update *update, struct object_id *oid,2349 struct strbuf *err)2350{2351 if (!(update->flags & REF_HAVE_OLD) ||2352 oideq(oid, &update->old_oid))2353 return 0;23542355 if (is_null_oid(&update->old_oid))2356 strbuf_addf(err, "cannot lock ref '%s': "2357 "reference already exists",2358 original_update_refname(update));2359 else if (is_null_oid(oid))2360 strbuf_addf(err, "cannot lock ref '%s': "2361 "reference is missing but expected %s",2362 original_update_refname(update),2363 oid_to_hex(&update->old_oid));2364 else2365 strbuf_addf(err, "cannot lock ref '%s': "2366 "is at %s but expected %s",2367 original_update_refname(update),2368 oid_to_hex(oid),2369 oid_to_hex(&update->old_oid));23702371 return -1;2372}23732374/*2375 * Prepare for carrying out update:2376 * - Lock the reference referred to by update.2377 * - Read the reference under lock.2378 * - Check that its old OID value (if specified) is correct, and in2379 * any case record it in update->lock->old_oid for later use when2380 * writing the reflog.2381 * - If it is a symref update without REF_NO_DEREF, split it up into a2382 * REF_LOG_ONLY update of the symref and add a separate update for2383 * the referent to transaction.2384 * - If it is an update of head_ref, add a corresponding REF_LOG_ONLY2385 * update of HEAD.2386 */2387static int lock_ref_for_update(struct files_ref_store *refs,2388 struct ref_update *update,2389 struct ref_transaction *transaction,2390 const char *head_ref,2391 struct string_list *affected_refnames,2392 struct strbuf *err)2393{2394 struct strbuf referent = STRBUF_INIT;2395 int mustexist = (update->flags & REF_HAVE_OLD) &&2396 !is_null_oid(&update->old_oid);2397 int ret = 0;2398 struct ref_lock *lock;23992400 files_assert_main_repository(refs, "lock_ref_for_update");24012402 if ((update->flags & REF_HAVE_NEW) && is_null_oid(&update->new_oid))2403 update->flags |= REF_DELETING;24042405 if (head_ref) {2406 ret = split_head_update(update, transaction, head_ref,2407 affected_refnames, err);2408 if (ret)2409 goto out;2410 }24112412 ret = lock_raw_ref(refs, update->refname, mustexist,2413 affected_refnames, NULL,2414 &lock, &referent,2415 &update->type, err);2416 if (ret) {2417 char *reason;24182419 reason = strbuf_detach(err, NULL);2420 strbuf_addf(err, "cannot lock ref '%s': %s",2421 original_update_refname(update), reason);2422 free(reason);2423 goto out;2424 }24252426 update->backend_data = lock;24272428 if (update->type & REF_ISSYMREF) {2429 if (update->flags & REF_NO_DEREF) {2430 /*2431 * We won't be reading the referent as part of2432 * the transaction, so we have to read it here2433 * to record and possibly check old_oid:2434 */2435 if (refs_read_ref_full(&refs->base,2436 referent.buf, 0,2437 &lock->old_oid, NULL)) {2438 if (update->flags & REF_HAVE_OLD) {2439 strbuf_addf(err, "cannot lock ref '%s': "2440 "error reading reference",2441 original_update_refname(update));2442 ret = TRANSACTION_GENERIC_ERROR;2443 goto out;2444 }2445 } else if (check_old_oid(update, &lock->old_oid, err)) {2446 ret = TRANSACTION_GENERIC_ERROR;2447 goto out;2448 }2449 } else {2450 /*2451 * Create a new update for the reference this2452 * symref is pointing at. Also, we will record2453 * and verify old_oid for this update as part2454 * of processing the split-off update, so we2455 * don't have to do it here.2456 */2457 ret = split_symref_update(update,2458 referent.buf, transaction,2459 affected_refnames, err);2460 if (ret)2461 goto out;2462 }2463 } else {2464 struct ref_update *parent_update;24652466 if (check_old_oid(update, &lock->old_oid, err)) {2467 ret = TRANSACTION_GENERIC_ERROR;2468 goto out;2469 }24702471 /*2472 * If this update is happening indirectly because of a2473 * symref update, record the old OID in the parent2474 * update:2475 */2476 for (parent_update = update->parent_update;2477 parent_update;2478 parent_update = parent_update->parent_update) {2479 struct ref_lock *parent_lock = parent_update->backend_data;2480 oidcpy(&parent_lock->old_oid, &lock->old_oid);2481 }2482 }24832484 if ((update->flags & REF_HAVE_NEW) &&2485 !(update->flags & REF_DELETING) &&2486 !(update->flags & REF_LOG_ONLY)) {2487 if (!(update->type & REF_ISSYMREF) &&2488 oideq(&lock->old_oid, &update->new_oid)) {2489 /*2490 * The reference already has the desired2491 * value, so we don't need to write it.2492 */2493 } else if (write_ref_to_lockfile(lock, &update->new_oid,2494 err)) {2495 char *write_err = strbuf_detach(err, NULL);24962497 /*2498 * The lock was freed upon failure of2499 * write_ref_to_lockfile():2500 */2501 update->backend_data = NULL;2502 strbuf_addf(err,2503 "cannot update ref '%s': %s",2504 update->refname, write_err);2505 free(write_err);2506 ret = TRANSACTION_GENERIC_ERROR;2507 goto out;2508 } else {2509 update->flags |= REF_NEEDS_COMMIT;2510 }2511 }2512 if (!(update->flags & REF_NEEDS_COMMIT)) {2513 /*2514 * We didn't call write_ref_to_lockfile(), so2515 * the lockfile is still open. Close it to2516 * free up the file descriptor:2517 */2518 if (close_ref_gently(lock)) {2519 strbuf_addf(err, "couldn't close '%s.lock'",2520 update->refname);2521 ret = TRANSACTION_GENERIC_ERROR;2522 goto out;2523 }2524 }25252526out:2527 strbuf_release(&referent);2528 return ret;2529}25302531struct files_transaction_backend_data {2532 struct ref_transaction *packed_transaction;2533 int packed_refs_locked;2534};25352536/*2537 * Unlock any references in `transaction` that are still locked, and2538 * mark the transaction closed.2539 */2540static void files_transaction_cleanup(struct files_ref_store *refs,2541 struct ref_transaction *transaction)2542{2543 size_t i;2544 struct files_transaction_backend_data *backend_data =2545 transaction->backend_data;2546 struct strbuf err = STRBUF_INIT;25472548 for (i = 0; i < transaction->nr; i++) {2549 struct ref_update *update = transaction->updates[i];2550 struct ref_lock *lock = update->backend_data;25512552 if (lock) {2553 unlock_ref(lock);2554 update->backend_data = NULL;2555 }2556 }25572558 if (backend_data->packed_transaction &&2559 ref_transaction_abort(backend_data->packed_transaction, &err)) {2560 error("error aborting transaction: %s", err.buf);2561 strbuf_release(&err);2562 }25632564 if (backend_data->packed_refs_locked)2565 packed_refs_unlock(refs->packed_ref_store);25662567 free(backend_data);25682569 transaction->state = REF_TRANSACTION_CLOSED;2570}25712572static int files_transaction_prepare(struct ref_store *ref_store,2573 struct ref_transaction *transaction,2574 struct strbuf *err)2575{2576 struct files_ref_store *refs =2577 files_downcast(ref_store, REF_STORE_WRITE,2578 "ref_transaction_prepare");2579 size_t i;2580 int ret = 0;2581 struct string_list affected_refnames = STRING_LIST_INIT_NODUP;2582 char *head_ref = NULL;2583 int head_type;2584 struct files_transaction_backend_data *backend_data;2585 struct ref_transaction *packed_transaction = NULL;25862587 assert(err);25882589 if (!transaction->nr)2590 goto cleanup;25912592 backend_data = xcalloc(1, sizeof(*backend_data));2593 transaction->backend_data = backend_data;25942595 /*2596 * Fail if a refname appears more than once in the2597 * transaction. (If we end up splitting up any updates using2598 * split_symref_update() or split_head_update(), those2599 * functions will check that the new updates don't have the2600 * same refname as any existing ones.) Also fail if any of the2601 * updates use REF_IS_PRUNING without REF_NO_DEREF.2602 */2603 for (i = 0; i < transaction->nr; i++) {2604 struct ref_update *update = transaction->updates[i];2605 struct string_list_item *item =2606 string_list_append(&affected_refnames, update->refname);26072608 if ((update->flags & REF_IS_PRUNING) &&2609 !(update->flags & REF_NO_DEREF))2610 BUG("REF_IS_PRUNING set without REF_NO_DEREF");26112612 /*2613 * We store a pointer to update in item->util, but at2614 * the moment we never use the value of this field2615 * except to check whether it is non-NULL.2616 */2617 item->util = update;2618 }2619 string_list_sort(&affected_refnames);2620 if (ref_update_reject_duplicates(&affected_refnames, err)) {2621 ret = TRANSACTION_GENERIC_ERROR;2622 goto cleanup;2623 }26242625 /*2626 * Special hack: If a branch is updated directly and HEAD2627 * points to it (may happen on the remote side of a push2628 * for example) then logically the HEAD reflog should be2629 * updated too.2630 *2631 * A generic solution would require reverse symref lookups,2632 * but finding all symrefs pointing to a given branch would be2633 * rather costly for this rare event (the direct update of a2634 * branch) to be worth it. So let's cheat and check with HEAD2635 * only, which should cover 99% of all usage scenarios (even2636 * 100% of the default ones).2637 *2638 * So if HEAD is a symbolic reference, then record the name of2639 * the reference that it points to. If we see an update of2640 * head_ref within the transaction, then split_head_update()2641 * arranges for the reflog of HEAD to be updated, too.2642 */2643 head_ref = refs_resolve_refdup(ref_store, "HEAD",2644 RESOLVE_REF_NO_RECURSE,2645 NULL, &head_type);26462647 if (head_ref && !(head_type & REF_ISSYMREF)) {2648 FREE_AND_NULL(head_ref);2649 }26502651 /*2652 * Acquire all locks, verify old values if provided, check2653 * that new values are valid, and write new values to the2654 * lockfiles, ready to be activated. Only keep one lockfile2655 * open at a time to avoid running out of file descriptors.2656 * Note that lock_ref_for_update() might append more updates2657 * to the transaction.2658 */2659 for (i = 0; i < transaction->nr; i++) {2660 struct ref_update *update = transaction->updates[i];26612662 ret = lock_ref_for_update(refs, update, transaction,2663 head_ref, &affected_refnames, err);2664 if (ret)2665 goto cleanup;26662667 if (update->flags & REF_DELETING &&2668 !(update->flags & REF_LOG_ONLY) &&2669 !(update->flags & REF_IS_PRUNING)) {2670 /*2671 * This reference has to be deleted from2672 * packed-refs if it exists there.2673 */2674 if (!packed_transaction) {2675 packed_transaction = ref_store_transaction_begin(2676 refs->packed_ref_store, err);2677 if (!packed_transaction) {2678 ret = TRANSACTION_GENERIC_ERROR;2679 goto cleanup;2680 }26812682 backend_data->packed_transaction =2683 packed_transaction;2684 }26852686 ref_transaction_add_update(2687 packed_transaction, update->refname,2688 REF_HAVE_NEW | REF_NO_DEREF,2689 &update->new_oid, NULL,2690 NULL);2691 }2692 }26932694 if (packed_transaction) {2695 if (packed_refs_lock(refs->packed_ref_store, 0, err)) {2696 ret = TRANSACTION_GENERIC_ERROR;2697 goto cleanup;2698 }2699 backend_data->packed_refs_locked = 1;27002701 if (is_packed_transaction_needed(refs->packed_ref_store,2702 packed_transaction)) {2703 ret = ref_transaction_prepare(packed_transaction, err);2704 /*2705 * A failure during the prepare step will abort2706 * itself, but not free. Do that now, and disconnect2707 * from the files_transaction so it does not try to2708 * abort us when we hit the cleanup code below.2709 */2710 if (ret) {2711 ref_transaction_free(packed_transaction);2712 backend_data->packed_transaction = NULL;2713 }2714 } else {2715 /*2716 * We can skip rewriting the `packed-refs`2717 * file. But we do need to leave it locked, so2718 * that somebody else doesn't pack a reference2719 * that we are trying to delete.2720 *2721 * We need to disconnect our transaction from2722 * backend_data, since the abort (whether successful or2723 * not) will free it.2724 */2725 backend_data->packed_transaction = NULL;2726 if (ref_transaction_abort(packed_transaction, err)) {2727 ret = TRANSACTION_GENERIC_ERROR;2728 goto cleanup;2729 }2730 }2731 }27322733cleanup:2734 free(head_ref);2735 string_list_clear(&affected_refnames, 0);27362737 if (ret)2738 files_transaction_cleanup(refs, transaction);2739 else2740 transaction->state = REF_TRANSACTION_PREPARED;27412742 return ret;2743}27442745static int files_transaction_finish(struct ref_store *ref_store,2746 struct ref_transaction *transaction,2747 struct strbuf *err)2748{2749 struct files_ref_store *refs =2750 files_downcast(ref_store, 0, "ref_transaction_finish");2751 size_t i;2752 int ret = 0;2753 struct strbuf sb = STRBUF_INIT;2754 struct files_transaction_backend_data *backend_data;2755 struct ref_transaction *packed_transaction;275627572758 assert(err);27592760 if (!transaction->nr) {2761 transaction->state = REF_TRANSACTION_CLOSED;2762 return 0;2763 }27642765 backend_data = transaction->backend_data;2766 packed_transaction = backend_data->packed_transaction;27672768 /* Perform updates first so live commits remain referenced */2769 for (i = 0; i < transaction->nr; i++) {2770 struct ref_update *update = transaction->updates[i];2771 struct ref_lock *lock = update->backend_data;27722773 if (update->flags & REF_NEEDS_COMMIT ||2774 update->flags & REF_LOG_ONLY) {2775 if (files_log_ref_write(refs,2776 lock->ref_name,2777 &lock->old_oid,2778 &update->new_oid,2779 update->msg, update->flags,2780 err)) {2781 char *old_msg = strbuf_detach(err, NULL);27822783 strbuf_addf(err, "cannot update the ref '%s': %s",2784 lock->ref_name, old_msg);2785 free(old_msg);2786 unlock_ref(lock);2787 update->backend_data = NULL;2788 ret = TRANSACTION_GENERIC_ERROR;2789 goto cleanup;2790 }2791 }2792 if (update->flags & REF_NEEDS_COMMIT) {2793 clear_loose_ref_cache(refs);2794 if (commit_ref(lock)) {2795 strbuf_addf(err, "couldn't set '%s'", lock->ref_name);2796 unlock_ref(lock);2797 update->backend_data = NULL;2798 ret = TRANSACTION_GENERIC_ERROR;2799 goto cleanup;2800 }2801 }2802 }28032804 /*2805 * Now that updates are safely completed, we can perform2806 * deletes. First delete the reflogs of any references that2807 * will be deleted, since (in the unexpected event of an2808 * error) leaving a reference without a reflog is less bad2809 * than leaving a reflog without a reference (the latter is a2810 * mildly invalid repository state):2811 */2812 for (i = 0; i < transaction->nr; i++) {2813 struct ref_update *update = transaction->updates[i];2814 if (update->flags & REF_DELETING &&2815 !(update->flags & REF_LOG_ONLY) &&2816 !(update->flags & REF_IS_PRUNING)) {2817 strbuf_reset(&sb);2818 files_reflog_path(refs, &sb, update->refname);2819 if (!unlink_or_warn(sb.buf))2820 try_remove_empty_parents(refs, update->refname,2821 REMOVE_EMPTY_PARENTS_REFLOG);2822 }2823 }28242825 /*2826 * Perform deletes now that updates are safely completed.2827 *2828 * First delete any packed versions of the references, while2829 * retaining the packed-refs lock:2830 */2831 if (packed_transaction) {2832 ret = ref_transaction_commit(packed_transaction, err);2833 ref_transaction_free(packed_transaction);2834 packed_transaction = NULL;2835 backend_data->packed_transaction = NULL;2836 if (ret)2837 goto cleanup;2838 }28392840 /* Now delete the loose versions of the references: */2841 for (i = 0; i < transaction->nr; i++) {2842 struct ref_update *update = transaction->updates[i];2843 struct ref_lock *lock = update->backend_data;28442845 if (update->flags & REF_DELETING &&2846 !(update->flags & REF_LOG_ONLY)) {2847 if (!(update->type & REF_ISPACKED) ||2848 update->type & REF_ISSYMREF) {2849 /* It is a loose reference. */2850 strbuf_reset(&sb);2851 files_ref_path(refs, &sb, lock->ref_name);2852 if (unlink_or_msg(sb.buf, err)) {2853 ret = TRANSACTION_GENERIC_ERROR;2854 goto cleanup;2855 }2856 update->flags |= REF_DELETED_LOOSE;2857 }2858 }2859 }28602861 clear_loose_ref_cache(refs);28622863cleanup:2864 files_transaction_cleanup(refs, transaction);28652866 for (i = 0; i < transaction->nr; i++) {2867 struct ref_update *update = transaction->updates[i];28682869 if (update->flags & REF_DELETED_LOOSE) {2870 /*2871 * The loose reference was deleted. Delete any2872 * empty parent directories. (Note that this2873 * can only work because we have already2874 * removed the lockfile.)2875 */2876 try_remove_empty_parents(refs, update->refname,2877 REMOVE_EMPTY_PARENTS_REF);2878 }2879 }28802881 strbuf_release(&sb);2882 return ret;2883}28842885static int files_transaction_abort(struct ref_store *ref_store,2886 struct ref_transaction *transaction,2887 struct strbuf *err)2888{2889 struct files_ref_store *refs =2890 files_downcast(ref_store, 0, "ref_transaction_abort");28912892 files_transaction_cleanup(refs, transaction);2893 return 0;2894}28952896static int ref_present(const char *refname,2897 const struct object_id *oid, int flags, void *cb_data)2898{2899 struct string_list *affected_refnames = cb_data;29002901 return string_list_has_string(affected_refnames, refname);2902}29032904static int files_initial_transaction_commit(struct ref_store *ref_store,2905 struct ref_transaction *transaction,2906 struct strbuf *err)2907{2908 struct files_ref_store *refs =2909 files_downcast(ref_store, REF_STORE_WRITE,2910 "initial_ref_transaction_commit");2911 size_t i;2912 int ret = 0;2913 struct string_list affected_refnames = STRING_LIST_INIT_NODUP;2914 struct ref_transaction *packed_transaction = NULL;29152916 assert(err);29172918 if (transaction->state != REF_TRANSACTION_OPEN)2919 BUG("commit called for transaction that is not open");29202921 /* Fail if a refname appears more than once in the transaction: */2922 for (i = 0; i < transaction->nr; i++)2923 string_list_append(&affected_refnames,2924 transaction->updates[i]->refname);2925 string_list_sort(&affected_refnames);2926 if (ref_update_reject_duplicates(&affected_refnames, err)) {2927 ret = TRANSACTION_GENERIC_ERROR;2928 goto cleanup;2929 }29302931 /*2932 * It's really undefined to call this function in an active2933 * repository or when there are existing references: we are2934 * only locking and changing packed-refs, so (1) any2935 * simultaneous processes might try to change a reference at2936 * the same time we do, and (2) any existing loose versions of2937 * the references that we are setting would have precedence2938 * over our values. But some remote helpers create the remote2939 * "HEAD" and "master" branches before calling this function,2940 * so here we really only check that none of the references2941 * that we are creating already exists.2942 */2943 if (refs_for_each_rawref(&refs->base, ref_present,2944 &affected_refnames))2945 BUG("initial ref transaction called with existing refs");29462947 packed_transaction = ref_store_transaction_begin(refs->packed_ref_store, err);2948 if (!packed_transaction) {2949 ret = TRANSACTION_GENERIC_ERROR;2950 goto cleanup;2951 }29522953 for (i = 0; i < transaction->nr; i++) {2954 struct ref_update *update = transaction->updates[i];29552956 if ((update->flags & REF_HAVE_OLD) &&2957 !is_null_oid(&update->old_oid))2958 BUG("initial ref transaction with old_sha1 set");2959 if (refs_verify_refname_available(&refs->base, update->refname,2960 &affected_refnames, NULL,2961 err)) {2962 ret = TRANSACTION_NAME_CONFLICT;2963 goto cleanup;2964 }29652966 /*2967 * Add a reference creation for this reference to the2968 * packed-refs transaction:2969 */2970 ref_transaction_add_update(packed_transaction, update->refname,2971 update->flags & ~REF_HAVE_OLD,2972 &update->new_oid, &update->old_oid,2973 NULL);2974 }29752976 if (packed_refs_lock(refs->packed_ref_store, 0, err)) {2977 ret = TRANSACTION_GENERIC_ERROR;2978 goto cleanup;2979 }29802981 if (initial_ref_transaction_commit(packed_transaction, err)) {2982 ret = TRANSACTION_GENERIC_ERROR;2983 }29842985 packed_refs_unlock(refs->packed_ref_store);2986cleanup:2987 if (packed_transaction)2988 ref_transaction_free(packed_transaction);2989 transaction->state = REF_TRANSACTION_CLOSED;2990 string_list_clear(&affected_refnames, 0);2991 return ret;2992}29932994struct expire_reflog_cb {2995 unsigned int flags;2996 reflog_expiry_should_prune_fn *should_prune_fn;2997 void *policy_cb;2998 FILE *newlog;2999 struct object_id last_kept_oid;3000};30013002static int expire_reflog_ent(struct object_id *ooid, struct object_id *noid,3003 const char *email, timestamp_t timestamp, int tz,3004 const char *message, void *cb_data)3005{3006 struct expire_reflog_cb *cb = cb_data;3007 struct expire_reflog_policy_cb *policy_cb = cb->policy_cb;30083009 if (cb->flags & EXPIRE_REFLOGS_REWRITE)3010 ooid = &cb->last_kept_oid;30113012 if ((*cb->should_prune_fn)(ooid, noid, email, timestamp, tz,3013 message, policy_cb)) {3014 if (!cb->newlog)3015 printf("would prune %s", message);3016 else if (cb->flags & EXPIRE_REFLOGS_VERBOSE)3017 printf("prune %s", message);3018 } else {3019 if (cb->newlog) {3020 fprintf(cb->newlog, "%s %s %s %"PRItime" %+05d\t%s",3021 oid_to_hex(ooid), oid_to_hex(noid),3022 email, timestamp, tz, message);3023 oidcpy(&cb->last_kept_oid, noid);3024 }3025 if (cb->flags & EXPIRE_REFLOGS_VERBOSE)3026 printf("keep %s", message);3027 }3028 return 0;3029}30303031static int files_reflog_expire(struct ref_store *ref_store,3032 const char *refname, const struct object_id *oid,3033 unsigned int flags,3034 reflog_expiry_prepare_fn prepare_fn,3035 reflog_expiry_should_prune_fn should_prune_fn,3036 reflog_expiry_cleanup_fn cleanup_fn,3037 void *policy_cb_data)3038{3039 struct files_ref_store *refs =3040 files_downcast(ref_store, REF_STORE_WRITE, "reflog_expire");3041 struct lock_file reflog_lock = LOCK_INIT;3042 struct expire_reflog_cb cb;3043 struct ref_lock *lock;3044 struct strbuf log_file_sb = STRBUF_INIT;3045 char *log_file;3046 int status = 0;3047 int type;3048 struct strbuf err = STRBUF_INIT;30493050 memset(&cb, 0, sizeof(cb));3051 cb.flags = flags;3052 cb.policy_cb = policy_cb_data;3053 cb.should_prune_fn = should_prune_fn;30543055 /*3056 * The reflog file is locked by holding the lock on the3057 * reference itself, plus we might need to update the3058 * reference if --updateref was specified:3059 */3060 lock = lock_ref_oid_basic(refs, refname, oid,3061 NULL, NULL, REF_NO_DEREF,3062 &type, &err);3063 if (!lock) {3064 error("cannot lock ref '%s': %s", refname, err.buf);3065 strbuf_release(&err);3066 return -1;3067 }3068 if (!refs_reflog_exists(ref_store, refname)) {3069 unlock_ref(lock);3070 return 0;3071 }30723073 files_reflog_path(refs, &log_file_sb, refname);3074 log_file = strbuf_detach(&log_file_sb, NULL);3075 if (!(flags & EXPIRE_REFLOGS_DRY_RUN)) {3076 /*3077 * Even though holding $GIT_DIR/logs/$reflog.lock has3078 * no locking implications, we use the lock_file3079 * machinery here anyway because it does a lot of the3080 * work we need, including cleaning up if the program3081 * exits unexpectedly.3082 */3083 if (hold_lock_file_for_update(&reflog_lock, log_file, 0) < 0) {3084 struct strbuf err = STRBUF_INIT;3085 unable_to_lock_message(log_file, errno, &err);3086 error("%s", err.buf);3087 strbuf_release(&err);3088 goto failure;3089 }3090 cb.newlog = fdopen_lock_file(&reflog_lock, "w");3091 if (!cb.newlog) {3092 error("cannot fdopen %s (%s)",3093 get_lock_file_path(&reflog_lock), strerror(errno));3094 goto failure;3095 }3096 }30973098 (*prepare_fn)(refname, oid, cb.policy_cb);3099 refs_for_each_reflog_ent(ref_store, refname, expire_reflog_ent, &cb);3100 (*cleanup_fn)(cb.policy_cb);31013102 if (!(flags & EXPIRE_REFLOGS_DRY_RUN)) {3103 /*3104 * It doesn't make sense to adjust a reference pointed3105 * to by a symbolic ref based on expiring entries in3106 * the symbolic reference's reflog. Nor can we update3107 * a reference if there are no remaining reflog3108 * entries.3109 */3110 int update = (flags & EXPIRE_REFLOGS_UPDATE_REF) &&3111 !(type & REF_ISSYMREF) &&3112 !is_null_oid(&cb.last_kept_oid);31133114 if (close_lock_file_gently(&reflog_lock)) {3115 status |= error("couldn't write %s: %s", log_file,3116 strerror(errno));3117 rollback_lock_file(&reflog_lock);3118 } else if (update &&3119 (write_in_full(get_lock_file_fd(&lock->lk),3120 oid_to_hex(&cb.last_kept_oid), the_hash_algo->hexsz) < 0 ||3121 write_str_in_full(get_lock_file_fd(&lock->lk), "\n") < 0 ||3122 close_ref_gently(lock) < 0)) {3123 status |= error("couldn't write %s",3124 get_lock_file_path(&lock->lk));3125 rollback_lock_file(&reflog_lock);3126 } else if (commit_lock_file(&reflog_lock)) {3127 status |= error("unable to write reflog '%s' (%s)",3128 log_file, strerror(errno));3129 } else if (update && commit_ref(lock)) {3130 status |= error("couldn't set %s", lock->ref_name);3131 }3132 }3133 free(log_file);3134 unlock_ref(lock);3135 return status;31363137 failure:3138 rollback_lock_file(&reflog_lock);3139 free(log_file);3140 unlock_ref(lock);3141 return -1;3142}31433144static int files_init_db(struct ref_store *ref_store, struct strbuf *err)3145{3146 struct files_ref_store *refs =3147 files_downcast(ref_store, REF_STORE_WRITE, "init_db");3148 struct strbuf sb = STRBUF_INIT;31493150 /*3151 * Create .git/refs/{heads,tags}3152 */3153 files_ref_path(refs, &sb, "refs/heads");3154 safe_create_dir(sb.buf, 1);31553156 strbuf_reset(&sb);3157 files_ref_path(refs, &sb, "refs/tags");3158 safe_create_dir(sb.buf, 1);31593160 strbuf_release(&sb);3161 return 0;3162}31633164struct ref_storage_be refs_be_files = {3165 NULL,3166 "files",3167 files_ref_store_create,3168 files_init_db,3169 files_transaction_prepare,3170 files_transaction_finish,3171 files_transaction_abort,3172 files_initial_transaction_commit,31733174 files_pack_refs,3175 files_create_symref,3176 files_delete_refs,3177 files_rename_ref,3178 files_copy_ref,31793180 files_ref_iterator_begin,3181 files_read_raw_ref,31823183 files_reflog_iterator_begin,3184 files_for_each_reflog_ent,3185 files_for_each_reflog_ent_reverse,3186 files_reflog_exists,3187 files_create_reflog,3188 files_delete_reflog,3189 files_reflog_expire3190};