1#include"builtin.h" 2#include"cache.h" 3#include"attr.h" 4#include"object.h" 5#include"blob.h" 6#include"commit.h" 7#include"tag.h" 8#include"tree.h" 9#include"delta.h" 10#include"pack.h" 11#include"pack-revindex.h" 12#include"csum-file.h" 13#include"tree-walk.h" 14#include"diff.h" 15#include"revision.h" 16#include"list-objects.h" 17#include"pack-objects.h" 18#include"progress.h" 19#include"refs.h" 20#include"streaming.h" 21#include"thread-utils.h" 22#include"pack-bitmap.h" 23#include"reachable.h" 24#include"sha1-array.h" 25#include"argv-array.h" 26 27static const char*pack_usage[] = { 28N_("git pack-objects --stdout [<options>...] [< <ref-list> | < <object-list>]"), 29N_("git pack-objects [<options>...] <base-name> [< <ref-list> | < <object-list>]"), 30 NULL 31}; 32 33/* 34 * Objects we are going to pack are collected in the `to_pack` structure. 35 * It contains an array (dynamically expanded) of the object data, and a map 36 * that can resolve SHA1s to their position in the array. 37 */ 38static struct packing_data to_pack; 39 40static struct pack_idx_entry **written_list; 41static uint32_t nr_result, nr_written; 42 43static int non_empty; 44static int reuse_delta =1, reuse_object =1; 45static int keep_unreachable, unpack_unreachable, include_tag; 46static unsigned long unpack_unreachable_expiration; 47static int pack_loose_unreachable; 48static int local; 49static int have_non_local_packs; 50static int incremental; 51static int ignore_packed_keep; 52static int allow_ofs_delta; 53static struct pack_idx_option pack_idx_opts; 54static const char*base_name; 55static int progress =1; 56static int window =10; 57static unsigned long pack_size_limit; 58static int depth =50; 59static int delta_search_threads; 60static int pack_to_stdout; 61static int num_preferred_base; 62static struct progress *progress_state; 63static int pack_compression_level = Z_DEFAULT_COMPRESSION; 64static int pack_compression_seen; 65 66static struct packed_git *reuse_packfile; 67static uint32_t reuse_packfile_objects; 68static off_t reuse_packfile_offset; 69 70static int use_bitmap_index =1; 71static int write_bitmap_index; 72static uint16_t write_bitmap_options; 73 74static unsigned long delta_cache_size =0; 75static unsigned long max_delta_cache_size =256*1024*1024; 76static unsigned long cache_max_small_delta_size =1000; 77 78static unsigned long window_memory_limit =0; 79 80/* 81 * stats 82 */ 83static uint32_t written, written_delta; 84static uint32_t reused, reused_delta; 85 86/* 87 * Indexed commits 88 */ 89static struct commit **indexed_commits; 90static unsigned int indexed_commits_nr; 91static unsigned int indexed_commits_alloc; 92 93static voidindex_commit_for_bitmap(struct commit *commit) 94{ 95if(indexed_commits_nr >= indexed_commits_alloc) { 96 indexed_commits_alloc = (indexed_commits_alloc +32) *2; 97REALLOC_ARRAY(indexed_commits, indexed_commits_alloc); 98} 99 100 indexed_commits[indexed_commits_nr++] = commit; 101} 102 103static void*get_delta(struct object_entry *entry) 104{ 105unsigned long size, base_size, delta_size; 106void*buf, *base_buf, *delta_buf; 107enum object_type type; 108 109 buf =read_sha1_file(entry->idx.sha1, &type, &size); 110if(!buf) 111die("unable to read%s",sha1_to_hex(entry->idx.sha1)); 112 base_buf =read_sha1_file(entry->delta->idx.sha1, &type, &base_size); 113if(!base_buf) 114die("unable to read%s",sha1_to_hex(entry->delta->idx.sha1)); 115 delta_buf =diff_delta(base_buf, base_size, 116 buf, size, &delta_size,0); 117if(!delta_buf || delta_size != entry->delta_size) 118die("delta size changed"); 119free(buf); 120free(base_buf); 121return delta_buf; 122} 123 124static unsigned longdo_compress(void**pptr,unsigned long size) 125{ 126 git_zstream stream; 127void*in, *out; 128unsigned long maxsize; 129 130git_deflate_init(&stream, pack_compression_level); 131 maxsize =git_deflate_bound(&stream, size); 132 133 in = *pptr; 134 out =xmalloc(maxsize); 135*pptr = out; 136 137 stream.next_in = in; 138 stream.avail_in = size; 139 stream.next_out = out; 140 stream.avail_out = maxsize; 141while(git_deflate(&stream, Z_FINISH) == Z_OK) 142;/* nothing */ 143git_deflate_end(&stream); 144 145free(in); 146return stream.total_out; 147} 148 149static unsigned longwrite_large_blob_data(struct git_istream *st,struct sha1file *f, 150const unsigned char*sha1) 151{ 152 git_zstream stream; 153unsigned char ibuf[1024*16]; 154unsigned char obuf[1024*16]; 155unsigned long olen =0; 156 157git_deflate_init(&stream, pack_compression_level); 158 159for(;;) { 160 ssize_t readlen; 161int zret = Z_OK; 162 readlen =read_istream(st, ibuf,sizeof(ibuf)); 163if(readlen == -1) 164die(_("unable to read%s"),sha1_to_hex(sha1)); 165 166 stream.next_in = ibuf; 167 stream.avail_in = readlen; 168while((stream.avail_in || readlen ==0) && 169(zret == Z_OK || zret == Z_BUF_ERROR)) { 170 stream.next_out = obuf; 171 stream.avail_out =sizeof(obuf); 172 zret =git_deflate(&stream, readlen ?0: Z_FINISH); 173sha1write(f, obuf, stream.next_out - obuf); 174 olen += stream.next_out - obuf; 175} 176if(stream.avail_in) 177die(_("deflate error (%d)"), zret); 178if(readlen ==0) { 179if(zret != Z_STREAM_END) 180die(_("deflate error (%d)"), zret); 181break; 182} 183} 184git_deflate_end(&stream); 185return olen; 186} 187 188/* 189 * we are going to reuse the existing object data as is. make 190 * sure it is not corrupt. 191 */ 192static intcheck_pack_inflate(struct packed_git *p, 193struct pack_window **w_curs, 194 off_t offset, 195 off_t len, 196unsigned long expect) 197{ 198 git_zstream stream; 199unsigned char fakebuf[4096], *in; 200int st; 201 202memset(&stream,0,sizeof(stream)); 203git_inflate_init(&stream); 204do{ 205 in =use_pack(p, w_curs, offset, &stream.avail_in); 206 stream.next_in = in; 207 stream.next_out = fakebuf; 208 stream.avail_out =sizeof(fakebuf); 209 st =git_inflate(&stream, Z_FINISH); 210 offset += stream.next_in - in; 211}while(st == Z_OK || st == Z_BUF_ERROR); 212git_inflate_end(&stream); 213return(st == Z_STREAM_END && 214 stream.total_out == expect && 215 stream.total_in == len) ?0: -1; 216} 217 218static voidcopy_pack_data(struct sha1file *f, 219struct packed_git *p, 220struct pack_window **w_curs, 221 off_t offset, 222 off_t len) 223{ 224unsigned char*in; 225unsigned long avail; 226 227while(len) { 228 in =use_pack(p, w_curs, offset, &avail); 229if(avail > len) 230 avail = (unsigned long)len; 231sha1write(f, in, avail); 232 offset += avail; 233 len -= avail; 234} 235} 236 237/* Return 0 if we will bust the pack-size limit */ 238static unsigned longwrite_no_reuse_object(struct sha1file *f,struct object_entry *entry, 239unsigned long limit,int usable_delta) 240{ 241unsigned long size, datalen; 242unsigned char header[10], dheader[10]; 243unsigned hdrlen; 244enum object_type type; 245void*buf; 246struct git_istream *st = NULL; 247 248if(!usable_delta) { 249if(entry->type == OBJ_BLOB && 250 entry->size > big_file_threshold && 251(st =open_istream(entry->idx.sha1, &type, &size, NULL)) != NULL) 252 buf = NULL; 253else{ 254 buf =read_sha1_file(entry->idx.sha1, &type, &size); 255if(!buf) 256die(_("unable to read%s"),sha1_to_hex(entry->idx.sha1)); 257} 258/* 259 * make sure no cached delta data remains from a 260 * previous attempt before a pack split occurred. 261 */ 262free(entry->delta_data); 263 entry->delta_data = NULL; 264 entry->z_delta_size =0; 265}else if(entry->delta_data) { 266 size = entry->delta_size; 267 buf = entry->delta_data; 268 entry->delta_data = NULL; 269 type = (allow_ofs_delta && entry->delta->idx.offset) ? 270 OBJ_OFS_DELTA : OBJ_REF_DELTA; 271}else{ 272 buf =get_delta(entry); 273 size = entry->delta_size; 274 type = (allow_ofs_delta && entry->delta->idx.offset) ? 275 OBJ_OFS_DELTA : OBJ_REF_DELTA; 276} 277 278if(st)/* large blob case, just assume we don't compress well */ 279 datalen = size; 280else if(entry->z_delta_size) 281 datalen = entry->z_delta_size; 282else 283 datalen =do_compress(&buf, size); 284 285/* 286 * The object header is a byte of 'type' followed by zero or 287 * more bytes of length. 288 */ 289 hdrlen =encode_in_pack_object_header(type, size, header); 290 291if(type == OBJ_OFS_DELTA) { 292/* 293 * Deltas with relative base contain an additional 294 * encoding of the relative offset for the delta 295 * base from this object's position in the pack. 296 */ 297 off_t ofs = entry->idx.offset - entry->delta->idx.offset; 298unsigned pos =sizeof(dheader) -1; 299 dheader[pos] = ofs &127; 300while(ofs >>=7) 301 dheader[--pos] =128| (--ofs &127); 302if(limit && hdrlen +sizeof(dheader) - pos + datalen +20>= limit) { 303if(st) 304close_istream(st); 305free(buf); 306return0; 307} 308sha1write(f, header, hdrlen); 309sha1write(f, dheader + pos,sizeof(dheader) - pos); 310 hdrlen +=sizeof(dheader) - pos; 311}else if(type == OBJ_REF_DELTA) { 312/* 313 * Deltas with a base reference contain 314 * an additional 20 bytes for the base sha1. 315 */ 316if(limit && hdrlen +20+ datalen +20>= limit) { 317if(st) 318close_istream(st); 319free(buf); 320return0; 321} 322sha1write(f, header, hdrlen); 323sha1write(f, entry->delta->idx.sha1,20); 324 hdrlen +=20; 325}else{ 326if(limit && hdrlen + datalen +20>= limit) { 327if(st) 328close_istream(st); 329free(buf); 330return0; 331} 332sha1write(f, header, hdrlen); 333} 334if(st) { 335 datalen =write_large_blob_data(st, f, entry->idx.sha1); 336close_istream(st); 337}else{ 338sha1write(f, buf, datalen); 339free(buf); 340} 341 342return hdrlen + datalen; 343} 344 345/* Return 0 if we will bust the pack-size limit */ 346static unsigned longwrite_reuse_object(struct sha1file *f,struct object_entry *entry, 347unsigned long limit,int usable_delta) 348{ 349struct packed_git *p = entry->in_pack; 350struct pack_window *w_curs = NULL; 351struct revindex_entry *revidx; 352 off_t offset; 353enum object_type type = entry->type; 354unsigned long datalen; 355unsigned char header[10], dheader[10]; 356unsigned hdrlen; 357 358if(entry->delta) 359 type = (allow_ofs_delta && entry->delta->idx.offset) ? 360 OBJ_OFS_DELTA : OBJ_REF_DELTA; 361 hdrlen =encode_in_pack_object_header(type, entry->size, header); 362 363 offset = entry->in_pack_offset; 364 revidx =find_pack_revindex(p, offset); 365 datalen = revidx[1].offset - offset; 366if(!pack_to_stdout && p->index_version >1&& 367check_pack_crc(p, &w_curs, offset, datalen, revidx->nr)) { 368error("bad packed object CRC for%s",sha1_to_hex(entry->idx.sha1)); 369unuse_pack(&w_curs); 370returnwrite_no_reuse_object(f, entry, limit, usable_delta); 371} 372 373 offset += entry->in_pack_header_size; 374 datalen -= entry->in_pack_header_size; 375 376if(!pack_to_stdout && p->index_version ==1&& 377check_pack_inflate(p, &w_curs, offset, datalen, entry->size)) { 378error("corrupt packed object for%s",sha1_to_hex(entry->idx.sha1)); 379unuse_pack(&w_curs); 380returnwrite_no_reuse_object(f, entry, limit, usable_delta); 381} 382 383if(type == OBJ_OFS_DELTA) { 384 off_t ofs = entry->idx.offset - entry->delta->idx.offset; 385unsigned pos =sizeof(dheader) -1; 386 dheader[pos] = ofs &127; 387while(ofs >>=7) 388 dheader[--pos] =128| (--ofs &127); 389if(limit && hdrlen +sizeof(dheader) - pos + datalen +20>= limit) { 390unuse_pack(&w_curs); 391return0; 392} 393sha1write(f, header, hdrlen); 394sha1write(f, dheader + pos,sizeof(dheader) - pos); 395 hdrlen +=sizeof(dheader) - pos; 396 reused_delta++; 397}else if(type == OBJ_REF_DELTA) { 398if(limit && hdrlen +20+ datalen +20>= limit) { 399unuse_pack(&w_curs); 400return0; 401} 402sha1write(f, header, hdrlen); 403sha1write(f, entry->delta->idx.sha1,20); 404 hdrlen +=20; 405 reused_delta++; 406}else{ 407if(limit && hdrlen + datalen +20>= limit) { 408unuse_pack(&w_curs); 409return0; 410} 411sha1write(f, header, hdrlen); 412} 413copy_pack_data(f, p, &w_curs, offset, datalen); 414unuse_pack(&w_curs); 415 reused++; 416return hdrlen + datalen; 417} 418 419/* Return 0 if we will bust the pack-size limit */ 420static unsigned longwrite_object(struct sha1file *f, 421struct object_entry *entry, 422 off_t write_offset) 423{ 424unsigned long limit, len; 425int usable_delta, to_reuse; 426 427if(!pack_to_stdout) 428crc32_begin(f); 429 430/* apply size limit if limited packsize and not first object */ 431if(!pack_size_limit || !nr_written) 432 limit =0; 433else if(pack_size_limit <= write_offset) 434/* 435 * the earlier object did not fit the limit; avoid 436 * mistaking this with unlimited (i.e. limit = 0). 437 */ 438 limit =1; 439else 440 limit = pack_size_limit - write_offset; 441 442if(!entry->delta) 443 usable_delta =0;/* no delta */ 444else if(!pack_size_limit) 445 usable_delta =1;/* unlimited packfile */ 446else if(entry->delta->idx.offset == (off_t)-1) 447 usable_delta =0;/* base was written to another pack */ 448else if(entry->delta->idx.offset) 449 usable_delta =1;/* base already exists in this pack */ 450else 451 usable_delta =0;/* base could end up in another pack */ 452 453if(!reuse_object) 454 to_reuse =0;/* explicit */ 455else if(!entry->in_pack) 456 to_reuse =0;/* can't reuse what we don't have */ 457else if(entry->type == OBJ_REF_DELTA || entry->type == OBJ_OFS_DELTA) 458/* check_object() decided it for us ... */ 459 to_reuse = usable_delta; 460/* ... but pack split may override that */ 461else if(entry->type != entry->in_pack_type) 462 to_reuse =0;/* pack has delta which is unusable */ 463else if(entry->delta) 464 to_reuse =0;/* we want to pack afresh */ 465else 466 to_reuse =1;/* we have it in-pack undeltified, 467 * and we do not need to deltify it. 468 */ 469 470if(!to_reuse) 471 len =write_no_reuse_object(f, entry, limit, usable_delta); 472else 473 len =write_reuse_object(f, entry, limit, usable_delta); 474if(!len) 475return0; 476 477if(usable_delta) 478 written_delta++; 479 written++; 480if(!pack_to_stdout) 481 entry->idx.crc32 =crc32_end(f); 482return len; 483} 484 485enum write_one_status { 486 WRITE_ONE_SKIP = -1,/* already written */ 487 WRITE_ONE_BREAK =0,/* writing this will bust the limit; not written */ 488 WRITE_ONE_WRITTEN =1,/* normal */ 489 WRITE_ONE_RECURSIVE =2/* already scheduled to be written */ 490}; 491 492static enum write_one_status write_one(struct sha1file *f, 493struct object_entry *e, 494 off_t *offset) 495{ 496unsigned long size; 497int recursing; 498 499/* 500 * we set offset to 1 (which is an impossible value) to mark 501 * the fact that this object is involved in "write its base 502 * first before writing a deltified object" recursion. 503 */ 504 recursing = (e->idx.offset ==1); 505if(recursing) { 506warning("recursive delta detected for object%s", 507sha1_to_hex(e->idx.sha1)); 508return WRITE_ONE_RECURSIVE; 509}else if(e->idx.offset || e->preferred_base) { 510/* offset is non zero if object is written already. */ 511return WRITE_ONE_SKIP; 512} 513 514/* if we are deltified, write out base object first. */ 515if(e->delta) { 516 e->idx.offset =1;/* now recurse */ 517switch(write_one(f, e->delta, offset)) { 518case WRITE_ONE_RECURSIVE: 519/* we cannot depend on this one */ 520 e->delta = NULL; 521break; 522default: 523break; 524case WRITE_ONE_BREAK: 525 e->idx.offset = recursing; 526return WRITE_ONE_BREAK; 527} 528} 529 530 e->idx.offset = *offset; 531 size =write_object(f, e, *offset); 532if(!size) { 533 e->idx.offset = recursing; 534return WRITE_ONE_BREAK; 535} 536 written_list[nr_written++] = &e->idx; 537 538/* make sure off_t is sufficiently large not to wrap */ 539if(signed_add_overflows(*offset, size)) 540die("pack too large for current definition of off_t"); 541*offset += size; 542return WRITE_ONE_WRITTEN; 543} 544 545static intmark_tagged(const char*path,const struct object_id *oid,int flag, 546void*cb_data) 547{ 548unsigned char peeled[20]; 549struct object_entry *entry =packlist_find(&to_pack, oid->hash, NULL); 550 551if(entry) 552 entry->tagged =1; 553if(!peel_ref(path, peeled)) { 554 entry =packlist_find(&to_pack, peeled, NULL); 555if(entry) 556 entry->tagged =1; 557} 558return0; 559} 560 561staticinlinevoidadd_to_write_order(struct object_entry **wo, 562unsigned int*endp, 563struct object_entry *e) 564{ 565if(e->filled) 566return; 567 wo[(*endp)++] = e; 568 e->filled =1; 569} 570 571static voidadd_descendants_to_write_order(struct object_entry **wo, 572unsigned int*endp, 573struct object_entry *e) 574{ 575int add_to_order =1; 576while(e) { 577if(add_to_order) { 578struct object_entry *s; 579/* add this node... */ 580add_to_write_order(wo, endp, e); 581/* all its siblings... */ 582for(s = e->delta_sibling; s; s = s->delta_sibling) { 583add_to_write_order(wo, endp, s); 584} 585} 586/* drop down a level to add left subtree nodes if possible */ 587if(e->delta_child) { 588 add_to_order =1; 589 e = e->delta_child; 590}else{ 591 add_to_order =0; 592/* our sibling might have some children, it is next */ 593if(e->delta_sibling) { 594 e = e->delta_sibling; 595continue; 596} 597/* go back to our parent node */ 598 e = e->delta; 599while(e && !e->delta_sibling) { 600/* we're on the right side of a subtree, keep 601 * going up until we can go right again */ 602 e = e->delta; 603} 604if(!e) { 605/* done- we hit our original root node */ 606return; 607} 608/* pass it off to sibling at this level */ 609 e = e->delta_sibling; 610} 611}; 612} 613 614static voidadd_family_to_write_order(struct object_entry **wo, 615unsigned int*endp, 616struct object_entry *e) 617{ 618struct object_entry *root; 619 620for(root = e; root->delta; root = root->delta) 621;/* nothing */ 622add_descendants_to_write_order(wo, endp, root); 623} 624 625static struct object_entry **compute_write_order(void) 626{ 627unsigned int i, wo_end, last_untagged; 628 629struct object_entry **wo; 630struct object_entry *objects = to_pack.objects; 631 632for(i =0; i < to_pack.nr_objects; i++) { 633 objects[i].tagged =0; 634 objects[i].filled =0; 635 objects[i].delta_child = NULL; 636 objects[i].delta_sibling = NULL; 637} 638 639/* 640 * Fully connect delta_child/delta_sibling network. 641 * Make sure delta_sibling is sorted in the original 642 * recency order. 643 */ 644for(i = to_pack.nr_objects; i >0;) { 645struct object_entry *e = &objects[--i]; 646if(!e->delta) 647continue; 648/* Mark me as the first child */ 649 e->delta_sibling = e->delta->delta_child; 650 e->delta->delta_child = e; 651} 652 653/* 654 * Mark objects that are at the tip of tags. 655 */ 656for_each_tag_ref(mark_tagged, NULL); 657 658/* 659 * Give the objects in the original recency order until 660 * we see a tagged tip. 661 */ 662ALLOC_ARRAY(wo, to_pack.nr_objects); 663for(i = wo_end =0; i < to_pack.nr_objects; i++) { 664if(objects[i].tagged) 665break; 666add_to_write_order(wo, &wo_end, &objects[i]); 667} 668 last_untagged = i; 669 670/* 671 * Then fill all the tagged tips. 672 */ 673for(; i < to_pack.nr_objects; i++) { 674if(objects[i].tagged) 675add_to_write_order(wo, &wo_end, &objects[i]); 676} 677 678/* 679 * And then all remaining commits and tags. 680 */ 681for(i = last_untagged; i < to_pack.nr_objects; i++) { 682if(objects[i].type != OBJ_COMMIT && 683 objects[i].type != OBJ_TAG) 684continue; 685add_to_write_order(wo, &wo_end, &objects[i]); 686} 687 688/* 689 * And then all the trees. 690 */ 691for(i = last_untagged; i < to_pack.nr_objects; i++) { 692if(objects[i].type != OBJ_TREE) 693continue; 694add_to_write_order(wo, &wo_end, &objects[i]); 695} 696 697/* 698 * Finally all the rest in really tight order 699 */ 700for(i = last_untagged; i < to_pack.nr_objects; i++) { 701if(!objects[i].filled) 702add_family_to_write_order(wo, &wo_end, &objects[i]); 703} 704 705if(wo_end != to_pack.nr_objects) 706die("ordered%uobjects, expected %"PRIu32, wo_end, to_pack.nr_objects); 707 708return wo; 709} 710 711static off_t write_reused_pack(struct sha1file *f) 712{ 713unsigned char buffer[8192]; 714 off_t to_write, total; 715int fd; 716 717if(!is_pack_valid(reuse_packfile)) 718die("packfile is invalid:%s", reuse_packfile->pack_name); 719 720 fd =git_open_noatime(reuse_packfile->pack_name); 721if(fd <0) 722die_errno("unable to open packfile for reuse:%s", 723 reuse_packfile->pack_name); 724 725if(lseek(fd,sizeof(struct pack_header), SEEK_SET) == -1) 726die_errno("unable to seek in reused packfile"); 727 728if(reuse_packfile_offset <0) 729 reuse_packfile_offset = reuse_packfile->pack_size -20; 730 731 total = to_write = reuse_packfile_offset -sizeof(struct pack_header); 732 733while(to_write) { 734int read_pack =xread(fd, buffer,sizeof(buffer)); 735 736if(read_pack <=0) 737die_errno("unable to read from reused packfile"); 738 739if(read_pack > to_write) 740 read_pack = to_write; 741 742sha1write(f, buffer, read_pack); 743 to_write -= read_pack; 744 745/* 746 * We don't know the actual number of objects written, 747 * only how many bytes written, how many bytes total, and 748 * how many objects total. So we can fake it by pretending all 749 * objects we are writing are the same size. This gives us a 750 * smooth progress meter, and at the end it matches the true 751 * answer. 752 */ 753 written = reuse_packfile_objects * 754(((double)(total - to_write)) / total); 755display_progress(progress_state, written); 756} 757 758close(fd); 759 written = reuse_packfile_objects; 760display_progress(progress_state, written); 761return reuse_packfile_offset -sizeof(struct pack_header); 762} 763 764static const char no_split_warning[] =N_( 765"disabling bitmap writing, packs are split due to pack.packSizeLimit" 766); 767 768static voidwrite_pack_file(void) 769{ 770uint32_t i =0, j; 771struct sha1file *f; 772 off_t offset; 773uint32_t nr_remaining = nr_result; 774time_t last_mtime =0; 775struct object_entry **write_order; 776 777if(progress > pack_to_stdout) 778 progress_state =start_progress(_("Writing objects"), nr_result); 779ALLOC_ARRAY(written_list, to_pack.nr_objects); 780 write_order =compute_write_order(); 781 782do{ 783unsigned char sha1[20]; 784char*pack_tmp_name = NULL; 785 786if(pack_to_stdout) 787 f =sha1fd_throughput(1,"<stdout>", progress_state); 788else 789 f =create_tmp_packfile(&pack_tmp_name); 790 791 offset =write_pack_header(f, nr_remaining); 792 793if(reuse_packfile) { 794 off_t packfile_size; 795assert(pack_to_stdout); 796 797 packfile_size =write_reused_pack(f); 798 offset += packfile_size; 799} 800 801 nr_written =0; 802for(; i < to_pack.nr_objects; i++) { 803struct object_entry *e = write_order[i]; 804if(write_one(f, e, &offset) == WRITE_ONE_BREAK) 805break; 806display_progress(progress_state, written); 807} 808 809/* 810 * Did we write the wrong # entries in the header? 811 * If so, rewrite it like in fast-import 812 */ 813if(pack_to_stdout) { 814sha1close(f, sha1, CSUM_CLOSE); 815}else if(nr_written == nr_remaining) { 816sha1close(f, sha1, CSUM_FSYNC); 817}else{ 818int fd =sha1close(f, sha1,0); 819fixup_pack_header_footer(fd, sha1, pack_tmp_name, 820 nr_written, sha1, offset); 821close(fd); 822if(write_bitmap_index) { 823warning(_(no_split_warning)); 824 write_bitmap_index =0; 825} 826} 827 828if(!pack_to_stdout) { 829struct stat st; 830struct strbuf tmpname = STRBUF_INIT; 831 832/* 833 * Packs are runtime accessed in their mtime 834 * order since newer packs are more likely to contain 835 * younger objects. So if we are creating multiple 836 * packs then we should modify the mtime of later ones 837 * to preserve this property. 838 */ 839if(stat(pack_tmp_name, &st) <0) { 840warning_errno("failed to stat%s", pack_tmp_name); 841}else if(!last_mtime) { 842 last_mtime = st.st_mtime; 843}else{ 844struct utimbuf utb; 845 utb.actime = st.st_atime; 846 utb.modtime = --last_mtime; 847if(utime(pack_tmp_name, &utb) <0) 848warning_errno("failed utime() on%s", pack_tmp_name); 849} 850 851strbuf_addf(&tmpname,"%s-", base_name); 852 853if(write_bitmap_index) { 854bitmap_writer_set_checksum(sha1); 855bitmap_writer_build_type_index(written_list, nr_written); 856} 857 858finish_tmp_packfile(&tmpname, pack_tmp_name, 859 written_list, nr_written, 860&pack_idx_opts, sha1); 861 862if(write_bitmap_index) { 863strbuf_addf(&tmpname,"%s.bitmap",sha1_to_hex(sha1)); 864 865stop_progress(&progress_state); 866 867bitmap_writer_show_progress(progress); 868bitmap_writer_reuse_bitmaps(&to_pack); 869bitmap_writer_select_commits(indexed_commits, indexed_commits_nr, -1); 870bitmap_writer_build(&to_pack); 871bitmap_writer_finish(written_list, nr_written, 872 tmpname.buf, write_bitmap_options); 873 write_bitmap_index =0; 874} 875 876strbuf_release(&tmpname); 877free(pack_tmp_name); 878puts(sha1_to_hex(sha1)); 879} 880 881/* mark written objects as written to previous pack */ 882for(j =0; j < nr_written; j++) { 883 written_list[j]->offset = (off_t)-1; 884} 885 nr_remaining -= nr_written; 886}while(nr_remaining && i < to_pack.nr_objects); 887 888free(written_list); 889free(write_order); 890stop_progress(&progress_state); 891if(written != nr_result) 892die("wrote %"PRIu32" objects while expecting %"PRIu32, 893 written, nr_result); 894} 895 896static voidsetup_delta_attr_check(struct git_attr_check *check) 897{ 898static struct git_attr *attr_delta; 899 900if(!attr_delta) 901 attr_delta =git_attr("delta"); 902 903 check[0].attr = attr_delta; 904} 905 906static intno_try_delta(const char*path) 907{ 908struct git_attr_check check[1]; 909 910setup_delta_attr_check(check); 911if(git_check_attr(path,ARRAY_SIZE(check), check)) 912return0; 913if(ATTR_FALSE(check->value)) 914return1; 915return0; 916} 917 918/* 919 * When adding an object, check whether we have already added it 920 * to our packing list. If so, we can skip. However, if we are 921 * being asked to excludei t, but the previous mention was to include 922 * it, make sure to adjust its flags and tweak our numbers accordingly. 923 * 924 * As an optimization, we pass out the index position where we would have 925 * found the item, since that saves us from having to look it up again a 926 * few lines later when we want to add the new entry. 927 */ 928static inthave_duplicate_entry(const unsigned char*sha1, 929int exclude, 930uint32_t*index_pos) 931{ 932struct object_entry *entry; 933 934 entry =packlist_find(&to_pack, sha1, index_pos); 935if(!entry) 936return0; 937 938if(exclude) { 939if(!entry->preferred_base) 940 nr_result--; 941 entry->preferred_base =1; 942} 943 944return1; 945} 946 947/* 948 * Check whether we want the object in the pack (e.g., we do not want 949 * objects found in non-local stores if the "--local" option was used). 950 * 951 * As a side effect of this check, we will find the packed version of this 952 * object, if any. We therefore pass out the pack information to avoid having 953 * to look it up again later. 954 */ 955static intwant_object_in_pack(const unsigned char*sha1, 956int exclude, 957struct packed_git **found_pack, 958 off_t *found_offset) 959{ 960struct packed_git *p; 961 962if(!exclude && local &&has_loose_object_nonlocal(sha1)) 963return0; 964 965*found_pack = NULL; 966*found_offset =0; 967 968for(p = packed_git; p; p = p->next) { 969 off_t offset =find_pack_entry_one(sha1, p); 970if(offset) { 971if(!*found_pack) { 972if(!is_pack_valid(p)) 973continue; 974*found_offset = offset; 975*found_pack = p; 976} 977if(exclude) 978return1; 979if(incremental) 980return0; 981 982/* 983 * When asked to do --local (do not include an 984 * object that appears in a pack we borrow 985 * from elsewhere) or --honor-pack-keep (do not 986 * include an object that appears in a pack marked 987 * with .keep), we need to make sure no copy of this 988 * object come from in _any_ pack that causes us to 989 * omit it, and need to complete this loop. When 990 * neither option is in effect, we know the object 991 * we just found is going to be packed, so break 992 * out of the loop to return 1 now. 993 */ 994if(!ignore_packed_keep && 995(!local || !have_non_local_packs)) 996break; 997 998if(local && !p->pack_local) 999return0;1000if(ignore_packed_keep && p->pack_local && p->pack_keep)1001return0;1002}1003}10041005return1;1006}10071008static voidcreate_object_entry(const unsigned char*sha1,1009enum object_type type,1010uint32_t hash,1011int exclude,1012int no_try_delta,1013uint32_t index_pos,1014struct packed_git *found_pack,1015 off_t found_offset)1016{1017struct object_entry *entry;10181019 entry =packlist_alloc(&to_pack, sha1, index_pos);1020 entry->hash = hash;1021if(type)1022 entry->type = type;1023if(exclude)1024 entry->preferred_base =1;1025else1026 nr_result++;1027if(found_pack) {1028 entry->in_pack = found_pack;1029 entry->in_pack_offset = found_offset;1030}10311032 entry->no_try_delta = no_try_delta;1033}10341035static const char no_closure_warning[] =N_(1036"disabling bitmap writing, as some objects are not being packed"1037);10381039static intadd_object_entry(const unsigned char*sha1,enum object_type type,1040const char*name,int exclude)1041{1042struct packed_git *found_pack;1043 off_t found_offset;1044uint32_t index_pos;10451046if(have_duplicate_entry(sha1, exclude, &index_pos))1047return0;10481049if(!want_object_in_pack(sha1, exclude, &found_pack, &found_offset)) {1050/* The pack is missing an object, so it will not have closure */1051if(write_bitmap_index) {1052warning(_(no_closure_warning));1053 write_bitmap_index =0;1054}1055return0;1056}10571058create_object_entry(sha1, type,pack_name_hash(name),1059 exclude, name &&no_try_delta(name),1060 index_pos, found_pack, found_offset);10611062display_progress(progress_state, nr_result);1063return1;1064}10651066static intadd_object_entry_from_bitmap(const unsigned char*sha1,1067enum object_type type,1068int flags,uint32_t name_hash,1069struct packed_git *pack, off_t offset)1070{1071uint32_t index_pos;10721073if(have_duplicate_entry(sha1,0, &index_pos))1074return0;10751076create_object_entry(sha1, type, name_hash,0,0, index_pos, pack, offset);10771078display_progress(progress_state, nr_result);1079return1;1080}10811082struct pbase_tree_cache {1083unsigned char sha1[20];1084int ref;1085int temporary;1086void*tree_data;1087unsigned long tree_size;1088};10891090static struct pbase_tree_cache *(pbase_tree_cache[256]);1091static intpbase_tree_cache_ix(const unsigned char*sha1)1092{1093return sha1[0] %ARRAY_SIZE(pbase_tree_cache);1094}1095static intpbase_tree_cache_ix_incr(int ix)1096{1097return(ix+1) %ARRAY_SIZE(pbase_tree_cache);1098}10991100static struct pbase_tree {1101struct pbase_tree *next;1102/* This is a phony "cache" entry; we are not1103 * going to evict it or find it through _get()1104 * mechanism -- this is for the toplevel node that1105 * would almost always change with any commit.1106 */1107struct pbase_tree_cache pcache;1108} *pbase_tree;11091110static struct pbase_tree_cache *pbase_tree_get(const unsigned char*sha1)1111{1112struct pbase_tree_cache *ent, *nent;1113void*data;1114unsigned long size;1115enum object_type type;1116int neigh;1117int my_ix =pbase_tree_cache_ix(sha1);1118int available_ix = -1;11191120/* pbase-tree-cache acts as a limited hashtable.1121 * your object will be found at your index or within a few1122 * slots after that slot if it is cached.1123 */1124for(neigh =0; neigh <8; neigh++) {1125 ent = pbase_tree_cache[my_ix];1126if(ent && !hashcmp(ent->sha1, sha1)) {1127 ent->ref++;1128return ent;1129}1130else if(((available_ix <0) && (!ent || !ent->ref)) ||1131((0<= available_ix) &&1132(!ent && pbase_tree_cache[available_ix])))1133 available_ix = my_ix;1134if(!ent)1135break;1136 my_ix =pbase_tree_cache_ix_incr(my_ix);1137}11381139/* Did not find one. Either we got a bogus request or1140 * we need to read and perhaps cache.1141 */1142 data =read_sha1_file(sha1, &type, &size);1143if(!data)1144return NULL;1145if(type != OBJ_TREE) {1146free(data);1147return NULL;1148}11491150/* We need to either cache or return a throwaway copy */11511152if(available_ix <0)1153 ent = NULL;1154else{1155 ent = pbase_tree_cache[available_ix];1156 my_ix = available_ix;1157}11581159if(!ent) {1160 nent =xmalloc(sizeof(*nent));1161 nent->temporary = (available_ix <0);1162}1163else{1164/* evict and reuse */1165free(ent->tree_data);1166 nent = ent;1167}1168hashcpy(nent->sha1, sha1);1169 nent->tree_data = data;1170 nent->tree_size = size;1171 nent->ref =1;1172if(!nent->temporary)1173 pbase_tree_cache[my_ix] = nent;1174return nent;1175}11761177static voidpbase_tree_put(struct pbase_tree_cache *cache)1178{1179if(!cache->temporary) {1180 cache->ref--;1181return;1182}1183free(cache->tree_data);1184free(cache);1185}11861187static intname_cmp_len(const char*name)1188{1189int i;1190for(i =0; name[i] && name[i] !='\n'&& name[i] !='/'; i++)1191;1192return i;1193}11941195static voidadd_pbase_object(struct tree_desc *tree,1196const char*name,1197int cmplen,1198const char*fullname)1199{1200struct name_entry entry;1201int cmp;12021203while(tree_entry(tree,&entry)) {1204if(S_ISGITLINK(entry.mode))1205continue;1206 cmp =tree_entry_len(&entry) != cmplen ?1:1207memcmp(name, entry.path, cmplen);1208if(cmp >0)1209continue;1210if(cmp <0)1211return;1212if(name[cmplen] !='/') {1213add_object_entry(entry.oid->hash,1214object_type(entry.mode),1215 fullname,1);1216return;1217}1218if(S_ISDIR(entry.mode)) {1219struct tree_desc sub;1220struct pbase_tree_cache *tree;1221const char*down = name+cmplen+1;1222int downlen =name_cmp_len(down);12231224 tree =pbase_tree_get(entry.oid->hash);1225if(!tree)1226return;1227init_tree_desc(&sub, tree->tree_data, tree->tree_size);12281229add_pbase_object(&sub, down, downlen, fullname);1230pbase_tree_put(tree);1231}1232}1233}12341235static unsigned*done_pbase_paths;1236static int done_pbase_paths_num;1237static int done_pbase_paths_alloc;1238static intdone_pbase_path_pos(unsigned hash)1239{1240int lo =0;1241int hi = done_pbase_paths_num;1242while(lo < hi) {1243int mi = (hi + lo) /2;1244if(done_pbase_paths[mi] == hash)1245return mi;1246if(done_pbase_paths[mi] < hash)1247 hi = mi;1248else1249 lo = mi +1;1250}1251return-lo-1;1252}12531254static intcheck_pbase_path(unsigned hash)1255{1256int pos = (!done_pbase_paths) ? -1:done_pbase_path_pos(hash);1257if(0<= pos)1258return1;1259 pos = -pos -1;1260ALLOC_GROW(done_pbase_paths,1261 done_pbase_paths_num +1,1262 done_pbase_paths_alloc);1263 done_pbase_paths_num++;1264if(pos < done_pbase_paths_num)1265memmove(done_pbase_paths + pos +1,1266 done_pbase_paths + pos,1267(done_pbase_paths_num - pos -1) *sizeof(unsigned));1268 done_pbase_paths[pos] = hash;1269return0;1270}12711272static voidadd_preferred_base_object(const char*name)1273{1274struct pbase_tree *it;1275int cmplen;1276unsigned hash =pack_name_hash(name);12771278if(!num_preferred_base ||check_pbase_path(hash))1279return;12801281 cmplen =name_cmp_len(name);1282for(it = pbase_tree; it; it = it->next) {1283if(cmplen ==0) {1284add_object_entry(it->pcache.sha1, OBJ_TREE, NULL,1);1285}1286else{1287struct tree_desc tree;1288init_tree_desc(&tree, it->pcache.tree_data, it->pcache.tree_size);1289add_pbase_object(&tree, name, cmplen, name);1290}1291}1292}12931294static voidadd_preferred_base(unsigned char*sha1)1295{1296struct pbase_tree *it;1297void*data;1298unsigned long size;1299unsigned char tree_sha1[20];13001301if(window <= num_preferred_base++)1302return;13031304 data =read_object_with_reference(sha1, tree_type, &size, tree_sha1);1305if(!data)1306return;13071308for(it = pbase_tree; it; it = it->next) {1309if(!hashcmp(it->pcache.sha1, tree_sha1)) {1310free(data);1311return;1312}1313}13141315 it =xcalloc(1,sizeof(*it));1316 it->next = pbase_tree;1317 pbase_tree = it;13181319hashcpy(it->pcache.sha1, tree_sha1);1320 it->pcache.tree_data = data;1321 it->pcache.tree_size = size;1322}13231324static voidcleanup_preferred_base(void)1325{1326struct pbase_tree *it;1327unsigned i;13281329 it = pbase_tree;1330 pbase_tree = NULL;1331while(it) {1332struct pbase_tree *this= it;1333 it =this->next;1334free(this->pcache.tree_data);1335free(this);1336}13371338for(i =0; i <ARRAY_SIZE(pbase_tree_cache); i++) {1339if(!pbase_tree_cache[i])1340continue;1341free(pbase_tree_cache[i]->tree_data);1342free(pbase_tree_cache[i]);1343 pbase_tree_cache[i] = NULL;1344}13451346free(done_pbase_paths);1347 done_pbase_paths = NULL;1348 done_pbase_paths_num = done_pbase_paths_alloc =0;1349}13501351static voidcheck_object(struct object_entry *entry)1352{1353if(entry->in_pack) {1354struct packed_git *p = entry->in_pack;1355struct pack_window *w_curs = NULL;1356const unsigned char*base_ref = NULL;1357struct object_entry *base_entry;1358unsigned long used, used_0;1359unsigned long avail;1360 off_t ofs;1361unsigned char*buf, c;13621363 buf =use_pack(p, &w_curs, entry->in_pack_offset, &avail);13641365/*1366 * We want in_pack_type even if we do not reuse delta1367 * since non-delta representations could still be reused.1368 */1369 used =unpack_object_header_buffer(buf, avail,1370&entry->in_pack_type,1371&entry->size);1372if(used ==0)1373goto give_up;13741375/*1376 * Determine if this is a delta and if so whether we can1377 * reuse it or not. Otherwise let's find out as cheaply as1378 * possible what the actual type and size for this object is.1379 */1380switch(entry->in_pack_type) {1381default:1382/* Not a delta hence we've already got all we need. */1383 entry->type = entry->in_pack_type;1384 entry->in_pack_header_size = used;1385if(entry->type < OBJ_COMMIT || entry->type > OBJ_BLOB)1386goto give_up;1387unuse_pack(&w_curs);1388return;1389case OBJ_REF_DELTA:1390if(reuse_delta && !entry->preferred_base)1391 base_ref =use_pack(p, &w_curs,1392 entry->in_pack_offset + used, NULL);1393 entry->in_pack_header_size = used +20;1394break;1395case OBJ_OFS_DELTA:1396 buf =use_pack(p, &w_curs,1397 entry->in_pack_offset + used, NULL);1398 used_0 =0;1399 c = buf[used_0++];1400 ofs = c &127;1401while(c &128) {1402 ofs +=1;1403if(!ofs ||MSB(ofs,7)) {1404error("delta base offset overflow in pack for%s",1405sha1_to_hex(entry->idx.sha1));1406goto give_up;1407}1408 c = buf[used_0++];1409 ofs = (ofs <<7) + (c &127);1410}1411 ofs = entry->in_pack_offset - ofs;1412if(ofs <=0|| ofs >= entry->in_pack_offset) {1413error("delta base offset out of bound for%s",1414sha1_to_hex(entry->idx.sha1));1415goto give_up;1416}1417if(reuse_delta && !entry->preferred_base) {1418struct revindex_entry *revidx;1419 revidx =find_pack_revindex(p, ofs);1420if(!revidx)1421goto give_up;1422 base_ref =nth_packed_object_sha1(p, revidx->nr);1423}1424 entry->in_pack_header_size = used + used_0;1425break;1426}14271428if(base_ref && (base_entry =packlist_find(&to_pack, base_ref, NULL))) {1429/*1430 * If base_ref was set above that means we wish to1431 * reuse delta data, and we even found that base1432 * in the list of objects we want to pack. Goodie!1433 *1434 * Depth value does not matter - find_deltas() will1435 * never consider reused delta as the base object to1436 * deltify other objects against, in order to avoid1437 * circular deltas.1438 */1439 entry->type = entry->in_pack_type;1440 entry->delta = base_entry;1441 entry->delta_size = entry->size;1442 entry->delta_sibling = base_entry->delta_child;1443 base_entry->delta_child = entry;1444unuse_pack(&w_curs);1445return;1446}14471448if(entry->type) {1449/*1450 * This must be a delta and we already know what the1451 * final object type is. Let's extract the actual1452 * object size from the delta header.1453 */1454 entry->size =get_size_from_delta(p, &w_curs,1455 entry->in_pack_offset + entry->in_pack_header_size);1456if(entry->size ==0)1457goto give_up;1458unuse_pack(&w_curs);1459return;1460}14611462/*1463 * No choice but to fall back to the recursive delta walk1464 * with sha1_object_info() to find about the object type1465 * at this point...1466 */1467 give_up:1468unuse_pack(&w_curs);1469}14701471 entry->type =sha1_object_info(entry->idx.sha1, &entry->size);1472/*1473 * The error condition is checked in prepare_pack(). This is1474 * to permit a missing preferred base object to be ignored1475 * as a preferred base. Doing so can result in a larger1476 * pack file, but the transfer will still take place.1477 */1478}14791480static intpack_offset_sort(const void*_a,const void*_b)1481{1482const struct object_entry *a = *(struct object_entry **)_a;1483const struct object_entry *b = *(struct object_entry **)_b;14841485/* avoid filesystem trashing with loose objects */1486if(!a->in_pack && !b->in_pack)1487returnhashcmp(a->idx.sha1, b->idx.sha1);14881489if(a->in_pack < b->in_pack)1490return-1;1491if(a->in_pack > b->in_pack)1492return1;1493return a->in_pack_offset < b->in_pack_offset ? -1:1494(a->in_pack_offset > b->in_pack_offset);1495}14961497/*1498 * Drop an on-disk delta we were planning to reuse. Naively, this would1499 * just involve blanking out the "delta" field, but we have to deal1500 * with some extra book-keeping:1501 *1502 * 1. Removing ourselves from the delta_sibling linked list.1503 *1504 * 2. Updating our size/type to the non-delta representation. These were1505 * either not recorded initially (size) or overwritten with the delta type1506 * (type) when check_object() decided to reuse the delta.1507 */1508static voiddrop_reused_delta(struct object_entry *entry)1509{1510struct object_entry **p = &entry->delta->delta_child;1511struct object_info oi = OBJECT_INFO_INIT;15121513while(*p) {1514if(*p == entry)1515*p = (*p)->delta_sibling;1516else1517 p = &(*p)->delta_sibling;1518}1519 entry->delta = NULL;15201521 oi.sizep = &entry->size;1522 oi.typep = &entry->type;1523if(packed_object_info(entry->in_pack, entry->in_pack_offset, &oi) <0) {1524/*1525 * We failed to get the info from this pack for some reason;1526 * fall back to sha1_object_info, which may find another copy.1527 * And if that fails, the error will be recorded in entry->type1528 * and dealt with in prepare_pack().1529 */1530 entry->type =sha1_object_info(entry->idx.sha1, &entry->size);1531}1532}15331534/*1535 * Follow the chain of deltas from this entry onward, throwing away any links1536 * that cause us to hit a cycle (as determined by the DFS state flags in1537 * the entries).1538 */1539static voidbreak_delta_chains(struct object_entry *entry)1540{1541/* If it's not a delta, it can't be part of a cycle. */1542if(!entry->delta) {1543 entry->dfs_state = DFS_DONE;1544return;1545}15461547switch(entry->dfs_state) {1548case DFS_NONE:1549/*1550 * This is the first time we've seen the object. We mark it as1551 * part of the active potential cycle and recurse.1552 */1553 entry->dfs_state = DFS_ACTIVE;1554break_delta_chains(entry->delta);1555 entry->dfs_state = DFS_DONE;1556break;15571558case DFS_DONE:1559/* object already examined, and not part of a cycle */1560break;15611562case DFS_ACTIVE:1563/*1564 * We found a cycle that needs broken. It would be correct to1565 * break any link in the chain, but it's convenient to1566 * break this one.1567 */1568drop_reused_delta(entry);1569 entry->dfs_state = DFS_DONE;1570break;1571}1572}15731574static voidget_object_details(void)1575{1576uint32_t i;1577struct object_entry **sorted_by_offset;15781579 sorted_by_offset =xcalloc(to_pack.nr_objects,sizeof(struct object_entry *));1580for(i =0; i < to_pack.nr_objects; i++)1581 sorted_by_offset[i] = to_pack.objects + i;1582qsort(sorted_by_offset, to_pack.nr_objects,sizeof(*sorted_by_offset), pack_offset_sort);15831584for(i =0; i < to_pack.nr_objects; i++) {1585struct object_entry *entry = sorted_by_offset[i];1586check_object(entry);1587if(big_file_threshold < entry->size)1588 entry->no_try_delta =1;1589}15901591/*1592 * This must happen in a second pass, since we rely on the delta1593 * information for the whole list being completed.1594 */1595for(i =0; i < to_pack.nr_objects; i++)1596break_delta_chains(&to_pack.objects[i]);15971598free(sorted_by_offset);1599}16001601/*1602 * We search for deltas in a list sorted by type, by filename hash, and then1603 * by size, so that we see progressively smaller and smaller files.1604 * That's because we prefer deltas to be from the bigger file1605 * to the smaller -- deletes are potentially cheaper, but perhaps1606 * more importantly, the bigger file is likely the more recent1607 * one. The deepest deltas are therefore the oldest objects which are1608 * less susceptible to be accessed often.1609 */1610static inttype_size_sort(const void*_a,const void*_b)1611{1612const struct object_entry *a = *(struct object_entry **)_a;1613const struct object_entry *b = *(struct object_entry **)_b;16141615if(a->type > b->type)1616return-1;1617if(a->type < b->type)1618return1;1619if(a->hash > b->hash)1620return-1;1621if(a->hash < b->hash)1622return1;1623if(a->preferred_base > b->preferred_base)1624return-1;1625if(a->preferred_base < b->preferred_base)1626return1;1627if(a->size > b->size)1628return-1;1629if(a->size < b->size)1630return1;1631return a < b ? -1: (a > b);/* newest first */1632}16331634struct unpacked {1635struct object_entry *entry;1636void*data;1637struct delta_index *index;1638unsigned depth;1639};16401641static intdelta_cacheable(unsigned long src_size,unsigned long trg_size,1642unsigned long delta_size)1643{1644if(max_delta_cache_size && delta_cache_size + delta_size > max_delta_cache_size)1645return0;16461647if(delta_size < cache_max_small_delta_size)1648return1;16491650/* cache delta, if objects are large enough compared to delta size */1651if((src_size >>20) + (trg_size >>21) > (delta_size >>10))1652return1;16531654return0;1655}16561657#ifndef NO_PTHREADS16581659static pthread_mutex_t read_mutex;1660#define read_lock() pthread_mutex_lock(&read_mutex)1661#define read_unlock() pthread_mutex_unlock(&read_mutex)16621663static pthread_mutex_t cache_mutex;1664#define cache_lock() pthread_mutex_lock(&cache_mutex)1665#define cache_unlock() pthread_mutex_unlock(&cache_mutex)16661667static pthread_mutex_t progress_mutex;1668#define progress_lock() pthread_mutex_lock(&progress_mutex)1669#define progress_unlock() pthread_mutex_unlock(&progress_mutex)16701671#else16721673#define read_lock() (void)01674#define read_unlock() (void)01675#define cache_lock() (void)01676#define cache_unlock() (void)01677#define progress_lock() (void)01678#define progress_unlock() (void)016791680#endif16811682static inttry_delta(struct unpacked *trg,struct unpacked *src,1683unsigned max_depth,unsigned long*mem_usage)1684{1685struct object_entry *trg_entry = trg->entry;1686struct object_entry *src_entry = src->entry;1687unsigned long trg_size, src_size, delta_size, sizediff, max_size, sz;1688unsigned ref_depth;1689enum object_type type;1690void*delta_buf;16911692/* Don't bother doing diffs between different types */1693if(trg_entry->type != src_entry->type)1694return-1;16951696/*1697 * We do not bother to try a delta that we discarded on an1698 * earlier try, but only when reusing delta data. Note that1699 * src_entry that is marked as the preferred_base should always1700 * be considered, as even if we produce a suboptimal delta against1701 * it, we will still save the transfer cost, as we already know1702 * the other side has it and we won't send src_entry at all.1703 */1704if(reuse_delta && trg_entry->in_pack &&1705 trg_entry->in_pack == src_entry->in_pack &&1706!src_entry->preferred_base &&1707 trg_entry->in_pack_type != OBJ_REF_DELTA &&1708 trg_entry->in_pack_type != OBJ_OFS_DELTA)1709return0;17101711/* Let's not bust the allowed depth. */1712if(src->depth >= max_depth)1713return0;17141715/* Now some size filtering heuristics. */1716 trg_size = trg_entry->size;1717if(!trg_entry->delta) {1718 max_size = trg_size/2-20;1719 ref_depth =1;1720}else{1721 max_size = trg_entry->delta_size;1722 ref_depth = trg->depth;1723}1724 max_size = (uint64_t)max_size * (max_depth - src->depth) /1725(max_depth - ref_depth +1);1726if(max_size ==0)1727return0;1728 src_size = src_entry->size;1729 sizediff = src_size < trg_size ? trg_size - src_size :0;1730if(sizediff >= max_size)1731return0;1732if(trg_size < src_size /32)1733return0;17341735/* Load data if not already done */1736if(!trg->data) {1737read_lock();1738 trg->data =read_sha1_file(trg_entry->idx.sha1, &type, &sz);1739read_unlock();1740if(!trg->data)1741die("object%scannot be read",1742sha1_to_hex(trg_entry->idx.sha1));1743if(sz != trg_size)1744die("object%sinconsistent object length (%lu vs%lu)",1745sha1_to_hex(trg_entry->idx.sha1), sz, trg_size);1746*mem_usage += sz;1747}1748if(!src->data) {1749read_lock();1750 src->data =read_sha1_file(src_entry->idx.sha1, &type, &sz);1751read_unlock();1752if(!src->data) {1753if(src_entry->preferred_base) {1754static int warned =0;1755if(!warned++)1756warning("object%scannot be read",1757sha1_to_hex(src_entry->idx.sha1));1758/*1759 * Those objects are not included in the1760 * resulting pack. Be resilient and ignore1761 * them if they can't be read, in case the1762 * pack could be created nevertheless.1763 */1764return0;1765}1766die("object%scannot be read",1767sha1_to_hex(src_entry->idx.sha1));1768}1769if(sz != src_size)1770die("object%sinconsistent object length (%lu vs%lu)",1771sha1_to_hex(src_entry->idx.sha1), sz, src_size);1772*mem_usage += sz;1773}1774if(!src->index) {1775 src->index =create_delta_index(src->data, src_size);1776if(!src->index) {1777static int warned =0;1778if(!warned++)1779warning("suboptimal pack - out of memory");1780return0;1781}1782*mem_usage +=sizeof_delta_index(src->index);1783}17841785 delta_buf =create_delta(src->index, trg->data, trg_size, &delta_size, max_size);1786if(!delta_buf)1787return0;17881789if(trg_entry->delta) {1790/* Prefer only shallower same-sized deltas. */1791if(delta_size == trg_entry->delta_size &&1792 src->depth +1>= trg->depth) {1793free(delta_buf);1794return0;1795}1796}17971798/*1799 * Handle memory allocation outside of the cache1800 * accounting lock. Compiler will optimize the strangeness1801 * away when NO_PTHREADS is defined.1802 */1803free(trg_entry->delta_data);1804cache_lock();1805if(trg_entry->delta_data) {1806 delta_cache_size -= trg_entry->delta_size;1807 trg_entry->delta_data = NULL;1808}1809if(delta_cacheable(src_size, trg_size, delta_size)) {1810 delta_cache_size += delta_size;1811cache_unlock();1812 trg_entry->delta_data =xrealloc(delta_buf, delta_size);1813}else{1814cache_unlock();1815free(delta_buf);1816}18171818 trg_entry->delta = src_entry;1819 trg_entry->delta_size = delta_size;1820 trg->depth = src->depth +1;18211822return1;1823}18241825static unsigned intcheck_delta_limit(struct object_entry *me,unsigned int n)1826{1827struct object_entry *child = me->delta_child;1828unsigned int m = n;1829while(child) {1830unsigned int c =check_delta_limit(child, n +1);1831if(m < c)1832 m = c;1833 child = child->delta_sibling;1834}1835return m;1836}18371838static unsigned longfree_unpacked(struct unpacked *n)1839{1840unsigned long freed_mem =sizeof_delta_index(n->index);1841free_delta_index(n->index);1842 n->index = NULL;1843if(n->data) {1844 freed_mem += n->entry->size;1845free(n->data);1846 n->data = NULL;1847}1848 n->entry = NULL;1849 n->depth =0;1850return freed_mem;1851}18521853static voidfind_deltas(struct object_entry **list,unsigned*list_size,1854int window,int depth,unsigned*processed)1855{1856uint32_t i, idx =0, count =0;1857struct unpacked *array;1858unsigned long mem_usage =0;18591860 array =xcalloc(window,sizeof(struct unpacked));18611862for(;;) {1863struct object_entry *entry;1864struct unpacked *n = array + idx;1865int j, max_depth, best_base = -1;18661867progress_lock();1868if(!*list_size) {1869progress_unlock();1870break;1871}1872 entry = *list++;1873(*list_size)--;1874if(!entry->preferred_base) {1875(*processed)++;1876display_progress(progress_state, *processed);1877}1878progress_unlock();18791880 mem_usage -=free_unpacked(n);1881 n->entry = entry;18821883while(window_memory_limit &&1884 mem_usage > window_memory_limit &&1885 count >1) {1886uint32_t tail = (idx + window - count) % window;1887 mem_usage -=free_unpacked(array + tail);1888 count--;1889}18901891/* We do not compute delta to *create* objects we are not1892 * going to pack.1893 */1894if(entry->preferred_base)1895goto next;18961897/*1898 * If the current object is at pack edge, take the depth the1899 * objects that depend on the current object into account1900 * otherwise they would become too deep.1901 */1902 max_depth = depth;1903if(entry->delta_child) {1904 max_depth -=check_delta_limit(entry,0);1905if(max_depth <=0)1906goto next;1907}19081909 j = window;1910while(--j >0) {1911int ret;1912uint32_t other_idx = idx + j;1913struct unpacked *m;1914if(other_idx >= window)1915 other_idx -= window;1916 m = array + other_idx;1917if(!m->entry)1918break;1919 ret =try_delta(n, m, max_depth, &mem_usage);1920if(ret <0)1921break;1922else if(ret >0)1923 best_base = other_idx;1924}19251926/*1927 * If we decided to cache the delta data, then it is best1928 * to compress it right away. First because we have to do1929 * it anyway, and doing it here while we're threaded will1930 * save a lot of time in the non threaded write phase,1931 * as well as allow for caching more deltas within1932 * the same cache size limit.1933 * ...1934 * But only if not writing to stdout, since in that case1935 * the network is most likely throttling writes anyway,1936 * and therefore it is best to go to the write phase ASAP1937 * instead, as we can afford spending more time compressing1938 * between writes at that moment.1939 */1940if(entry->delta_data && !pack_to_stdout) {1941 entry->z_delta_size =do_compress(&entry->delta_data,1942 entry->delta_size);1943cache_lock();1944 delta_cache_size -= entry->delta_size;1945 delta_cache_size += entry->z_delta_size;1946cache_unlock();1947}19481949/* if we made n a delta, and if n is already at max1950 * depth, leaving it in the window is pointless. we1951 * should evict it first.1952 */1953if(entry->delta && max_depth <= n->depth)1954continue;19551956/*1957 * Move the best delta base up in the window, after the1958 * currently deltified object, to keep it longer. It will1959 * be the first base object to be attempted next.1960 */1961if(entry->delta) {1962struct unpacked swap = array[best_base];1963int dist = (window + idx - best_base) % window;1964int dst = best_base;1965while(dist--) {1966int src = (dst +1) % window;1967 array[dst] = array[src];1968 dst = src;1969}1970 array[dst] = swap;1971}19721973 next:1974 idx++;1975if(count +1< window)1976 count++;1977if(idx >= window)1978 idx =0;1979}19801981for(i =0; i < window; ++i) {1982free_delta_index(array[i].index);1983free(array[i].data);1984}1985free(array);1986}19871988#ifndef NO_PTHREADS19891990static voidtry_to_free_from_threads(size_t size)1991{1992read_lock();1993release_pack_memory(size);1994read_unlock();1995}19961997static try_to_free_t old_try_to_free_routine;19981999/*2000 * The main thread waits on the condition that (at least) one of the workers2001 * has stopped working (which is indicated in the .working member of2002 * struct thread_params).2003 * When a work thread has completed its work, it sets .working to 0 and2004 * signals the main thread and waits on the condition that .data_ready2005 * becomes 1.2006 */20072008struct thread_params {2009 pthread_t thread;2010struct object_entry **list;2011unsigned list_size;2012unsigned remaining;2013int window;2014int depth;2015int working;2016int data_ready;2017 pthread_mutex_t mutex;2018 pthread_cond_t cond;2019unsigned*processed;2020};20212022static pthread_cond_t progress_cond;20232024/*2025 * Mutex and conditional variable can't be statically-initialized on Windows.2026 */2027static voidinit_threaded_search(void)2028{2029init_recursive_mutex(&read_mutex);2030pthread_mutex_init(&cache_mutex, NULL);2031pthread_mutex_init(&progress_mutex, NULL);2032pthread_cond_init(&progress_cond, NULL);2033 old_try_to_free_routine =set_try_to_free_routine(try_to_free_from_threads);2034}20352036static voidcleanup_threaded_search(void)2037{2038set_try_to_free_routine(old_try_to_free_routine);2039pthread_cond_destroy(&progress_cond);2040pthread_mutex_destroy(&read_mutex);2041pthread_mutex_destroy(&cache_mutex);2042pthread_mutex_destroy(&progress_mutex);2043}20442045static void*threaded_find_deltas(void*arg)2046{2047struct thread_params *me = arg;20482049while(me->remaining) {2050find_deltas(me->list, &me->remaining,2051 me->window, me->depth, me->processed);20522053progress_lock();2054 me->working =0;2055pthread_cond_signal(&progress_cond);2056progress_unlock();20572058/*2059 * We must not set ->data_ready before we wait on the2060 * condition because the main thread may have set it to 12061 * before we get here. In order to be sure that new2062 * work is available if we see 1 in ->data_ready, it2063 * was initialized to 0 before this thread was spawned2064 * and we reset it to 0 right away.2065 */2066pthread_mutex_lock(&me->mutex);2067while(!me->data_ready)2068pthread_cond_wait(&me->cond, &me->mutex);2069 me->data_ready =0;2070pthread_mutex_unlock(&me->mutex);2071}2072/* leave ->working 1 so that this doesn't get more work assigned */2073return NULL;2074}20752076static voidll_find_deltas(struct object_entry **list,unsigned list_size,2077int window,int depth,unsigned*processed)2078{2079struct thread_params *p;2080int i, ret, active_threads =0;20812082init_threaded_search();20832084if(delta_search_threads <=1) {2085find_deltas(list, &list_size, window, depth, processed);2086cleanup_threaded_search();2087return;2088}2089if(progress > pack_to_stdout)2090fprintf(stderr,"Delta compression using up to%dthreads.\n",2091 delta_search_threads);2092 p =xcalloc(delta_search_threads,sizeof(*p));20932094/* Partition the work amongst work threads. */2095for(i =0; i < delta_search_threads; i++) {2096unsigned sub_size = list_size / (delta_search_threads - i);20972098/* don't use too small segments or no deltas will be found */2099if(sub_size <2*window && i+1< delta_search_threads)2100 sub_size =0;21012102 p[i].window = window;2103 p[i].depth = depth;2104 p[i].processed = processed;2105 p[i].working =1;2106 p[i].data_ready =0;21072108/* try to split chunks on "path" boundaries */2109while(sub_size && sub_size < list_size &&2110 list[sub_size]->hash &&2111 list[sub_size]->hash == list[sub_size-1]->hash)2112 sub_size++;21132114 p[i].list = list;2115 p[i].list_size = sub_size;2116 p[i].remaining = sub_size;21172118 list += sub_size;2119 list_size -= sub_size;2120}21212122/* Start work threads. */2123for(i =0; i < delta_search_threads; i++) {2124if(!p[i].list_size)2125continue;2126pthread_mutex_init(&p[i].mutex, NULL);2127pthread_cond_init(&p[i].cond, NULL);2128 ret =pthread_create(&p[i].thread, NULL,2129 threaded_find_deltas, &p[i]);2130if(ret)2131die("unable to create thread:%s",strerror(ret));2132 active_threads++;2133}21342135/*2136 * Now let's wait for work completion. Each time a thread is done2137 * with its work, we steal half of the remaining work from the2138 * thread with the largest number of unprocessed objects and give2139 * it to that newly idle thread. This ensure good load balancing2140 * until the remaining object list segments are simply too short2141 * to be worth splitting anymore.2142 */2143while(active_threads) {2144struct thread_params *target = NULL;2145struct thread_params *victim = NULL;2146unsigned sub_size =0;21472148progress_lock();2149for(;;) {2150for(i =0; !target && i < delta_search_threads; i++)2151if(!p[i].working)2152 target = &p[i];2153if(target)2154break;2155pthread_cond_wait(&progress_cond, &progress_mutex);2156}21572158for(i =0; i < delta_search_threads; i++)2159if(p[i].remaining >2*window &&2160(!victim || victim->remaining < p[i].remaining))2161 victim = &p[i];2162if(victim) {2163 sub_size = victim->remaining /2;2164 list = victim->list + victim->list_size - sub_size;2165while(sub_size && list[0]->hash &&2166 list[0]->hash == list[-1]->hash) {2167 list++;2168 sub_size--;2169}2170if(!sub_size) {2171/*2172 * It is possible for some "paths" to have2173 * so many objects that no hash boundary2174 * might be found. Let's just steal the2175 * exact half in that case.2176 */2177 sub_size = victim->remaining /2;2178 list -= sub_size;2179}2180 target->list = list;2181 victim->list_size -= sub_size;2182 victim->remaining -= sub_size;2183}2184 target->list_size = sub_size;2185 target->remaining = sub_size;2186 target->working =1;2187progress_unlock();21882189pthread_mutex_lock(&target->mutex);2190 target->data_ready =1;2191pthread_cond_signal(&target->cond);2192pthread_mutex_unlock(&target->mutex);21932194if(!sub_size) {2195pthread_join(target->thread, NULL);2196pthread_cond_destroy(&target->cond);2197pthread_mutex_destroy(&target->mutex);2198 active_threads--;2199}2200}2201cleanup_threaded_search();2202free(p);2203}22042205#else2206#define ll_find_deltas(l, s, w, d, p) find_deltas(l, &s, w, d, p)2207#endif22082209static intadd_ref_tag(const char*path,const struct object_id *oid,int flag,void*cb_data)2210{2211struct object_id peeled;22122213if(starts_with(path,"refs/tags/") &&/* is a tag? */2214!peel_ref(path, peeled.hash) &&/* peelable? */2215packlist_find(&to_pack, peeled.hash, NULL))/* object packed? */2216add_object_entry(oid->hash, OBJ_TAG, NULL,0);2217return0;2218}22192220static voidprepare_pack(int window,int depth)2221{2222struct object_entry **delta_list;2223uint32_t i, nr_deltas;2224unsigned n;22252226get_object_details();22272228/*2229 * If we're locally repacking then we need to be doubly careful2230 * from now on in order to make sure no stealth corruption gets2231 * propagated to the new pack. Clients receiving streamed packs2232 * should validate everything they get anyway so no need to incur2233 * the additional cost here in that case.2234 */2235if(!pack_to_stdout)2236 do_check_packed_object_crc =1;22372238if(!to_pack.nr_objects || !window || !depth)2239return;22402241ALLOC_ARRAY(delta_list, to_pack.nr_objects);2242 nr_deltas = n =0;22432244for(i =0; i < to_pack.nr_objects; i++) {2245struct object_entry *entry = to_pack.objects + i;22462247if(entry->delta)2248/* This happens if we decided to reuse existing2249 * delta from a pack. "reuse_delta &&" is implied.2250 */2251continue;22522253if(entry->size <50)2254continue;22552256if(entry->no_try_delta)2257continue;22582259if(!entry->preferred_base) {2260 nr_deltas++;2261if(entry->type <0)2262die("unable to get type of object%s",2263sha1_to_hex(entry->idx.sha1));2264}else{2265if(entry->type <0) {2266/*2267 * This object is not found, but we2268 * don't have to include it anyway.2269 */2270continue;2271}2272}22732274 delta_list[n++] = entry;2275}22762277if(nr_deltas && n >1) {2278unsigned nr_done =0;2279if(progress)2280 progress_state =start_progress(_("Compressing objects"),2281 nr_deltas);2282qsort(delta_list, n,sizeof(*delta_list), type_size_sort);2283ll_find_deltas(delta_list, n, window+1, depth, &nr_done);2284stop_progress(&progress_state);2285if(nr_done != nr_deltas)2286die("inconsistency with delta count");2287}2288free(delta_list);2289}22902291static intgit_pack_config(const char*k,const char*v,void*cb)2292{2293if(!strcmp(k,"pack.window")) {2294 window =git_config_int(k, v);2295return0;2296}2297if(!strcmp(k,"pack.windowmemory")) {2298 window_memory_limit =git_config_ulong(k, v);2299return0;2300}2301if(!strcmp(k,"pack.depth")) {2302 depth =git_config_int(k, v);2303return0;2304}2305if(!strcmp(k,"pack.compression")) {2306int level =git_config_int(k, v);2307if(level == -1)2308 level = Z_DEFAULT_COMPRESSION;2309else if(level <0|| level > Z_BEST_COMPRESSION)2310die("bad pack compression level%d", level);2311 pack_compression_level = level;2312 pack_compression_seen =1;2313return0;2314}2315if(!strcmp(k,"pack.deltacachesize")) {2316 max_delta_cache_size =git_config_int(k, v);2317return0;2318}2319if(!strcmp(k,"pack.deltacachelimit")) {2320 cache_max_small_delta_size =git_config_int(k, v);2321return0;2322}2323if(!strcmp(k,"pack.writebitmaphashcache")) {2324if(git_config_bool(k, v))2325 write_bitmap_options |= BITMAP_OPT_HASH_CACHE;2326else2327 write_bitmap_options &= ~BITMAP_OPT_HASH_CACHE;2328}2329if(!strcmp(k,"pack.usebitmaps")) {2330 use_bitmap_index =git_config_bool(k, v);2331return0;2332}2333if(!strcmp(k,"pack.threads")) {2334 delta_search_threads =git_config_int(k, v);2335if(delta_search_threads <0)2336die("invalid number of threads specified (%d)",2337 delta_search_threads);2338#ifdef NO_PTHREADS2339if(delta_search_threads !=1)2340warning("no threads support, ignoring%s", k);2341#endif2342return0;2343}2344if(!strcmp(k,"pack.indexversion")) {2345 pack_idx_opts.version =git_config_int(k, v);2346if(pack_idx_opts.version >2)2347die("bad pack.indexversion=%"PRIu32,2348 pack_idx_opts.version);2349return0;2350}2351returngit_default_config(k, v, cb);2352}23532354static voidread_object_list_from_stdin(void)2355{2356char line[40+1+ PATH_MAX +2];2357unsigned char sha1[20];23582359for(;;) {2360if(!fgets(line,sizeof(line), stdin)) {2361if(feof(stdin))2362break;2363if(!ferror(stdin))2364die("fgets returned NULL, not EOF, not error!");2365if(errno != EINTR)2366die_errno("fgets");2367clearerr(stdin);2368continue;2369}2370if(line[0] =='-') {2371if(get_sha1_hex(line+1, sha1))2372die("expected edge sha1, got garbage:\n%s",2373 line);2374add_preferred_base(sha1);2375continue;2376}2377if(get_sha1_hex(line, sha1))2378die("expected sha1, got garbage:\n%s", line);23792380add_preferred_base_object(line+41);2381add_object_entry(sha1,0, line+41,0);2382}2383}23842385#define OBJECT_ADDED (1u<<20)23862387static voidshow_commit(struct commit *commit,void*data)2388{2389add_object_entry(commit->object.oid.hash, OBJ_COMMIT, NULL,0);2390 commit->object.flags |= OBJECT_ADDED;23912392if(write_bitmap_index)2393index_commit_for_bitmap(commit);2394}23952396static voidshow_object(struct object *obj,const char*name,void*data)2397{2398add_preferred_base_object(name);2399add_object_entry(obj->oid.hash, obj->type, name,0);2400 obj->flags |= OBJECT_ADDED;2401}24022403static voidshow_edge(struct commit *commit)2404{2405add_preferred_base(commit->object.oid.hash);2406}24072408struct in_pack_object {2409 off_t offset;2410struct object *object;2411};24122413struct in_pack {2414int alloc;2415int nr;2416struct in_pack_object *array;2417};24182419static voidmark_in_pack_object(struct object *object,struct packed_git *p,struct in_pack *in_pack)2420{2421 in_pack->array[in_pack->nr].offset =find_pack_entry_one(object->oid.hash, p);2422 in_pack->array[in_pack->nr].object = object;2423 in_pack->nr++;2424}24252426/*2427 * Compare the objects in the offset order, in order to emulate the2428 * "git rev-list --objects" output that produced the pack originally.2429 */2430static intofscmp(const void*a_,const void*b_)2431{2432struct in_pack_object *a = (struct in_pack_object *)a_;2433struct in_pack_object *b = (struct in_pack_object *)b_;24342435if(a->offset < b->offset)2436return-1;2437else if(a->offset > b->offset)2438return1;2439else2440returnoidcmp(&a->object->oid, &b->object->oid);2441}24422443static voidadd_objects_in_unpacked_packs(struct rev_info *revs)2444{2445struct packed_git *p;2446struct in_pack in_pack;2447uint32_t i;24482449memset(&in_pack,0,sizeof(in_pack));24502451for(p = packed_git; p; p = p->next) {2452const unsigned char*sha1;2453struct object *o;24542455if(!p->pack_local || p->pack_keep)2456continue;2457if(open_pack_index(p))2458die("cannot open pack index");24592460ALLOC_GROW(in_pack.array,2461 in_pack.nr + p->num_objects,2462 in_pack.alloc);24632464for(i =0; i < p->num_objects; i++) {2465 sha1 =nth_packed_object_sha1(p, i);2466 o =lookup_unknown_object(sha1);2467if(!(o->flags & OBJECT_ADDED))2468mark_in_pack_object(o, p, &in_pack);2469 o->flags |= OBJECT_ADDED;2470}2471}24722473if(in_pack.nr) {2474qsort(in_pack.array, in_pack.nr,sizeof(in_pack.array[0]),2475 ofscmp);2476for(i =0; i < in_pack.nr; i++) {2477struct object *o = in_pack.array[i].object;2478add_object_entry(o->oid.hash, o->type,"",0);2479}2480}2481free(in_pack.array);2482}24832484static intadd_loose_object(const unsigned char*sha1,const char*path,2485void*data)2486{2487enum object_type type =sha1_object_info(sha1, NULL);24882489if(type <0) {2490warning("loose object at%scould not be examined", path);2491return0;2492}24932494add_object_entry(sha1, type,"",0);2495return0;2496}24972498/*2499 * We actually don't even have to worry about reachability here.2500 * add_object_entry will weed out duplicates, so we just add every2501 * loose object we find.2502 */2503static voidadd_unreachable_loose_objects(void)2504{2505for_each_loose_file_in_objdir(get_object_directory(),2506 add_loose_object,2507 NULL, NULL, NULL);2508}25092510static inthas_sha1_pack_kept_or_nonlocal(const unsigned char*sha1)2511{2512static struct packed_git *last_found = (void*)1;2513struct packed_git *p;25142515 p = (last_found != (void*)1) ? last_found : packed_git;25162517while(p) {2518if((!p->pack_local || p->pack_keep) &&2519find_pack_entry_one(sha1, p)) {2520 last_found = p;2521return1;2522}2523if(p == last_found)2524 p = packed_git;2525else2526 p = p->next;2527if(p == last_found)2528 p = p->next;2529}2530return0;2531}25322533/*2534 * Store a list of sha1s that are should not be discarded2535 * because they are either written too recently, or are2536 * reachable from another object that was.2537 *2538 * This is filled by get_object_list.2539 */2540static struct sha1_array recent_objects;25412542static intloosened_object_can_be_discarded(const unsigned char*sha1,2543unsigned long mtime)2544{2545if(!unpack_unreachable_expiration)2546return0;2547if(mtime > unpack_unreachable_expiration)2548return0;2549if(sha1_array_lookup(&recent_objects, sha1) >=0)2550return0;2551return1;2552}25532554static voidloosen_unused_packed_objects(struct rev_info *revs)2555{2556struct packed_git *p;2557uint32_t i;2558const unsigned char*sha1;25592560for(p = packed_git; p; p = p->next) {2561if(!p->pack_local || p->pack_keep)2562continue;25632564if(open_pack_index(p))2565die("cannot open pack index");25662567for(i =0; i < p->num_objects; i++) {2568 sha1 =nth_packed_object_sha1(p, i);2569if(!packlist_find(&to_pack, sha1, NULL) &&2570!has_sha1_pack_kept_or_nonlocal(sha1) &&2571!loosened_object_can_be_discarded(sha1, p->mtime))2572if(force_object_loose(sha1, p->mtime))2573die("unable to force loose object");2574}2575}2576}25772578/*2579 * This tracks any options which a reader of the pack might2580 * not understand, and which would therefore prevent blind reuse2581 * of what we have on disk.2582 */2583static intpack_options_allow_reuse(void)2584{2585return allow_ofs_delta;2586}25872588static intget_object_list_from_bitmap(struct rev_info *revs)2589{2590if(prepare_bitmap_walk(revs) <0)2591return-1;25922593if(pack_options_allow_reuse() &&2594!reuse_partial_packfile_from_bitmap(2595&reuse_packfile,2596&reuse_packfile_objects,2597&reuse_packfile_offset)) {2598assert(reuse_packfile_objects);2599 nr_result += reuse_packfile_objects;2600display_progress(progress_state, nr_result);2601}26022603traverse_bitmap_commit_list(&add_object_entry_from_bitmap);2604return0;2605}26062607static voidrecord_recent_object(struct object *obj,2608const char*name,2609void*data)2610{2611sha1_array_append(&recent_objects, obj->oid.hash);2612}26132614static voidrecord_recent_commit(struct commit *commit,void*data)2615{2616sha1_array_append(&recent_objects, commit->object.oid.hash);2617}26182619static voidget_object_list(int ac,const char**av)2620{2621struct rev_info revs;2622char line[1000];2623int flags =0;26242625init_revisions(&revs, NULL);2626 save_commit_buffer =0;2627setup_revisions(ac, av, &revs, NULL);26282629/* make sure shallows are read */2630is_repository_shallow();26312632while(fgets(line,sizeof(line), stdin) != NULL) {2633int len =strlen(line);2634if(len && line[len -1] =='\n')2635 line[--len] =0;2636if(!len)2637break;2638if(*line =='-') {2639if(!strcmp(line,"--not")) {2640 flags ^= UNINTERESTING;2641 write_bitmap_index =0;2642continue;2643}2644if(starts_with(line,"--shallow ")) {2645unsigned char sha1[20];2646if(get_sha1_hex(line +10, sha1))2647die("not an SHA-1 '%s'", line +10);2648register_shallow(sha1);2649 use_bitmap_index =0;2650continue;2651}2652die("not a rev '%s'", line);2653}2654if(handle_revision_arg(line, &revs, flags, REVARG_CANNOT_BE_FILENAME))2655die("bad revision '%s'", line);2656}26572658if(use_bitmap_index && !get_object_list_from_bitmap(&revs))2659return;26602661if(prepare_revision_walk(&revs))2662die("revision walk setup failed");2663mark_edges_uninteresting(&revs, show_edge);2664traverse_commit_list(&revs, show_commit, show_object, NULL);26652666if(unpack_unreachable_expiration) {2667 revs.ignore_missing_links =1;2668if(add_unseen_recent_objects_to_traversal(&revs,2669 unpack_unreachable_expiration))2670die("unable to add recent objects");2671if(prepare_revision_walk(&revs))2672die("revision walk setup failed");2673traverse_commit_list(&revs, record_recent_commit,2674 record_recent_object, NULL);2675}26762677if(keep_unreachable)2678add_objects_in_unpacked_packs(&revs);2679if(pack_loose_unreachable)2680add_unreachable_loose_objects();2681if(unpack_unreachable)2682loosen_unused_packed_objects(&revs);26832684sha1_array_clear(&recent_objects);2685}26862687static intoption_parse_index_version(const struct option *opt,2688const char*arg,int unset)2689{2690char*c;2691const char*val = arg;2692 pack_idx_opts.version =strtoul(val, &c,10);2693if(pack_idx_opts.version >2)2694die(_("unsupported index version%s"), val);2695if(*c ==','&& c[1])2696 pack_idx_opts.off32_limit =strtoul(c+1, &c,0);2697if(*c || pack_idx_opts.off32_limit &0x80000000)2698die(_("bad index version '%s'"), val);2699return0;2700}27012702static intoption_parse_unpack_unreachable(const struct option *opt,2703const char*arg,int unset)2704{2705if(unset) {2706 unpack_unreachable =0;2707 unpack_unreachable_expiration =0;2708}2709else{2710 unpack_unreachable =1;2711if(arg)2712 unpack_unreachable_expiration =approxidate(arg);2713}2714return0;2715}27162717intcmd_pack_objects(int argc,const char**argv,const char*prefix)2718{2719int use_internal_rev_list =0;2720int thin =0;2721int shallow =0;2722int all_progress_implied =0;2723struct argv_array rp = ARGV_ARRAY_INIT;2724int rev_list_unpacked =0, rev_list_all =0, rev_list_reflog =0;2725int rev_list_index =0;2726struct option pack_objects_options[] = {2727OPT_SET_INT('q',"quiet", &progress,2728N_("do not show progress meter"),0),2729OPT_SET_INT(0,"progress", &progress,2730N_("show progress meter"),1),2731OPT_SET_INT(0,"all-progress", &progress,2732N_("show progress meter during object writing phase"),2),2733OPT_BOOL(0,"all-progress-implied",2734&all_progress_implied,2735N_("similar to --all-progress when progress meter is shown")),2736{ OPTION_CALLBACK,0,"index-version", NULL,N_("version[,offset]"),2737N_("write the pack index file in the specified idx format version"),27380, option_parse_index_version },2739OPT_MAGNITUDE(0,"max-pack-size", &pack_size_limit,2740N_("maximum size of each output pack file")),2741OPT_BOOL(0,"local", &local,2742N_("ignore borrowed objects from alternate object store")),2743OPT_BOOL(0,"incremental", &incremental,2744N_("ignore packed objects")),2745OPT_INTEGER(0,"window", &window,2746N_("limit pack window by objects")),2747OPT_MAGNITUDE(0,"window-memory", &window_memory_limit,2748N_("limit pack window by memory in addition to object limit")),2749OPT_INTEGER(0,"depth", &depth,2750N_("maximum length of delta chain allowed in the resulting pack")),2751OPT_BOOL(0,"reuse-delta", &reuse_delta,2752N_("reuse existing deltas")),2753OPT_BOOL(0,"reuse-object", &reuse_object,2754N_("reuse existing objects")),2755OPT_BOOL(0,"delta-base-offset", &allow_ofs_delta,2756N_("use OFS_DELTA objects")),2757OPT_INTEGER(0,"threads", &delta_search_threads,2758N_("use threads when searching for best delta matches")),2759OPT_BOOL(0,"non-empty", &non_empty,2760N_("do not create an empty pack output")),2761OPT_BOOL(0,"revs", &use_internal_rev_list,2762N_("read revision arguments from standard input")),2763{ OPTION_SET_INT,0,"unpacked", &rev_list_unpacked, NULL,2764N_("limit the objects to those that are not yet packed"),2765 PARSE_OPT_NOARG | PARSE_OPT_NONEG, NULL,1},2766{ OPTION_SET_INT,0,"all", &rev_list_all, NULL,2767N_("include objects reachable from any reference"),2768 PARSE_OPT_NOARG | PARSE_OPT_NONEG, NULL,1},2769{ OPTION_SET_INT,0,"reflog", &rev_list_reflog, NULL,2770N_("include objects referred by reflog entries"),2771 PARSE_OPT_NOARG | PARSE_OPT_NONEG, NULL,1},2772{ OPTION_SET_INT,0,"indexed-objects", &rev_list_index, NULL,2773N_("include objects referred to by the index"),2774 PARSE_OPT_NOARG | PARSE_OPT_NONEG, NULL,1},2775OPT_BOOL(0,"stdout", &pack_to_stdout,2776N_("output pack to stdout")),2777OPT_BOOL(0,"include-tag", &include_tag,2778N_("include tag objects that refer to objects to be packed")),2779OPT_BOOL(0,"keep-unreachable", &keep_unreachable,2780N_("keep unreachable objects")),2781OPT_BOOL(0,"pack-loose-unreachable", &pack_loose_unreachable,2782N_("pack loose unreachable objects")),2783{ OPTION_CALLBACK,0,"unpack-unreachable", NULL,N_("time"),2784N_("unpack unreachable objects newer than <time>"),2785 PARSE_OPT_OPTARG, option_parse_unpack_unreachable },2786OPT_BOOL(0,"thin", &thin,2787N_("create thin packs")),2788OPT_BOOL(0,"shallow", &shallow,2789N_("create packs suitable for shallow fetches")),2790OPT_BOOL(0,"honor-pack-keep", &ignore_packed_keep,2791N_("ignore packs that have companion .keep file")),2792OPT_INTEGER(0,"compression", &pack_compression_level,2793N_("pack compression level")),2794OPT_SET_INT(0,"keep-true-parents", &grafts_replace_parents,2795N_("do not hide commits by grafts"),0),2796OPT_BOOL(0,"use-bitmap-index", &use_bitmap_index,2797N_("use a bitmap index if available to speed up counting objects")),2798OPT_BOOL(0,"write-bitmap-index", &write_bitmap_index,2799N_("write a bitmap index together with the pack index")),2800OPT_END(),2801};28022803 check_replace_refs =0;28042805reset_pack_idx_option(&pack_idx_opts);2806git_config(git_pack_config, NULL);2807if(!pack_compression_seen && core_compression_seen)2808 pack_compression_level = core_compression_level;28092810 progress =isatty(2);2811 argc =parse_options(argc, argv, prefix, pack_objects_options,2812 pack_usage,0);28132814if(argc) {2815 base_name = argv[0];2816 argc--;2817}2818if(pack_to_stdout != !base_name || argc)2819usage_with_options(pack_usage, pack_objects_options);28202821argv_array_push(&rp,"pack-objects");2822if(thin) {2823 use_internal_rev_list =1;2824argv_array_push(&rp, shallow2825?"--objects-edge-aggressive"2826:"--objects-edge");2827}else2828argv_array_push(&rp,"--objects");28292830if(rev_list_all) {2831 use_internal_rev_list =1;2832argv_array_push(&rp,"--all");2833}2834if(rev_list_reflog) {2835 use_internal_rev_list =1;2836argv_array_push(&rp,"--reflog");2837}2838if(rev_list_index) {2839 use_internal_rev_list =1;2840argv_array_push(&rp,"--indexed-objects");2841}2842if(rev_list_unpacked) {2843 use_internal_rev_list =1;2844argv_array_push(&rp,"--unpacked");2845}28462847if(!reuse_object)2848 reuse_delta =0;2849if(pack_compression_level == -1)2850 pack_compression_level = Z_DEFAULT_COMPRESSION;2851else if(pack_compression_level <0|| pack_compression_level > Z_BEST_COMPRESSION)2852die("bad pack compression level%d", pack_compression_level);28532854if(!delta_search_threads)/* --threads=0 means autodetect */2855 delta_search_threads =online_cpus();28562857#ifdef NO_PTHREADS2858if(delta_search_threads !=1)2859warning("no threads support, ignoring --threads");2860#endif2861if(!pack_to_stdout && !pack_size_limit)2862 pack_size_limit = pack_size_limit_cfg;2863if(pack_to_stdout && pack_size_limit)2864die("--max-pack-size cannot be used to build a pack for transfer.");2865if(pack_size_limit && pack_size_limit <1024*1024) {2866warning("minimum pack size limit is 1 MiB");2867 pack_size_limit =1024*1024;2868}28692870if(!pack_to_stdout && thin)2871die("--thin cannot be used to build an indexable pack.");28722873if(keep_unreachable && unpack_unreachable)2874die("--keep-unreachable and --unpack-unreachable are incompatible.");2875if(!rev_list_all || !rev_list_reflog || !rev_list_index)2876 unpack_unreachable_expiration =0;28772878if(!use_internal_rev_list || !pack_to_stdout ||is_repository_shallow())2879 use_bitmap_index =0;28802881if(pack_to_stdout || !rev_list_all)2882 write_bitmap_index =0;28832884if(progress && all_progress_implied)2885 progress =2;28862887prepare_packed_git();2888if(ignore_packed_keep) {2889struct packed_git *p;2890for(p = packed_git; p; p = p->next)2891if(p->pack_local && p->pack_keep)2892break;2893if(!p)/* no keep-able packs found */2894 ignore_packed_keep =0;2895}2896if(local) {2897/*2898 * unlike ignore_packed_keep above, we do not want to2899 * unset "local" based on looking at packs, as it2900 * also covers non-local objects2901 */2902struct packed_git *p;2903for(p = packed_git; p; p = p->next) {2904if(!p->pack_local) {2905 have_non_local_packs =1;2906break;2907}2908}2909}29102911if(progress)2912 progress_state =start_progress(_("Counting objects"),0);2913if(!use_internal_rev_list)2914read_object_list_from_stdin();2915else{2916get_object_list(rp.argc, rp.argv);2917argv_array_clear(&rp);2918}2919cleanup_preferred_base();2920if(include_tag && nr_result)2921for_each_ref(add_ref_tag, NULL);2922stop_progress(&progress_state);29232924if(non_empty && !nr_result)2925return0;2926if(nr_result)2927prepare_pack(window, depth);2928write_pack_file();2929if(progress)2930fprintf(stderr,"Total %"PRIu32" (delta %"PRIu32"),"2931" reused %"PRIu32" (delta %"PRIu32")\n",2932 written, written_delta, reused, reused_delta);2933return0;2934}