1#include"../cache.h" 2#include"../refs.h" 3#include"refs-internal.h" 4#include"../iterator.h" 5#include"../dir-iterator.h" 6#include"../lockfile.h" 7#include"../object.h" 8#include"../dir.h" 9 10struct ref_lock { 11char*ref_name; 12struct lock_file *lk; 13struct object_id old_oid; 14}; 15 16struct ref_entry; 17 18/* 19 * Information used (along with the information in ref_entry) to 20 * describe a single cached reference. This data structure only 21 * occurs embedded in a union in struct ref_entry, and only when 22 * (ref_entry->flag & REF_DIR) is zero. 23 */ 24struct ref_value { 25/* 26 * The name of the object to which this reference resolves 27 * (which may be a tag object). If REF_ISBROKEN, this is 28 * null. If REF_ISSYMREF, then this is the name of the object 29 * referred to by the last reference in the symlink chain. 30 */ 31struct object_id oid; 32 33/* 34 * If REF_KNOWS_PEELED, then this field holds the peeled value 35 * of this reference, or null if the reference is known not to 36 * be peelable. See the documentation for peel_ref() for an 37 * exact definition of "peelable". 38 */ 39struct object_id peeled; 40}; 41 42struct files_ref_store; 43 44/* 45 * Information used (along with the information in ref_entry) to 46 * describe a level in the hierarchy of references. This data 47 * structure only occurs embedded in a union in struct ref_entry, and 48 * only when (ref_entry.flag & REF_DIR) is set. In that case, 49 * (ref_entry.flag & REF_INCOMPLETE) determines whether the references 50 * in the directory have already been read: 51 * 52 * (ref_entry.flag & REF_INCOMPLETE) unset -- a directory of loose 53 * or packed references, already read. 54 * 55 * (ref_entry.flag & REF_INCOMPLETE) set -- a directory of loose 56 * references that hasn't been read yet (nor has any of its 57 * subdirectories). 58 * 59 * Entries within a directory are stored within a growable array of 60 * pointers to ref_entries (entries, nr, alloc). Entries 0 <= i < 61 * sorted are sorted by their component name in strcmp() order and the 62 * remaining entries are unsorted. 63 * 64 * Loose references are read lazily, one directory at a time. When a 65 * directory of loose references is read, then all of the references 66 * in that directory are stored, and REF_INCOMPLETE stubs are created 67 * for any subdirectories, but the subdirectories themselves are not 68 * read. The reading is triggered by get_ref_dir(). 69 */ 70struct ref_dir { 71int nr, alloc; 72 73/* 74 * Entries with index 0 <= i < sorted are sorted by name. New 75 * entries are appended to the list unsorted, and are sorted 76 * only when required; thus we avoid the need to sort the list 77 * after the addition of every reference. 78 */ 79int sorted; 80 81/* A pointer to the files_ref_store that contains this ref_dir. */ 82struct files_ref_store *ref_store; 83 84struct ref_entry **entries; 85}; 86 87/* 88 * Bit values for ref_entry::flag. REF_ISSYMREF=0x01, 89 * REF_ISPACKED=0x02, REF_ISBROKEN=0x04 and REF_BAD_NAME=0x08 are 90 * public values; see refs.h. 91 */ 92 93/* 94 * The field ref_entry->u.value.peeled of this value entry contains 95 * the correct peeled value for the reference, which might be 96 * null_sha1 if the reference is not a tag or if it is broken. 97 */ 98#define REF_KNOWS_PEELED 0x10 99 100/* ref_entry represents a directory of references */ 101#define REF_DIR 0x20 102 103/* 104 * Entry has not yet been read from disk (used only for REF_DIR 105 * entries representing loose references) 106 */ 107#define REF_INCOMPLETE 0x40 108 109/* 110 * A ref_entry represents either a reference or a "subdirectory" of 111 * references. 112 * 113 * Each directory in the reference namespace is represented by a 114 * ref_entry with (flags & REF_DIR) set and containing a subdir member 115 * that holds the entries in that directory that have been read so 116 * far. If (flags & REF_INCOMPLETE) is set, then the directory and 117 * its subdirectories haven't been read yet. REF_INCOMPLETE is only 118 * used for loose reference directories. 119 * 120 * References are represented by a ref_entry with (flags & REF_DIR) 121 * unset and a value member that describes the reference's value. The 122 * flag member is at the ref_entry level, but it is also needed to 123 * interpret the contents of the value field (in other words, a 124 * ref_value object is not very much use without the enclosing 125 * ref_entry). 126 * 127 * Reference names cannot end with slash and directories' names are 128 * always stored with a trailing slash (except for the top-level 129 * directory, which is always denoted by ""). This has two nice 130 * consequences: (1) when the entries in each subdir are sorted 131 * lexicographically by name (as they usually are), the references in 132 * a whole tree can be generated in lexicographic order by traversing 133 * the tree in left-to-right, depth-first order; (2) the names of 134 * references and subdirectories cannot conflict, and therefore the 135 * presence of an empty subdirectory does not block the creation of a 136 * similarly-named reference. (The fact that reference names with the 137 * same leading components can conflict *with each other* is a 138 * separate issue that is regulated by verify_refname_available().) 139 * 140 * Please note that the name field contains the fully-qualified 141 * reference (or subdirectory) name. Space could be saved by only 142 * storing the relative names. But that would require the full names 143 * to be generated on the fly when iterating in do_for_each_ref(), and 144 * would break callback functions, who have always been able to assume 145 * that the name strings that they are passed will not be freed during 146 * the iteration. 147 */ 148struct ref_entry { 149unsigned char flag;/* ISSYMREF? ISPACKED? */ 150union{ 151struct ref_value value;/* if not (flags&REF_DIR) */ 152struct ref_dir subdir;/* if (flags&REF_DIR) */ 153} u; 154/* 155 * The full name of the reference (e.g., "refs/heads/master") 156 * or the full name of the directory with a trailing slash 157 * (e.g., "refs/heads/"): 158 */ 159char name[FLEX_ARRAY]; 160}; 161 162static voidread_loose_refs(const char*dirname,struct ref_dir *dir); 163static intsearch_ref_dir(struct ref_dir *dir,const char*refname,size_t len); 164static struct ref_entry *create_dir_entry(struct files_ref_store *ref_store, 165const char*dirname,size_t len, 166int incomplete); 167static voidadd_entry_to_dir(struct ref_dir *dir,struct ref_entry *entry); 168static intfiles_log_ref_write(struct files_ref_store *refs, 169const char*refname,const unsigned char*old_sha1, 170const unsigned char*new_sha1,const char*msg, 171int flags,struct strbuf *err); 172 173static struct ref_dir *get_ref_dir(struct ref_entry *entry) 174{ 175struct ref_dir *dir; 176assert(entry->flag & REF_DIR); 177 dir = &entry->u.subdir; 178if(entry->flag & REF_INCOMPLETE) { 179read_loose_refs(entry->name, dir); 180 181/* 182 * Manually add refs/bisect, which, being 183 * per-worktree, might not appear in the directory 184 * listing for refs/ in the main repo. 185 */ 186if(!strcmp(entry->name,"refs/")) { 187int pos =search_ref_dir(dir,"refs/bisect/",12); 188if(pos <0) { 189struct ref_entry *child_entry; 190 child_entry =create_dir_entry(dir->ref_store, 191"refs/bisect/", 19212,1); 193add_entry_to_dir(dir, child_entry); 194read_loose_refs("refs/bisect", 195&child_entry->u.subdir); 196} 197} 198 entry->flag &= ~REF_INCOMPLETE; 199} 200return dir; 201} 202 203static struct ref_entry *create_ref_entry(const char*refname, 204const unsigned char*sha1,int flag, 205int check_name) 206{ 207struct ref_entry *ref; 208 209if(check_name && 210check_refname_format(refname, REFNAME_ALLOW_ONELEVEL)) 211die("Reference has invalid format: '%s'", refname); 212FLEX_ALLOC_STR(ref, name, refname); 213hashcpy(ref->u.value.oid.hash, sha1); 214oidclr(&ref->u.value.peeled); 215 ref->flag = flag; 216return ref; 217} 218 219static voidclear_ref_dir(struct ref_dir *dir); 220 221static voidfree_ref_entry(struct ref_entry *entry) 222{ 223if(entry->flag & REF_DIR) { 224/* 225 * Do not use get_ref_dir() here, as that might 226 * trigger the reading of loose refs. 227 */ 228clear_ref_dir(&entry->u.subdir); 229} 230free(entry); 231} 232 233/* 234 * Add a ref_entry to the end of dir (unsorted). Entry is always 235 * stored directly in dir; no recursion into subdirectories is 236 * done. 237 */ 238static voidadd_entry_to_dir(struct ref_dir *dir,struct ref_entry *entry) 239{ 240ALLOC_GROW(dir->entries, dir->nr +1, dir->alloc); 241 dir->entries[dir->nr++] = entry; 242/* optimize for the case that entries are added in order */ 243if(dir->nr ==1|| 244(dir->nr == dir->sorted +1&& 245strcmp(dir->entries[dir->nr -2]->name, 246 dir->entries[dir->nr -1]->name) <0)) 247 dir->sorted = dir->nr; 248} 249 250/* 251 * Clear and free all entries in dir, recursively. 252 */ 253static voidclear_ref_dir(struct ref_dir *dir) 254{ 255int i; 256for(i =0; i < dir->nr; i++) 257free_ref_entry(dir->entries[i]); 258free(dir->entries); 259 dir->sorted = dir->nr = dir->alloc =0; 260 dir->entries = NULL; 261} 262 263/* 264 * Create a struct ref_entry object for the specified dirname. 265 * dirname is the name of the directory with a trailing slash (e.g., 266 * "refs/heads/") or "" for the top-level directory. 267 */ 268static struct ref_entry *create_dir_entry(struct files_ref_store *ref_store, 269const char*dirname,size_t len, 270int incomplete) 271{ 272struct ref_entry *direntry; 273FLEX_ALLOC_MEM(direntry, name, dirname, len); 274 direntry->u.subdir.ref_store = ref_store; 275 direntry->flag = REF_DIR | (incomplete ? REF_INCOMPLETE :0); 276return direntry; 277} 278 279static intref_entry_cmp(const void*a,const void*b) 280{ 281struct ref_entry *one = *(struct ref_entry **)a; 282struct ref_entry *two = *(struct ref_entry **)b; 283returnstrcmp(one->name, two->name); 284} 285 286static voidsort_ref_dir(struct ref_dir *dir); 287 288struct string_slice { 289size_t len; 290const char*str; 291}; 292 293static intref_entry_cmp_sslice(const void*key_,const void*ent_) 294{ 295const struct string_slice *key = key_; 296const struct ref_entry *ent = *(const struct ref_entry *const*)ent_; 297int cmp =strncmp(key->str, ent->name, key->len); 298if(cmp) 299return cmp; 300return'\0'- (unsigned char)ent->name[key->len]; 301} 302 303/* 304 * Return the index of the entry with the given refname from the 305 * ref_dir (non-recursively), sorting dir if necessary. Return -1 if 306 * no such entry is found. dir must already be complete. 307 */ 308static intsearch_ref_dir(struct ref_dir *dir,const char*refname,size_t len) 309{ 310struct ref_entry **r; 311struct string_slice key; 312 313if(refname == NULL || !dir->nr) 314return-1; 315 316sort_ref_dir(dir); 317 key.len = len; 318 key.str = refname; 319 r =bsearch(&key, dir->entries, dir->nr,sizeof(*dir->entries), 320 ref_entry_cmp_sslice); 321 322if(r == NULL) 323return-1; 324 325return r - dir->entries; 326} 327 328/* 329 * Search for a directory entry directly within dir (without 330 * recursing). Sort dir if necessary. subdirname must be a directory 331 * name (i.e., end in '/'). If mkdir is set, then create the 332 * directory if it is missing; otherwise, return NULL if the desired 333 * directory cannot be found. dir must already be complete. 334 */ 335static struct ref_dir *search_for_subdir(struct ref_dir *dir, 336const char*subdirname,size_t len, 337int mkdir) 338{ 339int entry_index =search_ref_dir(dir, subdirname, len); 340struct ref_entry *entry; 341if(entry_index == -1) { 342if(!mkdir) 343return NULL; 344/* 345 * Since dir is complete, the absence of a subdir 346 * means that the subdir really doesn't exist; 347 * therefore, create an empty record for it but mark 348 * the record complete. 349 */ 350 entry =create_dir_entry(dir->ref_store, subdirname, len,0); 351add_entry_to_dir(dir, entry); 352}else{ 353 entry = dir->entries[entry_index]; 354} 355returnget_ref_dir(entry); 356} 357 358/* 359 * If refname is a reference name, find the ref_dir within the dir 360 * tree that should hold refname. If refname is a directory name 361 * (i.e., ends in '/'), then return that ref_dir itself. dir must 362 * represent the top-level directory and must already be complete. 363 * Sort ref_dirs and recurse into subdirectories as necessary. If 364 * mkdir is set, then create any missing directories; otherwise, 365 * return NULL if the desired directory cannot be found. 366 */ 367static struct ref_dir *find_containing_dir(struct ref_dir *dir, 368const char*refname,int mkdir) 369{ 370const char*slash; 371for(slash =strchr(refname,'/'); slash; slash =strchr(slash +1,'/')) { 372size_t dirnamelen = slash - refname +1; 373struct ref_dir *subdir; 374 subdir =search_for_subdir(dir, refname, dirnamelen, mkdir); 375if(!subdir) { 376 dir = NULL; 377break; 378} 379 dir = subdir; 380} 381 382return dir; 383} 384 385/* 386 * Find the value entry with the given name in dir, sorting ref_dirs 387 * and recursing into subdirectories as necessary. If the name is not 388 * found or it corresponds to a directory entry, return NULL. 389 */ 390static struct ref_entry *find_ref(struct ref_dir *dir,const char*refname) 391{ 392int entry_index; 393struct ref_entry *entry; 394 dir =find_containing_dir(dir, refname,0); 395if(!dir) 396return NULL; 397 entry_index =search_ref_dir(dir, refname,strlen(refname)); 398if(entry_index == -1) 399return NULL; 400 entry = dir->entries[entry_index]; 401return(entry->flag & REF_DIR) ? NULL : entry; 402} 403 404/* 405 * Remove the entry with the given name from dir, recursing into 406 * subdirectories as necessary. If refname is the name of a directory 407 * (i.e., ends with '/'), then remove the directory and its contents. 408 * If the removal was successful, return the number of entries 409 * remaining in the directory entry that contained the deleted entry. 410 * If the name was not found, return -1. Please note that this 411 * function only deletes the entry from the cache; it does not delete 412 * it from the filesystem or ensure that other cache entries (which 413 * might be symbolic references to the removed entry) are updated. 414 * Nor does it remove any containing dir entries that might be made 415 * empty by the removal. dir must represent the top-level directory 416 * and must already be complete. 417 */ 418static intremove_entry(struct ref_dir *dir,const char*refname) 419{ 420int refname_len =strlen(refname); 421int entry_index; 422struct ref_entry *entry; 423int is_dir = refname[refname_len -1] =='/'; 424if(is_dir) { 425/* 426 * refname represents a reference directory. Remove 427 * the trailing slash; otherwise we will get the 428 * directory *representing* refname rather than the 429 * one *containing* it. 430 */ 431char*dirname =xmemdupz(refname, refname_len -1); 432 dir =find_containing_dir(dir, dirname,0); 433free(dirname); 434}else{ 435 dir =find_containing_dir(dir, refname,0); 436} 437if(!dir) 438return-1; 439 entry_index =search_ref_dir(dir, refname, refname_len); 440if(entry_index == -1) 441return-1; 442 entry = dir->entries[entry_index]; 443 444memmove(&dir->entries[entry_index], 445&dir->entries[entry_index +1], 446(dir->nr - entry_index -1) *sizeof(*dir->entries) 447); 448 dir->nr--; 449if(dir->sorted > entry_index) 450 dir->sorted--; 451free_ref_entry(entry); 452return dir->nr; 453} 454 455/* 456 * Add a ref_entry to the ref_dir (unsorted), recursing into 457 * subdirectories as necessary. dir must represent the top-level 458 * directory. Return 0 on success. 459 */ 460static intadd_ref(struct ref_dir *dir,struct ref_entry *ref) 461{ 462 dir =find_containing_dir(dir, ref->name,1); 463if(!dir) 464return-1; 465add_entry_to_dir(dir, ref); 466return0; 467} 468 469/* 470 * Emit a warning and return true iff ref1 and ref2 have the same name 471 * and the same sha1. Die if they have the same name but different 472 * sha1s. 473 */ 474static intis_dup_ref(const struct ref_entry *ref1,const struct ref_entry *ref2) 475{ 476if(strcmp(ref1->name, ref2->name)) 477return0; 478 479/* Duplicate name; make sure that they don't conflict: */ 480 481if((ref1->flag & REF_DIR) || (ref2->flag & REF_DIR)) 482/* This is impossible by construction */ 483die("Reference directory conflict:%s", ref1->name); 484 485if(oidcmp(&ref1->u.value.oid, &ref2->u.value.oid)) 486die("Duplicated ref, and SHA1s don't match:%s", ref1->name); 487 488warning("Duplicated ref:%s", ref1->name); 489return1; 490} 491 492/* 493 * Sort the entries in dir non-recursively (if they are not already 494 * sorted) and remove any duplicate entries. 495 */ 496static voidsort_ref_dir(struct ref_dir *dir) 497{ 498int i, j; 499struct ref_entry *last = NULL; 500 501/* 502 * This check also prevents passing a zero-length array to qsort(), 503 * which is a problem on some platforms. 504 */ 505if(dir->sorted == dir->nr) 506return; 507 508QSORT(dir->entries, dir->nr, ref_entry_cmp); 509 510/* Remove any duplicates: */ 511for(i =0, j =0; j < dir->nr; j++) { 512struct ref_entry *entry = dir->entries[j]; 513if(last &&is_dup_ref(last, entry)) 514free_ref_entry(entry); 515else 516 last = dir->entries[i++] = entry; 517} 518 dir->sorted = dir->nr = i; 519} 520 521/* 522 * Return true if refname, which has the specified oid and flags, can 523 * be resolved to an object in the database. If the referred-to object 524 * does not exist, emit a warning and return false. 525 */ 526static intref_resolves_to_object(const char*refname, 527const struct object_id *oid, 528unsigned int flags) 529{ 530if(flags & REF_ISBROKEN) 531return0; 532if(!has_sha1_file(oid->hash)) { 533error("%sdoes not point to a valid object!", refname); 534return0; 535} 536return1; 537} 538 539/* 540 * Return true if the reference described by entry can be resolved to 541 * an object in the database; otherwise, emit a warning and return 542 * false. 543 */ 544static intentry_resolves_to_object(struct ref_entry *entry) 545{ 546returnref_resolves_to_object(entry->name, 547&entry->u.value.oid, entry->flag); 548} 549 550typedefinteach_ref_entry_fn(struct ref_entry *entry,void*cb_data); 551 552/* 553 * Call fn for each reference in dir that has index in the range 554 * offset <= index < dir->nr. Recurse into subdirectories that are in 555 * that index range, sorting them before iterating. This function 556 * does not sort dir itself; it should be sorted beforehand. fn is 557 * called for all references, including broken ones. 558 */ 559static intdo_for_each_entry_in_dir(struct ref_dir *dir,int offset, 560 each_ref_entry_fn fn,void*cb_data) 561{ 562int i; 563assert(dir->sorted == dir->nr); 564for(i = offset; i < dir->nr; i++) { 565struct ref_entry *entry = dir->entries[i]; 566int retval; 567if(entry->flag & REF_DIR) { 568struct ref_dir *subdir =get_ref_dir(entry); 569sort_ref_dir(subdir); 570 retval =do_for_each_entry_in_dir(subdir,0, fn, cb_data); 571}else{ 572 retval =fn(entry, cb_data); 573} 574if(retval) 575return retval; 576} 577return0; 578} 579 580/* 581 * Load all of the refs from the dir into our in-memory cache. The hard work 582 * of loading loose refs is done by get_ref_dir(), so we just need to recurse 583 * through all of the sub-directories. We do not even need to care about 584 * sorting, as traversal order does not matter to us. 585 */ 586static voidprime_ref_dir(struct ref_dir *dir) 587{ 588int i; 589for(i =0; i < dir->nr; i++) { 590struct ref_entry *entry = dir->entries[i]; 591if(entry->flag & REF_DIR) 592prime_ref_dir(get_ref_dir(entry)); 593} 594} 595 596/* 597 * A level in the reference hierarchy that is currently being iterated 598 * through. 599 */ 600struct cache_ref_iterator_level { 601/* 602 * The ref_dir being iterated over at this level. The ref_dir 603 * is sorted before being stored here. 604 */ 605struct ref_dir *dir; 606 607/* 608 * The index of the current entry within dir (which might 609 * itself be a directory). If index == -1, then the iteration 610 * hasn't yet begun. If index == dir->nr, then the iteration 611 * through this level is over. 612 */ 613int index; 614}; 615 616/* 617 * Represent an iteration through a ref_dir in the memory cache. The 618 * iteration recurses through subdirectories. 619 */ 620struct cache_ref_iterator { 621struct ref_iterator base; 622 623/* 624 * The number of levels currently on the stack. This is always 625 * at least 1, because when it becomes zero the iteration is 626 * ended and this struct is freed. 627 */ 628size_t levels_nr; 629 630/* The number of levels that have been allocated on the stack */ 631size_t levels_alloc; 632 633/* 634 * A stack of levels. levels[0] is the uppermost level that is 635 * being iterated over in this iteration. (This is not 636 * necessary the top level in the references hierarchy. If we 637 * are iterating through a subtree, then levels[0] will hold 638 * the ref_dir for that subtree, and subsequent levels will go 639 * on from there.) 640 */ 641struct cache_ref_iterator_level *levels; 642}; 643 644static intcache_ref_iterator_advance(struct ref_iterator *ref_iterator) 645{ 646struct cache_ref_iterator *iter = 647(struct cache_ref_iterator *)ref_iterator; 648 649while(1) { 650struct cache_ref_iterator_level *level = 651&iter->levels[iter->levels_nr -1]; 652struct ref_dir *dir = level->dir; 653struct ref_entry *entry; 654 655if(level->index == -1) 656sort_ref_dir(dir); 657 658if(++level->index == level->dir->nr) { 659/* This level is exhausted; pop up a level */ 660if(--iter->levels_nr ==0) 661returnref_iterator_abort(ref_iterator); 662 663continue; 664} 665 666 entry = dir->entries[level->index]; 667 668if(entry->flag & REF_DIR) { 669/* push down a level */ 670ALLOC_GROW(iter->levels, iter->levels_nr +1, 671 iter->levels_alloc); 672 673 level = &iter->levels[iter->levels_nr++]; 674 level->dir =get_ref_dir(entry); 675 level->index = -1; 676}else{ 677 iter->base.refname = entry->name; 678 iter->base.oid = &entry->u.value.oid; 679 iter->base.flags = entry->flag; 680return ITER_OK; 681} 682} 683} 684 685static enum peel_status peel_entry(struct ref_entry *entry,int repeel); 686 687static intcache_ref_iterator_peel(struct ref_iterator *ref_iterator, 688struct object_id *peeled) 689{ 690struct cache_ref_iterator *iter = 691(struct cache_ref_iterator *)ref_iterator; 692struct cache_ref_iterator_level *level; 693struct ref_entry *entry; 694 695 level = &iter->levels[iter->levels_nr -1]; 696 697if(level->index == -1) 698die("BUG: peel called before advance for cache iterator"); 699 700 entry = level->dir->entries[level->index]; 701 702if(peel_entry(entry,0)) 703return-1; 704oidcpy(peeled, &entry->u.value.peeled); 705return0; 706} 707 708static intcache_ref_iterator_abort(struct ref_iterator *ref_iterator) 709{ 710struct cache_ref_iterator *iter = 711(struct cache_ref_iterator *)ref_iterator; 712 713free(iter->levels); 714base_ref_iterator_free(ref_iterator); 715return ITER_DONE; 716} 717 718static struct ref_iterator_vtable cache_ref_iterator_vtable = { 719 cache_ref_iterator_advance, 720 cache_ref_iterator_peel, 721 cache_ref_iterator_abort 722}; 723 724static struct ref_iterator *cache_ref_iterator_begin(struct ref_dir *dir) 725{ 726struct cache_ref_iterator *iter; 727struct ref_iterator *ref_iterator; 728struct cache_ref_iterator_level *level; 729 730 iter =xcalloc(1,sizeof(*iter)); 731 ref_iterator = &iter->base; 732base_ref_iterator_init(ref_iterator, &cache_ref_iterator_vtable); 733ALLOC_GROW(iter->levels,10, iter->levels_alloc); 734 735 iter->levels_nr =1; 736 level = &iter->levels[0]; 737 level->index = -1; 738 level->dir = dir; 739 740return ref_iterator; 741} 742 743struct nonmatching_ref_data { 744const struct string_list *skip; 745const char*conflicting_refname; 746}; 747 748static intnonmatching_ref_fn(struct ref_entry *entry,void*vdata) 749{ 750struct nonmatching_ref_data *data = vdata; 751 752if(data->skip &&string_list_has_string(data->skip, entry->name)) 753return0; 754 755 data->conflicting_refname = entry->name; 756return1; 757} 758 759/* 760 * Return 0 if a reference named refname could be created without 761 * conflicting with the name of an existing reference in dir. 762 * See verify_refname_available for more information. 763 */ 764static intverify_refname_available_dir(const char*refname, 765const struct string_list *extras, 766const struct string_list *skip, 767struct ref_dir *dir, 768struct strbuf *err) 769{ 770const char*slash; 771const char*extra_refname; 772int pos; 773struct strbuf dirname = STRBUF_INIT; 774int ret = -1; 775 776/* 777 * For the sake of comments in this function, suppose that 778 * refname is "refs/foo/bar". 779 */ 780 781assert(err); 782 783strbuf_grow(&dirname,strlen(refname) +1); 784for(slash =strchr(refname,'/'); slash; slash =strchr(slash +1,'/')) { 785/* Expand dirname to the new prefix, not including the trailing slash: */ 786strbuf_add(&dirname, refname + dirname.len, slash - refname - dirname.len); 787 788/* 789 * We are still at a leading dir of the refname (e.g., 790 * "refs/foo"; if there is a reference with that name, 791 * it is a conflict, *unless* it is in skip. 792 */ 793if(dir) { 794 pos =search_ref_dir(dir, dirname.buf, dirname.len); 795if(pos >=0&& 796(!skip || !string_list_has_string(skip, dirname.buf))) { 797/* 798 * We found a reference whose name is 799 * a proper prefix of refname; e.g., 800 * "refs/foo", and is not in skip. 801 */ 802strbuf_addf(err,"'%s' exists; cannot create '%s'", 803 dirname.buf, refname); 804goto cleanup; 805} 806} 807 808if(extras &&string_list_has_string(extras, dirname.buf) && 809(!skip || !string_list_has_string(skip, dirname.buf))) { 810strbuf_addf(err,"cannot process '%s' and '%s' at the same time", 811 refname, dirname.buf); 812goto cleanup; 813} 814 815/* 816 * Otherwise, we can try to continue our search with 817 * the next component. So try to look up the 818 * directory, e.g., "refs/foo/". If we come up empty, 819 * we know there is nothing under this whole prefix, 820 * but even in that case we still have to continue the 821 * search for conflicts with extras. 822 */ 823strbuf_addch(&dirname,'/'); 824if(dir) { 825 pos =search_ref_dir(dir, dirname.buf, dirname.len); 826if(pos <0) { 827/* 828 * There was no directory "refs/foo/", 829 * so there is nothing under this 830 * whole prefix. So there is no need 831 * to continue looking for conflicting 832 * references. But we need to continue 833 * looking for conflicting extras. 834 */ 835 dir = NULL; 836}else{ 837 dir =get_ref_dir(dir->entries[pos]); 838} 839} 840} 841 842/* 843 * We are at the leaf of our refname (e.g., "refs/foo/bar"). 844 * There is no point in searching for a reference with that 845 * name, because a refname isn't considered to conflict with 846 * itself. But we still need to check for references whose 847 * names are in the "refs/foo/bar/" namespace, because they 848 * *do* conflict. 849 */ 850strbuf_addstr(&dirname, refname + dirname.len); 851strbuf_addch(&dirname,'/'); 852 853if(dir) { 854 pos =search_ref_dir(dir, dirname.buf, dirname.len); 855 856if(pos >=0) { 857/* 858 * We found a directory named "$refname/" 859 * (e.g., "refs/foo/bar/"). It is a problem 860 * iff it contains any ref that is not in 861 * "skip". 862 */ 863struct nonmatching_ref_data data; 864 865 data.skip = skip; 866 data.conflicting_refname = NULL; 867 dir =get_ref_dir(dir->entries[pos]); 868sort_ref_dir(dir); 869if(do_for_each_entry_in_dir(dir,0, nonmatching_ref_fn, &data)) { 870strbuf_addf(err,"'%s' exists; cannot create '%s'", 871 data.conflicting_refname, refname); 872goto cleanup; 873} 874} 875} 876 877 extra_refname =find_descendant_ref(dirname.buf, extras, skip); 878if(extra_refname) 879strbuf_addf(err,"cannot process '%s' and '%s' at the same time", 880 refname, extra_refname); 881else 882 ret =0; 883 884cleanup: 885strbuf_release(&dirname); 886return ret; 887} 888 889struct packed_ref_cache { 890struct ref_entry *root; 891 892/* 893 * Count of references to the data structure in this instance, 894 * including the pointer from files_ref_store::packed if any. 895 * The data will not be freed as long as the reference count 896 * is nonzero. 897 */ 898unsigned int referrers; 899 900/* 901 * Iff the packed-refs file associated with this instance is 902 * currently locked for writing, this points at the associated 903 * lock (which is owned by somebody else). The referrer count 904 * is also incremented when the file is locked and decremented 905 * when it is unlocked. 906 */ 907struct lock_file *lock; 908 909/* The metadata from when this packed-refs cache was read */ 910struct stat_validity validity; 911}; 912 913/* 914 * Future: need to be in "struct repository" 915 * when doing a full libification. 916 */ 917struct files_ref_store { 918struct ref_store base; 919 920char*gitdir; 921char*gitcommondir; 922char*packed_refs_path; 923 924struct ref_entry *loose; 925struct packed_ref_cache *packed; 926}; 927 928/* Lock used for the main packed-refs file: */ 929static struct lock_file packlock; 930 931/* 932 * Increment the reference count of *packed_refs. 933 */ 934static voidacquire_packed_ref_cache(struct packed_ref_cache *packed_refs) 935{ 936 packed_refs->referrers++; 937} 938 939/* 940 * Decrease the reference count of *packed_refs. If it goes to zero, 941 * free *packed_refs and return true; otherwise return false. 942 */ 943static intrelease_packed_ref_cache(struct packed_ref_cache *packed_refs) 944{ 945if(!--packed_refs->referrers) { 946free_ref_entry(packed_refs->root); 947stat_validity_clear(&packed_refs->validity); 948free(packed_refs); 949return1; 950}else{ 951return0; 952} 953} 954 955static voidclear_packed_ref_cache(struct files_ref_store *refs) 956{ 957if(refs->packed) { 958struct packed_ref_cache *packed_refs = refs->packed; 959 960if(packed_refs->lock) 961die("internal error: packed-ref cache cleared while locked"); 962 refs->packed = NULL; 963release_packed_ref_cache(packed_refs); 964} 965} 966 967static voidclear_loose_ref_cache(struct files_ref_store *refs) 968{ 969if(refs->loose) { 970free_ref_entry(refs->loose); 971 refs->loose = NULL; 972} 973} 974 975/* 976 * Create a new submodule ref cache and add it to the internal 977 * set of caches. 978 */ 979static struct ref_store *files_ref_store_create(const char*gitdir) 980{ 981struct files_ref_store *refs =xcalloc(1,sizeof(*refs)); 982struct ref_store *ref_store = (struct ref_store *)refs; 983struct strbuf sb = STRBUF_INIT; 984 985base_ref_store_init(ref_store, &refs_be_files); 986 987 refs->gitdir =xstrdup(gitdir); 988get_common_dir_noenv(&sb, gitdir); 989 refs->gitcommondir =strbuf_detach(&sb, NULL); 990strbuf_addf(&sb,"%s/packed-refs", refs->gitcommondir); 991 refs->packed_refs_path =strbuf_detach(&sb, NULL); 992 993return ref_store; 994} 995 996/* 997 * Die if refs is for a submodule (i.e., not for the main repository). 998 * caller is used in any necessary error messages. 999 */1000static voidfiles_assert_main_repository(struct files_ref_store *refs,1001const char*caller)1002{1003/* This function is to be fixed up in the next patch */1004}10051006/*1007 * Downcast ref_store to files_ref_store. Die if ref_store is not a1008 * files_ref_store. If submodule_allowed is not true, then also die if1009 * files_ref_store is for a submodule (i.e., not for the main1010 * repository). caller is used in any necessary error messages.1011 */1012static struct files_ref_store *files_downcast(1013struct ref_store *ref_store,int submodule_allowed,1014const char*caller)1015{1016struct files_ref_store *refs;10171018if(ref_store->be != &refs_be_files)1019die("BUG: ref_store is type\"%s\"not\"files\"in%s",1020 ref_store->be->name, caller);10211022 refs = (struct files_ref_store *)ref_store;10231024if(!submodule_allowed)1025files_assert_main_repository(refs, caller);10261027return refs;1028}10291030/* The length of a peeled reference line in packed-refs, including EOL: */1031#define PEELED_LINE_LENGTH 4210321033/*1034 * The packed-refs header line that we write out. Perhaps other1035 * traits will be added later. The trailing space is required.1036 */1037static const char PACKED_REFS_HEADER[] =1038"# pack-refs with: peeled fully-peeled\n";10391040/*1041 * Parse one line from a packed-refs file. Write the SHA1 to sha1.1042 * Return a pointer to the refname within the line (null-terminated),1043 * or NULL if there was a problem.1044 */1045static const char*parse_ref_line(struct strbuf *line,unsigned char*sha1)1046{1047const char*ref;10481049/*1050 * 42: the answer to everything.1051 *1052 * In this case, it happens to be the answer to1053 * 40 (length of sha1 hex representation)1054 * +1 (space in between hex and name)1055 * +1 (newline at the end of the line)1056 */1057if(line->len <=42)1058return NULL;10591060if(get_sha1_hex(line->buf, sha1) <0)1061return NULL;1062if(!isspace(line->buf[40]))1063return NULL;10641065 ref = line->buf +41;1066if(isspace(*ref))1067return NULL;10681069if(line->buf[line->len -1] !='\n')1070return NULL;1071 line->buf[--line->len] =0;10721073return ref;1074}10751076/*1077 * Read f, which is a packed-refs file, into dir.1078 *1079 * A comment line of the form "# pack-refs with: " may contain zero or1080 * more traits. We interpret the traits as follows:1081 *1082 * No traits:1083 *1084 * Probably no references are peeled. But if the file contains a1085 * peeled value for a reference, we will use it.1086 *1087 * peeled:1088 *1089 * References under "refs/tags/", if they *can* be peeled, *are*1090 * peeled in this file. References outside of "refs/tags/" are1091 * probably not peeled even if they could have been, but if we find1092 * a peeled value for such a reference we will use it.1093 *1094 * fully-peeled:1095 *1096 * All references in the file that can be peeled are peeled.1097 * Inversely (and this is more important), any references in the1098 * file for which no peeled value is recorded is not peelable. This1099 * trait should typically be written alongside "peeled" for1100 * compatibility with older clients, but we do not require it1101 * (i.e., "peeled" is a no-op if "fully-peeled" is set).1102 */1103static voidread_packed_refs(FILE*f,struct ref_dir *dir)1104{1105struct ref_entry *last = NULL;1106struct strbuf line = STRBUF_INIT;1107enum{ PEELED_NONE, PEELED_TAGS, PEELED_FULLY } peeled = PEELED_NONE;11081109while(strbuf_getwholeline(&line, f,'\n') != EOF) {1110unsigned char sha1[20];1111const char*refname;1112const char*traits;11131114if(skip_prefix(line.buf,"# pack-refs with:", &traits)) {1115if(strstr(traits," fully-peeled "))1116 peeled = PEELED_FULLY;1117else if(strstr(traits," peeled "))1118 peeled = PEELED_TAGS;1119/* perhaps other traits later as well */1120continue;1121}11221123 refname =parse_ref_line(&line, sha1);1124if(refname) {1125int flag = REF_ISPACKED;11261127if(check_refname_format(refname, REFNAME_ALLOW_ONELEVEL)) {1128if(!refname_is_safe(refname))1129die("packed refname is dangerous:%s", refname);1130hashclr(sha1);1131 flag |= REF_BAD_NAME | REF_ISBROKEN;1132}1133 last =create_ref_entry(refname, sha1, flag,0);1134if(peeled == PEELED_FULLY ||1135(peeled == PEELED_TAGS &&starts_with(refname,"refs/tags/")))1136 last->flag |= REF_KNOWS_PEELED;1137add_ref(dir, last);1138continue;1139}1140if(last &&1141 line.buf[0] =='^'&&1142 line.len == PEELED_LINE_LENGTH &&1143 line.buf[PEELED_LINE_LENGTH -1] =='\n'&&1144!get_sha1_hex(line.buf +1, sha1)) {1145hashcpy(last->u.value.peeled.hash, sha1);1146/*1147 * Regardless of what the file header said,1148 * we definitely know the value of *this*1149 * reference:1150 */1151 last->flag |= REF_KNOWS_PEELED;1152}1153}11541155strbuf_release(&line);1156}11571158static const char*files_packed_refs_path(struct files_ref_store *refs)1159{1160return refs->packed_refs_path;1161}11621163static voidfiles_reflog_path(struct files_ref_store *refs,1164struct strbuf *sb,1165const char*refname)1166{1167if(!refname) {1168/*1169 * FIXME: of course this is wrong in multi worktree1170 * setting. To be fixed real soon.1171 */1172strbuf_addf(sb,"%s/logs", refs->gitcommondir);1173return;1174}11751176switch(ref_type(refname)) {1177case REF_TYPE_PER_WORKTREE:1178case REF_TYPE_PSEUDOREF:1179strbuf_addf(sb,"%s/logs/%s", refs->gitdir, refname);1180break;1181case REF_TYPE_NORMAL:1182strbuf_addf(sb,"%s/logs/%s", refs->gitcommondir, refname);1183break;1184default:1185die("BUG: unknown ref type%dof ref%s",1186ref_type(refname), refname);1187}1188}11891190static voidfiles_ref_path(struct files_ref_store *refs,1191struct strbuf *sb,1192const char*refname)1193{1194switch(ref_type(refname)) {1195case REF_TYPE_PER_WORKTREE:1196case REF_TYPE_PSEUDOREF:1197strbuf_addf(sb,"%s/%s", refs->gitdir, refname);1198break;1199case REF_TYPE_NORMAL:1200strbuf_addf(sb,"%s/%s", refs->gitcommondir, refname);1201break;1202default:1203die("BUG: unknown ref type%dof ref%s",1204ref_type(refname), refname);1205}1206}12071208/*1209 * Get the packed_ref_cache for the specified files_ref_store,1210 * creating it if necessary.1211 */1212static struct packed_ref_cache *get_packed_ref_cache(struct files_ref_store *refs)1213{1214const char*packed_refs_file =files_packed_refs_path(refs);12151216if(refs->packed &&1217!stat_validity_check(&refs->packed->validity, packed_refs_file))1218clear_packed_ref_cache(refs);12191220if(!refs->packed) {1221FILE*f;12221223 refs->packed =xcalloc(1,sizeof(*refs->packed));1224acquire_packed_ref_cache(refs->packed);1225 refs->packed->root =create_dir_entry(refs,"",0,0);1226 f =fopen(packed_refs_file,"r");1227if(f) {1228stat_validity_update(&refs->packed->validity,fileno(f));1229read_packed_refs(f,get_ref_dir(refs->packed->root));1230fclose(f);1231}1232}1233return refs->packed;1234}12351236static struct ref_dir *get_packed_ref_dir(struct packed_ref_cache *packed_ref_cache)1237{1238returnget_ref_dir(packed_ref_cache->root);1239}12401241static struct ref_dir *get_packed_refs(struct files_ref_store *refs)1242{1243returnget_packed_ref_dir(get_packed_ref_cache(refs));1244}12451246/*1247 * Add a reference to the in-memory packed reference cache. This may1248 * only be called while the packed-refs file is locked (see1249 * lock_packed_refs()). To actually write the packed-refs file, call1250 * commit_packed_refs().1251 */1252static voidadd_packed_ref(struct files_ref_store *refs,1253const char*refname,const unsigned char*sha1)1254{1255struct packed_ref_cache *packed_ref_cache =get_packed_ref_cache(refs);12561257if(!packed_ref_cache->lock)1258die("internal error: packed refs not locked");1259add_ref(get_packed_ref_dir(packed_ref_cache),1260create_ref_entry(refname, sha1, REF_ISPACKED,1));1261}12621263/*1264 * Read the loose references from the namespace dirname into dir1265 * (without recursing). dirname must end with '/'. dir must be the1266 * directory entry corresponding to dirname.1267 */1268static voidread_loose_refs(const char*dirname,struct ref_dir *dir)1269{1270struct files_ref_store *refs = dir->ref_store;1271DIR*d;1272struct dirent *de;1273int dirnamelen =strlen(dirname);1274struct strbuf refname;1275struct strbuf path = STRBUF_INIT;1276size_t path_baselen;12771278files_ref_path(refs, &path, dirname);1279 path_baselen = path.len;12801281 d =opendir(path.buf);1282if(!d) {1283strbuf_release(&path);1284return;1285}12861287strbuf_init(&refname, dirnamelen +257);1288strbuf_add(&refname, dirname, dirnamelen);12891290while((de =readdir(d)) != NULL) {1291unsigned char sha1[20];1292struct stat st;1293int flag;12941295if(de->d_name[0] =='.')1296continue;1297if(ends_with(de->d_name,".lock"))1298continue;1299strbuf_addstr(&refname, de->d_name);1300strbuf_addstr(&path, de->d_name);1301if(stat(path.buf, &st) <0) {1302;/* silently ignore */1303}else if(S_ISDIR(st.st_mode)) {1304strbuf_addch(&refname,'/');1305add_entry_to_dir(dir,1306create_dir_entry(refs, refname.buf,1307 refname.len,1));1308}else{1309if(!resolve_ref_recursively(&refs->base,1310 refname.buf,1311 RESOLVE_REF_READING,1312 sha1, &flag)) {1313hashclr(sha1);1314 flag |= REF_ISBROKEN;1315}else if(is_null_sha1(sha1)) {1316/*1317 * It is so astronomically unlikely1318 * that NULL_SHA1 is the SHA-1 of an1319 * actual object that we consider its1320 * appearance in a loose reference1321 * file to be repo corruption1322 * (probably due to a software bug).1323 */1324 flag |= REF_ISBROKEN;1325}13261327if(check_refname_format(refname.buf,1328 REFNAME_ALLOW_ONELEVEL)) {1329if(!refname_is_safe(refname.buf))1330die("loose refname is dangerous:%s", refname.buf);1331hashclr(sha1);1332 flag |= REF_BAD_NAME | REF_ISBROKEN;1333}1334add_entry_to_dir(dir,1335create_ref_entry(refname.buf, sha1, flag,0));1336}1337strbuf_setlen(&refname, dirnamelen);1338strbuf_setlen(&path, path_baselen);1339}1340strbuf_release(&refname);1341strbuf_release(&path);1342closedir(d);1343}13441345static struct ref_dir *get_loose_refs(struct files_ref_store *refs)1346{1347if(!refs->loose) {1348/*1349 * Mark the top-level directory complete because we1350 * are about to read the only subdirectory that can1351 * hold references:1352 */1353 refs->loose =create_dir_entry(refs,"",0,0);1354/*1355 * Create an incomplete entry for "refs/":1356 */1357add_entry_to_dir(get_ref_dir(refs->loose),1358create_dir_entry(refs,"refs/",5,1));1359}1360returnget_ref_dir(refs->loose);1361}13621363/*1364 * Return the ref_entry for the given refname from the packed1365 * references. If it does not exist, return NULL.1366 */1367static struct ref_entry *get_packed_ref(struct files_ref_store *refs,1368const char*refname)1369{1370returnfind_ref(get_packed_refs(refs), refname);1371}13721373/*1374 * A loose ref file doesn't exist; check for a packed ref.1375 */1376static intresolve_packed_ref(struct files_ref_store *refs,1377const char*refname,1378unsigned char*sha1,unsigned int*flags)1379{1380struct ref_entry *entry;13811382/*1383 * The loose reference file does not exist; check for a packed1384 * reference.1385 */1386 entry =get_packed_ref(refs, refname);1387if(entry) {1388hashcpy(sha1, entry->u.value.oid.hash);1389*flags |= REF_ISPACKED;1390return0;1391}1392/* refname is not a packed reference. */1393return-1;1394}13951396static intfiles_read_raw_ref(struct ref_store *ref_store,1397const char*refname,unsigned char*sha1,1398struct strbuf *referent,unsigned int*type)1399{1400struct files_ref_store *refs =1401files_downcast(ref_store,1,"read_raw_ref");1402struct strbuf sb_contents = STRBUF_INIT;1403struct strbuf sb_path = STRBUF_INIT;1404const char*path;1405const char*buf;1406struct stat st;1407int fd;1408int ret = -1;1409int save_errno;1410int remaining_retries =3;14111412*type =0;1413strbuf_reset(&sb_path);14141415files_ref_path(refs, &sb_path, refname);14161417 path = sb_path.buf;14181419stat_ref:1420/*1421 * We might have to loop back here to avoid a race1422 * condition: first we lstat() the file, then we try1423 * to read it as a link or as a file. But if somebody1424 * changes the type of the file (file <-> directory1425 * <-> symlink) between the lstat() and reading, then1426 * we don't want to report that as an error but rather1427 * try again starting with the lstat().1428 *1429 * We'll keep a count of the retries, though, just to avoid1430 * any confusing situation sending us into an infinite loop.1431 */14321433if(remaining_retries-- <=0)1434goto out;14351436if(lstat(path, &st) <0) {1437if(errno != ENOENT)1438goto out;1439if(resolve_packed_ref(refs, refname, sha1, type)) {1440 errno = ENOENT;1441goto out;1442}1443 ret =0;1444goto out;1445}14461447/* Follow "normalized" - ie "refs/.." symlinks by hand */1448if(S_ISLNK(st.st_mode)) {1449strbuf_reset(&sb_contents);1450if(strbuf_readlink(&sb_contents, path,0) <0) {1451if(errno == ENOENT || errno == EINVAL)1452/* inconsistent with lstat; retry */1453goto stat_ref;1454else1455goto out;1456}1457if(starts_with(sb_contents.buf,"refs/") &&1458!check_refname_format(sb_contents.buf,0)) {1459strbuf_swap(&sb_contents, referent);1460*type |= REF_ISSYMREF;1461 ret =0;1462goto out;1463}1464/*1465 * It doesn't look like a refname; fall through to just1466 * treating it like a non-symlink, and reading whatever it1467 * points to.1468 */1469}14701471/* Is it a directory? */1472if(S_ISDIR(st.st_mode)) {1473/*1474 * Even though there is a directory where the loose1475 * ref is supposed to be, there could still be a1476 * packed ref:1477 */1478if(resolve_packed_ref(refs, refname, sha1, type)) {1479 errno = EISDIR;1480goto out;1481}1482 ret =0;1483goto out;1484}14851486/*1487 * Anything else, just open it and try to use it as1488 * a ref1489 */1490 fd =open(path, O_RDONLY);1491if(fd <0) {1492if(errno == ENOENT && !S_ISLNK(st.st_mode))1493/* inconsistent with lstat; retry */1494goto stat_ref;1495else1496goto out;1497}1498strbuf_reset(&sb_contents);1499if(strbuf_read(&sb_contents, fd,256) <0) {1500int save_errno = errno;1501close(fd);1502 errno = save_errno;1503goto out;1504}1505close(fd);1506strbuf_rtrim(&sb_contents);1507 buf = sb_contents.buf;1508if(starts_with(buf,"ref:")) {1509 buf +=4;1510while(isspace(*buf))1511 buf++;15121513strbuf_reset(referent);1514strbuf_addstr(referent, buf);1515*type |= REF_ISSYMREF;1516 ret =0;1517goto out;1518}15191520/*1521 * Please note that FETCH_HEAD has additional1522 * data after the sha.1523 */1524if(get_sha1_hex(buf, sha1) ||1525(buf[40] !='\0'&& !isspace(buf[40]))) {1526*type |= REF_ISBROKEN;1527 errno = EINVAL;1528goto out;1529}15301531 ret =0;15321533out:1534 save_errno = errno;1535strbuf_release(&sb_path);1536strbuf_release(&sb_contents);1537 errno = save_errno;1538return ret;1539}15401541static voidunlock_ref(struct ref_lock *lock)1542{1543/* Do not free lock->lk -- atexit() still looks at them */1544if(lock->lk)1545rollback_lock_file(lock->lk);1546free(lock->ref_name);1547free(lock);1548}15491550/*1551 * Lock refname, without following symrefs, and set *lock_p to point1552 * at a newly-allocated lock object. Fill in lock->old_oid, referent,1553 * and type similarly to read_raw_ref().1554 *1555 * The caller must verify that refname is a "safe" reference name (in1556 * the sense of refname_is_safe()) before calling this function.1557 *1558 * If the reference doesn't already exist, verify that refname doesn't1559 * have a D/F conflict with any existing references. extras and skip1560 * are passed to verify_refname_available_dir() for this check.1561 *1562 * If mustexist is not set and the reference is not found or is1563 * broken, lock the reference anyway but clear sha1.1564 *1565 * Return 0 on success. On failure, write an error message to err and1566 * return TRANSACTION_NAME_CONFLICT or TRANSACTION_GENERIC_ERROR.1567 *1568 * Implementation note: This function is basically1569 *1570 * lock reference1571 * read_raw_ref()1572 *1573 * but it includes a lot more code to1574 * - Deal with possible races with other processes1575 * - Avoid calling verify_refname_available_dir() when it can be1576 * avoided, namely if we were successfully able to read the ref1577 * - Generate informative error messages in the case of failure1578 */1579static intlock_raw_ref(struct files_ref_store *refs,1580const char*refname,int mustexist,1581const struct string_list *extras,1582const struct string_list *skip,1583struct ref_lock **lock_p,1584struct strbuf *referent,1585unsigned int*type,1586struct strbuf *err)1587{1588struct ref_lock *lock;1589struct strbuf ref_file = STRBUF_INIT;1590int attempts_remaining =3;1591int ret = TRANSACTION_GENERIC_ERROR;15921593assert(err);1594files_assert_main_repository(refs,"lock_raw_ref");15951596*type =0;15971598/* First lock the file so it can't change out from under us. */15991600*lock_p = lock =xcalloc(1,sizeof(*lock));16011602 lock->ref_name =xstrdup(refname);1603files_ref_path(refs, &ref_file, refname);16041605retry:1606switch(safe_create_leading_directories(ref_file.buf)) {1607case SCLD_OK:1608break;/* success */1609case SCLD_EXISTS:1610/*1611 * Suppose refname is "refs/foo/bar". We just failed1612 * to create the containing directory, "refs/foo",1613 * because there was a non-directory in the way. This1614 * indicates a D/F conflict, probably because of1615 * another reference such as "refs/foo". There is no1616 * reason to expect this error to be transitory.1617 */1618if(verify_refname_available(refname, extras, skip, err)) {1619if(mustexist) {1620/*1621 * To the user the relevant error is1622 * that the "mustexist" reference is1623 * missing:1624 */1625strbuf_reset(err);1626strbuf_addf(err,"unable to resolve reference '%s'",1627 refname);1628}else{1629/*1630 * The error message set by1631 * verify_refname_available_dir() is OK.1632 */1633 ret = TRANSACTION_NAME_CONFLICT;1634}1635}else{1636/*1637 * The file that is in the way isn't a loose1638 * reference. Report it as a low-level1639 * failure.1640 */1641strbuf_addf(err,"unable to create lock file%s.lock; "1642"non-directory in the way",1643 ref_file.buf);1644}1645goto error_return;1646case SCLD_VANISHED:1647/* Maybe another process was tidying up. Try again. */1648if(--attempts_remaining >0)1649goto retry;1650/* fall through */1651default:1652strbuf_addf(err,"unable to create directory for%s",1653 ref_file.buf);1654goto error_return;1655}16561657if(!lock->lk)1658 lock->lk =xcalloc(1,sizeof(struct lock_file));16591660if(hold_lock_file_for_update(lock->lk, ref_file.buf, LOCK_NO_DEREF) <0) {1661if(errno == ENOENT && --attempts_remaining >0) {1662/*1663 * Maybe somebody just deleted one of the1664 * directories leading to ref_file. Try1665 * again:1666 */1667goto retry;1668}else{1669unable_to_lock_message(ref_file.buf, errno, err);1670goto error_return;1671}1672}16731674/*1675 * Now we hold the lock and can read the reference without1676 * fear that its value will change.1677 */16781679if(files_read_raw_ref(&refs->base, refname,1680 lock->old_oid.hash, referent, type)) {1681if(errno == ENOENT) {1682if(mustexist) {1683/* Garden variety missing reference. */1684strbuf_addf(err,"unable to resolve reference '%s'",1685 refname);1686goto error_return;1687}else{1688/*1689 * Reference is missing, but that's OK. We1690 * know that there is not a conflict with1691 * another loose reference because1692 * (supposing that we are trying to lock1693 * reference "refs/foo/bar"):1694 *1695 * - We were successfully able to create1696 * the lockfile refs/foo/bar.lock, so we1697 * know there cannot be a loose reference1698 * named "refs/foo".1699 *1700 * - We got ENOENT and not EISDIR, so we1701 * know that there cannot be a loose1702 * reference named "refs/foo/bar/baz".1703 */1704}1705}else if(errno == EISDIR) {1706/*1707 * There is a directory in the way. It might have1708 * contained references that have been deleted. If1709 * we don't require that the reference already1710 * exists, try to remove the directory so that it1711 * doesn't cause trouble when we want to rename the1712 * lockfile into place later.1713 */1714if(mustexist) {1715/* Garden variety missing reference. */1716strbuf_addf(err,"unable to resolve reference '%s'",1717 refname);1718goto error_return;1719}else if(remove_dir_recursively(&ref_file,1720 REMOVE_DIR_EMPTY_ONLY)) {1721if(verify_refname_available_dir(1722 refname, extras, skip,1723get_loose_refs(refs),1724 err)) {1725/*1726 * The error message set by1727 * verify_refname_available() is OK.1728 */1729 ret = TRANSACTION_NAME_CONFLICT;1730goto error_return;1731}else{1732/*1733 * We can't delete the directory,1734 * but we also don't know of any1735 * references that it should1736 * contain.1737 */1738strbuf_addf(err,"there is a non-empty directory '%s' "1739"blocking reference '%s'",1740 ref_file.buf, refname);1741goto error_return;1742}1743}1744}else if(errno == EINVAL && (*type & REF_ISBROKEN)) {1745strbuf_addf(err,"unable to resolve reference '%s': "1746"reference broken", refname);1747goto error_return;1748}else{1749strbuf_addf(err,"unable to resolve reference '%s':%s",1750 refname,strerror(errno));1751goto error_return;1752}17531754/*1755 * If the ref did not exist and we are creating it,1756 * make sure there is no existing packed ref whose1757 * name begins with our refname, nor a packed ref1758 * whose name is a proper prefix of our refname.1759 */1760if(verify_refname_available_dir(1761 refname, extras, skip,1762get_packed_refs(refs),1763 err)) {1764goto error_return;1765}1766}17671768 ret =0;1769goto out;17701771error_return:1772unlock_ref(lock);1773*lock_p = NULL;17741775out:1776strbuf_release(&ref_file);1777return ret;1778}17791780/*1781 * Peel the entry (if possible) and return its new peel_status. If1782 * repeel is true, re-peel the entry even if there is an old peeled1783 * value that is already stored in it.1784 *1785 * It is OK to call this function with a packed reference entry that1786 * might be stale and might even refer to an object that has since1787 * been garbage-collected. In such a case, if the entry has1788 * REF_KNOWS_PEELED then leave the status unchanged and return1789 * PEEL_PEELED or PEEL_NON_TAG; otherwise, return PEEL_INVALID.1790 */1791static enum peel_status peel_entry(struct ref_entry *entry,int repeel)1792{1793enum peel_status status;17941795if(entry->flag & REF_KNOWS_PEELED) {1796if(repeel) {1797 entry->flag &= ~REF_KNOWS_PEELED;1798oidclr(&entry->u.value.peeled);1799}else{1800returnis_null_oid(&entry->u.value.peeled) ?1801 PEEL_NON_TAG : PEEL_PEELED;1802}1803}1804if(entry->flag & REF_ISBROKEN)1805return PEEL_BROKEN;1806if(entry->flag & REF_ISSYMREF)1807return PEEL_IS_SYMREF;18081809 status =peel_object(entry->u.value.oid.hash, entry->u.value.peeled.hash);1810if(status == PEEL_PEELED || status == PEEL_NON_TAG)1811 entry->flag |= REF_KNOWS_PEELED;1812return status;1813}18141815static intfiles_peel_ref(struct ref_store *ref_store,1816const char*refname,unsigned char*sha1)1817{1818struct files_ref_store *refs =files_downcast(ref_store,0,"peel_ref");1819int flag;1820unsigned char base[20];18211822if(current_ref_iter && current_ref_iter->refname == refname) {1823struct object_id peeled;18241825if(ref_iterator_peel(current_ref_iter, &peeled))1826return-1;1827hashcpy(sha1, peeled.hash);1828return0;1829}18301831if(read_ref_full(refname, RESOLVE_REF_READING, base, &flag))1832return-1;18331834/*1835 * If the reference is packed, read its ref_entry from the1836 * cache in the hope that we already know its peeled value.1837 * We only try this optimization on packed references because1838 * (a) forcing the filling of the loose reference cache could1839 * be expensive and (b) loose references anyway usually do not1840 * have REF_KNOWS_PEELED.1841 */1842if(flag & REF_ISPACKED) {1843struct ref_entry *r =get_packed_ref(refs, refname);1844if(r) {1845if(peel_entry(r,0))1846return-1;1847hashcpy(sha1, r->u.value.peeled.hash);1848return0;1849}1850}18511852returnpeel_object(base, sha1);1853}18541855struct files_ref_iterator {1856struct ref_iterator base;18571858struct packed_ref_cache *packed_ref_cache;1859struct ref_iterator *iter0;1860unsigned int flags;1861};18621863static intfiles_ref_iterator_advance(struct ref_iterator *ref_iterator)1864{1865struct files_ref_iterator *iter =1866(struct files_ref_iterator *)ref_iterator;1867int ok;18681869while((ok =ref_iterator_advance(iter->iter0)) == ITER_OK) {1870if(iter->flags & DO_FOR_EACH_PER_WORKTREE_ONLY &&1871ref_type(iter->iter0->refname) != REF_TYPE_PER_WORKTREE)1872continue;18731874if(!(iter->flags & DO_FOR_EACH_INCLUDE_BROKEN) &&1875!ref_resolves_to_object(iter->iter0->refname,1876 iter->iter0->oid,1877 iter->iter0->flags))1878continue;18791880 iter->base.refname = iter->iter0->refname;1881 iter->base.oid = iter->iter0->oid;1882 iter->base.flags = iter->iter0->flags;1883return ITER_OK;1884}18851886 iter->iter0 = NULL;1887if(ref_iterator_abort(ref_iterator) != ITER_DONE)1888 ok = ITER_ERROR;18891890return ok;1891}18921893static intfiles_ref_iterator_peel(struct ref_iterator *ref_iterator,1894struct object_id *peeled)1895{1896struct files_ref_iterator *iter =1897(struct files_ref_iterator *)ref_iterator;18981899returnref_iterator_peel(iter->iter0, peeled);1900}19011902static intfiles_ref_iterator_abort(struct ref_iterator *ref_iterator)1903{1904struct files_ref_iterator *iter =1905(struct files_ref_iterator *)ref_iterator;1906int ok = ITER_DONE;19071908if(iter->iter0)1909 ok =ref_iterator_abort(iter->iter0);19101911release_packed_ref_cache(iter->packed_ref_cache);1912base_ref_iterator_free(ref_iterator);1913return ok;1914}19151916static struct ref_iterator_vtable files_ref_iterator_vtable = {1917 files_ref_iterator_advance,1918 files_ref_iterator_peel,1919 files_ref_iterator_abort1920};19211922static struct ref_iterator *files_ref_iterator_begin(1923struct ref_store *ref_store,1924const char*prefix,unsigned int flags)1925{1926struct files_ref_store *refs =1927files_downcast(ref_store,1,"ref_iterator_begin");1928struct ref_dir *loose_dir, *packed_dir;1929struct ref_iterator *loose_iter, *packed_iter;1930struct files_ref_iterator *iter;1931struct ref_iterator *ref_iterator;19321933if(ref_paranoia <0)1934 ref_paranoia =git_env_bool("GIT_REF_PARANOIA",0);1935if(ref_paranoia)1936 flags |= DO_FOR_EACH_INCLUDE_BROKEN;19371938 iter =xcalloc(1,sizeof(*iter));1939 ref_iterator = &iter->base;1940base_ref_iterator_init(ref_iterator, &files_ref_iterator_vtable);19411942/*1943 * We must make sure that all loose refs are read before1944 * accessing the packed-refs file; this avoids a race1945 * condition if loose refs are migrated to the packed-refs1946 * file by a simultaneous process, but our in-memory view is1947 * from before the migration. We ensure this as follows:1948 * First, we call prime_ref_dir(), which pre-reads the loose1949 * references for the subtree into the cache. (If they've1950 * already been read, that's OK; we only need to guarantee1951 * that they're read before the packed refs, not *how much*1952 * before.) After that, we call get_packed_ref_cache(), which1953 * internally checks whether the packed-ref cache is up to1954 * date with what is on disk, and re-reads it if not.1955 */19561957 loose_dir =get_loose_refs(refs);19581959if(prefix && *prefix)1960 loose_dir =find_containing_dir(loose_dir, prefix,0);19611962if(loose_dir) {1963prime_ref_dir(loose_dir);1964 loose_iter =cache_ref_iterator_begin(loose_dir);1965}else{1966/* There's nothing to iterate over. */1967 loose_iter =empty_ref_iterator_begin();1968}19691970 iter->packed_ref_cache =get_packed_ref_cache(refs);1971acquire_packed_ref_cache(iter->packed_ref_cache);1972 packed_dir =get_packed_ref_dir(iter->packed_ref_cache);19731974if(prefix && *prefix)1975 packed_dir =find_containing_dir(packed_dir, prefix,0);19761977if(packed_dir) {1978 packed_iter =cache_ref_iterator_begin(packed_dir);1979}else{1980/* There's nothing to iterate over. */1981 packed_iter =empty_ref_iterator_begin();1982}19831984 iter->iter0 =overlay_ref_iterator_begin(loose_iter, packed_iter);1985 iter->flags = flags;19861987return ref_iterator;1988}19891990/*1991 * Verify that the reference locked by lock has the value old_sha1.1992 * Fail if the reference doesn't exist and mustexist is set. Return 01993 * on success. On error, write an error message to err, set errno, and1994 * return a negative value.1995 */1996static intverify_lock(struct ref_lock *lock,1997const unsigned char*old_sha1,int mustexist,1998struct strbuf *err)1999{2000assert(err);20012002if(read_ref_full(lock->ref_name,2003 mustexist ? RESOLVE_REF_READING :0,2004 lock->old_oid.hash, NULL)) {2005if(old_sha1) {2006int save_errno = errno;2007strbuf_addf(err,"can't verify ref '%s'", lock->ref_name);2008 errno = save_errno;2009return-1;2010}else{2011oidclr(&lock->old_oid);2012return0;2013}2014}2015if(old_sha1 &&hashcmp(lock->old_oid.hash, old_sha1)) {2016strbuf_addf(err,"ref '%s' is at%sbut expected%s",2017 lock->ref_name,2018oid_to_hex(&lock->old_oid),2019sha1_to_hex(old_sha1));2020 errno = EBUSY;2021return-1;2022}2023return0;2024}20252026static intremove_empty_directories(struct strbuf *path)2027{2028/*2029 * we want to create a file but there is a directory there;2030 * if that is an empty directory (or a directory that contains2031 * only empty directories), remove them.2032 */2033returnremove_dir_recursively(path, REMOVE_DIR_EMPTY_ONLY);2034}20352036static intcreate_reflock(const char*path,void*cb)2037{2038struct lock_file *lk = cb;20392040returnhold_lock_file_for_update(lk, path, LOCK_NO_DEREF) <0? -1:0;2041}20422043/*2044 * Locks a ref returning the lock on success and NULL on failure.2045 * On failure errno is set to something meaningful.2046 */2047static struct ref_lock *lock_ref_sha1_basic(struct files_ref_store *refs,2048const char*refname,2049const unsigned char*old_sha1,2050const struct string_list *extras,2051const struct string_list *skip,2052unsigned int flags,int*type,2053struct strbuf *err)2054{2055struct strbuf ref_file = STRBUF_INIT;2056struct ref_lock *lock;2057int last_errno =0;2058int mustexist = (old_sha1 && !is_null_sha1(old_sha1));2059int resolve_flags = RESOLVE_REF_NO_RECURSE;2060int resolved;20612062files_assert_main_repository(refs,"lock_ref_sha1_basic");2063assert(err);20642065 lock =xcalloc(1,sizeof(struct ref_lock));20662067if(mustexist)2068 resolve_flags |= RESOLVE_REF_READING;2069if(flags & REF_DELETING)2070 resolve_flags |= RESOLVE_REF_ALLOW_BAD_NAME;20712072files_ref_path(refs, &ref_file, refname);2073 resolved = !!resolve_ref_unsafe(refname, resolve_flags,2074 lock->old_oid.hash, type);2075if(!resolved && errno == EISDIR) {2076/*2077 * we are trying to lock foo but we used to2078 * have foo/bar which now does not exist;2079 * it is normal for the empty directory 'foo'2080 * to remain.2081 */2082if(remove_empty_directories(&ref_file)) {2083 last_errno = errno;2084if(!verify_refname_available_dir(2085 refname, extras, skip,2086get_loose_refs(refs), err))2087strbuf_addf(err,"there are still refs under '%s'",2088 refname);2089goto error_return;2090}2091 resolved = !!resolve_ref_unsafe(refname, resolve_flags,2092 lock->old_oid.hash, type);2093}2094if(!resolved) {2095 last_errno = errno;2096if(last_errno != ENOTDIR ||2097!verify_refname_available_dir(2098 refname, extras, skip,2099get_loose_refs(refs), err))2100strbuf_addf(err,"unable to resolve reference '%s':%s",2101 refname,strerror(last_errno));21022103goto error_return;2104}21052106/*2107 * If the ref did not exist and we are creating it, make sure2108 * there is no existing packed ref whose name begins with our2109 * refname, nor a packed ref whose name is a proper prefix of2110 * our refname.2111 */2112if(is_null_oid(&lock->old_oid) &&2113verify_refname_available_dir(refname, extras, skip,2114get_packed_refs(refs),2115 err)) {2116 last_errno = ENOTDIR;2117goto error_return;2118}21192120 lock->lk =xcalloc(1,sizeof(struct lock_file));21212122 lock->ref_name =xstrdup(refname);21232124if(raceproof_create_file(ref_file.buf, create_reflock, lock->lk)) {2125 last_errno = errno;2126unable_to_lock_message(ref_file.buf, errno, err);2127goto error_return;2128}21292130if(verify_lock(lock, old_sha1, mustexist, err)) {2131 last_errno = errno;2132goto error_return;2133}2134goto out;21352136 error_return:2137unlock_ref(lock);2138 lock = NULL;21392140 out:2141strbuf_release(&ref_file);2142 errno = last_errno;2143return lock;2144}21452146/*2147 * Write an entry to the packed-refs file for the specified refname.2148 * If peeled is non-NULL, write it as the entry's peeled value.2149 */2150static voidwrite_packed_entry(FILE*fh,char*refname,unsigned char*sha1,2151unsigned char*peeled)2152{2153fprintf_or_die(fh,"%s %s\n",sha1_to_hex(sha1), refname);2154if(peeled)2155fprintf_or_die(fh,"^%s\n",sha1_to_hex(peeled));2156}21572158/*2159 * An each_ref_entry_fn that writes the entry to a packed-refs file.2160 */2161static intwrite_packed_entry_fn(struct ref_entry *entry,void*cb_data)2162{2163enum peel_status peel_status =peel_entry(entry,0);21642165if(peel_status != PEEL_PEELED && peel_status != PEEL_NON_TAG)2166error("internal error:%sis not a valid packed reference!",2167 entry->name);2168write_packed_entry(cb_data, entry->name, entry->u.value.oid.hash,2169 peel_status == PEEL_PEELED ?2170 entry->u.value.peeled.hash : NULL);2171return0;2172}21732174/*2175 * Lock the packed-refs file for writing. Flags is passed to2176 * hold_lock_file_for_update(). Return 0 on success. On errors, set2177 * errno appropriately and return a nonzero value.2178 */2179static intlock_packed_refs(struct files_ref_store *refs,int flags)2180{2181static int timeout_configured =0;2182static int timeout_value =1000;2183struct packed_ref_cache *packed_ref_cache;21842185files_assert_main_repository(refs,"lock_packed_refs");21862187if(!timeout_configured) {2188git_config_get_int("core.packedrefstimeout", &timeout_value);2189 timeout_configured =1;2190}21912192if(hold_lock_file_for_update_timeout(2193&packlock,files_packed_refs_path(refs),2194 flags, timeout_value) <0)2195return-1;2196/*2197 * Get the current packed-refs while holding the lock. If the2198 * packed-refs file has been modified since we last read it,2199 * this will automatically invalidate the cache and re-read2200 * the packed-refs file.2201 */2202 packed_ref_cache =get_packed_ref_cache(refs);2203 packed_ref_cache->lock = &packlock;2204/* Increment the reference count to prevent it from being freed: */2205acquire_packed_ref_cache(packed_ref_cache);2206return0;2207}22082209/*2210 * Write the current version of the packed refs cache from memory to2211 * disk. The packed-refs file must already be locked for writing (see2212 * lock_packed_refs()). Return zero on success. On errors, set errno2213 * and return a nonzero value2214 */2215static intcommit_packed_refs(struct files_ref_store *refs)2216{2217struct packed_ref_cache *packed_ref_cache =2218get_packed_ref_cache(refs);2219int error =0;2220int save_errno =0;2221FILE*out;22222223files_assert_main_repository(refs,"commit_packed_refs");22242225if(!packed_ref_cache->lock)2226die("internal error: packed-refs not locked");22272228 out =fdopen_lock_file(packed_ref_cache->lock,"w");2229if(!out)2230die_errno("unable to fdopen packed-refs descriptor");22312232fprintf_or_die(out,"%s", PACKED_REFS_HEADER);2233do_for_each_entry_in_dir(get_packed_ref_dir(packed_ref_cache),22340, write_packed_entry_fn, out);22352236if(commit_lock_file(packed_ref_cache->lock)) {2237 save_errno = errno;2238 error = -1;2239}2240 packed_ref_cache->lock = NULL;2241release_packed_ref_cache(packed_ref_cache);2242 errno = save_errno;2243return error;2244}22452246/*2247 * Rollback the lockfile for the packed-refs file, and discard the2248 * in-memory packed reference cache. (The packed-refs file will be2249 * read anew if it is needed again after this function is called.)2250 */2251static voidrollback_packed_refs(struct files_ref_store *refs)2252{2253struct packed_ref_cache *packed_ref_cache =2254get_packed_ref_cache(refs);22552256files_assert_main_repository(refs,"rollback_packed_refs");22572258if(!packed_ref_cache->lock)2259die("internal error: packed-refs not locked");2260rollback_lock_file(packed_ref_cache->lock);2261 packed_ref_cache->lock = NULL;2262release_packed_ref_cache(packed_ref_cache);2263clear_packed_ref_cache(refs);2264}22652266struct ref_to_prune {2267struct ref_to_prune *next;2268unsigned char sha1[20];2269char name[FLEX_ARRAY];2270};22712272struct pack_refs_cb_data {2273unsigned int flags;2274struct ref_dir *packed_refs;2275struct ref_to_prune *ref_to_prune;2276};22772278/*2279 * An each_ref_entry_fn that is run over loose references only. If2280 * the loose reference can be packed, add an entry in the packed ref2281 * cache. If the reference should be pruned, also add it to2282 * ref_to_prune in the pack_refs_cb_data.2283 */2284static intpack_if_possible_fn(struct ref_entry *entry,void*cb_data)2285{2286struct pack_refs_cb_data *cb = cb_data;2287enum peel_status peel_status;2288struct ref_entry *packed_entry;2289int is_tag_ref =starts_with(entry->name,"refs/tags/");22902291/* Do not pack per-worktree refs: */2292if(ref_type(entry->name) != REF_TYPE_NORMAL)2293return0;22942295/* ALWAYS pack tags */2296if(!(cb->flags & PACK_REFS_ALL) && !is_tag_ref)2297return0;22982299/* Do not pack symbolic or broken refs: */2300if((entry->flag & REF_ISSYMREF) || !entry_resolves_to_object(entry))2301return0;23022303/* Add a packed ref cache entry equivalent to the loose entry. */2304 peel_status =peel_entry(entry,1);2305if(peel_status != PEEL_PEELED && peel_status != PEEL_NON_TAG)2306die("internal error peeling reference%s(%s)",2307 entry->name,oid_to_hex(&entry->u.value.oid));2308 packed_entry =find_ref(cb->packed_refs, entry->name);2309if(packed_entry) {2310/* Overwrite existing packed entry with info from loose entry */2311 packed_entry->flag = REF_ISPACKED | REF_KNOWS_PEELED;2312oidcpy(&packed_entry->u.value.oid, &entry->u.value.oid);2313}else{2314 packed_entry =create_ref_entry(entry->name, entry->u.value.oid.hash,2315 REF_ISPACKED | REF_KNOWS_PEELED,0);2316add_ref(cb->packed_refs, packed_entry);2317}2318oidcpy(&packed_entry->u.value.peeled, &entry->u.value.peeled);23192320/* Schedule the loose reference for pruning if requested. */2321if((cb->flags & PACK_REFS_PRUNE)) {2322struct ref_to_prune *n;2323FLEX_ALLOC_STR(n, name, entry->name);2324hashcpy(n->sha1, entry->u.value.oid.hash);2325 n->next = cb->ref_to_prune;2326 cb->ref_to_prune = n;2327}2328return0;2329}23302331enum{2332 REMOVE_EMPTY_PARENTS_REF =0x01,2333 REMOVE_EMPTY_PARENTS_REFLOG =0x022334};23352336/*2337 * Remove empty parent directories associated with the specified2338 * reference and/or its reflog, but spare [logs/]refs/ and immediate2339 * subdirs. flags is a combination of REMOVE_EMPTY_PARENTS_REF and/or2340 * REMOVE_EMPTY_PARENTS_REFLOG.2341 */2342static voidtry_remove_empty_parents(struct files_ref_store *refs,2343const char*refname,2344unsigned int flags)2345{2346struct strbuf buf = STRBUF_INIT;2347struct strbuf sb = STRBUF_INIT;2348char*p, *q;2349int i;23502351strbuf_addstr(&buf, refname);2352 p = buf.buf;2353for(i =0; i <2; i++) {/* refs/{heads,tags,...}/ */2354while(*p && *p !='/')2355 p++;2356/* tolerate duplicate slashes; see check_refname_format() */2357while(*p =='/')2358 p++;2359}2360 q = buf.buf + buf.len;2361while(flags & (REMOVE_EMPTY_PARENTS_REF | REMOVE_EMPTY_PARENTS_REFLOG)) {2362while(q > p && *q !='/')2363 q--;2364while(q > p && *(q-1) =='/')2365 q--;2366if(q == p)2367break;2368strbuf_setlen(&buf, q - buf.buf);23692370strbuf_reset(&sb);2371files_ref_path(refs, &sb, buf.buf);2372if((flags & REMOVE_EMPTY_PARENTS_REF) &&rmdir(sb.buf))2373 flags &= ~REMOVE_EMPTY_PARENTS_REF;23742375strbuf_reset(&sb);2376files_reflog_path(refs, &sb, buf.buf);2377if((flags & REMOVE_EMPTY_PARENTS_REFLOG) &&rmdir(sb.buf))2378 flags &= ~REMOVE_EMPTY_PARENTS_REFLOG;2379}2380strbuf_release(&buf);2381strbuf_release(&sb);2382}23832384/* make sure nobody touched the ref, and unlink */2385static voidprune_ref(struct ref_to_prune *r)2386{2387struct ref_transaction *transaction;2388struct strbuf err = STRBUF_INIT;23892390if(check_refname_format(r->name,0))2391return;23922393 transaction =ref_transaction_begin(&err);2394if(!transaction ||2395ref_transaction_delete(transaction, r->name, r->sha1,2396 REF_ISPRUNING | REF_NODEREF, NULL, &err) ||2397ref_transaction_commit(transaction, &err)) {2398ref_transaction_free(transaction);2399error("%s", err.buf);2400strbuf_release(&err);2401return;2402}2403ref_transaction_free(transaction);2404strbuf_release(&err);2405}24062407static voidprune_refs(struct ref_to_prune *r)2408{2409while(r) {2410prune_ref(r);2411 r = r->next;2412}2413}24142415static intfiles_pack_refs(struct ref_store *ref_store,unsigned int flags)2416{2417struct files_ref_store *refs =2418files_downcast(ref_store,0,"pack_refs");2419struct pack_refs_cb_data cbdata;24202421memset(&cbdata,0,sizeof(cbdata));2422 cbdata.flags = flags;24232424lock_packed_refs(refs, LOCK_DIE_ON_ERROR);2425 cbdata.packed_refs =get_packed_refs(refs);24262427do_for_each_entry_in_dir(get_loose_refs(refs),0,2428 pack_if_possible_fn, &cbdata);24292430if(commit_packed_refs(refs))2431die_errno("unable to overwrite old ref-pack file");24322433prune_refs(cbdata.ref_to_prune);2434return0;2435}24362437/*2438 * Rewrite the packed-refs file, omitting any refs listed in2439 * 'refnames'. On error, leave packed-refs unchanged, write an error2440 * message to 'err', and return a nonzero value.2441 *2442 * The refs in 'refnames' needn't be sorted. `err` must not be NULL.2443 */2444static intrepack_without_refs(struct files_ref_store *refs,2445struct string_list *refnames,struct strbuf *err)2446{2447struct ref_dir *packed;2448struct string_list_item *refname;2449int ret, needs_repacking =0, removed =0;24502451files_assert_main_repository(refs,"repack_without_refs");2452assert(err);24532454/* Look for a packed ref */2455for_each_string_list_item(refname, refnames) {2456if(get_packed_ref(refs, refname->string)) {2457 needs_repacking =1;2458break;2459}2460}24612462/* Avoid locking if we have nothing to do */2463if(!needs_repacking)2464return0;/* no refname exists in packed refs */24652466if(lock_packed_refs(refs,0)) {2467unable_to_lock_message(files_packed_refs_path(refs), errno, err);2468return-1;2469}2470 packed =get_packed_refs(refs);24712472/* Remove refnames from the cache */2473for_each_string_list_item(refname, refnames)2474if(remove_entry(packed, refname->string) != -1)2475 removed =1;2476if(!removed) {2477/*2478 * All packed entries disappeared while we were2479 * acquiring the lock.2480 */2481rollback_packed_refs(refs);2482return0;2483}24842485/* Write what remains */2486 ret =commit_packed_refs(refs);2487if(ret)2488strbuf_addf(err,"unable to overwrite old ref-pack file:%s",2489strerror(errno));2490return ret;2491}24922493static intfiles_delete_refs(struct ref_store *ref_store,2494struct string_list *refnames,unsigned int flags)2495{2496struct files_ref_store *refs =2497files_downcast(ref_store,0,"delete_refs");2498struct strbuf err = STRBUF_INIT;2499int i, result =0;25002501if(!refnames->nr)2502return0;25032504 result =repack_without_refs(refs, refnames, &err);2505if(result) {2506/*2507 * If we failed to rewrite the packed-refs file, then2508 * it is unsafe to try to remove loose refs, because2509 * doing so might expose an obsolete packed value for2510 * a reference that might even point at an object that2511 * has been garbage collected.2512 */2513if(refnames->nr ==1)2514error(_("could not delete reference%s:%s"),2515 refnames->items[0].string, err.buf);2516else2517error(_("could not delete references:%s"), err.buf);25182519goto out;2520}25212522for(i =0; i < refnames->nr; i++) {2523const char*refname = refnames->items[i].string;25242525if(delete_ref(NULL, refname, NULL, flags))2526 result |=error(_("could not remove reference%s"), refname);2527}25282529out:2530strbuf_release(&err);2531return result;2532}25332534/*2535 * People using contrib's git-new-workdir have .git/logs/refs ->2536 * /some/other/path/.git/logs/refs, and that may live on another device.2537 *2538 * IOW, to avoid cross device rename errors, the temporary renamed log must2539 * live into logs/refs.2540 */2541#define TMP_RENAMED_LOG"refs/.tmp-renamed-log"25422543struct rename_cb {2544const char*tmp_renamed_log;2545int true_errno;2546};25472548static intrename_tmp_log_callback(const char*path,void*cb_data)2549{2550struct rename_cb *cb = cb_data;25512552if(rename(cb->tmp_renamed_log, path)) {2553/*2554 * rename(a, b) when b is an existing directory ought2555 * to result in ISDIR, but Solaris 5.8 gives ENOTDIR.2556 * Sheesh. Record the true errno for error reporting,2557 * but report EISDIR to raceproof_create_file() so2558 * that it knows to retry.2559 */2560 cb->true_errno = errno;2561if(errno == ENOTDIR)2562 errno = EISDIR;2563return-1;2564}else{2565return0;2566}2567}25682569static intrename_tmp_log(struct files_ref_store *refs,const char*newrefname)2570{2571struct strbuf path = STRBUF_INIT;2572struct strbuf tmp = STRBUF_INIT;2573struct rename_cb cb;2574int ret;25752576files_reflog_path(refs, &path, newrefname);2577files_reflog_path(refs, &tmp, TMP_RENAMED_LOG);2578 cb.tmp_renamed_log = tmp.buf;2579 ret =raceproof_create_file(path.buf, rename_tmp_log_callback, &cb);2580if(ret) {2581if(errno == EISDIR)2582error("directory not empty:%s", path.buf);2583else2584error("unable to move logfile%sto%s:%s",2585 tmp.buf, path.buf,2586strerror(cb.true_errno));2587}25882589strbuf_release(&path);2590strbuf_release(&tmp);2591return ret;2592}25932594static intfiles_verify_refname_available(struct ref_store *ref_store,2595const char*newname,2596const struct string_list *extras,2597const struct string_list *skip,2598struct strbuf *err)2599{2600struct files_ref_store *refs =2601files_downcast(ref_store,1,"verify_refname_available");2602struct ref_dir *packed_refs =get_packed_refs(refs);2603struct ref_dir *loose_refs =get_loose_refs(refs);26042605if(verify_refname_available_dir(newname, extras, skip,2606 packed_refs, err) ||2607verify_refname_available_dir(newname, extras, skip,2608 loose_refs, err))2609return-1;26102611return0;2612}26132614static intwrite_ref_to_lockfile(struct ref_lock *lock,2615const unsigned char*sha1,struct strbuf *err);2616static intcommit_ref_update(struct files_ref_store *refs,2617struct ref_lock *lock,2618const unsigned char*sha1,const char*logmsg,2619struct strbuf *err);26202621static intfiles_rename_ref(struct ref_store *ref_store,2622const char*oldrefname,const char*newrefname,2623const char*logmsg)2624{2625struct files_ref_store *refs =2626files_downcast(ref_store,0,"rename_ref");2627unsigned char sha1[20], orig_sha1[20];2628int flag =0, logmoved =0;2629struct ref_lock *lock;2630struct stat loginfo;2631struct strbuf sb_oldref = STRBUF_INIT;2632struct strbuf sb_newref = STRBUF_INIT;2633struct strbuf tmp_renamed_log = STRBUF_INIT;2634int log, ret;2635struct strbuf err = STRBUF_INIT;26362637files_reflog_path(refs, &sb_oldref, oldrefname);2638files_reflog_path(refs, &sb_newref, newrefname);2639files_reflog_path(refs, &tmp_renamed_log, TMP_RENAMED_LOG);26402641 log = !lstat(sb_oldref.buf, &loginfo);2642if(log &&S_ISLNK(loginfo.st_mode)) {2643 ret =error("reflog for%sis a symlink", oldrefname);2644goto out;2645}26462647if(!resolve_ref_unsafe(oldrefname, RESOLVE_REF_READING | RESOLVE_REF_NO_RECURSE,2648 orig_sha1, &flag)) {2649 ret =error("refname%snot found", oldrefname);2650goto out;2651}26522653if(flag & REF_ISSYMREF) {2654 ret =error("refname%sis a symbolic ref, renaming it is not supported",2655 oldrefname);2656goto out;2657}2658if(!rename_ref_available(oldrefname, newrefname)) {2659 ret =1;2660goto out;2661}26622663if(log &&rename(sb_oldref.buf, tmp_renamed_log.buf)) {2664 ret =error("unable to move logfile logs/%sto logs/"TMP_RENAMED_LOG":%s",2665 oldrefname,strerror(errno));2666goto out;2667}26682669if(delete_ref(logmsg, oldrefname, orig_sha1, REF_NODEREF)) {2670error("unable to delete old%s", oldrefname);2671goto rollback;2672}26732674/*2675 * Since we are doing a shallow lookup, sha1 is not the2676 * correct value to pass to delete_ref as old_sha1. But that2677 * doesn't matter, because an old_sha1 check wouldn't add to2678 * the safety anyway; we want to delete the reference whatever2679 * its current value.2680 */2681if(!read_ref_full(newrefname, RESOLVE_REF_READING | RESOLVE_REF_NO_RECURSE,2682 sha1, NULL) &&2683delete_ref(NULL, newrefname, NULL, REF_NODEREF)) {2684if(errno == EISDIR) {2685struct strbuf path = STRBUF_INIT;2686int result;26872688files_ref_path(refs, &path, newrefname);2689 result =remove_empty_directories(&path);2690strbuf_release(&path);26912692if(result) {2693error("Directory not empty:%s", newrefname);2694goto rollback;2695}2696}else{2697error("unable to delete existing%s", newrefname);2698goto rollback;2699}2700}27012702if(log &&rename_tmp_log(refs, newrefname))2703goto rollback;27042705 logmoved = log;27062707 lock =lock_ref_sha1_basic(refs, newrefname, NULL, NULL, NULL,2708 REF_NODEREF, NULL, &err);2709if(!lock) {2710error("unable to rename '%s' to '%s':%s", oldrefname, newrefname, err.buf);2711strbuf_release(&err);2712goto rollback;2713}2714hashcpy(lock->old_oid.hash, orig_sha1);27152716if(write_ref_to_lockfile(lock, orig_sha1, &err) ||2717commit_ref_update(refs, lock, orig_sha1, logmsg, &err)) {2718error("unable to write current sha1 into%s:%s", newrefname, err.buf);2719strbuf_release(&err);2720goto rollback;2721}27222723 ret =0;2724goto out;27252726 rollback:2727 lock =lock_ref_sha1_basic(refs, oldrefname, NULL, NULL, NULL,2728 REF_NODEREF, NULL, &err);2729if(!lock) {2730error("unable to lock%sfor rollback:%s", oldrefname, err.buf);2731strbuf_release(&err);2732goto rollbacklog;2733}27342735 flag = log_all_ref_updates;2736 log_all_ref_updates = LOG_REFS_NONE;2737if(write_ref_to_lockfile(lock, orig_sha1, &err) ||2738commit_ref_update(refs, lock, orig_sha1, NULL, &err)) {2739error("unable to write current sha1 into%s:%s", oldrefname, err.buf);2740strbuf_release(&err);2741}2742 log_all_ref_updates = flag;27432744 rollbacklog:2745if(logmoved &&rename(sb_newref.buf, sb_oldref.buf))2746error("unable to restore logfile%sfrom%s:%s",2747 oldrefname, newrefname,strerror(errno));2748if(!logmoved && log &&2749rename(tmp_renamed_log.buf, sb_oldref.buf))2750error("unable to restore logfile%sfrom logs/"TMP_RENAMED_LOG":%s",2751 oldrefname,strerror(errno));2752 ret =1;2753 out:2754strbuf_release(&sb_newref);2755strbuf_release(&sb_oldref);2756strbuf_release(&tmp_renamed_log);27572758return ret;2759}27602761static intclose_ref(struct ref_lock *lock)2762{2763if(close_lock_file(lock->lk))2764return-1;2765return0;2766}27672768static intcommit_ref(struct ref_lock *lock)2769{2770char*path =get_locked_file_path(lock->lk);2771struct stat st;27722773if(!lstat(path, &st) &&S_ISDIR(st.st_mode)) {2774/*2775 * There is a directory at the path we want to rename2776 * the lockfile to. Hopefully it is empty; try to2777 * delete it.2778 */2779size_t len =strlen(path);2780struct strbuf sb_path = STRBUF_INIT;27812782strbuf_attach(&sb_path, path, len, len);27832784/*2785 * If this fails, commit_lock_file() will also fail2786 * and will report the problem.2787 */2788remove_empty_directories(&sb_path);2789strbuf_release(&sb_path);2790}else{2791free(path);2792}27932794if(commit_lock_file(lock->lk))2795return-1;2796return0;2797}27982799static intopen_or_create_logfile(const char*path,void*cb)2800{2801int*fd = cb;28022803*fd =open(path, O_APPEND | O_WRONLY | O_CREAT,0666);2804return(*fd <0) ? -1:0;2805}28062807/*2808 * Create a reflog for a ref. If force_create = 0, only create the2809 * reflog for certain refs (those for which should_autocreate_reflog2810 * returns non-zero). Otherwise, create it regardless of the reference2811 * name. If the logfile already existed or was created, return 0 and2812 * set *logfd to the file descriptor opened for appending to the file.2813 * If no logfile exists and we decided not to create one, return 0 and2814 * set *logfd to -1. On failure, fill in *err, set *logfd to -1, and2815 * return -1.2816 */2817static intlog_ref_setup(struct files_ref_store *refs,2818const char*refname,int force_create,2819int*logfd,struct strbuf *err)2820{2821struct strbuf logfile_sb = STRBUF_INIT;2822char*logfile;28232824files_reflog_path(refs, &logfile_sb, refname);2825 logfile =strbuf_detach(&logfile_sb, NULL);28262827if(force_create ||should_autocreate_reflog(refname)) {2828if(raceproof_create_file(logfile, open_or_create_logfile, logfd)) {2829if(errno == ENOENT)2830strbuf_addf(err,"unable to create directory for '%s': "2831"%s", logfile,strerror(errno));2832else if(errno == EISDIR)2833strbuf_addf(err,"there are still logs under '%s'",2834 logfile);2835else2836strbuf_addf(err,"unable to append to '%s':%s",2837 logfile,strerror(errno));28382839goto error;2840}2841}else{2842*logfd =open(logfile, O_APPEND | O_WRONLY,0666);2843if(*logfd <0) {2844if(errno == ENOENT || errno == EISDIR) {2845/*2846 * The logfile doesn't already exist,2847 * but that is not an error; it only2848 * means that we won't write log2849 * entries to it.2850 */2851;2852}else{2853strbuf_addf(err,"unable to append to '%s':%s",2854 logfile,strerror(errno));2855goto error;2856}2857}2858}28592860if(*logfd >=0)2861adjust_shared_perm(logfile);28622863free(logfile);2864return0;28652866error:2867free(logfile);2868return-1;2869}28702871static intfiles_create_reflog(struct ref_store *ref_store,2872const char*refname,int force_create,2873struct strbuf *err)2874{2875struct files_ref_store *refs =2876files_downcast(ref_store,0,"create_reflog");2877int fd;28782879if(log_ref_setup(refs, refname, force_create, &fd, err))2880return-1;28812882if(fd >=0)2883close(fd);28842885return0;2886}28872888static intlog_ref_write_fd(int fd,const unsigned char*old_sha1,2889const unsigned char*new_sha1,2890const char*committer,const char*msg)2891{2892int msglen, written;2893unsigned maxlen, len;2894char*logrec;28952896 msglen = msg ?strlen(msg) :0;2897 maxlen =strlen(committer) + msglen +100;2898 logrec =xmalloc(maxlen);2899 len =xsnprintf(logrec, maxlen,"%s %s %s\n",2900sha1_to_hex(old_sha1),2901sha1_to_hex(new_sha1),2902 committer);2903if(msglen)2904 len +=copy_reflog_msg(logrec + len -1, msg) -1;29052906 written = len <= maxlen ?write_in_full(fd, logrec, len) : -1;2907free(logrec);2908if(written != len)2909return-1;29102911return0;2912}29132914static intfiles_log_ref_write(struct files_ref_store *refs,2915const char*refname,const unsigned char*old_sha1,2916const unsigned char*new_sha1,const char*msg,2917int flags,struct strbuf *err)2918{2919int logfd, result;29202921if(log_all_ref_updates == LOG_REFS_UNSET)2922 log_all_ref_updates =is_bare_repository() ? LOG_REFS_NONE : LOG_REFS_NORMAL;29232924 result =log_ref_setup(refs, refname,2925 flags & REF_FORCE_CREATE_REFLOG,2926&logfd, err);29272928if(result)2929return result;29302931if(logfd <0)2932return0;2933 result =log_ref_write_fd(logfd, old_sha1, new_sha1,2934git_committer_info(0), msg);2935if(result) {2936struct strbuf sb = STRBUF_INIT;2937int save_errno = errno;29382939files_reflog_path(refs, &sb, refname);2940strbuf_addf(err,"unable to append to '%s':%s",2941 sb.buf,strerror(save_errno));2942strbuf_release(&sb);2943close(logfd);2944return-1;2945}2946if(close(logfd)) {2947struct strbuf sb = STRBUF_INIT;2948int save_errno = errno;29492950files_reflog_path(refs, &sb, refname);2951strbuf_addf(err,"unable to append to '%s':%s",2952 sb.buf,strerror(save_errno));2953strbuf_release(&sb);2954return-1;2955}2956return0;2957}29582959/*2960 * Write sha1 into the open lockfile, then close the lockfile. On2961 * errors, rollback the lockfile, fill in *err and2962 * return -1.2963 */2964static intwrite_ref_to_lockfile(struct ref_lock *lock,2965const unsigned char*sha1,struct strbuf *err)2966{2967static char term ='\n';2968struct object *o;2969int fd;29702971 o =parse_object(sha1);2972if(!o) {2973strbuf_addf(err,2974"trying to write ref '%s' with nonexistent object%s",2975 lock->ref_name,sha1_to_hex(sha1));2976unlock_ref(lock);2977return-1;2978}2979if(o->type != OBJ_COMMIT &&is_branch(lock->ref_name)) {2980strbuf_addf(err,2981"trying to write non-commit object%sto branch '%s'",2982sha1_to_hex(sha1), lock->ref_name);2983unlock_ref(lock);2984return-1;2985}2986 fd =get_lock_file_fd(lock->lk);2987if(write_in_full(fd,sha1_to_hex(sha1),40) !=40||2988write_in_full(fd, &term,1) !=1||2989close_ref(lock) <0) {2990strbuf_addf(err,2991"couldn't write '%s'",get_lock_file_path(lock->lk));2992unlock_ref(lock);2993return-1;2994}2995return0;2996}29972998/*2999 * Commit a change to a loose reference that has already been written3000 * to the loose reference lockfile. Also update the reflogs if3001 * necessary, using the specified lockmsg (which can be NULL).3002 */3003static intcommit_ref_update(struct files_ref_store *refs,3004struct ref_lock *lock,3005const unsigned char*sha1,const char*logmsg,3006struct strbuf *err)3007{3008files_assert_main_repository(refs,"commit_ref_update");30093010clear_loose_ref_cache(refs);3011if(files_log_ref_write(refs, lock->ref_name,3012 lock->old_oid.hash, sha1,3013 logmsg,0, err)) {3014char*old_msg =strbuf_detach(err, NULL);3015strbuf_addf(err,"cannot update the ref '%s':%s",3016 lock->ref_name, old_msg);3017free(old_msg);3018unlock_ref(lock);3019return-1;3020}30213022if(strcmp(lock->ref_name,"HEAD") !=0) {3023/*3024 * Special hack: If a branch is updated directly and HEAD3025 * points to it (may happen on the remote side of a push3026 * for example) then logically the HEAD reflog should be3027 * updated too.3028 * A generic solution implies reverse symref information,3029 * but finding all symrefs pointing to the given branch3030 * would be rather costly for this rare event (the direct3031 * update of a branch) to be worth it. So let's cheat and3032 * check with HEAD only which should cover 99% of all usage3033 * scenarios (even 100% of the default ones).3034 */3035unsigned char head_sha1[20];3036int head_flag;3037const char*head_ref;30383039 head_ref =resolve_ref_unsafe("HEAD", RESOLVE_REF_READING,3040 head_sha1, &head_flag);3041if(head_ref && (head_flag & REF_ISSYMREF) &&3042!strcmp(head_ref, lock->ref_name)) {3043struct strbuf log_err = STRBUF_INIT;3044if(files_log_ref_write(refs,"HEAD",3045 lock->old_oid.hash, sha1,3046 logmsg,0, &log_err)) {3047error("%s", log_err.buf);3048strbuf_release(&log_err);3049}3050}3051}30523053if(commit_ref(lock)) {3054strbuf_addf(err,"couldn't set '%s'", lock->ref_name);3055unlock_ref(lock);3056return-1;3057}30583059unlock_ref(lock);3060return0;3061}30623063static intcreate_ref_symlink(struct ref_lock *lock,const char*target)3064{3065int ret = -1;3066#ifndef NO_SYMLINK_HEAD3067char*ref_path =get_locked_file_path(lock->lk);3068unlink(ref_path);3069 ret =symlink(target, ref_path);3070free(ref_path);30713072if(ret)3073fprintf(stderr,"no symlink - falling back to symbolic ref\n");3074#endif3075return ret;3076}30773078static voidupdate_symref_reflog(struct files_ref_store *refs,3079struct ref_lock *lock,const char*refname,3080const char*target,const char*logmsg)3081{3082struct strbuf err = STRBUF_INIT;3083unsigned char new_sha1[20];3084if(logmsg && !read_ref(target, new_sha1) &&3085files_log_ref_write(refs, refname, lock->old_oid.hash,3086 new_sha1, logmsg,0, &err)) {3087error("%s", err.buf);3088strbuf_release(&err);3089}3090}30913092static intcreate_symref_locked(struct files_ref_store *refs,3093struct ref_lock *lock,const char*refname,3094const char*target,const char*logmsg)3095{3096if(prefer_symlink_refs && !create_ref_symlink(lock, target)) {3097update_symref_reflog(refs, lock, refname, target, logmsg);3098return0;3099}31003101if(!fdopen_lock_file(lock->lk,"w"))3102returnerror("unable to fdopen%s:%s",3103 lock->lk->tempfile.filename.buf,strerror(errno));31043105update_symref_reflog(refs, lock, refname, target, logmsg);31063107/* no error check; commit_ref will check ferror */3108fprintf(lock->lk->tempfile.fp,"ref:%s\n", target);3109if(commit_ref(lock) <0)3110returnerror("unable to write symref for%s:%s", refname,3111strerror(errno));3112return0;3113}31143115static intfiles_create_symref(struct ref_store *ref_store,3116const char*refname,const char*target,3117const char*logmsg)3118{3119struct files_ref_store *refs =3120files_downcast(ref_store,0,"create_symref");3121struct strbuf err = STRBUF_INIT;3122struct ref_lock *lock;3123int ret;31243125 lock =lock_ref_sha1_basic(refs, refname, NULL,3126 NULL, NULL, REF_NODEREF, NULL,3127&err);3128if(!lock) {3129error("%s", err.buf);3130strbuf_release(&err);3131return-1;3132}31333134 ret =create_symref_locked(refs, lock, refname, target, logmsg);3135unlock_ref(lock);3136return ret;3137}31383139intset_worktree_head_symref(const char*gitdir,const char*target,const char*logmsg)3140{3141/*3142 * FIXME: this obviously will not work well for future refs3143 * backends. This function needs to die.3144 */3145struct files_ref_store *refs =3146files_downcast(get_main_ref_store(),0,"set_head_symref");31473148static struct lock_file head_lock;3149struct ref_lock *lock;3150struct strbuf head_path = STRBUF_INIT;3151const char*head_rel;3152int ret;31533154strbuf_addf(&head_path,"%s/HEAD",absolute_path(gitdir));3155if(hold_lock_file_for_update(&head_lock, head_path.buf,3156 LOCK_NO_DEREF) <0) {3157struct strbuf err = STRBUF_INIT;3158unable_to_lock_message(head_path.buf, errno, &err);3159error("%s", err.buf);3160strbuf_release(&err);3161strbuf_release(&head_path);3162return-1;3163}31643165/* head_rel will be "HEAD" for the main tree, "worktrees/wt/HEAD" for3166 linked trees */3167 head_rel =remove_leading_path(head_path.buf,3168absolute_path(get_git_common_dir()));3169/* to make use of create_symref_locked(), initialize ref_lock */3170 lock =xcalloc(1,sizeof(struct ref_lock));3171 lock->lk = &head_lock;3172 lock->ref_name =xstrdup(head_rel);31733174 ret =create_symref_locked(refs, lock, head_rel, target, logmsg);31753176unlock_ref(lock);/* will free lock */3177strbuf_release(&head_path);3178return ret;3179}31803181static intfiles_reflog_exists(struct ref_store *ref_store,3182const char*refname)3183{3184struct files_ref_store *refs =3185files_downcast(ref_store,0,"reflog_exists");3186struct strbuf sb = STRBUF_INIT;3187struct stat st;3188int ret;31893190files_reflog_path(refs, &sb, refname);3191 ret = !lstat(sb.buf, &st) &&S_ISREG(st.st_mode);3192strbuf_release(&sb);3193return ret;3194}31953196static intfiles_delete_reflog(struct ref_store *ref_store,3197const char*refname)3198{3199struct files_ref_store *refs =3200files_downcast(ref_store,0,"delete_reflog");3201struct strbuf sb = STRBUF_INIT;3202int ret;32033204files_reflog_path(refs, &sb, refname);3205 ret =remove_path(sb.buf);3206strbuf_release(&sb);3207return ret;3208}32093210static intshow_one_reflog_ent(struct strbuf *sb, each_reflog_ent_fn fn,void*cb_data)3211{3212struct object_id ooid, noid;3213char*email_end, *message;3214unsigned long timestamp;3215int tz;3216const char*p = sb->buf;32173218/* old SP new SP name <email> SP time TAB msg LF */3219if(!sb->len || sb->buf[sb->len -1] !='\n'||3220parse_oid_hex(p, &ooid, &p) || *p++ !=' '||3221parse_oid_hex(p, &noid, &p) || *p++ !=' '||3222!(email_end =strchr(p,'>')) ||3223 email_end[1] !=' '||3224!(timestamp =strtoul(email_end +2, &message,10)) ||3225!message || message[0] !=' '||3226(message[1] !='+'&& message[1] !='-') ||3227!isdigit(message[2]) || !isdigit(message[3]) ||3228!isdigit(message[4]) || !isdigit(message[5]))3229return0;/* corrupt? */3230 email_end[1] ='\0';3231 tz =strtol(message +1, NULL,10);3232if(message[6] !='\t')3233 message +=6;3234else3235 message +=7;3236returnfn(&ooid, &noid, p, timestamp, tz, message, cb_data);3237}32383239static char*find_beginning_of_line(char*bob,char*scan)3240{3241while(bob < scan && *(--scan) !='\n')3242;/* keep scanning backwards */3243/*3244 * Return either beginning of the buffer, or LF at the end of3245 * the previous line.3246 */3247return scan;3248}32493250static intfiles_for_each_reflog_ent_reverse(struct ref_store *ref_store,3251const char*refname,3252 each_reflog_ent_fn fn,3253void*cb_data)3254{3255struct files_ref_store *refs =3256files_downcast(ref_store,0,"for_each_reflog_ent_reverse");3257struct strbuf sb = STRBUF_INIT;3258FILE*logfp;3259long pos;3260int ret =0, at_tail =1;32613262files_reflog_path(refs, &sb, refname);3263 logfp =fopen(sb.buf,"r");3264strbuf_release(&sb);3265if(!logfp)3266return-1;32673268/* Jump to the end */3269if(fseek(logfp,0, SEEK_END) <0)3270returnerror("cannot seek back reflog for%s:%s",3271 refname,strerror(errno));3272 pos =ftell(logfp);3273while(!ret &&0< pos) {3274int cnt;3275size_t nread;3276char buf[BUFSIZ];3277char*endp, *scanp;32783279/* Fill next block from the end */3280 cnt = (sizeof(buf) < pos) ?sizeof(buf) : pos;3281if(fseek(logfp, pos - cnt, SEEK_SET))3282returnerror("cannot seek back reflog for%s:%s",3283 refname,strerror(errno));3284 nread =fread(buf, cnt,1, logfp);3285if(nread !=1)3286returnerror("cannot read%dbytes from reflog for%s:%s",3287 cnt, refname,strerror(errno));3288 pos -= cnt;32893290 scanp = endp = buf + cnt;3291if(at_tail && scanp[-1] =='\n')3292/* Looking at the final LF at the end of the file */3293 scanp--;3294 at_tail =0;32953296while(buf < scanp) {3297/*3298 * terminating LF of the previous line, or the beginning3299 * of the buffer.3300 */3301char*bp;33023303 bp =find_beginning_of_line(buf, scanp);33043305if(*bp =='\n') {3306/*3307 * The newline is the end of the previous line,3308 * so we know we have complete line starting3309 * at (bp + 1). Prefix it onto any prior data3310 * we collected for the line and process it.3311 */3312strbuf_splice(&sb,0,0, bp +1, endp - (bp +1));3313 scanp = bp;3314 endp = bp +1;3315 ret =show_one_reflog_ent(&sb, fn, cb_data);3316strbuf_reset(&sb);3317if(ret)3318break;3319}else if(!pos) {3320/*3321 * We are at the start of the buffer, and the3322 * start of the file; there is no previous3323 * line, and we have everything for this one.3324 * Process it, and we can end the loop.3325 */3326strbuf_splice(&sb,0,0, buf, endp - buf);3327 ret =show_one_reflog_ent(&sb, fn, cb_data);3328strbuf_reset(&sb);3329break;3330}33313332if(bp == buf) {3333/*3334 * We are at the start of the buffer, and there3335 * is more file to read backwards. Which means3336 * we are in the middle of a line. Note that we3337 * may get here even if *bp was a newline; that3338 * just means we are at the exact end of the3339 * previous line, rather than some spot in the3340 * middle.3341 *3342 * Save away what we have to be combined with3343 * the data from the next read.3344 */3345strbuf_splice(&sb,0,0, buf, endp - buf);3346break;3347}3348}33493350}3351if(!ret && sb.len)3352die("BUG: reverse reflog parser had leftover data");33533354fclose(logfp);3355strbuf_release(&sb);3356return ret;3357}33583359static intfiles_for_each_reflog_ent(struct ref_store *ref_store,3360const char*refname,3361 each_reflog_ent_fn fn,void*cb_data)3362{3363struct files_ref_store *refs =3364files_downcast(ref_store,0,"for_each_reflog_ent");3365FILE*logfp;3366struct strbuf sb = STRBUF_INIT;3367int ret =0;33683369files_reflog_path(refs, &sb, refname);3370 logfp =fopen(sb.buf,"r");3371strbuf_release(&sb);3372if(!logfp)3373return-1;33743375while(!ret && !strbuf_getwholeline(&sb, logfp,'\n'))3376 ret =show_one_reflog_ent(&sb, fn, cb_data);3377fclose(logfp);3378strbuf_release(&sb);3379return ret;3380}33813382struct files_reflog_iterator {3383struct ref_iterator base;33843385struct dir_iterator *dir_iterator;3386struct object_id oid;3387};33883389static intfiles_reflog_iterator_advance(struct ref_iterator *ref_iterator)3390{3391struct files_reflog_iterator *iter =3392(struct files_reflog_iterator *)ref_iterator;3393struct dir_iterator *diter = iter->dir_iterator;3394int ok;33953396while((ok =dir_iterator_advance(diter)) == ITER_OK) {3397int flags;33983399if(!S_ISREG(diter->st.st_mode))3400continue;3401if(diter->basename[0] =='.')3402continue;3403if(ends_with(diter->basename,".lock"))3404continue;34053406if(read_ref_full(diter->relative_path,0,3407 iter->oid.hash, &flags)) {3408error("bad ref for%s", diter->path.buf);3409continue;3410}34113412 iter->base.refname = diter->relative_path;3413 iter->base.oid = &iter->oid;3414 iter->base.flags = flags;3415return ITER_OK;3416}34173418 iter->dir_iterator = NULL;3419if(ref_iterator_abort(ref_iterator) == ITER_ERROR)3420 ok = ITER_ERROR;3421return ok;3422}34233424static intfiles_reflog_iterator_peel(struct ref_iterator *ref_iterator,3425struct object_id *peeled)3426{3427die("BUG: ref_iterator_peel() called for reflog_iterator");3428}34293430static intfiles_reflog_iterator_abort(struct ref_iterator *ref_iterator)3431{3432struct files_reflog_iterator *iter =3433(struct files_reflog_iterator *)ref_iterator;3434int ok = ITER_DONE;34353436if(iter->dir_iterator)3437 ok =dir_iterator_abort(iter->dir_iterator);34383439base_ref_iterator_free(ref_iterator);3440return ok;3441}34423443static struct ref_iterator_vtable files_reflog_iterator_vtable = {3444 files_reflog_iterator_advance,3445 files_reflog_iterator_peel,3446 files_reflog_iterator_abort3447};34483449static struct ref_iterator *files_reflog_iterator_begin(struct ref_store *ref_store)3450{3451struct files_ref_store *refs =3452files_downcast(ref_store,0,"reflog_iterator_begin");3453struct files_reflog_iterator *iter =xcalloc(1,sizeof(*iter));3454struct ref_iterator *ref_iterator = &iter->base;3455struct strbuf sb = STRBUF_INIT;34563457base_ref_iterator_init(ref_iterator, &files_reflog_iterator_vtable);3458files_reflog_path(refs, &sb, NULL);3459 iter->dir_iterator =dir_iterator_begin(sb.buf);3460strbuf_release(&sb);3461return ref_iterator;3462}34633464static intref_update_reject_duplicates(struct string_list *refnames,3465struct strbuf *err)3466{3467int i, n = refnames->nr;34683469assert(err);34703471for(i =1; i < n; i++)3472if(!strcmp(refnames->items[i -1].string, refnames->items[i].string)) {3473strbuf_addf(err,3474"multiple updates for ref '%s' not allowed.",3475 refnames->items[i].string);3476return1;3477}3478return0;3479}34803481/*3482 * If update is a direct update of head_ref (the reference pointed to3483 * by HEAD), then add an extra REF_LOG_ONLY update for HEAD.3484 */3485static intsplit_head_update(struct ref_update *update,3486struct ref_transaction *transaction,3487const char*head_ref,3488struct string_list *affected_refnames,3489struct strbuf *err)3490{3491struct string_list_item *item;3492struct ref_update *new_update;34933494if((update->flags & REF_LOG_ONLY) ||3495(update->flags & REF_ISPRUNING) ||3496(update->flags & REF_UPDATE_VIA_HEAD))3497return0;34983499if(strcmp(update->refname, head_ref))3500return0;35013502/*3503 * First make sure that HEAD is not already in the3504 * transaction. This insertion is O(N) in the transaction3505 * size, but it happens at most once per transaction.3506 */3507 item =string_list_insert(affected_refnames,"HEAD");3508if(item->util) {3509/* An entry already existed */3510strbuf_addf(err,3511"multiple updates for 'HEAD' (including one "3512"via its referent '%s') are not allowed",3513 update->refname);3514return TRANSACTION_NAME_CONFLICT;3515}35163517 new_update =ref_transaction_add_update(3518 transaction,"HEAD",3519 update->flags | REF_LOG_ONLY | REF_NODEREF,3520 update->new_sha1, update->old_sha1,3521 update->msg);35223523 item->util = new_update;35243525return0;3526}35273528/*3529 * update is for a symref that points at referent and doesn't have3530 * REF_NODEREF set. Split it into two updates:3531 * - The original update, but with REF_LOG_ONLY and REF_NODEREF set3532 * - A new, separate update for the referent reference3533 * Note that the new update will itself be subject to splitting when3534 * the iteration gets to it.3535 */3536static intsplit_symref_update(struct files_ref_store *refs,3537struct ref_update *update,3538const char*referent,3539struct ref_transaction *transaction,3540struct string_list *affected_refnames,3541struct strbuf *err)3542{3543struct string_list_item *item;3544struct ref_update *new_update;3545unsigned int new_flags;35463547/*3548 * First make sure that referent is not already in the3549 * transaction. This insertion is O(N) in the transaction3550 * size, but it happens at most once per symref in a3551 * transaction.3552 */3553 item =string_list_insert(affected_refnames, referent);3554if(item->util) {3555/* An entry already existed */3556strbuf_addf(err,3557"multiple updates for '%s' (including one "3558"via symref '%s') are not allowed",3559 referent, update->refname);3560return TRANSACTION_NAME_CONFLICT;3561}35623563 new_flags = update->flags;3564if(!strcmp(update->refname,"HEAD")) {3565/*3566 * Record that the new update came via HEAD, so that3567 * when we process it, split_head_update() doesn't try3568 * to add another reflog update for HEAD. Note that3569 * this bit will be propagated if the new_update3570 * itself needs to be split.3571 */3572 new_flags |= REF_UPDATE_VIA_HEAD;3573}35743575 new_update =ref_transaction_add_update(3576 transaction, referent, new_flags,3577 update->new_sha1, update->old_sha1,3578 update->msg);35793580 new_update->parent_update = update;35813582/*3583 * Change the symbolic ref update to log only. Also, it3584 * doesn't need to check its old SHA-1 value, as that will be3585 * done when new_update is processed.3586 */3587 update->flags |= REF_LOG_ONLY | REF_NODEREF;3588 update->flags &= ~REF_HAVE_OLD;35893590 item->util = new_update;35913592return0;3593}35943595/*3596 * Return the refname under which update was originally requested.3597 */3598static const char*original_update_refname(struct ref_update *update)3599{3600while(update->parent_update)3601 update = update->parent_update;36023603return update->refname;3604}36053606/*3607 * Check whether the REF_HAVE_OLD and old_oid values stored in update3608 * are consistent with oid, which is the reference's current value. If3609 * everything is OK, return 0; otherwise, write an error message to3610 * err and return -1.3611 */3612static intcheck_old_oid(struct ref_update *update,struct object_id *oid,3613struct strbuf *err)3614{3615if(!(update->flags & REF_HAVE_OLD) ||3616!hashcmp(oid->hash, update->old_sha1))3617return0;36183619if(is_null_sha1(update->old_sha1))3620strbuf_addf(err,"cannot lock ref '%s': "3621"reference already exists",3622original_update_refname(update));3623else if(is_null_oid(oid))3624strbuf_addf(err,"cannot lock ref '%s': "3625"reference is missing but expected%s",3626original_update_refname(update),3627sha1_to_hex(update->old_sha1));3628else3629strbuf_addf(err,"cannot lock ref '%s': "3630"is at%sbut expected%s",3631original_update_refname(update),3632oid_to_hex(oid),3633sha1_to_hex(update->old_sha1));36343635return-1;3636}36373638/*3639 * Prepare for carrying out update:3640 * - Lock the reference referred to by update.3641 * - Read the reference under lock.3642 * - Check that its old SHA-1 value (if specified) is correct, and in3643 * any case record it in update->lock->old_oid for later use when3644 * writing the reflog.3645 * - If it is a symref update without REF_NODEREF, split it up into a3646 * REF_LOG_ONLY update of the symref and add a separate update for3647 * the referent to transaction.3648 * - If it is an update of head_ref, add a corresponding REF_LOG_ONLY3649 * update of HEAD.3650 */3651static intlock_ref_for_update(struct files_ref_store *refs,3652struct ref_update *update,3653struct ref_transaction *transaction,3654const char*head_ref,3655struct string_list *affected_refnames,3656struct strbuf *err)3657{3658struct strbuf referent = STRBUF_INIT;3659int mustexist = (update->flags & REF_HAVE_OLD) &&3660!is_null_sha1(update->old_sha1);3661int ret;3662struct ref_lock *lock;36633664files_assert_main_repository(refs,"lock_ref_for_update");36653666if((update->flags & REF_HAVE_NEW) &&is_null_sha1(update->new_sha1))3667 update->flags |= REF_DELETING;36683669if(head_ref) {3670 ret =split_head_update(update, transaction, head_ref,3671 affected_refnames, err);3672if(ret)3673return ret;3674}36753676 ret =lock_raw_ref(refs, update->refname, mustexist,3677 affected_refnames, NULL,3678&lock, &referent,3679&update->type, err);3680if(ret) {3681char*reason;36823683 reason =strbuf_detach(err, NULL);3684strbuf_addf(err,"cannot lock ref '%s':%s",3685original_update_refname(update), reason);3686free(reason);3687return ret;3688}36893690 update->backend_data = lock;36913692if(update->type & REF_ISSYMREF) {3693if(update->flags & REF_NODEREF) {3694/*3695 * We won't be reading the referent as part of3696 * the transaction, so we have to read it here3697 * to record and possibly check old_sha1:3698 */3699if(read_ref_full(referent.buf,0,3700 lock->old_oid.hash, NULL)) {3701if(update->flags & REF_HAVE_OLD) {3702strbuf_addf(err,"cannot lock ref '%s': "3703"error reading reference",3704original_update_refname(update));3705return-1;3706}3707}else if(check_old_oid(update, &lock->old_oid, err)) {3708return TRANSACTION_GENERIC_ERROR;3709}3710}else{3711/*3712 * Create a new update for the reference this3713 * symref is pointing at. Also, we will record3714 * and verify old_sha1 for this update as part3715 * of processing the split-off update, so we3716 * don't have to do it here.3717 */3718 ret =split_symref_update(refs, update,3719 referent.buf, transaction,3720 affected_refnames, err);3721if(ret)3722return ret;3723}3724}else{3725struct ref_update *parent_update;37263727if(check_old_oid(update, &lock->old_oid, err))3728return TRANSACTION_GENERIC_ERROR;37293730/*3731 * If this update is happening indirectly because of a3732 * symref update, record the old SHA-1 in the parent3733 * update:3734 */3735for(parent_update = update->parent_update;3736 parent_update;3737 parent_update = parent_update->parent_update) {3738struct ref_lock *parent_lock = parent_update->backend_data;3739oidcpy(&parent_lock->old_oid, &lock->old_oid);3740}3741}37423743if((update->flags & REF_HAVE_NEW) &&3744!(update->flags & REF_DELETING) &&3745!(update->flags & REF_LOG_ONLY)) {3746if(!(update->type & REF_ISSYMREF) &&3747!hashcmp(lock->old_oid.hash, update->new_sha1)) {3748/*3749 * The reference already has the desired3750 * value, so we don't need to write it.3751 */3752}else if(write_ref_to_lockfile(lock, update->new_sha1,3753 err)) {3754char*write_err =strbuf_detach(err, NULL);37553756/*3757 * The lock was freed upon failure of3758 * write_ref_to_lockfile():3759 */3760 update->backend_data = NULL;3761strbuf_addf(err,3762"cannot update ref '%s':%s",3763 update->refname, write_err);3764free(write_err);3765return TRANSACTION_GENERIC_ERROR;3766}else{3767 update->flags |= REF_NEEDS_COMMIT;3768}3769}3770if(!(update->flags & REF_NEEDS_COMMIT)) {3771/*3772 * We didn't call write_ref_to_lockfile(), so3773 * the lockfile is still open. Close it to3774 * free up the file descriptor:3775 */3776if(close_ref(lock)) {3777strbuf_addf(err,"couldn't close '%s.lock'",3778 update->refname);3779return TRANSACTION_GENERIC_ERROR;3780}3781}3782return0;3783}37843785static intfiles_transaction_commit(struct ref_store *ref_store,3786struct ref_transaction *transaction,3787struct strbuf *err)3788{3789struct files_ref_store *refs =3790files_downcast(ref_store,0,"ref_transaction_commit");3791int ret =0, i;3792struct string_list refs_to_delete = STRING_LIST_INIT_NODUP;3793struct string_list_item *ref_to_delete;3794struct string_list affected_refnames = STRING_LIST_INIT_NODUP;3795char*head_ref = NULL;3796int head_type;3797struct object_id head_oid;3798struct strbuf sb = STRBUF_INIT;37993800assert(err);38013802if(transaction->state != REF_TRANSACTION_OPEN)3803die("BUG: commit called for transaction that is not open");38043805if(!transaction->nr) {3806 transaction->state = REF_TRANSACTION_CLOSED;3807return0;3808}38093810/*3811 * Fail if a refname appears more than once in the3812 * transaction. (If we end up splitting up any updates using3813 * split_symref_update() or split_head_update(), those3814 * functions will check that the new updates don't have the3815 * same refname as any existing ones.)3816 */3817for(i =0; i < transaction->nr; i++) {3818struct ref_update *update = transaction->updates[i];3819struct string_list_item *item =3820string_list_append(&affected_refnames, update->refname);38213822/*3823 * We store a pointer to update in item->util, but at3824 * the moment we never use the value of this field3825 * except to check whether it is non-NULL.3826 */3827 item->util = update;3828}3829string_list_sort(&affected_refnames);3830if(ref_update_reject_duplicates(&affected_refnames, err)) {3831 ret = TRANSACTION_GENERIC_ERROR;3832goto cleanup;3833}38343835/*3836 * Special hack: If a branch is updated directly and HEAD3837 * points to it (may happen on the remote side of a push3838 * for example) then logically the HEAD reflog should be3839 * updated too.3840 *3841 * A generic solution would require reverse symref lookups,3842 * but finding all symrefs pointing to a given branch would be3843 * rather costly for this rare event (the direct update of a3844 * branch) to be worth it. So let's cheat and check with HEAD3845 * only, which should cover 99% of all usage scenarios (even3846 * 100% of the default ones).3847 *3848 * So if HEAD is a symbolic reference, then record the name of3849 * the reference that it points to. If we see an update of3850 * head_ref within the transaction, then split_head_update()3851 * arranges for the reflog of HEAD to be updated, too.3852 */3853 head_ref =resolve_refdup("HEAD", RESOLVE_REF_NO_RECURSE,3854 head_oid.hash, &head_type);38553856if(head_ref && !(head_type & REF_ISSYMREF)) {3857free(head_ref);3858 head_ref = NULL;3859}38603861/*3862 * Acquire all locks, verify old values if provided, check3863 * that new values are valid, and write new values to the3864 * lockfiles, ready to be activated. Only keep one lockfile3865 * open at a time to avoid running out of file descriptors.3866 */3867for(i =0; i < transaction->nr; i++) {3868struct ref_update *update = transaction->updates[i];38693870 ret =lock_ref_for_update(refs, update, transaction,3871 head_ref, &affected_refnames, err);3872if(ret)3873goto cleanup;3874}38753876/* Perform updates first so live commits remain referenced */3877for(i =0; i < transaction->nr; i++) {3878struct ref_update *update = transaction->updates[i];3879struct ref_lock *lock = update->backend_data;38803881if(update->flags & REF_NEEDS_COMMIT ||3882 update->flags & REF_LOG_ONLY) {3883if(files_log_ref_write(refs,3884 lock->ref_name,3885 lock->old_oid.hash,3886 update->new_sha1,3887 update->msg, update->flags,3888 err)) {3889char*old_msg =strbuf_detach(err, NULL);38903891strbuf_addf(err,"cannot update the ref '%s':%s",3892 lock->ref_name, old_msg);3893free(old_msg);3894unlock_ref(lock);3895 update->backend_data = NULL;3896 ret = TRANSACTION_GENERIC_ERROR;3897goto cleanup;3898}3899}3900if(update->flags & REF_NEEDS_COMMIT) {3901clear_loose_ref_cache(refs);3902if(commit_ref(lock)) {3903strbuf_addf(err,"couldn't set '%s'", lock->ref_name);3904unlock_ref(lock);3905 update->backend_data = NULL;3906 ret = TRANSACTION_GENERIC_ERROR;3907goto cleanup;3908}3909}3910}3911/* Perform deletes now that updates are safely completed */3912for(i =0; i < transaction->nr; i++) {3913struct ref_update *update = transaction->updates[i];3914struct ref_lock *lock = update->backend_data;39153916if(update->flags & REF_DELETING &&3917!(update->flags & REF_LOG_ONLY)) {3918if(!(update->type & REF_ISPACKED) ||3919 update->type & REF_ISSYMREF) {3920/* It is a loose reference. */3921strbuf_reset(&sb);3922files_ref_path(refs, &sb, lock->ref_name);3923if(unlink_or_msg(sb.buf, err)) {3924 ret = TRANSACTION_GENERIC_ERROR;3925goto cleanup;3926}3927 update->flags |= REF_DELETED_LOOSE;3928}39293930if(!(update->flags & REF_ISPRUNING))3931string_list_append(&refs_to_delete,3932 lock->ref_name);3933}3934}39353936if(repack_without_refs(refs, &refs_to_delete, err)) {3937 ret = TRANSACTION_GENERIC_ERROR;3938goto cleanup;3939}39403941/* Delete the reflogs of any references that were deleted: */3942for_each_string_list_item(ref_to_delete, &refs_to_delete) {3943strbuf_reset(&sb);3944files_reflog_path(refs, &sb, ref_to_delete->string);3945if(!unlink_or_warn(sb.buf))3946try_remove_empty_parents(refs, ref_to_delete->string,3947 REMOVE_EMPTY_PARENTS_REFLOG);3948}39493950clear_loose_ref_cache(refs);39513952cleanup:3953strbuf_release(&sb);3954 transaction->state = REF_TRANSACTION_CLOSED;39553956for(i =0; i < transaction->nr; i++) {3957struct ref_update *update = transaction->updates[i];3958struct ref_lock *lock = update->backend_data;39593960if(lock)3961unlock_ref(lock);39623963if(update->flags & REF_DELETED_LOOSE) {3964/*3965 * The loose reference was deleted. Delete any3966 * empty parent directories. (Note that this3967 * can only work because we have already3968 * removed the lockfile.)3969 */3970try_remove_empty_parents(refs, update->refname,3971 REMOVE_EMPTY_PARENTS_REF);3972}3973}39743975string_list_clear(&refs_to_delete,0);3976free(head_ref);3977string_list_clear(&affected_refnames,0);39783979return ret;3980}39813982static intref_present(const char*refname,3983const struct object_id *oid,int flags,void*cb_data)3984{3985struct string_list *affected_refnames = cb_data;39863987returnstring_list_has_string(affected_refnames, refname);3988}39893990static intfiles_initial_transaction_commit(struct ref_store *ref_store,3991struct ref_transaction *transaction,3992struct strbuf *err)3993{3994struct files_ref_store *refs =3995files_downcast(ref_store,0,"initial_ref_transaction_commit");3996int ret =0, i;3997struct string_list affected_refnames = STRING_LIST_INIT_NODUP;39983999assert(err);40004001if(transaction->state != REF_TRANSACTION_OPEN)4002die("BUG: commit called for transaction that is not open");40034004/* Fail if a refname appears more than once in the transaction: */4005for(i =0; i < transaction->nr; i++)4006string_list_append(&affected_refnames,4007 transaction->updates[i]->refname);4008string_list_sort(&affected_refnames);4009if(ref_update_reject_duplicates(&affected_refnames, err)) {4010 ret = TRANSACTION_GENERIC_ERROR;4011goto cleanup;4012}40134014/*4015 * It's really undefined to call this function in an active4016 * repository or when there are existing references: we are4017 * only locking and changing packed-refs, so (1) any4018 * simultaneous processes might try to change a reference at4019 * the same time we do, and (2) any existing loose versions of4020 * the references that we are setting would have precedence4021 * over our values. But some remote helpers create the remote4022 * "HEAD" and "master" branches before calling this function,4023 * so here we really only check that none of the references4024 * that we are creating already exists.4025 */4026if(for_each_rawref(ref_present, &affected_refnames))4027die("BUG: initial ref transaction called with existing refs");40284029for(i =0; i < transaction->nr; i++) {4030struct ref_update *update = transaction->updates[i];40314032if((update->flags & REF_HAVE_OLD) &&4033!is_null_sha1(update->old_sha1))4034die("BUG: initial ref transaction with old_sha1 set");4035if(verify_refname_available(update->refname,4036&affected_refnames, NULL,4037 err)) {4038 ret = TRANSACTION_NAME_CONFLICT;4039goto cleanup;4040}4041}40424043if(lock_packed_refs(refs,0)) {4044strbuf_addf(err,"unable to lock packed-refs file:%s",4045strerror(errno));4046 ret = TRANSACTION_GENERIC_ERROR;4047goto cleanup;4048}40494050for(i =0; i < transaction->nr; i++) {4051struct ref_update *update = transaction->updates[i];40524053if((update->flags & REF_HAVE_NEW) &&4054!is_null_sha1(update->new_sha1))4055add_packed_ref(refs, update->refname, update->new_sha1);4056}40574058if(commit_packed_refs(refs)) {4059strbuf_addf(err,"unable to commit packed-refs file:%s",4060strerror(errno));4061 ret = TRANSACTION_GENERIC_ERROR;4062goto cleanup;4063}40644065cleanup:4066 transaction->state = REF_TRANSACTION_CLOSED;4067string_list_clear(&affected_refnames,0);4068return ret;4069}40704071struct expire_reflog_cb {4072unsigned int flags;4073 reflog_expiry_should_prune_fn *should_prune_fn;4074void*policy_cb;4075FILE*newlog;4076struct object_id last_kept_oid;4077};40784079static intexpire_reflog_ent(struct object_id *ooid,struct object_id *noid,4080const char*email,unsigned long timestamp,int tz,4081const char*message,void*cb_data)4082{4083struct expire_reflog_cb *cb = cb_data;4084struct expire_reflog_policy_cb *policy_cb = cb->policy_cb;40854086if(cb->flags & EXPIRE_REFLOGS_REWRITE)4087 ooid = &cb->last_kept_oid;40884089if((*cb->should_prune_fn)(ooid->hash, noid->hash, email, timestamp, tz,4090 message, policy_cb)) {4091if(!cb->newlog)4092printf("would prune%s", message);4093else if(cb->flags & EXPIRE_REFLOGS_VERBOSE)4094printf("prune%s", message);4095}else{4096if(cb->newlog) {4097fprintf(cb->newlog,"%s %s %s %lu %+05d\t%s",4098oid_to_hex(ooid),oid_to_hex(noid),4099 email, timestamp, tz, message);4100oidcpy(&cb->last_kept_oid, noid);4101}4102if(cb->flags & EXPIRE_REFLOGS_VERBOSE)4103printf("keep%s", message);4104}4105return0;4106}41074108static intfiles_reflog_expire(struct ref_store *ref_store,4109const char*refname,const unsigned char*sha1,4110unsigned int flags,4111 reflog_expiry_prepare_fn prepare_fn,4112 reflog_expiry_should_prune_fn should_prune_fn,4113 reflog_expiry_cleanup_fn cleanup_fn,4114void*policy_cb_data)4115{4116struct files_ref_store *refs =4117files_downcast(ref_store,0,"reflog_expire");4118static struct lock_file reflog_lock;4119struct expire_reflog_cb cb;4120struct ref_lock *lock;4121struct strbuf log_file_sb = STRBUF_INIT;4122char*log_file;4123int status =0;4124int type;4125struct strbuf err = STRBUF_INIT;41264127memset(&cb,0,sizeof(cb));4128 cb.flags = flags;4129 cb.policy_cb = policy_cb_data;4130 cb.should_prune_fn = should_prune_fn;41314132/*4133 * The reflog file is locked by holding the lock on the4134 * reference itself, plus we might need to update the4135 * reference if --updateref was specified:4136 */4137 lock =lock_ref_sha1_basic(refs, refname, sha1,4138 NULL, NULL, REF_NODEREF,4139&type, &err);4140if(!lock) {4141error("cannot lock ref '%s':%s", refname, err.buf);4142strbuf_release(&err);4143return-1;4144}4145if(!reflog_exists(refname)) {4146unlock_ref(lock);4147return0;4148}41494150files_reflog_path(refs, &log_file_sb, refname);4151 log_file =strbuf_detach(&log_file_sb, NULL);4152if(!(flags & EXPIRE_REFLOGS_DRY_RUN)) {4153/*4154 * Even though holding $GIT_DIR/logs/$reflog.lock has4155 * no locking implications, we use the lock_file4156 * machinery here anyway because it does a lot of the4157 * work we need, including cleaning up if the program4158 * exits unexpectedly.4159 */4160if(hold_lock_file_for_update(&reflog_lock, log_file,0) <0) {4161struct strbuf err = STRBUF_INIT;4162unable_to_lock_message(log_file, errno, &err);4163error("%s", err.buf);4164strbuf_release(&err);4165goto failure;4166}4167 cb.newlog =fdopen_lock_file(&reflog_lock,"w");4168if(!cb.newlog) {4169error("cannot fdopen%s(%s)",4170get_lock_file_path(&reflog_lock),strerror(errno));4171goto failure;4172}4173}41744175(*prepare_fn)(refname, sha1, cb.policy_cb);4176for_each_reflog_ent(refname, expire_reflog_ent, &cb);4177(*cleanup_fn)(cb.policy_cb);41784179if(!(flags & EXPIRE_REFLOGS_DRY_RUN)) {4180/*4181 * It doesn't make sense to adjust a reference pointed4182 * to by a symbolic ref based on expiring entries in4183 * the symbolic reference's reflog. Nor can we update4184 * a reference if there are no remaining reflog4185 * entries.4186 */4187int update = (flags & EXPIRE_REFLOGS_UPDATE_REF) &&4188!(type & REF_ISSYMREF) &&4189!is_null_oid(&cb.last_kept_oid);41904191if(close_lock_file(&reflog_lock)) {4192 status |=error("couldn't write%s:%s", log_file,4193strerror(errno));4194}else if(update &&4195(write_in_full(get_lock_file_fd(lock->lk),4196oid_to_hex(&cb.last_kept_oid), GIT_SHA1_HEXSZ) != GIT_SHA1_HEXSZ ||4197write_str_in_full(get_lock_file_fd(lock->lk),"\n") !=1||4198close_ref(lock) <0)) {4199 status |=error("couldn't write%s",4200get_lock_file_path(lock->lk));4201rollback_lock_file(&reflog_lock);4202}else if(commit_lock_file(&reflog_lock)) {4203 status |=error("unable to write reflog '%s' (%s)",4204 log_file,strerror(errno));4205}else if(update &&commit_ref(lock)) {4206 status |=error("couldn't set%s", lock->ref_name);4207}4208}4209free(log_file);4210unlock_ref(lock);4211return status;42124213 failure:4214rollback_lock_file(&reflog_lock);4215free(log_file);4216unlock_ref(lock);4217return-1;4218}42194220static intfiles_init_db(struct ref_store *ref_store,struct strbuf *err)4221{4222struct files_ref_store *refs =4223files_downcast(ref_store,0,"init_db");4224struct strbuf sb = STRBUF_INIT;42254226/*4227 * Create .git/refs/{heads,tags}4228 */4229files_ref_path(refs, &sb,"refs/heads");4230safe_create_dir(sb.buf,1);42314232strbuf_reset(&sb);4233files_ref_path(refs, &sb,"refs/tags");4234safe_create_dir(sb.buf,1);42354236strbuf_release(&sb);4237return0;4238}42394240struct ref_storage_be refs_be_files = {4241 NULL,4242"files",4243 files_ref_store_create,4244 files_init_db,4245 files_transaction_commit,4246 files_initial_transaction_commit,42474248 files_pack_refs,4249 files_peel_ref,4250 files_create_symref,4251 files_delete_refs,4252 files_rename_ref,42534254 files_ref_iterator_begin,4255 files_read_raw_ref,4256 files_verify_refname_available,42574258 files_reflog_iterator_begin,4259 files_for_each_reflog_ent,4260 files_for_each_reflog_ent_reverse,4261 files_reflog_exists,4262 files_create_reflog,4263 files_delete_reflog,4264 files_reflog_expire4265};