1#include"../cache.h" 2#include"../refs.h" 3#include"refs-internal.h" 4#include"ref-cache.h" 5#include"../iterator.h" 6#include"../dir-iterator.h" 7#include"../lockfile.h" 8#include"../object.h" 9#include"../dir.h" 10 11struct ref_lock { 12char*ref_name; 13struct lock_file *lk; 14struct object_id old_oid; 15}; 16 17/* 18 * Return true if refname, which has the specified oid and flags, can 19 * be resolved to an object in the database. If the referred-to object 20 * does not exist, emit a warning and return false. 21 */ 22static intref_resolves_to_object(const char*refname, 23const struct object_id *oid, 24unsigned int flags) 25{ 26if(flags & REF_ISBROKEN) 27return0; 28if(!has_sha1_file(oid->hash)) { 29error("%sdoes not point to a valid object!", refname); 30return0; 31} 32return1; 33} 34 35struct packed_ref_cache { 36struct ref_cache *cache; 37 38/* 39 * Count of references to the data structure in this instance, 40 * including the pointer from files_ref_store::packed if any. 41 * The data will not be freed as long as the reference count 42 * is nonzero. 43 */ 44unsigned int referrers; 45 46/* The metadata from when this packed-refs cache was read */ 47struct stat_validity validity; 48}; 49 50/* 51 * A container for `packed-refs`-related data. It is not (yet) a 52 * `ref_store`. 53 */ 54struct packed_ref_store { 55unsigned int store_flags; 56 57/* The path of the "packed-refs" file: */ 58char*path; 59 60/* 61 * A cache of the values read from the `packed-refs` file, if 62 * it might still be current; otherwise, NULL. 63 */ 64struct packed_ref_cache *cache; 65 66/* 67 * Lock used for the "packed-refs" file. Note that this (and 68 * thus the enclosing `packed_ref_store`) must not be freed. 69 */ 70struct lock_file lock; 71}; 72 73static struct packed_ref_store *packed_ref_store_create( 74const char*path,unsigned int store_flags) 75{ 76struct packed_ref_store *refs =xcalloc(1,sizeof(*refs)); 77 78 refs->store_flags = store_flags; 79 refs->path =xstrdup(path); 80return refs; 81} 82 83/* 84 * Future: need to be in "struct repository" 85 * when doing a full libification. 86 */ 87struct files_ref_store { 88struct ref_store base; 89unsigned int store_flags; 90 91char*gitdir; 92char*gitcommondir; 93 94struct ref_cache *loose; 95 96struct packed_ref_store *packed_ref_store; 97}; 98 99/* 100 * Increment the reference count of *packed_refs. 101 */ 102static voidacquire_packed_ref_cache(struct packed_ref_cache *packed_refs) 103{ 104 packed_refs->referrers++; 105} 106 107/* 108 * Decrease the reference count of *packed_refs. If it goes to zero, 109 * free *packed_refs and return true; otherwise return false. 110 */ 111static intrelease_packed_ref_cache(struct packed_ref_cache *packed_refs) 112{ 113if(!--packed_refs->referrers) { 114free_ref_cache(packed_refs->cache); 115stat_validity_clear(&packed_refs->validity); 116free(packed_refs); 117return1; 118}else{ 119return0; 120} 121} 122 123static voidclear_packed_ref_cache(struct packed_ref_store *refs) 124{ 125if(refs->cache) { 126struct packed_ref_cache *cache = refs->cache; 127 128if(is_lock_file_locked(&refs->lock)) 129die("BUG: packed-ref cache cleared while locked"); 130 refs->cache = NULL; 131release_packed_ref_cache(cache); 132} 133} 134 135static voidclear_loose_ref_cache(struct files_ref_store *refs) 136{ 137if(refs->loose) { 138free_ref_cache(refs->loose); 139 refs->loose = NULL; 140} 141} 142 143/* 144 * Create a new submodule ref cache and add it to the internal 145 * set of caches. 146 */ 147static struct ref_store *files_ref_store_create(const char*gitdir, 148unsigned int flags) 149{ 150struct files_ref_store *refs =xcalloc(1,sizeof(*refs)); 151struct ref_store *ref_store = (struct ref_store *)refs; 152struct strbuf sb = STRBUF_INIT; 153 154base_ref_store_init(ref_store, &refs_be_files); 155 refs->store_flags = flags; 156 157 refs->gitdir =xstrdup(gitdir); 158get_common_dir_noenv(&sb, gitdir); 159 refs->gitcommondir =strbuf_detach(&sb, NULL); 160strbuf_addf(&sb,"%s/packed-refs", refs->gitcommondir); 161 refs->packed_ref_store =packed_ref_store_create(sb.buf, flags); 162strbuf_release(&sb); 163 164return ref_store; 165} 166 167/* 168 * Die if refs is not the main ref store. caller is used in any 169 * necessary error messages. 170 */ 171static voidfiles_assert_main_repository(struct files_ref_store *refs, 172const char*caller) 173{ 174if(refs->store_flags & REF_STORE_MAIN) 175return; 176 177die("BUG: operation%sonly allowed for main ref store", caller); 178} 179 180/* 181 * Downcast ref_store to files_ref_store. Die if ref_store is not a 182 * files_ref_store. required_flags is compared with ref_store's 183 * store_flags to ensure the ref_store has all required capabilities. 184 * "caller" is used in any necessary error messages. 185 */ 186static struct files_ref_store *files_downcast(struct ref_store *ref_store, 187unsigned int required_flags, 188const char*caller) 189{ 190struct files_ref_store *refs; 191 192if(ref_store->be != &refs_be_files) 193die("BUG: ref_store is type\"%s\"not\"files\"in%s", 194 ref_store->be->name, caller); 195 196 refs = (struct files_ref_store *)ref_store; 197 198if((refs->store_flags & required_flags) != required_flags) 199die("BUG: operation%srequires abilities 0x%x, but only have 0x%x", 200 caller, required_flags, refs->store_flags); 201 202return refs; 203} 204 205/* The length of a peeled reference line in packed-refs, including EOL: */ 206#define PEELED_LINE_LENGTH 42 207 208/* 209 * The packed-refs header line that we write out. Perhaps other 210 * traits will be added later. The trailing space is required. 211 */ 212static const char PACKED_REFS_HEADER[] = 213"# pack-refs with: peeled fully-peeled\n"; 214 215/* 216 * Parse one line from a packed-refs file. Write the SHA1 to sha1. 217 * Return a pointer to the refname within the line (null-terminated), 218 * or NULL if there was a problem. 219 */ 220static const char*parse_ref_line(struct strbuf *line,struct object_id *oid) 221{ 222const char*ref; 223 224if(parse_oid_hex(line->buf, oid, &ref) <0) 225return NULL; 226if(!isspace(*ref++)) 227return NULL; 228 229if(isspace(*ref)) 230return NULL; 231 232if(line->buf[line->len -1] !='\n') 233return NULL; 234 line->buf[--line->len] =0; 235 236return ref; 237} 238 239/* 240 * Read from `packed_refs_file` into a newly-allocated 241 * `packed_ref_cache` and return it. The return value will already 242 * have its reference count incremented. 243 * 244 * A comment line of the form "# pack-refs with: " may contain zero or 245 * more traits. We interpret the traits as follows: 246 * 247 * No traits: 248 * 249 * Probably no references are peeled. But if the file contains a 250 * peeled value for a reference, we will use it. 251 * 252 * peeled: 253 * 254 * References under "refs/tags/", if they *can* be peeled, *are* 255 * peeled in this file. References outside of "refs/tags/" are 256 * probably not peeled even if they could have been, but if we find 257 * a peeled value for such a reference we will use it. 258 * 259 * fully-peeled: 260 * 261 * All references in the file that can be peeled are peeled. 262 * Inversely (and this is more important), any references in the 263 * file for which no peeled value is recorded is not peelable. This 264 * trait should typically be written alongside "peeled" for 265 * compatibility with older clients, but we do not require it 266 * (i.e., "peeled" is a no-op if "fully-peeled" is set). 267 */ 268static struct packed_ref_cache *read_packed_refs(const char*packed_refs_file) 269{ 270FILE*f; 271struct packed_ref_cache *packed_refs =xcalloc(1,sizeof(*packed_refs)); 272struct ref_entry *last = NULL; 273struct strbuf line = STRBUF_INIT; 274enum{ PEELED_NONE, PEELED_TAGS, PEELED_FULLY } peeled = PEELED_NONE; 275struct ref_dir *dir; 276 277acquire_packed_ref_cache(packed_refs); 278 packed_refs->cache =create_ref_cache(NULL, NULL); 279 packed_refs->cache->root->flag &= ~REF_INCOMPLETE; 280 281 f =fopen(packed_refs_file,"r"); 282if(!f) { 283if(errno == ENOENT) { 284/* 285 * This is OK; it just means that no 286 * "packed-refs" file has been written yet, 287 * which is equivalent to it being empty. 288 */ 289return packed_refs; 290}else{ 291die_errno("couldn't read%s", packed_refs_file); 292} 293} 294 295stat_validity_update(&packed_refs->validity,fileno(f)); 296 297 dir =get_ref_dir(packed_refs->cache->root); 298while(strbuf_getwholeline(&line, f,'\n') != EOF) { 299struct object_id oid; 300const char*refname; 301const char*traits; 302 303if(skip_prefix(line.buf,"# pack-refs with:", &traits)) { 304if(strstr(traits," fully-peeled ")) 305 peeled = PEELED_FULLY; 306else if(strstr(traits," peeled ")) 307 peeled = PEELED_TAGS; 308/* perhaps other traits later as well */ 309continue; 310} 311 312 refname =parse_ref_line(&line, &oid); 313if(refname) { 314int flag = REF_ISPACKED; 315 316if(check_refname_format(refname, REFNAME_ALLOW_ONELEVEL)) { 317if(!refname_is_safe(refname)) 318die("packed refname is dangerous:%s", refname); 319oidclr(&oid); 320 flag |= REF_BAD_NAME | REF_ISBROKEN; 321} 322 last =create_ref_entry(refname, &oid, flag); 323if(peeled == PEELED_FULLY || 324(peeled == PEELED_TAGS &&starts_with(refname,"refs/tags/"))) 325 last->flag |= REF_KNOWS_PEELED; 326add_ref_entry(dir, last); 327continue; 328} 329if(last && 330 line.buf[0] =='^'&& 331 line.len == PEELED_LINE_LENGTH && 332 line.buf[PEELED_LINE_LENGTH -1] =='\n'&& 333!get_oid_hex(line.buf +1, &oid)) { 334oidcpy(&last->u.value.peeled, &oid); 335/* 336 * Regardless of what the file header said, 337 * we definitely know the value of *this* 338 * reference: 339 */ 340 last->flag |= REF_KNOWS_PEELED; 341} 342} 343 344fclose(f); 345strbuf_release(&line); 346 347return packed_refs; 348} 349 350static voidfiles_reflog_path(struct files_ref_store *refs, 351struct strbuf *sb, 352const char*refname) 353{ 354if(!refname) { 355/* 356 * FIXME: of course this is wrong in multi worktree 357 * setting. To be fixed real soon. 358 */ 359strbuf_addf(sb,"%s/logs", refs->gitcommondir); 360return; 361} 362 363switch(ref_type(refname)) { 364case REF_TYPE_PER_WORKTREE: 365case REF_TYPE_PSEUDOREF: 366strbuf_addf(sb,"%s/logs/%s", refs->gitdir, refname); 367break; 368case REF_TYPE_NORMAL: 369strbuf_addf(sb,"%s/logs/%s", refs->gitcommondir, refname); 370break; 371default: 372die("BUG: unknown ref type%dof ref%s", 373ref_type(refname), refname); 374} 375} 376 377static voidfiles_ref_path(struct files_ref_store *refs, 378struct strbuf *sb, 379const char*refname) 380{ 381switch(ref_type(refname)) { 382case REF_TYPE_PER_WORKTREE: 383case REF_TYPE_PSEUDOREF: 384strbuf_addf(sb,"%s/%s", refs->gitdir, refname); 385break; 386case REF_TYPE_NORMAL: 387strbuf_addf(sb,"%s/%s", refs->gitcommondir, refname); 388break; 389default: 390die("BUG: unknown ref type%dof ref%s", 391ref_type(refname), refname); 392} 393} 394 395/* 396 * Check that the packed refs cache (if any) still reflects the 397 * contents of the file. If not, clear the cache. 398 */ 399static voidvalidate_packed_ref_cache(struct packed_ref_store *refs) 400{ 401if(refs->cache && 402!stat_validity_check(&refs->cache->validity, refs->path)) 403clear_packed_ref_cache(refs); 404} 405 406/* 407 * Get the packed_ref_cache for the specified packed_ref_store, 408 * creating and populating it if it hasn't been read before or if the 409 * file has been changed (according to its `validity` field) since it 410 * was last read. On the other hand, if we hold the lock, then assume 411 * that the file hasn't been changed out from under us, so skip the 412 * extra `stat()` call in `stat_validity_check()`. 413 */ 414static struct packed_ref_cache *get_packed_ref_cache(struct packed_ref_store *refs) 415{ 416if(!is_lock_file_locked(&refs->lock)) 417validate_packed_ref_cache(refs); 418 419if(!refs->cache) 420 refs->cache =read_packed_refs(refs->path); 421 422return refs->cache; 423} 424 425static struct ref_dir *get_packed_ref_dir(struct packed_ref_cache *packed_ref_cache) 426{ 427returnget_ref_dir(packed_ref_cache->cache->root); 428} 429 430static struct ref_dir *get_packed_refs(struct files_ref_store *refs) 431{ 432returnget_packed_ref_dir(get_packed_ref_cache(refs->packed_ref_store)); 433} 434 435/* 436 * Add or overwrite a reference in the in-memory packed reference 437 * cache. This may only be called while the packed-refs file is locked 438 * (see lock_packed_refs()). To actually write the packed-refs file, 439 * call commit_packed_refs(). 440 */ 441static voidadd_packed_ref(struct files_ref_store *refs, 442const char*refname,const struct object_id *oid) 443{ 444struct ref_dir *packed_refs; 445struct ref_entry *packed_entry; 446 447if(!is_lock_file_locked(&refs->packed_ref_store->lock)) 448die("BUG: packed refs not locked"); 449 450if(check_refname_format(refname, REFNAME_ALLOW_ONELEVEL)) 451die("Reference has invalid format: '%s'", refname); 452 453 packed_refs =get_packed_refs(refs); 454 packed_entry =find_ref_entry(packed_refs, refname); 455if(packed_entry) { 456/* Overwrite the existing entry: */ 457oidcpy(&packed_entry->u.value.oid, oid); 458 packed_entry->flag = REF_ISPACKED; 459oidclr(&packed_entry->u.value.peeled); 460}else{ 461 packed_entry =create_ref_entry(refname, oid, REF_ISPACKED); 462add_ref_entry(packed_refs, packed_entry); 463} 464} 465 466/* 467 * Read the loose references from the namespace dirname into dir 468 * (without recursing). dirname must end with '/'. dir must be the 469 * directory entry corresponding to dirname. 470 */ 471static voidloose_fill_ref_dir(struct ref_store *ref_store, 472struct ref_dir *dir,const char*dirname) 473{ 474struct files_ref_store *refs = 475files_downcast(ref_store, REF_STORE_READ,"fill_ref_dir"); 476DIR*d; 477struct dirent *de; 478int dirnamelen =strlen(dirname); 479struct strbuf refname; 480struct strbuf path = STRBUF_INIT; 481size_t path_baselen; 482 483files_ref_path(refs, &path, dirname); 484 path_baselen = path.len; 485 486 d =opendir(path.buf); 487if(!d) { 488strbuf_release(&path); 489return; 490} 491 492strbuf_init(&refname, dirnamelen +257); 493strbuf_add(&refname, dirname, dirnamelen); 494 495while((de =readdir(d)) != NULL) { 496struct object_id oid; 497struct stat st; 498int flag; 499 500if(de->d_name[0] =='.') 501continue; 502if(ends_with(de->d_name,".lock")) 503continue; 504strbuf_addstr(&refname, de->d_name); 505strbuf_addstr(&path, de->d_name); 506if(stat(path.buf, &st) <0) { 507;/* silently ignore */ 508}else if(S_ISDIR(st.st_mode)) { 509strbuf_addch(&refname,'/'); 510add_entry_to_dir(dir, 511create_dir_entry(dir->cache, refname.buf, 512 refname.len,1)); 513}else{ 514if(!refs_resolve_ref_unsafe(&refs->base, 515 refname.buf, 516 RESOLVE_REF_READING, 517 oid.hash, &flag)) { 518oidclr(&oid); 519 flag |= REF_ISBROKEN; 520}else if(is_null_oid(&oid)) { 521/* 522 * It is so astronomically unlikely 523 * that NULL_SHA1 is the SHA-1 of an 524 * actual object that we consider its 525 * appearance in a loose reference 526 * file to be repo corruption 527 * (probably due to a software bug). 528 */ 529 flag |= REF_ISBROKEN; 530} 531 532if(check_refname_format(refname.buf, 533 REFNAME_ALLOW_ONELEVEL)) { 534if(!refname_is_safe(refname.buf)) 535die("loose refname is dangerous:%s", refname.buf); 536oidclr(&oid); 537 flag |= REF_BAD_NAME | REF_ISBROKEN; 538} 539add_entry_to_dir(dir, 540create_ref_entry(refname.buf, &oid, flag)); 541} 542strbuf_setlen(&refname, dirnamelen); 543strbuf_setlen(&path, path_baselen); 544} 545strbuf_release(&refname); 546strbuf_release(&path); 547closedir(d); 548 549/* 550 * Manually add refs/bisect, which, being per-worktree, might 551 * not appear in the directory listing for refs/ in the main 552 * repo. 553 */ 554if(!strcmp(dirname,"refs/")) { 555int pos =search_ref_dir(dir,"refs/bisect/",12); 556 557if(pos <0) { 558struct ref_entry *child_entry =create_dir_entry( 559 dir->cache,"refs/bisect/",12,1); 560add_entry_to_dir(dir, child_entry); 561} 562} 563} 564 565static struct ref_cache *get_loose_ref_cache(struct files_ref_store *refs) 566{ 567if(!refs->loose) { 568/* 569 * Mark the top-level directory complete because we 570 * are about to read the only subdirectory that can 571 * hold references: 572 */ 573 refs->loose =create_ref_cache(&refs->base, loose_fill_ref_dir); 574 575/* We're going to fill the top level ourselves: */ 576 refs->loose->root->flag &= ~REF_INCOMPLETE; 577 578/* 579 * Add an incomplete entry for "refs/" (to be filled 580 * lazily): 581 */ 582add_entry_to_dir(get_ref_dir(refs->loose->root), 583create_dir_entry(refs->loose,"refs/",5,1)); 584} 585return refs->loose; 586} 587 588/* 589 * Return the ref_entry for the given refname from the packed 590 * references. If it does not exist, return NULL. 591 */ 592static struct ref_entry *get_packed_ref(struct files_ref_store *refs, 593const char*refname) 594{ 595returnfind_ref_entry(get_packed_refs(refs), refname); 596} 597 598/* 599 * A loose ref file doesn't exist; check for a packed ref. 600 */ 601static intresolve_packed_ref(struct files_ref_store *refs, 602const char*refname, 603unsigned char*sha1,unsigned int*flags) 604{ 605struct ref_entry *entry; 606 607/* 608 * The loose reference file does not exist; check for a packed 609 * reference. 610 */ 611 entry =get_packed_ref(refs, refname); 612if(entry) { 613hashcpy(sha1, entry->u.value.oid.hash); 614*flags |= REF_ISPACKED; 615return0; 616} 617/* refname is not a packed reference. */ 618return-1; 619} 620 621static intfiles_read_raw_ref(struct ref_store *ref_store, 622const char*refname,unsigned char*sha1, 623struct strbuf *referent,unsigned int*type) 624{ 625struct files_ref_store *refs = 626files_downcast(ref_store, REF_STORE_READ,"read_raw_ref"); 627struct strbuf sb_contents = STRBUF_INIT; 628struct strbuf sb_path = STRBUF_INIT; 629const char*path; 630const char*buf; 631struct stat st; 632int fd; 633int ret = -1; 634int save_errno; 635int remaining_retries =3; 636 637*type =0; 638strbuf_reset(&sb_path); 639 640files_ref_path(refs, &sb_path, refname); 641 642 path = sb_path.buf; 643 644stat_ref: 645/* 646 * We might have to loop back here to avoid a race 647 * condition: first we lstat() the file, then we try 648 * to read it as a link or as a file. But if somebody 649 * changes the type of the file (file <-> directory 650 * <-> symlink) between the lstat() and reading, then 651 * we don't want to report that as an error but rather 652 * try again starting with the lstat(). 653 * 654 * We'll keep a count of the retries, though, just to avoid 655 * any confusing situation sending us into an infinite loop. 656 */ 657 658if(remaining_retries-- <=0) 659goto out; 660 661if(lstat(path, &st) <0) { 662if(errno != ENOENT) 663goto out; 664if(resolve_packed_ref(refs, refname, sha1, type)) { 665 errno = ENOENT; 666goto out; 667} 668 ret =0; 669goto out; 670} 671 672/* Follow "normalized" - ie "refs/.." symlinks by hand */ 673if(S_ISLNK(st.st_mode)) { 674strbuf_reset(&sb_contents); 675if(strbuf_readlink(&sb_contents, path,0) <0) { 676if(errno == ENOENT || errno == EINVAL) 677/* inconsistent with lstat; retry */ 678goto stat_ref; 679else 680goto out; 681} 682if(starts_with(sb_contents.buf,"refs/") && 683!check_refname_format(sb_contents.buf,0)) { 684strbuf_swap(&sb_contents, referent); 685*type |= REF_ISSYMREF; 686 ret =0; 687goto out; 688} 689/* 690 * It doesn't look like a refname; fall through to just 691 * treating it like a non-symlink, and reading whatever it 692 * points to. 693 */ 694} 695 696/* Is it a directory? */ 697if(S_ISDIR(st.st_mode)) { 698/* 699 * Even though there is a directory where the loose 700 * ref is supposed to be, there could still be a 701 * packed ref: 702 */ 703if(resolve_packed_ref(refs, refname, sha1, type)) { 704 errno = EISDIR; 705goto out; 706} 707 ret =0; 708goto out; 709} 710 711/* 712 * Anything else, just open it and try to use it as 713 * a ref 714 */ 715 fd =open(path, O_RDONLY); 716if(fd <0) { 717if(errno == ENOENT && !S_ISLNK(st.st_mode)) 718/* inconsistent with lstat; retry */ 719goto stat_ref; 720else 721goto out; 722} 723strbuf_reset(&sb_contents); 724if(strbuf_read(&sb_contents, fd,256) <0) { 725int save_errno = errno; 726close(fd); 727 errno = save_errno; 728goto out; 729} 730close(fd); 731strbuf_rtrim(&sb_contents); 732 buf = sb_contents.buf; 733if(starts_with(buf,"ref:")) { 734 buf +=4; 735while(isspace(*buf)) 736 buf++; 737 738strbuf_reset(referent); 739strbuf_addstr(referent, buf); 740*type |= REF_ISSYMREF; 741 ret =0; 742goto out; 743} 744 745/* 746 * Please note that FETCH_HEAD has additional 747 * data after the sha. 748 */ 749if(get_sha1_hex(buf, sha1) || 750(buf[40] !='\0'&& !isspace(buf[40]))) { 751*type |= REF_ISBROKEN; 752 errno = EINVAL; 753goto out; 754} 755 756 ret =0; 757 758out: 759 save_errno = errno; 760strbuf_release(&sb_path); 761strbuf_release(&sb_contents); 762 errno = save_errno; 763return ret; 764} 765 766static voidunlock_ref(struct ref_lock *lock) 767{ 768/* Do not free lock->lk -- atexit() still looks at them */ 769if(lock->lk) 770rollback_lock_file(lock->lk); 771free(lock->ref_name); 772free(lock); 773} 774 775/* 776 * Lock refname, without following symrefs, and set *lock_p to point 777 * at a newly-allocated lock object. Fill in lock->old_oid, referent, 778 * and type similarly to read_raw_ref(). 779 * 780 * The caller must verify that refname is a "safe" reference name (in 781 * the sense of refname_is_safe()) before calling this function. 782 * 783 * If the reference doesn't already exist, verify that refname doesn't 784 * have a D/F conflict with any existing references. extras and skip 785 * are passed to refs_verify_refname_available() for this check. 786 * 787 * If mustexist is not set and the reference is not found or is 788 * broken, lock the reference anyway but clear sha1. 789 * 790 * Return 0 on success. On failure, write an error message to err and 791 * return TRANSACTION_NAME_CONFLICT or TRANSACTION_GENERIC_ERROR. 792 * 793 * Implementation note: This function is basically 794 * 795 * lock reference 796 * read_raw_ref() 797 * 798 * but it includes a lot more code to 799 * - Deal with possible races with other processes 800 * - Avoid calling refs_verify_refname_available() when it can be 801 * avoided, namely if we were successfully able to read the ref 802 * - Generate informative error messages in the case of failure 803 */ 804static intlock_raw_ref(struct files_ref_store *refs, 805const char*refname,int mustexist, 806const struct string_list *extras, 807const struct string_list *skip, 808struct ref_lock **lock_p, 809struct strbuf *referent, 810unsigned int*type, 811struct strbuf *err) 812{ 813struct ref_lock *lock; 814struct strbuf ref_file = STRBUF_INIT; 815int attempts_remaining =3; 816int ret = TRANSACTION_GENERIC_ERROR; 817 818assert(err); 819files_assert_main_repository(refs,"lock_raw_ref"); 820 821*type =0; 822 823/* First lock the file so it can't change out from under us. */ 824 825*lock_p = lock =xcalloc(1,sizeof(*lock)); 826 827 lock->ref_name =xstrdup(refname); 828files_ref_path(refs, &ref_file, refname); 829 830retry: 831switch(safe_create_leading_directories(ref_file.buf)) { 832case SCLD_OK: 833break;/* success */ 834case SCLD_EXISTS: 835/* 836 * Suppose refname is "refs/foo/bar". We just failed 837 * to create the containing directory, "refs/foo", 838 * because there was a non-directory in the way. This 839 * indicates a D/F conflict, probably because of 840 * another reference such as "refs/foo". There is no 841 * reason to expect this error to be transitory. 842 */ 843if(refs_verify_refname_available(&refs->base, refname, 844 extras, skip, err)) { 845if(mustexist) { 846/* 847 * To the user the relevant error is 848 * that the "mustexist" reference is 849 * missing: 850 */ 851strbuf_reset(err); 852strbuf_addf(err,"unable to resolve reference '%s'", 853 refname); 854}else{ 855/* 856 * The error message set by 857 * refs_verify_refname_available() is 858 * OK. 859 */ 860 ret = TRANSACTION_NAME_CONFLICT; 861} 862}else{ 863/* 864 * The file that is in the way isn't a loose 865 * reference. Report it as a low-level 866 * failure. 867 */ 868strbuf_addf(err,"unable to create lock file%s.lock; " 869"non-directory in the way", 870 ref_file.buf); 871} 872goto error_return; 873case SCLD_VANISHED: 874/* Maybe another process was tidying up. Try again. */ 875if(--attempts_remaining >0) 876goto retry; 877/* fall through */ 878default: 879strbuf_addf(err,"unable to create directory for%s", 880 ref_file.buf); 881goto error_return; 882} 883 884if(!lock->lk) 885 lock->lk =xcalloc(1,sizeof(struct lock_file)); 886 887if(hold_lock_file_for_update(lock->lk, ref_file.buf, LOCK_NO_DEREF) <0) { 888if(errno == ENOENT && --attempts_remaining >0) { 889/* 890 * Maybe somebody just deleted one of the 891 * directories leading to ref_file. Try 892 * again: 893 */ 894goto retry; 895}else{ 896unable_to_lock_message(ref_file.buf, errno, err); 897goto error_return; 898} 899} 900 901/* 902 * Now we hold the lock and can read the reference without 903 * fear that its value will change. 904 */ 905 906if(files_read_raw_ref(&refs->base, refname, 907 lock->old_oid.hash, referent, type)) { 908if(errno == ENOENT) { 909if(mustexist) { 910/* Garden variety missing reference. */ 911strbuf_addf(err,"unable to resolve reference '%s'", 912 refname); 913goto error_return; 914}else{ 915/* 916 * Reference is missing, but that's OK. We 917 * know that there is not a conflict with 918 * another loose reference because 919 * (supposing that we are trying to lock 920 * reference "refs/foo/bar"): 921 * 922 * - We were successfully able to create 923 * the lockfile refs/foo/bar.lock, so we 924 * know there cannot be a loose reference 925 * named "refs/foo". 926 * 927 * - We got ENOENT and not EISDIR, so we 928 * know that there cannot be a loose 929 * reference named "refs/foo/bar/baz". 930 */ 931} 932}else if(errno == EISDIR) { 933/* 934 * There is a directory in the way. It might have 935 * contained references that have been deleted. If 936 * we don't require that the reference already 937 * exists, try to remove the directory so that it 938 * doesn't cause trouble when we want to rename the 939 * lockfile into place later. 940 */ 941if(mustexist) { 942/* Garden variety missing reference. */ 943strbuf_addf(err,"unable to resolve reference '%s'", 944 refname); 945goto error_return; 946}else if(remove_dir_recursively(&ref_file, 947 REMOVE_DIR_EMPTY_ONLY)) { 948if(refs_verify_refname_available( 949&refs->base, refname, 950 extras, skip, err)) { 951/* 952 * The error message set by 953 * verify_refname_available() is OK. 954 */ 955 ret = TRANSACTION_NAME_CONFLICT; 956goto error_return; 957}else{ 958/* 959 * We can't delete the directory, 960 * but we also don't know of any 961 * references that it should 962 * contain. 963 */ 964strbuf_addf(err,"there is a non-empty directory '%s' " 965"blocking reference '%s'", 966 ref_file.buf, refname); 967goto error_return; 968} 969} 970}else if(errno == EINVAL && (*type & REF_ISBROKEN)) { 971strbuf_addf(err,"unable to resolve reference '%s': " 972"reference broken", refname); 973goto error_return; 974}else{ 975strbuf_addf(err,"unable to resolve reference '%s':%s", 976 refname,strerror(errno)); 977goto error_return; 978} 979 980/* 981 * If the ref did not exist and we are creating it, 982 * make sure there is no existing ref that conflicts 983 * with refname: 984 */ 985if(refs_verify_refname_available( 986&refs->base, refname, 987 extras, skip, err)) 988goto error_return; 989} 990 991 ret =0; 992goto out; 993 994error_return: 995unlock_ref(lock); 996*lock_p = NULL; 997 998out: 999strbuf_release(&ref_file);1000return ret;1001}10021003static intfiles_peel_ref(struct ref_store *ref_store,1004const char*refname,unsigned char*sha1)1005{1006struct files_ref_store *refs =1007files_downcast(ref_store, REF_STORE_READ | REF_STORE_ODB,1008"peel_ref");1009int flag;1010unsigned char base[20];10111012if(current_ref_iter && current_ref_iter->refname == refname) {1013struct object_id peeled;10141015if(ref_iterator_peel(current_ref_iter, &peeled))1016return-1;1017hashcpy(sha1, peeled.hash);1018return0;1019}10201021if(refs_read_ref_full(ref_store, refname,1022 RESOLVE_REF_READING, base, &flag))1023return-1;10241025/*1026 * If the reference is packed, read its ref_entry from the1027 * cache in the hope that we already know its peeled value.1028 * We only try this optimization on packed references because1029 * (a) forcing the filling of the loose reference cache could1030 * be expensive and (b) loose references anyway usually do not1031 * have REF_KNOWS_PEELED.1032 */1033if(flag & REF_ISPACKED) {1034struct ref_entry *r =get_packed_ref(refs, refname);1035if(r) {1036if(peel_entry(r,0))1037return-1;1038hashcpy(sha1, r->u.value.peeled.hash);1039return0;1040}1041}10421043returnpeel_object(base, sha1);1044}10451046struct files_ref_iterator {1047struct ref_iterator base;10481049struct packed_ref_cache *packed_ref_cache;1050struct ref_iterator *iter0;1051unsigned int flags;1052};10531054static intfiles_ref_iterator_advance(struct ref_iterator *ref_iterator)1055{1056struct files_ref_iterator *iter =1057(struct files_ref_iterator *)ref_iterator;1058int ok;10591060while((ok =ref_iterator_advance(iter->iter0)) == ITER_OK) {1061if(iter->flags & DO_FOR_EACH_PER_WORKTREE_ONLY &&1062ref_type(iter->iter0->refname) != REF_TYPE_PER_WORKTREE)1063continue;10641065if(!(iter->flags & DO_FOR_EACH_INCLUDE_BROKEN) &&1066!ref_resolves_to_object(iter->iter0->refname,1067 iter->iter0->oid,1068 iter->iter0->flags))1069continue;10701071 iter->base.refname = iter->iter0->refname;1072 iter->base.oid = iter->iter0->oid;1073 iter->base.flags = iter->iter0->flags;1074return ITER_OK;1075}10761077 iter->iter0 = NULL;1078if(ref_iterator_abort(ref_iterator) != ITER_DONE)1079 ok = ITER_ERROR;10801081return ok;1082}10831084static intfiles_ref_iterator_peel(struct ref_iterator *ref_iterator,1085struct object_id *peeled)1086{1087struct files_ref_iterator *iter =1088(struct files_ref_iterator *)ref_iterator;10891090returnref_iterator_peel(iter->iter0, peeled);1091}10921093static intfiles_ref_iterator_abort(struct ref_iterator *ref_iterator)1094{1095struct files_ref_iterator *iter =1096(struct files_ref_iterator *)ref_iterator;1097int ok = ITER_DONE;10981099if(iter->iter0)1100 ok =ref_iterator_abort(iter->iter0);11011102release_packed_ref_cache(iter->packed_ref_cache);1103base_ref_iterator_free(ref_iterator);1104return ok;1105}11061107static struct ref_iterator_vtable files_ref_iterator_vtable = {1108 files_ref_iterator_advance,1109 files_ref_iterator_peel,1110 files_ref_iterator_abort1111};11121113static struct ref_iterator *files_ref_iterator_begin(1114struct ref_store *ref_store,1115const char*prefix,unsigned int flags)1116{1117struct files_ref_store *refs;1118struct ref_iterator *loose_iter, *packed_iter;1119struct files_ref_iterator *iter;1120struct ref_iterator *ref_iterator;1121unsigned int required_flags = REF_STORE_READ;11221123if(!(flags & DO_FOR_EACH_INCLUDE_BROKEN))1124 required_flags |= REF_STORE_ODB;11251126 refs =files_downcast(ref_store, required_flags,"ref_iterator_begin");11271128 iter =xcalloc(1,sizeof(*iter));1129 ref_iterator = &iter->base;1130base_ref_iterator_init(ref_iterator, &files_ref_iterator_vtable);11311132/*1133 * We must make sure that all loose refs are read before1134 * accessing the packed-refs file; this avoids a race1135 * condition if loose refs are migrated to the packed-refs1136 * file by a simultaneous process, but our in-memory view is1137 * from before the migration. We ensure this as follows:1138 * First, we call start the loose refs iteration with its1139 * `prime_ref` argument set to true. This causes the loose1140 * references in the subtree to be pre-read into the cache.1141 * (If they've already been read, that's OK; we only need to1142 * guarantee that they're read before the packed refs, not1143 * *how much* before.) After that, we call1144 * get_packed_ref_cache(), which internally checks whether the1145 * packed-ref cache is up to date with what is on disk, and1146 * re-reads it if not.1147 */11481149 loose_iter =cache_ref_iterator_begin(get_loose_ref_cache(refs),1150 prefix,1);11511152 iter->packed_ref_cache =get_packed_ref_cache(refs->packed_ref_store);1153acquire_packed_ref_cache(iter->packed_ref_cache);1154 packed_iter =cache_ref_iterator_begin(iter->packed_ref_cache->cache,1155 prefix,0);11561157 iter->iter0 =overlay_ref_iterator_begin(loose_iter, packed_iter);1158 iter->flags = flags;11591160return ref_iterator;1161}11621163/*1164 * Verify that the reference locked by lock has the value old_sha1.1165 * Fail if the reference doesn't exist and mustexist is set. Return 01166 * on success. On error, write an error message to err, set errno, and1167 * return a negative value.1168 */1169static intverify_lock(struct ref_store *ref_store,struct ref_lock *lock,1170const unsigned char*old_sha1,int mustexist,1171struct strbuf *err)1172{1173assert(err);11741175if(refs_read_ref_full(ref_store, lock->ref_name,1176 mustexist ? RESOLVE_REF_READING :0,1177 lock->old_oid.hash, NULL)) {1178if(old_sha1) {1179int save_errno = errno;1180strbuf_addf(err,"can't verify ref '%s'", lock->ref_name);1181 errno = save_errno;1182return-1;1183}else{1184oidclr(&lock->old_oid);1185return0;1186}1187}1188if(old_sha1 &&hashcmp(lock->old_oid.hash, old_sha1)) {1189strbuf_addf(err,"ref '%s' is at%sbut expected%s",1190 lock->ref_name,1191oid_to_hex(&lock->old_oid),1192sha1_to_hex(old_sha1));1193 errno = EBUSY;1194return-1;1195}1196return0;1197}11981199static intremove_empty_directories(struct strbuf *path)1200{1201/*1202 * we want to create a file but there is a directory there;1203 * if that is an empty directory (or a directory that contains1204 * only empty directories), remove them.1205 */1206returnremove_dir_recursively(path, REMOVE_DIR_EMPTY_ONLY);1207}12081209static intcreate_reflock(const char*path,void*cb)1210{1211struct lock_file *lk = cb;12121213returnhold_lock_file_for_update(lk, path, LOCK_NO_DEREF) <0? -1:0;1214}12151216/*1217 * Locks a ref returning the lock on success and NULL on failure.1218 * On failure errno is set to something meaningful.1219 */1220static struct ref_lock *lock_ref_sha1_basic(struct files_ref_store *refs,1221const char*refname,1222const unsigned char*old_sha1,1223const struct string_list *extras,1224const struct string_list *skip,1225unsigned int flags,int*type,1226struct strbuf *err)1227{1228struct strbuf ref_file = STRBUF_INIT;1229struct ref_lock *lock;1230int last_errno =0;1231int mustexist = (old_sha1 && !is_null_sha1(old_sha1));1232int resolve_flags = RESOLVE_REF_NO_RECURSE;1233int resolved;12341235files_assert_main_repository(refs,"lock_ref_sha1_basic");1236assert(err);12371238 lock =xcalloc(1,sizeof(struct ref_lock));12391240if(mustexist)1241 resolve_flags |= RESOLVE_REF_READING;1242if(flags & REF_DELETING)1243 resolve_flags |= RESOLVE_REF_ALLOW_BAD_NAME;12441245files_ref_path(refs, &ref_file, refname);1246 resolved = !!refs_resolve_ref_unsafe(&refs->base,1247 refname, resolve_flags,1248 lock->old_oid.hash, type);1249if(!resolved && errno == EISDIR) {1250/*1251 * we are trying to lock foo but we used to1252 * have foo/bar which now does not exist;1253 * it is normal for the empty directory 'foo'1254 * to remain.1255 */1256if(remove_empty_directories(&ref_file)) {1257 last_errno = errno;1258if(!refs_verify_refname_available(1259&refs->base,1260 refname, extras, skip, err))1261strbuf_addf(err,"there are still refs under '%s'",1262 refname);1263goto error_return;1264}1265 resolved = !!refs_resolve_ref_unsafe(&refs->base,1266 refname, resolve_flags,1267 lock->old_oid.hash, type);1268}1269if(!resolved) {1270 last_errno = errno;1271if(last_errno != ENOTDIR ||1272!refs_verify_refname_available(&refs->base, refname,1273 extras, skip, err))1274strbuf_addf(err,"unable to resolve reference '%s':%s",1275 refname,strerror(last_errno));12761277goto error_return;1278}12791280/*1281 * If the ref did not exist and we are creating it, make sure1282 * there is no existing packed ref whose name begins with our1283 * refname, nor a packed ref whose name is a proper prefix of1284 * our refname.1285 */1286if(is_null_oid(&lock->old_oid) &&1287refs_verify_refname_available(&refs->base, refname,1288 extras, skip, err)) {1289 last_errno = ENOTDIR;1290goto error_return;1291}12921293 lock->lk =xcalloc(1,sizeof(struct lock_file));12941295 lock->ref_name =xstrdup(refname);12961297if(raceproof_create_file(ref_file.buf, create_reflock, lock->lk)) {1298 last_errno = errno;1299unable_to_lock_message(ref_file.buf, errno, err);1300goto error_return;1301}13021303if(verify_lock(&refs->base, lock, old_sha1, mustexist, err)) {1304 last_errno = errno;1305goto error_return;1306}1307goto out;13081309 error_return:1310unlock_ref(lock);1311 lock = NULL;13121313 out:1314strbuf_release(&ref_file);1315 errno = last_errno;1316return lock;1317}13181319/*1320 * Write an entry to the packed-refs file for the specified refname.1321 * If peeled is non-NULL, write it as the entry's peeled value.1322 */1323static voidwrite_packed_entry(FILE*fh,const char*refname,1324const unsigned char*sha1,1325const unsigned char*peeled)1326{1327fprintf_or_die(fh,"%s %s\n",sha1_to_hex(sha1), refname);1328if(peeled)1329fprintf_or_die(fh,"^%s\n",sha1_to_hex(peeled));1330}13311332/*1333 * Lock the packed-refs file for writing. Flags is passed to1334 * hold_lock_file_for_update(). Return 0 on success. On errors, set1335 * errno appropriately and return a nonzero value.1336 */1337static intlock_packed_refs(struct files_ref_store *refs,int flags)1338{1339static int timeout_configured =0;1340static int timeout_value =1000;1341struct packed_ref_cache *packed_ref_cache;13421343files_assert_main_repository(refs,"lock_packed_refs");13441345if(!timeout_configured) {1346git_config_get_int("core.packedrefstimeout", &timeout_value);1347 timeout_configured =1;1348}13491350if(hold_lock_file_for_update_timeout(1351&refs->packed_ref_store->lock,1352 refs->packed_ref_store->path,1353 flags, timeout_value) <0)1354return-1;13551356/*1357 * Now that we hold the `packed-refs` lock, make sure that our1358 * cache matches the current version of the file. Normally1359 * `get_packed_ref_cache()` does that for us, but that1360 * function assumes that when the file is locked, any existing1361 * cache is still valid. We've just locked the file, but it1362 * might have changed the moment *before* we locked it.1363 */1364validate_packed_ref_cache(refs->packed_ref_store);13651366 packed_ref_cache =get_packed_ref_cache(refs->packed_ref_store);1367/* Increment the reference count to prevent it from being freed: */1368acquire_packed_ref_cache(packed_ref_cache);1369return0;1370}13711372/*1373 * Write the current version of the packed refs cache from memory to1374 * disk. The packed-refs file must already be locked for writing (see1375 * lock_packed_refs()). Return zero on success. On errors, set errno1376 * and return a nonzero value1377 */1378static intcommit_packed_refs(struct files_ref_store *refs)1379{1380struct packed_ref_cache *packed_ref_cache =1381get_packed_ref_cache(refs->packed_ref_store);1382int ok, error =0;1383int save_errno =0;1384FILE*out;1385struct ref_iterator *iter;13861387files_assert_main_repository(refs,"commit_packed_refs");13881389if(!is_lock_file_locked(&refs->packed_ref_store->lock))1390die("BUG: packed-refs not locked");13911392 out =fdopen_lock_file(&refs->packed_ref_store->lock,"w");1393if(!out)1394die_errno("unable to fdopen packed-refs descriptor");13951396fprintf_or_die(out,"%s", PACKED_REFS_HEADER);13971398 iter =cache_ref_iterator_begin(packed_ref_cache->cache, NULL,0);1399while((ok =ref_iterator_advance(iter)) == ITER_OK) {1400struct object_id peeled;1401int peel_error =ref_iterator_peel(iter, &peeled);14021403write_packed_entry(out, iter->refname, iter->oid->hash,1404 peel_error ? NULL : peeled.hash);1405}14061407if(ok != ITER_DONE)1408die("error while iterating over references");14091410if(commit_lock_file(&refs->packed_ref_store->lock)) {1411 save_errno = errno;1412 error = -1;1413}1414release_packed_ref_cache(packed_ref_cache);1415 errno = save_errno;1416return error;1417}14181419/*1420 * Rollback the lockfile for the packed-refs file, and discard the1421 * in-memory packed reference cache. (The packed-refs file will be1422 * read anew if it is needed again after this function is called.)1423 */1424static voidrollback_packed_refs(struct files_ref_store *refs)1425{1426struct packed_ref_cache *packed_ref_cache =1427get_packed_ref_cache(refs->packed_ref_store);14281429files_assert_main_repository(refs,"rollback_packed_refs");14301431if(!is_lock_file_locked(&refs->packed_ref_store->lock))1432die("BUG: packed-refs not locked");1433rollback_lock_file(&refs->packed_ref_store->lock);1434release_packed_ref_cache(packed_ref_cache);1435clear_packed_ref_cache(refs->packed_ref_store);1436}14371438struct ref_to_prune {1439struct ref_to_prune *next;1440unsigned char sha1[20];1441char name[FLEX_ARRAY];1442};14431444enum{1445 REMOVE_EMPTY_PARENTS_REF =0x01,1446 REMOVE_EMPTY_PARENTS_REFLOG =0x021447};14481449/*1450 * Remove empty parent directories associated with the specified1451 * reference and/or its reflog, but spare [logs/]refs/ and immediate1452 * subdirs. flags is a combination of REMOVE_EMPTY_PARENTS_REF and/or1453 * REMOVE_EMPTY_PARENTS_REFLOG.1454 */1455static voidtry_remove_empty_parents(struct files_ref_store *refs,1456const char*refname,1457unsigned int flags)1458{1459struct strbuf buf = STRBUF_INIT;1460struct strbuf sb = STRBUF_INIT;1461char*p, *q;1462int i;14631464strbuf_addstr(&buf, refname);1465 p = buf.buf;1466for(i =0; i <2; i++) {/* refs/{heads,tags,...}/ */1467while(*p && *p !='/')1468 p++;1469/* tolerate duplicate slashes; see check_refname_format() */1470while(*p =='/')1471 p++;1472}1473 q = buf.buf + buf.len;1474while(flags & (REMOVE_EMPTY_PARENTS_REF | REMOVE_EMPTY_PARENTS_REFLOG)) {1475while(q > p && *q !='/')1476 q--;1477while(q > p && *(q-1) =='/')1478 q--;1479if(q == p)1480break;1481strbuf_setlen(&buf, q - buf.buf);14821483strbuf_reset(&sb);1484files_ref_path(refs, &sb, buf.buf);1485if((flags & REMOVE_EMPTY_PARENTS_REF) &&rmdir(sb.buf))1486 flags &= ~REMOVE_EMPTY_PARENTS_REF;14871488strbuf_reset(&sb);1489files_reflog_path(refs, &sb, buf.buf);1490if((flags & REMOVE_EMPTY_PARENTS_REFLOG) &&rmdir(sb.buf))1491 flags &= ~REMOVE_EMPTY_PARENTS_REFLOG;1492}1493strbuf_release(&buf);1494strbuf_release(&sb);1495}14961497/* make sure nobody touched the ref, and unlink */1498static voidprune_ref(struct files_ref_store *refs,struct ref_to_prune *r)1499{1500struct ref_transaction *transaction;1501struct strbuf err = STRBUF_INIT;15021503if(check_refname_format(r->name,0))1504return;15051506 transaction =ref_store_transaction_begin(&refs->base, &err);1507if(!transaction ||1508ref_transaction_delete(transaction, r->name, r->sha1,1509 REF_ISPRUNING | REF_NODEREF, NULL, &err) ||1510ref_transaction_commit(transaction, &err)) {1511ref_transaction_free(transaction);1512error("%s", err.buf);1513strbuf_release(&err);1514return;1515}1516ref_transaction_free(transaction);1517strbuf_release(&err);1518}15191520static voidprune_refs(struct files_ref_store *refs,struct ref_to_prune *r)1521{1522while(r) {1523prune_ref(refs, r);1524 r = r->next;1525}1526}15271528/*1529 * Return true if the specified reference should be packed.1530 */1531static intshould_pack_ref(const char*refname,1532const struct object_id *oid,unsigned int ref_flags,1533unsigned int pack_flags)1534{1535/* Do not pack per-worktree refs: */1536if(ref_type(refname) != REF_TYPE_NORMAL)1537return0;15381539/* Do not pack non-tags unless PACK_REFS_ALL is set: */1540if(!(pack_flags & PACK_REFS_ALL) && !starts_with(refname,"refs/tags/"))1541return0;15421543/* Do not pack symbolic refs: */1544if(ref_flags & REF_ISSYMREF)1545return0;15461547/* Do not pack broken refs: */1548if(!ref_resolves_to_object(refname, oid, ref_flags))1549return0;15501551return1;1552}15531554static intfiles_pack_refs(struct ref_store *ref_store,unsigned int flags)1555{1556struct files_ref_store *refs =1557files_downcast(ref_store, REF_STORE_WRITE | REF_STORE_ODB,1558"pack_refs");1559struct ref_iterator *iter;1560int ok;1561struct ref_to_prune *refs_to_prune = NULL;15621563lock_packed_refs(refs, LOCK_DIE_ON_ERROR);15641565 iter =cache_ref_iterator_begin(get_loose_ref_cache(refs), NULL,0);1566while((ok =ref_iterator_advance(iter)) == ITER_OK) {1567/*1568 * If the loose reference can be packed, add an entry1569 * in the packed ref cache. If the reference should be1570 * pruned, also add it to refs_to_prune.1571 */1572if(!should_pack_ref(iter->refname, iter->oid, iter->flags,1573 flags))1574continue;15751576/*1577 * Create an entry in the packed-refs cache equivalent1578 * to the one from the loose ref cache, except that1579 * we don't copy the peeled status, because we want it1580 * to be re-peeled.1581 */1582add_packed_ref(refs, iter->refname, iter->oid);15831584/* Schedule the loose reference for pruning if requested. */1585if((flags & PACK_REFS_PRUNE)) {1586struct ref_to_prune *n;1587FLEX_ALLOC_STR(n, name, iter->refname);1588hashcpy(n->sha1, iter->oid->hash);1589 n->next = refs_to_prune;1590 refs_to_prune = n;1591}1592}1593if(ok != ITER_DONE)1594die("error while iterating over references");15951596if(commit_packed_refs(refs))1597die_errno("unable to overwrite old ref-pack file");15981599prune_refs(refs, refs_to_prune);1600return0;1601}16021603/*1604 * Rewrite the packed-refs file, omitting any refs listed in1605 * 'refnames'. On error, leave packed-refs unchanged, write an error1606 * message to 'err', and return a nonzero value.1607 *1608 * The refs in 'refnames' needn't be sorted. `err` must not be NULL.1609 */1610static intrepack_without_refs(struct files_ref_store *refs,1611struct string_list *refnames,struct strbuf *err)1612{1613struct ref_dir *packed;1614struct string_list_item *refname;1615int ret, needs_repacking =0, removed =0;16161617files_assert_main_repository(refs,"repack_without_refs");1618assert(err);16191620/* Look for a packed ref */1621for_each_string_list_item(refname, refnames) {1622if(get_packed_ref(refs, refname->string)) {1623 needs_repacking =1;1624break;1625}1626}16271628/* Avoid locking if we have nothing to do */1629if(!needs_repacking)1630return0;/* no refname exists in packed refs */16311632if(lock_packed_refs(refs,0)) {1633unable_to_lock_message(refs->packed_ref_store->path, errno, err);1634return-1;1635}1636 packed =get_packed_refs(refs);16371638/* Remove refnames from the cache */1639for_each_string_list_item(refname, refnames)1640if(remove_entry_from_dir(packed, refname->string) != -1)1641 removed =1;1642if(!removed) {1643/*1644 * All packed entries disappeared while we were1645 * acquiring the lock.1646 */1647rollback_packed_refs(refs);1648return0;1649}16501651/* Write what remains */1652 ret =commit_packed_refs(refs);1653if(ret)1654strbuf_addf(err,"unable to overwrite old ref-pack file:%s",1655strerror(errno));1656return ret;1657}16581659static intfiles_delete_refs(struct ref_store *ref_store,const char*msg,1660struct string_list *refnames,unsigned int flags)1661{1662struct files_ref_store *refs =1663files_downcast(ref_store, REF_STORE_WRITE,"delete_refs");1664struct strbuf err = STRBUF_INIT;1665int i, result =0;16661667if(!refnames->nr)1668return0;16691670 result =repack_without_refs(refs, refnames, &err);1671if(result) {1672/*1673 * If we failed to rewrite the packed-refs file, then1674 * it is unsafe to try to remove loose refs, because1675 * doing so might expose an obsolete packed value for1676 * a reference that might even point at an object that1677 * has been garbage collected.1678 */1679if(refnames->nr ==1)1680error(_("could not delete reference%s:%s"),1681 refnames->items[0].string, err.buf);1682else1683error(_("could not delete references:%s"), err.buf);16841685goto out;1686}16871688for(i =0; i < refnames->nr; i++) {1689const char*refname = refnames->items[i].string;16901691if(refs_delete_ref(&refs->base, msg, refname, NULL, flags))1692 result |=error(_("could not remove reference%s"), refname);1693}16941695out:1696strbuf_release(&err);1697return result;1698}16991700/*1701 * People using contrib's git-new-workdir have .git/logs/refs ->1702 * /some/other/path/.git/logs/refs, and that may live on another device.1703 *1704 * IOW, to avoid cross device rename errors, the temporary renamed log must1705 * live into logs/refs.1706 */1707#define TMP_RENAMED_LOG"refs/.tmp-renamed-log"17081709struct rename_cb {1710const char*tmp_renamed_log;1711int true_errno;1712};17131714static intrename_tmp_log_callback(const char*path,void*cb_data)1715{1716struct rename_cb *cb = cb_data;17171718if(rename(cb->tmp_renamed_log, path)) {1719/*1720 * rename(a, b) when b is an existing directory ought1721 * to result in ISDIR, but Solaris 5.8 gives ENOTDIR.1722 * Sheesh. Record the true errno for error reporting,1723 * but report EISDIR to raceproof_create_file() so1724 * that it knows to retry.1725 */1726 cb->true_errno = errno;1727if(errno == ENOTDIR)1728 errno = EISDIR;1729return-1;1730}else{1731return0;1732}1733}17341735static intrename_tmp_log(struct files_ref_store *refs,const char*newrefname)1736{1737struct strbuf path = STRBUF_INIT;1738struct strbuf tmp = STRBUF_INIT;1739struct rename_cb cb;1740int ret;17411742files_reflog_path(refs, &path, newrefname);1743files_reflog_path(refs, &tmp, TMP_RENAMED_LOG);1744 cb.tmp_renamed_log = tmp.buf;1745 ret =raceproof_create_file(path.buf, rename_tmp_log_callback, &cb);1746if(ret) {1747if(errno == EISDIR)1748error("directory not empty:%s", path.buf);1749else1750error("unable to move logfile%sto%s:%s",1751 tmp.buf, path.buf,1752strerror(cb.true_errno));1753}17541755strbuf_release(&path);1756strbuf_release(&tmp);1757return ret;1758}17591760static intwrite_ref_to_lockfile(struct ref_lock *lock,1761const struct object_id *oid,struct strbuf *err);1762static intcommit_ref_update(struct files_ref_store *refs,1763struct ref_lock *lock,1764const struct object_id *oid,const char*logmsg,1765struct strbuf *err);17661767static intfiles_rename_ref(struct ref_store *ref_store,1768const char*oldrefname,const char*newrefname,1769const char*logmsg)1770{1771struct files_ref_store *refs =1772files_downcast(ref_store, REF_STORE_WRITE,"rename_ref");1773struct object_id oid, orig_oid;1774int flag =0, logmoved =0;1775struct ref_lock *lock;1776struct stat loginfo;1777struct strbuf sb_oldref = STRBUF_INIT;1778struct strbuf sb_newref = STRBUF_INIT;1779struct strbuf tmp_renamed_log = STRBUF_INIT;1780int log, ret;1781struct strbuf err = STRBUF_INIT;17821783files_reflog_path(refs, &sb_oldref, oldrefname);1784files_reflog_path(refs, &sb_newref, newrefname);1785files_reflog_path(refs, &tmp_renamed_log, TMP_RENAMED_LOG);17861787 log = !lstat(sb_oldref.buf, &loginfo);1788if(log &&S_ISLNK(loginfo.st_mode)) {1789 ret =error("reflog for%sis a symlink", oldrefname);1790goto out;1791}17921793if(!refs_resolve_ref_unsafe(&refs->base, oldrefname,1794 RESOLVE_REF_READING | RESOLVE_REF_NO_RECURSE,1795 orig_oid.hash, &flag)) {1796 ret =error("refname%snot found", oldrefname);1797goto out;1798}17991800if(flag & REF_ISSYMREF) {1801 ret =error("refname%sis a symbolic ref, renaming it is not supported",1802 oldrefname);1803goto out;1804}1805if(!refs_rename_ref_available(&refs->base, oldrefname, newrefname)) {1806 ret =1;1807goto out;1808}18091810if(log &&rename(sb_oldref.buf, tmp_renamed_log.buf)) {1811 ret =error("unable to move logfile logs/%sto logs/"TMP_RENAMED_LOG":%s",1812 oldrefname,strerror(errno));1813goto out;1814}18151816if(refs_delete_ref(&refs->base, logmsg, oldrefname,1817 orig_oid.hash, REF_NODEREF)) {1818error("unable to delete old%s", oldrefname);1819goto rollback;1820}18211822/*1823 * Since we are doing a shallow lookup, oid is not the1824 * correct value to pass to delete_ref as old_oid. But that1825 * doesn't matter, because an old_oid check wouldn't add to1826 * the safety anyway; we want to delete the reference whatever1827 * its current value.1828 */1829if(!refs_read_ref_full(&refs->base, newrefname,1830 RESOLVE_REF_READING | RESOLVE_REF_NO_RECURSE,1831 oid.hash, NULL) &&1832refs_delete_ref(&refs->base, NULL, newrefname,1833 NULL, REF_NODEREF)) {1834if(errno == EISDIR) {1835struct strbuf path = STRBUF_INIT;1836int result;18371838files_ref_path(refs, &path, newrefname);1839 result =remove_empty_directories(&path);1840strbuf_release(&path);18411842if(result) {1843error("Directory not empty:%s", newrefname);1844goto rollback;1845}1846}else{1847error("unable to delete existing%s", newrefname);1848goto rollback;1849}1850}18511852if(log &&rename_tmp_log(refs, newrefname))1853goto rollback;18541855 logmoved = log;18561857 lock =lock_ref_sha1_basic(refs, newrefname, NULL, NULL, NULL,1858 REF_NODEREF, NULL, &err);1859if(!lock) {1860error("unable to rename '%s' to '%s':%s", oldrefname, newrefname, err.buf);1861strbuf_release(&err);1862goto rollback;1863}1864oidcpy(&lock->old_oid, &orig_oid);18651866if(write_ref_to_lockfile(lock, &orig_oid, &err) ||1867commit_ref_update(refs, lock, &orig_oid, logmsg, &err)) {1868error("unable to write current sha1 into%s:%s", newrefname, err.buf);1869strbuf_release(&err);1870goto rollback;1871}18721873 ret =0;1874goto out;18751876 rollback:1877 lock =lock_ref_sha1_basic(refs, oldrefname, NULL, NULL, NULL,1878 REF_NODEREF, NULL, &err);1879if(!lock) {1880error("unable to lock%sfor rollback:%s", oldrefname, err.buf);1881strbuf_release(&err);1882goto rollbacklog;1883}18841885 flag = log_all_ref_updates;1886 log_all_ref_updates = LOG_REFS_NONE;1887if(write_ref_to_lockfile(lock, &orig_oid, &err) ||1888commit_ref_update(refs, lock, &orig_oid, NULL, &err)) {1889error("unable to write current sha1 into%s:%s", oldrefname, err.buf);1890strbuf_release(&err);1891}1892 log_all_ref_updates = flag;18931894 rollbacklog:1895if(logmoved &&rename(sb_newref.buf, sb_oldref.buf))1896error("unable to restore logfile%sfrom%s:%s",1897 oldrefname, newrefname,strerror(errno));1898if(!logmoved && log &&1899rename(tmp_renamed_log.buf, sb_oldref.buf))1900error("unable to restore logfile%sfrom logs/"TMP_RENAMED_LOG":%s",1901 oldrefname,strerror(errno));1902 ret =1;1903 out:1904strbuf_release(&sb_newref);1905strbuf_release(&sb_oldref);1906strbuf_release(&tmp_renamed_log);19071908return ret;1909}19101911static intclose_ref(struct ref_lock *lock)1912{1913if(close_lock_file(lock->lk))1914return-1;1915return0;1916}19171918static intcommit_ref(struct ref_lock *lock)1919{1920char*path =get_locked_file_path(lock->lk);1921struct stat st;19221923if(!lstat(path, &st) &&S_ISDIR(st.st_mode)) {1924/*1925 * There is a directory at the path we want to rename1926 * the lockfile to. Hopefully it is empty; try to1927 * delete it.1928 */1929size_t len =strlen(path);1930struct strbuf sb_path = STRBUF_INIT;19311932strbuf_attach(&sb_path, path, len, len);19331934/*1935 * If this fails, commit_lock_file() will also fail1936 * and will report the problem.1937 */1938remove_empty_directories(&sb_path);1939strbuf_release(&sb_path);1940}else{1941free(path);1942}19431944if(commit_lock_file(lock->lk))1945return-1;1946return0;1947}19481949static intopen_or_create_logfile(const char*path,void*cb)1950{1951int*fd = cb;19521953*fd =open(path, O_APPEND | O_WRONLY | O_CREAT,0666);1954return(*fd <0) ? -1:0;1955}19561957/*1958 * Create a reflog for a ref. If force_create = 0, only create the1959 * reflog for certain refs (those for which should_autocreate_reflog1960 * returns non-zero). Otherwise, create it regardless of the reference1961 * name. If the logfile already existed or was created, return 0 and1962 * set *logfd to the file descriptor opened for appending to the file.1963 * If no logfile exists and we decided not to create one, return 0 and1964 * set *logfd to -1. On failure, fill in *err, set *logfd to -1, and1965 * return -1.1966 */1967static intlog_ref_setup(struct files_ref_store *refs,1968const char*refname,int force_create,1969int*logfd,struct strbuf *err)1970{1971struct strbuf logfile_sb = STRBUF_INIT;1972char*logfile;19731974files_reflog_path(refs, &logfile_sb, refname);1975 logfile =strbuf_detach(&logfile_sb, NULL);19761977if(force_create ||should_autocreate_reflog(refname)) {1978if(raceproof_create_file(logfile, open_or_create_logfile, logfd)) {1979if(errno == ENOENT)1980strbuf_addf(err,"unable to create directory for '%s': "1981"%s", logfile,strerror(errno));1982else if(errno == EISDIR)1983strbuf_addf(err,"there are still logs under '%s'",1984 logfile);1985else1986strbuf_addf(err,"unable to append to '%s':%s",1987 logfile,strerror(errno));19881989goto error;1990}1991}else{1992*logfd =open(logfile, O_APPEND | O_WRONLY,0666);1993if(*logfd <0) {1994if(errno == ENOENT || errno == EISDIR) {1995/*1996 * The logfile doesn't already exist,1997 * but that is not an error; it only1998 * means that we won't write log1999 * entries to it.2000 */2001;2002}else{2003strbuf_addf(err,"unable to append to '%s':%s",2004 logfile,strerror(errno));2005goto error;2006}2007}2008}20092010if(*logfd >=0)2011adjust_shared_perm(logfile);20122013free(logfile);2014return0;20152016error:2017free(logfile);2018return-1;2019}20202021static intfiles_create_reflog(struct ref_store *ref_store,2022const char*refname,int force_create,2023struct strbuf *err)2024{2025struct files_ref_store *refs =2026files_downcast(ref_store, REF_STORE_WRITE,"create_reflog");2027int fd;20282029if(log_ref_setup(refs, refname, force_create, &fd, err))2030return-1;20312032if(fd >=0)2033close(fd);20342035return0;2036}20372038static intlog_ref_write_fd(int fd,const struct object_id *old_oid,2039const struct object_id *new_oid,2040const char*committer,const char*msg)2041{2042int msglen, written;2043unsigned maxlen, len;2044char*logrec;20452046 msglen = msg ?strlen(msg) :0;2047 maxlen =strlen(committer) + msglen +100;2048 logrec =xmalloc(maxlen);2049 len =xsnprintf(logrec, maxlen,"%s %s %s\n",2050oid_to_hex(old_oid),2051oid_to_hex(new_oid),2052 committer);2053if(msglen)2054 len +=copy_reflog_msg(logrec + len -1, msg) -1;20552056 written = len <= maxlen ?write_in_full(fd, logrec, len) : -1;2057free(logrec);2058if(written != len)2059return-1;20602061return0;2062}20632064static intfiles_log_ref_write(struct files_ref_store *refs,2065const char*refname,const struct object_id *old_oid,2066const struct object_id *new_oid,const char*msg,2067int flags,struct strbuf *err)2068{2069int logfd, result;20702071if(log_all_ref_updates == LOG_REFS_UNSET)2072 log_all_ref_updates =is_bare_repository() ? LOG_REFS_NONE : LOG_REFS_NORMAL;20732074 result =log_ref_setup(refs, refname,2075 flags & REF_FORCE_CREATE_REFLOG,2076&logfd, err);20772078if(result)2079return result;20802081if(logfd <0)2082return0;2083 result =log_ref_write_fd(logfd, old_oid, new_oid,2084git_committer_info(0), msg);2085if(result) {2086struct strbuf sb = STRBUF_INIT;2087int save_errno = errno;20882089files_reflog_path(refs, &sb, refname);2090strbuf_addf(err,"unable to append to '%s':%s",2091 sb.buf,strerror(save_errno));2092strbuf_release(&sb);2093close(logfd);2094return-1;2095}2096if(close(logfd)) {2097struct strbuf sb = STRBUF_INIT;2098int save_errno = errno;20992100files_reflog_path(refs, &sb, refname);2101strbuf_addf(err,"unable to append to '%s':%s",2102 sb.buf,strerror(save_errno));2103strbuf_release(&sb);2104return-1;2105}2106return0;2107}21082109/*2110 * Write sha1 into the open lockfile, then close the lockfile. On2111 * errors, rollback the lockfile, fill in *err and2112 * return -1.2113 */2114static intwrite_ref_to_lockfile(struct ref_lock *lock,2115const struct object_id *oid,struct strbuf *err)2116{2117static char term ='\n';2118struct object *o;2119int fd;21202121 o =parse_object(oid);2122if(!o) {2123strbuf_addf(err,2124"trying to write ref '%s' with nonexistent object%s",2125 lock->ref_name,oid_to_hex(oid));2126unlock_ref(lock);2127return-1;2128}2129if(o->type != OBJ_COMMIT &&is_branch(lock->ref_name)) {2130strbuf_addf(err,2131"trying to write non-commit object%sto branch '%s'",2132oid_to_hex(oid), lock->ref_name);2133unlock_ref(lock);2134return-1;2135}2136 fd =get_lock_file_fd(lock->lk);2137if(write_in_full(fd,oid_to_hex(oid), GIT_SHA1_HEXSZ) != GIT_SHA1_HEXSZ ||2138write_in_full(fd, &term,1) !=1||2139close_ref(lock) <0) {2140strbuf_addf(err,2141"couldn't write '%s'",get_lock_file_path(lock->lk));2142unlock_ref(lock);2143return-1;2144}2145return0;2146}21472148/*2149 * Commit a change to a loose reference that has already been written2150 * to the loose reference lockfile. Also update the reflogs if2151 * necessary, using the specified lockmsg (which can be NULL).2152 */2153static intcommit_ref_update(struct files_ref_store *refs,2154struct ref_lock *lock,2155const struct object_id *oid,const char*logmsg,2156struct strbuf *err)2157{2158files_assert_main_repository(refs,"commit_ref_update");21592160clear_loose_ref_cache(refs);2161if(files_log_ref_write(refs, lock->ref_name,2162&lock->old_oid, oid,2163 logmsg,0, err)) {2164char*old_msg =strbuf_detach(err, NULL);2165strbuf_addf(err,"cannot update the ref '%s':%s",2166 lock->ref_name, old_msg);2167free(old_msg);2168unlock_ref(lock);2169return-1;2170}21712172if(strcmp(lock->ref_name,"HEAD") !=0) {2173/*2174 * Special hack: If a branch is updated directly and HEAD2175 * points to it (may happen on the remote side of a push2176 * for example) then logically the HEAD reflog should be2177 * updated too.2178 * A generic solution implies reverse symref information,2179 * but finding all symrefs pointing to the given branch2180 * would be rather costly for this rare event (the direct2181 * update of a branch) to be worth it. So let's cheat and2182 * check with HEAD only which should cover 99% of all usage2183 * scenarios (even 100% of the default ones).2184 */2185struct object_id head_oid;2186int head_flag;2187const char*head_ref;21882189 head_ref =refs_resolve_ref_unsafe(&refs->base,"HEAD",2190 RESOLVE_REF_READING,2191 head_oid.hash, &head_flag);2192if(head_ref && (head_flag & REF_ISSYMREF) &&2193!strcmp(head_ref, lock->ref_name)) {2194struct strbuf log_err = STRBUF_INIT;2195if(files_log_ref_write(refs,"HEAD",2196&lock->old_oid, oid,2197 logmsg,0, &log_err)) {2198error("%s", log_err.buf);2199strbuf_release(&log_err);2200}2201}2202}22032204if(commit_ref(lock)) {2205strbuf_addf(err,"couldn't set '%s'", lock->ref_name);2206unlock_ref(lock);2207return-1;2208}22092210unlock_ref(lock);2211return0;2212}22132214static intcreate_ref_symlink(struct ref_lock *lock,const char*target)2215{2216int ret = -1;2217#ifndef NO_SYMLINK_HEAD2218char*ref_path =get_locked_file_path(lock->lk);2219unlink(ref_path);2220 ret =symlink(target, ref_path);2221free(ref_path);22222223if(ret)2224fprintf(stderr,"no symlink - falling back to symbolic ref\n");2225#endif2226return ret;2227}22282229static voidupdate_symref_reflog(struct files_ref_store *refs,2230struct ref_lock *lock,const char*refname,2231const char*target,const char*logmsg)2232{2233struct strbuf err = STRBUF_INIT;2234struct object_id new_oid;2235if(logmsg &&2236!refs_read_ref_full(&refs->base, target,2237 RESOLVE_REF_READING, new_oid.hash, NULL) &&2238files_log_ref_write(refs, refname, &lock->old_oid,2239&new_oid, logmsg,0, &err)) {2240error("%s", err.buf);2241strbuf_release(&err);2242}2243}22442245static intcreate_symref_locked(struct files_ref_store *refs,2246struct ref_lock *lock,const char*refname,2247const char*target,const char*logmsg)2248{2249if(prefer_symlink_refs && !create_ref_symlink(lock, target)) {2250update_symref_reflog(refs, lock, refname, target, logmsg);2251return0;2252}22532254if(!fdopen_lock_file(lock->lk,"w"))2255returnerror("unable to fdopen%s:%s",2256 lock->lk->tempfile.filename.buf,strerror(errno));22572258update_symref_reflog(refs, lock, refname, target, logmsg);22592260/* no error check; commit_ref will check ferror */2261fprintf(lock->lk->tempfile.fp,"ref:%s\n", target);2262if(commit_ref(lock) <0)2263returnerror("unable to write symref for%s:%s", refname,2264strerror(errno));2265return0;2266}22672268static intfiles_create_symref(struct ref_store *ref_store,2269const char*refname,const char*target,2270const char*logmsg)2271{2272struct files_ref_store *refs =2273files_downcast(ref_store, REF_STORE_WRITE,"create_symref");2274struct strbuf err = STRBUF_INIT;2275struct ref_lock *lock;2276int ret;22772278 lock =lock_ref_sha1_basic(refs, refname, NULL,2279 NULL, NULL, REF_NODEREF, NULL,2280&err);2281if(!lock) {2282error("%s", err.buf);2283strbuf_release(&err);2284return-1;2285}22862287 ret =create_symref_locked(refs, lock, refname, target, logmsg);2288unlock_ref(lock);2289return ret;2290}22912292static intfiles_reflog_exists(struct ref_store *ref_store,2293const char*refname)2294{2295struct files_ref_store *refs =2296files_downcast(ref_store, REF_STORE_READ,"reflog_exists");2297struct strbuf sb = STRBUF_INIT;2298struct stat st;2299int ret;23002301files_reflog_path(refs, &sb, refname);2302 ret = !lstat(sb.buf, &st) &&S_ISREG(st.st_mode);2303strbuf_release(&sb);2304return ret;2305}23062307static intfiles_delete_reflog(struct ref_store *ref_store,2308const char*refname)2309{2310struct files_ref_store *refs =2311files_downcast(ref_store, REF_STORE_WRITE,"delete_reflog");2312struct strbuf sb = STRBUF_INIT;2313int ret;23142315files_reflog_path(refs, &sb, refname);2316 ret =remove_path(sb.buf);2317strbuf_release(&sb);2318return ret;2319}23202321static intshow_one_reflog_ent(struct strbuf *sb, each_reflog_ent_fn fn,void*cb_data)2322{2323struct object_id ooid, noid;2324char*email_end, *message;2325 timestamp_t timestamp;2326int tz;2327const char*p = sb->buf;23282329/* old SP new SP name <email> SP time TAB msg LF */2330if(!sb->len || sb->buf[sb->len -1] !='\n'||2331parse_oid_hex(p, &ooid, &p) || *p++ !=' '||2332parse_oid_hex(p, &noid, &p) || *p++ !=' '||2333!(email_end =strchr(p,'>')) ||2334 email_end[1] !=' '||2335!(timestamp =parse_timestamp(email_end +2, &message,10)) ||2336!message || message[0] !=' '||2337(message[1] !='+'&& message[1] !='-') ||2338!isdigit(message[2]) || !isdigit(message[3]) ||2339!isdigit(message[4]) || !isdigit(message[5]))2340return0;/* corrupt? */2341 email_end[1] ='\0';2342 tz =strtol(message +1, NULL,10);2343if(message[6] !='\t')2344 message +=6;2345else2346 message +=7;2347returnfn(&ooid, &noid, p, timestamp, tz, message, cb_data);2348}23492350static char*find_beginning_of_line(char*bob,char*scan)2351{2352while(bob < scan && *(--scan) !='\n')2353;/* keep scanning backwards */2354/*2355 * Return either beginning of the buffer, or LF at the end of2356 * the previous line.2357 */2358return scan;2359}23602361static intfiles_for_each_reflog_ent_reverse(struct ref_store *ref_store,2362const char*refname,2363 each_reflog_ent_fn fn,2364void*cb_data)2365{2366struct files_ref_store *refs =2367files_downcast(ref_store, REF_STORE_READ,2368"for_each_reflog_ent_reverse");2369struct strbuf sb = STRBUF_INIT;2370FILE*logfp;2371long pos;2372int ret =0, at_tail =1;23732374files_reflog_path(refs, &sb, refname);2375 logfp =fopen(sb.buf,"r");2376strbuf_release(&sb);2377if(!logfp)2378return-1;23792380/* Jump to the end */2381if(fseek(logfp,0, SEEK_END) <0)2382 ret =error("cannot seek back reflog for%s:%s",2383 refname,strerror(errno));2384 pos =ftell(logfp);2385while(!ret &&0< pos) {2386int cnt;2387size_t nread;2388char buf[BUFSIZ];2389char*endp, *scanp;23902391/* Fill next block from the end */2392 cnt = (sizeof(buf) < pos) ?sizeof(buf) : pos;2393if(fseek(logfp, pos - cnt, SEEK_SET)) {2394 ret =error("cannot seek back reflog for%s:%s",2395 refname,strerror(errno));2396break;2397}2398 nread =fread(buf, cnt,1, logfp);2399if(nread !=1) {2400 ret =error("cannot read%dbytes from reflog for%s:%s",2401 cnt, refname,strerror(errno));2402break;2403}2404 pos -= cnt;24052406 scanp = endp = buf + cnt;2407if(at_tail && scanp[-1] =='\n')2408/* Looking at the final LF at the end of the file */2409 scanp--;2410 at_tail =0;24112412while(buf < scanp) {2413/*2414 * terminating LF of the previous line, or the beginning2415 * of the buffer.2416 */2417char*bp;24182419 bp =find_beginning_of_line(buf, scanp);24202421if(*bp =='\n') {2422/*2423 * The newline is the end of the previous line,2424 * so we know we have complete line starting2425 * at (bp + 1). Prefix it onto any prior data2426 * we collected for the line and process it.2427 */2428strbuf_splice(&sb,0,0, bp +1, endp - (bp +1));2429 scanp = bp;2430 endp = bp +1;2431 ret =show_one_reflog_ent(&sb, fn, cb_data);2432strbuf_reset(&sb);2433if(ret)2434break;2435}else if(!pos) {2436/*2437 * We are at the start of the buffer, and the2438 * start of the file; there is no previous2439 * line, and we have everything for this one.2440 * Process it, and we can end the loop.2441 */2442strbuf_splice(&sb,0,0, buf, endp - buf);2443 ret =show_one_reflog_ent(&sb, fn, cb_data);2444strbuf_reset(&sb);2445break;2446}24472448if(bp == buf) {2449/*2450 * We are at the start of the buffer, and there2451 * is more file to read backwards. Which means2452 * we are in the middle of a line. Note that we2453 * may get here even if *bp was a newline; that2454 * just means we are at the exact end of the2455 * previous line, rather than some spot in the2456 * middle.2457 *2458 * Save away what we have to be combined with2459 * the data from the next read.2460 */2461strbuf_splice(&sb,0,0, buf, endp - buf);2462break;2463}2464}24652466}2467if(!ret && sb.len)2468die("BUG: reverse reflog parser had leftover data");24692470fclose(logfp);2471strbuf_release(&sb);2472return ret;2473}24742475static intfiles_for_each_reflog_ent(struct ref_store *ref_store,2476const char*refname,2477 each_reflog_ent_fn fn,void*cb_data)2478{2479struct files_ref_store *refs =2480files_downcast(ref_store, REF_STORE_READ,2481"for_each_reflog_ent");2482FILE*logfp;2483struct strbuf sb = STRBUF_INIT;2484int ret =0;24852486files_reflog_path(refs, &sb, refname);2487 logfp =fopen(sb.buf,"r");2488strbuf_release(&sb);2489if(!logfp)2490return-1;24912492while(!ret && !strbuf_getwholeline(&sb, logfp,'\n'))2493 ret =show_one_reflog_ent(&sb, fn, cb_data);2494fclose(logfp);2495strbuf_release(&sb);2496return ret;2497}24982499struct files_reflog_iterator {2500struct ref_iterator base;25012502struct ref_store *ref_store;2503struct dir_iterator *dir_iterator;2504struct object_id oid;2505};25062507static intfiles_reflog_iterator_advance(struct ref_iterator *ref_iterator)2508{2509struct files_reflog_iterator *iter =2510(struct files_reflog_iterator *)ref_iterator;2511struct dir_iterator *diter = iter->dir_iterator;2512int ok;25132514while((ok =dir_iterator_advance(diter)) == ITER_OK) {2515int flags;25162517if(!S_ISREG(diter->st.st_mode))2518continue;2519if(diter->basename[0] =='.')2520continue;2521if(ends_with(diter->basename,".lock"))2522continue;25232524if(refs_read_ref_full(iter->ref_store,2525 diter->relative_path,0,2526 iter->oid.hash, &flags)) {2527error("bad ref for%s", diter->path.buf);2528continue;2529}25302531 iter->base.refname = diter->relative_path;2532 iter->base.oid = &iter->oid;2533 iter->base.flags = flags;2534return ITER_OK;2535}25362537 iter->dir_iterator = NULL;2538if(ref_iterator_abort(ref_iterator) == ITER_ERROR)2539 ok = ITER_ERROR;2540return ok;2541}25422543static intfiles_reflog_iterator_peel(struct ref_iterator *ref_iterator,2544struct object_id *peeled)2545{2546die("BUG: ref_iterator_peel() called for reflog_iterator");2547}25482549static intfiles_reflog_iterator_abort(struct ref_iterator *ref_iterator)2550{2551struct files_reflog_iterator *iter =2552(struct files_reflog_iterator *)ref_iterator;2553int ok = ITER_DONE;25542555if(iter->dir_iterator)2556 ok =dir_iterator_abort(iter->dir_iterator);25572558base_ref_iterator_free(ref_iterator);2559return ok;2560}25612562static struct ref_iterator_vtable files_reflog_iterator_vtable = {2563 files_reflog_iterator_advance,2564 files_reflog_iterator_peel,2565 files_reflog_iterator_abort2566};25672568static struct ref_iterator *files_reflog_iterator_begin(struct ref_store *ref_store)2569{2570struct files_ref_store *refs =2571files_downcast(ref_store, REF_STORE_READ,2572"reflog_iterator_begin");2573struct files_reflog_iterator *iter =xcalloc(1,sizeof(*iter));2574struct ref_iterator *ref_iterator = &iter->base;2575struct strbuf sb = STRBUF_INIT;25762577base_ref_iterator_init(ref_iterator, &files_reflog_iterator_vtable);2578files_reflog_path(refs, &sb, NULL);2579 iter->dir_iterator =dir_iterator_begin(sb.buf);2580 iter->ref_store = ref_store;2581strbuf_release(&sb);2582return ref_iterator;2583}25842585/*2586 * If update is a direct update of head_ref (the reference pointed to2587 * by HEAD), then add an extra REF_LOG_ONLY update for HEAD.2588 */2589static intsplit_head_update(struct ref_update *update,2590struct ref_transaction *transaction,2591const char*head_ref,2592struct string_list *affected_refnames,2593struct strbuf *err)2594{2595struct string_list_item *item;2596struct ref_update *new_update;25972598if((update->flags & REF_LOG_ONLY) ||2599(update->flags & REF_ISPRUNING) ||2600(update->flags & REF_UPDATE_VIA_HEAD))2601return0;26022603if(strcmp(update->refname, head_ref))2604return0;26052606/*2607 * First make sure that HEAD is not already in the2608 * transaction. This insertion is O(N) in the transaction2609 * size, but it happens at most once per transaction.2610 */2611 item =string_list_insert(affected_refnames,"HEAD");2612if(item->util) {2613/* An entry already existed */2614strbuf_addf(err,2615"multiple updates for 'HEAD' (including one "2616"via its referent '%s') are not allowed",2617 update->refname);2618return TRANSACTION_NAME_CONFLICT;2619}26202621 new_update =ref_transaction_add_update(2622 transaction,"HEAD",2623 update->flags | REF_LOG_ONLY | REF_NODEREF,2624 update->new_oid.hash, update->old_oid.hash,2625 update->msg);26262627 item->util = new_update;26282629return0;2630}26312632/*2633 * update is for a symref that points at referent and doesn't have2634 * REF_NODEREF set. Split it into two updates:2635 * - The original update, but with REF_LOG_ONLY and REF_NODEREF set2636 * - A new, separate update for the referent reference2637 * Note that the new update will itself be subject to splitting when2638 * the iteration gets to it.2639 */2640static intsplit_symref_update(struct files_ref_store *refs,2641struct ref_update *update,2642const char*referent,2643struct ref_transaction *transaction,2644struct string_list *affected_refnames,2645struct strbuf *err)2646{2647struct string_list_item *item;2648struct ref_update *new_update;2649unsigned int new_flags;26502651/*2652 * First make sure that referent is not already in the2653 * transaction. This insertion is O(N) in the transaction2654 * size, but it happens at most once per symref in a2655 * transaction.2656 */2657 item =string_list_insert(affected_refnames, referent);2658if(item->util) {2659/* An entry already existed */2660strbuf_addf(err,2661"multiple updates for '%s' (including one "2662"via symref '%s') are not allowed",2663 referent, update->refname);2664return TRANSACTION_NAME_CONFLICT;2665}26662667 new_flags = update->flags;2668if(!strcmp(update->refname,"HEAD")) {2669/*2670 * Record that the new update came via HEAD, so that2671 * when we process it, split_head_update() doesn't try2672 * to add another reflog update for HEAD. Note that2673 * this bit will be propagated if the new_update2674 * itself needs to be split.2675 */2676 new_flags |= REF_UPDATE_VIA_HEAD;2677}26782679 new_update =ref_transaction_add_update(2680 transaction, referent, new_flags,2681 update->new_oid.hash, update->old_oid.hash,2682 update->msg);26832684 new_update->parent_update = update;26852686/*2687 * Change the symbolic ref update to log only. Also, it2688 * doesn't need to check its old SHA-1 value, as that will be2689 * done when new_update is processed.2690 */2691 update->flags |= REF_LOG_ONLY | REF_NODEREF;2692 update->flags &= ~REF_HAVE_OLD;26932694 item->util = new_update;26952696return0;2697}26982699/*2700 * Return the refname under which update was originally requested.2701 */2702static const char*original_update_refname(struct ref_update *update)2703{2704while(update->parent_update)2705 update = update->parent_update;27062707return update->refname;2708}27092710/*2711 * Check whether the REF_HAVE_OLD and old_oid values stored in update2712 * are consistent with oid, which is the reference's current value. If2713 * everything is OK, return 0; otherwise, write an error message to2714 * err and return -1.2715 */2716static intcheck_old_oid(struct ref_update *update,struct object_id *oid,2717struct strbuf *err)2718{2719if(!(update->flags & REF_HAVE_OLD) ||2720!oidcmp(oid, &update->old_oid))2721return0;27222723if(is_null_oid(&update->old_oid))2724strbuf_addf(err,"cannot lock ref '%s': "2725"reference already exists",2726original_update_refname(update));2727else if(is_null_oid(oid))2728strbuf_addf(err,"cannot lock ref '%s': "2729"reference is missing but expected%s",2730original_update_refname(update),2731oid_to_hex(&update->old_oid));2732else2733strbuf_addf(err,"cannot lock ref '%s': "2734"is at%sbut expected%s",2735original_update_refname(update),2736oid_to_hex(oid),2737oid_to_hex(&update->old_oid));27382739return-1;2740}27412742/*2743 * Prepare for carrying out update:2744 * - Lock the reference referred to by update.2745 * - Read the reference under lock.2746 * - Check that its old SHA-1 value (if specified) is correct, and in2747 * any case record it in update->lock->old_oid for later use when2748 * writing the reflog.2749 * - If it is a symref update without REF_NODEREF, split it up into a2750 * REF_LOG_ONLY update of the symref and add a separate update for2751 * the referent to transaction.2752 * - If it is an update of head_ref, add a corresponding REF_LOG_ONLY2753 * update of HEAD.2754 */2755static intlock_ref_for_update(struct files_ref_store *refs,2756struct ref_update *update,2757struct ref_transaction *transaction,2758const char*head_ref,2759struct string_list *affected_refnames,2760struct strbuf *err)2761{2762struct strbuf referent = STRBUF_INIT;2763int mustexist = (update->flags & REF_HAVE_OLD) &&2764!is_null_oid(&update->old_oid);2765int ret;2766struct ref_lock *lock;27672768files_assert_main_repository(refs,"lock_ref_for_update");27692770if((update->flags & REF_HAVE_NEW) &&is_null_oid(&update->new_oid))2771 update->flags |= REF_DELETING;27722773if(head_ref) {2774 ret =split_head_update(update, transaction, head_ref,2775 affected_refnames, err);2776if(ret)2777return ret;2778}27792780 ret =lock_raw_ref(refs, update->refname, mustexist,2781 affected_refnames, NULL,2782&lock, &referent,2783&update->type, err);2784if(ret) {2785char*reason;27862787 reason =strbuf_detach(err, NULL);2788strbuf_addf(err,"cannot lock ref '%s':%s",2789original_update_refname(update), reason);2790free(reason);2791return ret;2792}27932794 update->backend_data = lock;27952796if(update->type & REF_ISSYMREF) {2797if(update->flags & REF_NODEREF) {2798/*2799 * We won't be reading the referent as part of2800 * the transaction, so we have to read it here2801 * to record and possibly check old_sha1:2802 */2803if(refs_read_ref_full(&refs->base,2804 referent.buf,0,2805 lock->old_oid.hash, NULL)) {2806if(update->flags & REF_HAVE_OLD) {2807strbuf_addf(err,"cannot lock ref '%s': "2808"error reading reference",2809original_update_refname(update));2810return-1;2811}2812}else if(check_old_oid(update, &lock->old_oid, err)) {2813return TRANSACTION_GENERIC_ERROR;2814}2815}else{2816/*2817 * Create a new update for the reference this2818 * symref is pointing at. Also, we will record2819 * and verify old_sha1 for this update as part2820 * of processing the split-off update, so we2821 * don't have to do it here.2822 */2823 ret =split_symref_update(refs, update,2824 referent.buf, transaction,2825 affected_refnames, err);2826if(ret)2827return ret;2828}2829}else{2830struct ref_update *parent_update;28312832if(check_old_oid(update, &lock->old_oid, err))2833return TRANSACTION_GENERIC_ERROR;28342835/*2836 * If this update is happening indirectly because of a2837 * symref update, record the old SHA-1 in the parent2838 * update:2839 */2840for(parent_update = update->parent_update;2841 parent_update;2842 parent_update = parent_update->parent_update) {2843struct ref_lock *parent_lock = parent_update->backend_data;2844oidcpy(&parent_lock->old_oid, &lock->old_oid);2845}2846}28472848if((update->flags & REF_HAVE_NEW) &&2849!(update->flags & REF_DELETING) &&2850!(update->flags & REF_LOG_ONLY)) {2851if(!(update->type & REF_ISSYMREF) &&2852!oidcmp(&lock->old_oid, &update->new_oid)) {2853/*2854 * The reference already has the desired2855 * value, so we don't need to write it.2856 */2857}else if(write_ref_to_lockfile(lock, &update->new_oid,2858 err)) {2859char*write_err =strbuf_detach(err, NULL);28602861/*2862 * The lock was freed upon failure of2863 * write_ref_to_lockfile():2864 */2865 update->backend_data = NULL;2866strbuf_addf(err,2867"cannot update ref '%s':%s",2868 update->refname, write_err);2869free(write_err);2870return TRANSACTION_GENERIC_ERROR;2871}else{2872 update->flags |= REF_NEEDS_COMMIT;2873}2874}2875if(!(update->flags & REF_NEEDS_COMMIT)) {2876/*2877 * We didn't call write_ref_to_lockfile(), so2878 * the lockfile is still open. Close it to2879 * free up the file descriptor:2880 */2881if(close_ref(lock)) {2882strbuf_addf(err,"couldn't close '%s.lock'",2883 update->refname);2884return TRANSACTION_GENERIC_ERROR;2885}2886}2887return0;2888}28892890/*2891 * Unlock any references in `transaction` that are still locked, and2892 * mark the transaction closed.2893 */2894static voidfiles_transaction_cleanup(struct ref_transaction *transaction)2895{2896size_t i;28972898for(i =0; i < transaction->nr; i++) {2899struct ref_update *update = transaction->updates[i];2900struct ref_lock *lock = update->backend_data;29012902if(lock) {2903unlock_ref(lock);2904 update->backend_data = NULL;2905}2906}29072908 transaction->state = REF_TRANSACTION_CLOSED;2909}29102911static intfiles_transaction_prepare(struct ref_store *ref_store,2912struct ref_transaction *transaction,2913struct strbuf *err)2914{2915struct files_ref_store *refs =2916files_downcast(ref_store, REF_STORE_WRITE,2917"ref_transaction_prepare");2918size_t i;2919int ret =0;2920struct string_list affected_refnames = STRING_LIST_INIT_NODUP;2921char*head_ref = NULL;2922int head_type;2923struct object_id head_oid;29242925assert(err);29262927if(!transaction->nr)2928goto cleanup;29292930/*2931 * Fail if a refname appears more than once in the2932 * transaction. (If we end up splitting up any updates using2933 * split_symref_update() or split_head_update(), those2934 * functions will check that the new updates don't have the2935 * same refname as any existing ones.)2936 */2937for(i =0; i < transaction->nr; i++) {2938struct ref_update *update = transaction->updates[i];2939struct string_list_item *item =2940string_list_append(&affected_refnames, update->refname);29412942/*2943 * We store a pointer to update in item->util, but at2944 * the moment we never use the value of this field2945 * except to check whether it is non-NULL.2946 */2947 item->util = update;2948}2949string_list_sort(&affected_refnames);2950if(ref_update_reject_duplicates(&affected_refnames, err)) {2951 ret = TRANSACTION_GENERIC_ERROR;2952goto cleanup;2953}29542955/*2956 * Special hack: If a branch is updated directly and HEAD2957 * points to it (may happen on the remote side of a push2958 * for example) then logically the HEAD reflog should be2959 * updated too.2960 *2961 * A generic solution would require reverse symref lookups,2962 * but finding all symrefs pointing to a given branch would be2963 * rather costly for this rare event (the direct update of a2964 * branch) to be worth it. So let's cheat and check with HEAD2965 * only, which should cover 99% of all usage scenarios (even2966 * 100% of the default ones).2967 *2968 * So if HEAD is a symbolic reference, then record the name of2969 * the reference that it points to. If we see an update of2970 * head_ref within the transaction, then split_head_update()2971 * arranges for the reflog of HEAD to be updated, too.2972 */2973 head_ref =refs_resolve_refdup(ref_store,"HEAD",2974 RESOLVE_REF_NO_RECURSE,2975 head_oid.hash, &head_type);29762977if(head_ref && !(head_type & REF_ISSYMREF)) {2978free(head_ref);2979 head_ref = NULL;2980}29812982/*2983 * Acquire all locks, verify old values if provided, check2984 * that new values are valid, and write new values to the2985 * lockfiles, ready to be activated. Only keep one lockfile2986 * open at a time to avoid running out of file descriptors.2987 * Note that lock_ref_for_update() might append more updates2988 * to the transaction.2989 */2990for(i =0; i < transaction->nr; i++) {2991struct ref_update *update = transaction->updates[i];29922993 ret =lock_ref_for_update(refs, update, transaction,2994 head_ref, &affected_refnames, err);2995if(ret)2996break;2997}29982999cleanup:3000free(head_ref);3001string_list_clear(&affected_refnames,0);30023003if(ret)3004files_transaction_cleanup(transaction);3005else3006 transaction->state = REF_TRANSACTION_PREPARED;30073008return ret;3009}30103011static intfiles_transaction_finish(struct ref_store *ref_store,3012struct ref_transaction *transaction,3013struct strbuf *err)3014{3015struct files_ref_store *refs =3016files_downcast(ref_store,0,"ref_transaction_finish");3017size_t i;3018int ret =0;3019struct string_list refs_to_delete = STRING_LIST_INIT_NODUP;3020struct string_list_item *ref_to_delete;3021struct strbuf sb = STRBUF_INIT;30223023assert(err);30243025if(!transaction->nr) {3026 transaction->state = REF_TRANSACTION_CLOSED;3027return0;3028}30293030/* Perform updates first so live commits remain referenced */3031for(i =0; i < transaction->nr; i++) {3032struct ref_update *update = transaction->updates[i];3033struct ref_lock *lock = update->backend_data;30343035if(update->flags & REF_NEEDS_COMMIT ||3036 update->flags & REF_LOG_ONLY) {3037if(files_log_ref_write(refs,3038 lock->ref_name,3039&lock->old_oid,3040&update->new_oid,3041 update->msg, update->flags,3042 err)) {3043char*old_msg =strbuf_detach(err, NULL);30443045strbuf_addf(err,"cannot update the ref '%s':%s",3046 lock->ref_name, old_msg);3047free(old_msg);3048unlock_ref(lock);3049 update->backend_data = NULL;3050 ret = TRANSACTION_GENERIC_ERROR;3051goto cleanup;3052}3053}3054if(update->flags & REF_NEEDS_COMMIT) {3055clear_loose_ref_cache(refs);3056if(commit_ref(lock)) {3057strbuf_addf(err,"couldn't set '%s'", lock->ref_name);3058unlock_ref(lock);3059 update->backend_data = NULL;3060 ret = TRANSACTION_GENERIC_ERROR;3061goto cleanup;3062}3063}3064}3065/* Perform deletes now that updates are safely completed */3066for(i =0; i < transaction->nr; i++) {3067struct ref_update *update = transaction->updates[i];3068struct ref_lock *lock = update->backend_data;30693070if(update->flags & REF_DELETING &&3071!(update->flags & REF_LOG_ONLY)) {3072if(!(update->type & REF_ISPACKED) ||3073 update->type & REF_ISSYMREF) {3074/* It is a loose reference. */3075strbuf_reset(&sb);3076files_ref_path(refs, &sb, lock->ref_name);3077if(unlink_or_msg(sb.buf, err)) {3078 ret = TRANSACTION_GENERIC_ERROR;3079goto cleanup;3080}3081 update->flags |= REF_DELETED_LOOSE;3082}30833084if(!(update->flags & REF_ISPRUNING))3085string_list_append(&refs_to_delete,3086 lock->ref_name);3087}3088}30893090if(repack_without_refs(refs, &refs_to_delete, err)) {3091 ret = TRANSACTION_GENERIC_ERROR;3092goto cleanup;3093}30943095/* Delete the reflogs of any references that were deleted: */3096for_each_string_list_item(ref_to_delete, &refs_to_delete) {3097strbuf_reset(&sb);3098files_reflog_path(refs, &sb, ref_to_delete->string);3099if(!unlink_or_warn(sb.buf))3100try_remove_empty_parents(refs, ref_to_delete->string,3101 REMOVE_EMPTY_PARENTS_REFLOG);3102}31033104clear_loose_ref_cache(refs);31053106cleanup:3107files_transaction_cleanup(transaction);31083109for(i =0; i < transaction->nr; i++) {3110struct ref_update *update = transaction->updates[i];31113112if(update->flags & REF_DELETED_LOOSE) {3113/*3114 * The loose reference was deleted. Delete any3115 * empty parent directories. (Note that this3116 * can only work because we have already3117 * removed the lockfile.)3118 */3119try_remove_empty_parents(refs, update->refname,3120 REMOVE_EMPTY_PARENTS_REF);3121}3122}31233124strbuf_release(&sb);3125string_list_clear(&refs_to_delete,0);3126return ret;3127}31283129static intfiles_transaction_abort(struct ref_store *ref_store,3130struct ref_transaction *transaction,3131struct strbuf *err)3132{3133files_transaction_cleanup(transaction);3134return0;3135}31363137static intref_present(const char*refname,3138const struct object_id *oid,int flags,void*cb_data)3139{3140struct string_list *affected_refnames = cb_data;31413142returnstring_list_has_string(affected_refnames, refname);3143}31443145static intfiles_initial_transaction_commit(struct ref_store *ref_store,3146struct ref_transaction *transaction,3147struct strbuf *err)3148{3149struct files_ref_store *refs =3150files_downcast(ref_store, REF_STORE_WRITE,3151"initial_ref_transaction_commit");3152size_t i;3153int ret =0;3154struct string_list affected_refnames = STRING_LIST_INIT_NODUP;31553156assert(err);31573158if(transaction->state != REF_TRANSACTION_OPEN)3159die("BUG: commit called for transaction that is not open");31603161/* Fail if a refname appears more than once in the transaction: */3162for(i =0; i < transaction->nr; i++)3163string_list_append(&affected_refnames,3164 transaction->updates[i]->refname);3165string_list_sort(&affected_refnames);3166if(ref_update_reject_duplicates(&affected_refnames, err)) {3167 ret = TRANSACTION_GENERIC_ERROR;3168goto cleanup;3169}31703171/*3172 * It's really undefined to call this function in an active3173 * repository or when there are existing references: we are3174 * only locking and changing packed-refs, so (1) any3175 * simultaneous processes might try to change a reference at3176 * the same time we do, and (2) any existing loose versions of3177 * the references that we are setting would have precedence3178 * over our values. But some remote helpers create the remote3179 * "HEAD" and "master" branches before calling this function,3180 * so here we really only check that none of the references3181 * that we are creating already exists.3182 */3183if(refs_for_each_rawref(&refs->base, ref_present,3184&affected_refnames))3185die("BUG: initial ref transaction called with existing refs");31863187for(i =0; i < transaction->nr; i++) {3188struct ref_update *update = transaction->updates[i];31893190if((update->flags & REF_HAVE_OLD) &&3191!is_null_oid(&update->old_oid))3192die("BUG: initial ref transaction with old_sha1 set");3193if(refs_verify_refname_available(&refs->base, update->refname,3194&affected_refnames, NULL,3195 err)) {3196 ret = TRANSACTION_NAME_CONFLICT;3197goto cleanup;3198}3199}32003201if(lock_packed_refs(refs,0)) {3202strbuf_addf(err,"unable to lock packed-refs file:%s",3203strerror(errno));3204 ret = TRANSACTION_GENERIC_ERROR;3205goto cleanup;3206}32073208for(i =0; i < transaction->nr; i++) {3209struct ref_update *update = transaction->updates[i];32103211if((update->flags & REF_HAVE_NEW) &&3212!is_null_oid(&update->new_oid))3213add_packed_ref(refs, update->refname,3214&update->new_oid);3215}32163217if(commit_packed_refs(refs)) {3218strbuf_addf(err,"unable to commit packed-refs file:%s",3219strerror(errno));3220 ret = TRANSACTION_GENERIC_ERROR;3221goto cleanup;3222}32233224cleanup:3225 transaction->state = REF_TRANSACTION_CLOSED;3226string_list_clear(&affected_refnames,0);3227return ret;3228}32293230struct expire_reflog_cb {3231unsigned int flags;3232 reflog_expiry_should_prune_fn *should_prune_fn;3233void*policy_cb;3234FILE*newlog;3235struct object_id last_kept_oid;3236};32373238static intexpire_reflog_ent(struct object_id *ooid,struct object_id *noid,3239const char*email, timestamp_t timestamp,int tz,3240const char*message,void*cb_data)3241{3242struct expire_reflog_cb *cb = cb_data;3243struct expire_reflog_policy_cb *policy_cb = cb->policy_cb;32443245if(cb->flags & EXPIRE_REFLOGS_REWRITE)3246 ooid = &cb->last_kept_oid;32473248if((*cb->should_prune_fn)(ooid, noid, email, timestamp, tz,3249 message, policy_cb)) {3250if(!cb->newlog)3251printf("would prune%s", message);3252else if(cb->flags & EXPIRE_REFLOGS_VERBOSE)3253printf("prune%s", message);3254}else{3255if(cb->newlog) {3256fprintf(cb->newlog,"%s %s %s%"PRItime" %+05d\t%s",3257oid_to_hex(ooid),oid_to_hex(noid),3258 email, timestamp, tz, message);3259oidcpy(&cb->last_kept_oid, noid);3260}3261if(cb->flags & EXPIRE_REFLOGS_VERBOSE)3262printf("keep%s", message);3263}3264return0;3265}32663267static intfiles_reflog_expire(struct ref_store *ref_store,3268const char*refname,const unsigned char*sha1,3269unsigned int flags,3270 reflog_expiry_prepare_fn prepare_fn,3271 reflog_expiry_should_prune_fn should_prune_fn,3272 reflog_expiry_cleanup_fn cleanup_fn,3273void*policy_cb_data)3274{3275struct files_ref_store *refs =3276files_downcast(ref_store, REF_STORE_WRITE,"reflog_expire");3277static struct lock_file reflog_lock;3278struct expire_reflog_cb cb;3279struct ref_lock *lock;3280struct strbuf log_file_sb = STRBUF_INIT;3281char*log_file;3282int status =0;3283int type;3284struct strbuf err = STRBUF_INIT;3285struct object_id oid;32863287memset(&cb,0,sizeof(cb));3288 cb.flags = flags;3289 cb.policy_cb = policy_cb_data;3290 cb.should_prune_fn = should_prune_fn;32913292/*3293 * The reflog file is locked by holding the lock on the3294 * reference itself, plus we might need to update the3295 * reference if --updateref was specified:3296 */3297 lock =lock_ref_sha1_basic(refs, refname, sha1,3298 NULL, NULL, REF_NODEREF,3299&type, &err);3300if(!lock) {3301error("cannot lock ref '%s':%s", refname, err.buf);3302strbuf_release(&err);3303return-1;3304}3305if(!refs_reflog_exists(ref_store, refname)) {3306unlock_ref(lock);3307return0;3308}33093310files_reflog_path(refs, &log_file_sb, refname);3311 log_file =strbuf_detach(&log_file_sb, NULL);3312if(!(flags & EXPIRE_REFLOGS_DRY_RUN)) {3313/*3314 * Even though holding $GIT_DIR/logs/$reflog.lock has3315 * no locking implications, we use the lock_file3316 * machinery here anyway because it does a lot of the3317 * work we need, including cleaning up if the program3318 * exits unexpectedly.3319 */3320if(hold_lock_file_for_update(&reflog_lock, log_file,0) <0) {3321struct strbuf err = STRBUF_INIT;3322unable_to_lock_message(log_file, errno, &err);3323error("%s", err.buf);3324strbuf_release(&err);3325goto failure;3326}3327 cb.newlog =fdopen_lock_file(&reflog_lock,"w");3328if(!cb.newlog) {3329error("cannot fdopen%s(%s)",3330get_lock_file_path(&reflog_lock),strerror(errno));3331goto failure;3332}3333}33343335hashcpy(oid.hash, sha1);33363337(*prepare_fn)(refname, &oid, cb.policy_cb);3338refs_for_each_reflog_ent(ref_store, refname, expire_reflog_ent, &cb);3339(*cleanup_fn)(cb.policy_cb);33403341if(!(flags & EXPIRE_REFLOGS_DRY_RUN)) {3342/*3343 * It doesn't make sense to adjust a reference pointed3344 * to by a symbolic ref based on expiring entries in3345 * the symbolic reference's reflog. Nor can we update3346 * a reference if there are no remaining reflog3347 * entries.3348 */3349int update = (flags & EXPIRE_REFLOGS_UPDATE_REF) &&3350!(type & REF_ISSYMREF) &&3351!is_null_oid(&cb.last_kept_oid);33523353if(close_lock_file(&reflog_lock)) {3354 status |=error("couldn't write%s:%s", log_file,3355strerror(errno));3356}else if(update &&3357(write_in_full(get_lock_file_fd(lock->lk),3358oid_to_hex(&cb.last_kept_oid), GIT_SHA1_HEXSZ) != GIT_SHA1_HEXSZ ||3359write_str_in_full(get_lock_file_fd(lock->lk),"\n") !=1||3360close_ref(lock) <0)) {3361 status |=error("couldn't write%s",3362get_lock_file_path(lock->lk));3363rollback_lock_file(&reflog_lock);3364}else if(commit_lock_file(&reflog_lock)) {3365 status |=error("unable to write reflog '%s' (%s)",3366 log_file,strerror(errno));3367}else if(update &&commit_ref(lock)) {3368 status |=error("couldn't set%s", lock->ref_name);3369}3370}3371free(log_file);3372unlock_ref(lock);3373return status;33743375 failure:3376rollback_lock_file(&reflog_lock);3377free(log_file);3378unlock_ref(lock);3379return-1;3380}33813382static intfiles_init_db(struct ref_store *ref_store,struct strbuf *err)3383{3384struct files_ref_store *refs =3385files_downcast(ref_store, REF_STORE_WRITE,"init_db");3386struct strbuf sb = STRBUF_INIT;33873388/*3389 * Create .git/refs/{heads,tags}3390 */3391files_ref_path(refs, &sb,"refs/heads");3392safe_create_dir(sb.buf,1);33933394strbuf_reset(&sb);3395files_ref_path(refs, &sb,"refs/tags");3396safe_create_dir(sb.buf,1);33973398strbuf_release(&sb);3399return0;3400}34013402struct ref_storage_be refs_be_files = {3403 NULL,3404"files",3405 files_ref_store_create,3406 files_init_db,3407 files_transaction_prepare,3408 files_transaction_finish,3409 files_transaction_abort,3410 files_initial_transaction_commit,34113412 files_pack_refs,3413 files_peel_ref,3414 files_create_symref,3415 files_delete_refs,3416 files_rename_ref,34173418 files_ref_iterator_begin,3419 files_read_raw_ref,34203421 files_reflog_iterator_begin,3422 files_for_each_reflog_ent,3423 files_for_each_reflog_ent_reverse,3424 files_reflog_exists,3425 files_create_reflog,3426 files_delete_reflog,3427 files_reflog_expire3428};