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}14961497static voidget_object_details(void)1498{1499uint32_t i;1500struct object_entry **sorted_by_offset;15011502 sorted_by_offset =xcalloc(to_pack.nr_objects,sizeof(struct object_entry *));1503for(i =0; i < to_pack.nr_objects; i++)1504 sorted_by_offset[i] = to_pack.objects + i;1505qsort(sorted_by_offset, to_pack.nr_objects,sizeof(*sorted_by_offset), pack_offset_sort);15061507for(i =0; i < to_pack.nr_objects; i++) {1508struct object_entry *entry = sorted_by_offset[i];1509check_object(entry);1510if(big_file_threshold < entry->size)1511 entry->no_try_delta =1;1512}15131514free(sorted_by_offset);1515}15161517/*1518 * We search for deltas in a list sorted by type, by filename hash, and then1519 * by size, so that we see progressively smaller and smaller files.1520 * That's because we prefer deltas to be from the bigger file1521 * to the smaller -- deletes are potentially cheaper, but perhaps1522 * more importantly, the bigger file is likely the more recent1523 * one. The deepest deltas are therefore the oldest objects which are1524 * less susceptible to be accessed often.1525 */1526static inttype_size_sort(const void*_a,const void*_b)1527{1528const struct object_entry *a = *(struct object_entry **)_a;1529const struct object_entry *b = *(struct object_entry **)_b;15301531if(a->type > b->type)1532return-1;1533if(a->type < b->type)1534return1;1535if(a->hash > b->hash)1536return-1;1537if(a->hash < b->hash)1538return1;1539if(a->preferred_base > b->preferred_base)1540return-1;1541if(a->preferred_base < b->preferred_base)1542return1;1543if(a->size > b->size)1544return-1;1545if(a->size < b->size)1546return1;1547return a < b ? -1: (a > b);/* newest first */1548}15491550struct unpacked {1551struct object_entry *entry;1552void*data;1553struct delta_index *index;1554unsigned depth;1555};15561557static intdelta_cacheable(unsigned long src_size,unsigned long trg_size,1558unsigned long delta_size)1559{1560if(max_delta_cache_size && delta_cache_size + delta_size > max_delta_cache_size)1561return0;15621563if(delta_size < cache_max_small_delta_size)1564return1;15651566/* cache delta, if objects are large enough compared to delta size */1567if((src_size >>20) + (trg_size >>21) > (delta_size >>10))1568return1;15691570return0;1571}15721573#ifndef NO_PTHREADS15741575static pthread_mutex_t read_mutex;1576#define read_lock() pthread_mutex_lock(&read_mutex)1577#define read_unlock() pthread_mutex_unlock(&read_mutex)15781579static pthread_mutex_t cache_mutex;1580#define cache_lock() pthread_mutex_lock(&cache_mutex)1581#define cache_unlock() pthread_mutex_unlock(&cache_mutex)15821583static pthread_mutex_t progress_mutex;1584#define progress_lock() pthread_mutex_lock(&progress_mutex)1585#define progress_unlock() pthread_mutex_unlock(&progress_mutex)15861587#else15881589#define read_lock() (void)01590#define read_unlock() (void)01591#define cache_lock() (void)01592#define cache_unlock() (void)01593#define progress_lock() (void)01594#define progress_unlock() (void)015951596#endif15971598static inttry_delta(struct unpacked *trg,struct unpacked *src,1599unsigned max_depth,unsigned long*mem_usage)1600{1601struct object_entry *trg_entry = trg->entry;1602struct object_entry *src_entry = src->entry;1603unsigned long trg_size, src_size, delta_size, sizediff, max_size, sz;1604unsigned ref_depth;1605enum object_type type;1606void*delta_buf;16071608/* Don't bother doing diffs between different types */1609if(trg_entry->type != src_entry->type)1610return-1;16111612/*1613 * We do not bother to try a delta that we discarded on an1614 * earlier try, but only when reusing delta data. Note that1615 * src_entry that is marked as the preferred_base should always1616 * be considered, as even if we produce a suboptimal delta against1617 * it, we will still save the transfer cost, as we already know1618 * the other side has it and we won't send src_entry at all.1619 */1620if(reuse_delta && trg_entry->in_pack &&1621 trg_entry->in_pack == src_entry->in_pack &&1622!src_entry->preferred_base &&1623 trg_entry->in_pack_type != OBJ_REF_DELTA &&1624 trg_entry->in_pack_type != OBJ_OFS_DELTA)1625return0;16261627/* Let's not bust the allowed depth. */1628if(src->depth >= max_depth)1629return0;16301631/* Now some size filtering heuristics. */1632 trg_size = trg_entry->size;1633if(!trg_entry->delta) {1634 max_size = trg_size/2-20;1635 ref_depth =1;1636}else{1637 max_size = trg_entry->delta_size;1638 ref_depth = trg->depth;1639}1640 max_size = (uint64_t)max_size * (max_depth - src->depth) /1641(max_depth - ref_depth +1);1642if(max_size ==0)1643return0;1644 src_size = src_entry->size;1645 sizediff = src_size < trg_size ? trg_size - src_size :0;1646if(sizediff >= max_size)1647return0;1648if(trg_size < src_size /32)1649return0;16501651/* Load data if not already done */1652if(!trg->data) {1653read_lock();1654 trg->data =read_sha1_file(trg_entry->idx.sha1, &type, &sz);1655read_unlock();1656if(!trg->data)1657die("object%scannot be read",1658sha1_to_hex(trg_entry->idx.sha1));1659if(sz != trg_size)1660die("object%sinconsistent object length (%lu vs%lu)",1661sha1_to_hex(trg_entry->idx.sha1), sz, trg_size);1662*mem_usage += sz;1663}1664if(!src->data) {1665read_lock();1666 src->data =read_sha1_file(src_entry->idx.sha1, &type, &sz);1667read_unlock();1668if(!src->data) {1669if(src_entry->preferred_base) {1670static int warned =0;1671if(!warned++)1672warning("object%scannot be read",1673sha1_to_hex(src_entry->idx.sha1));1674/*1675 * Those objects are not included in the1676 * resulting pack. Be resilient and ignore1677 * them if they can't be read, in case the1678 * pack could be created nevertheless.1679 */1680return0;1681}1682die("object%scannot be read",1683sha1_to_hex(src_entry->idx.sha1));1684}1685if(sz != src_size)1686die("object%sinconsistent object length (%lu vs%lu)",1687sha1_to_hex(src_entry->idx.sha1), sz, src_size);1688*mem_usage += sz;1689}1690if(!src->index) {1691 src->index =create_delta_index(src->data, src_size);1692if(!src->index) {1693static int warned =0;1694if(!warned++)1695warning("suboptimal pack - out of memory");1696return0;1697}1698*mem_usage +=sizeof_delta_index(src->index);1699}17001701 delta_buf =create_delta(src->index, trg->data, trg_size, &delta_size, max_size);1702if(!delta_buf)1703return0;17041705if(trg_entry->delta) {1706/* Prefer only shallower same-sized deltas. */1707if(delta_size == trg_entry->delta_size &&1708 src->depth +1>= trg->depth) {1709free(delta_buf);1710return0;1711}1712}17131714/*1715 * Handle memory allocation outside of the cache1716 * accounting lock. Compiler will optimize the strangeness1717 * away when NO_PTHREADS is defined.1718 */1719free(trg_entry->delta_data);1720cache_lock();1721if(trg_entry->delta_data) {1722 delta_cache_size -= trg_entry->delta_size;1723 trg_entry->delta_data = NULL;1724}1725if(delta_cacheable(src_size, trg_size, delta_size)) {1726 delta_cache_size += delta_size;1727cache_unlock();1728 trg_entry->delta_data =xrealloc(delta_buf, delta_size);1729}else{1730cache_unlock();1731free(delta_buf);1732}17331734 trg_entry->delta = src_entry;1735 trg_entry->delta_size = delta_size;1736 trg->depth = src->depth +1;17371738return1;1739}17401741static unsigned intcheck_delta_limit(struct object_entry *me,unsigned int n)1742{1743struct object_entry *child = me->delta_child;1744unsigned int m = n;1745while(child) {1746unsigned int c =check_delta_limit(child, n +1);1747if(m < c)1748 m = c;1749 child = child->delta_sibling;1750}1751return m;1752}17531754static unsigned longfree_unpacked(struct unpacked *n)1755{1756unsigned long freed_mem =sizeof_delta_index(n->index);1757free_delta_index(n->index);1758 n->index = NULL;1759if(n->data) {1760 freed_mem += n->entry->size;1761free(n->data);1762 n->data = NULL;1763}1764 n->entry = NULL;1765 n->depth =0;1766return freed_mem;1767}17681769static voidfind_deltas(struct object_entry **list,unsigned*list_size,1770int window,int depth,unsigned*processed)1771{1772uint32_t i, idx =0, count =0;1773struct unpacked *array;1774unsigned long mem_usage =0;17751776 array =xcalloc(window,sizeof(struct unpacked));17771778for(;;) {1779struct object_entry *entry;1780struct unpacked *n = array + idx;1781int j, max_depth, best_base = -1;17821783progress_lock();1784if(!*list_size) {1785progress_unlock();1786break;1787}1788 entry = *list++;1789(*list_size)--;1790if(!entry->preferred_base) {1791(*processed)++;1792display_progress(progress_state, *processed);1793}1794progress_unlock();17951796 mem_usage -=free_unpacked(n);1797 n->entry = entry;17981799while(window_memory_limit &&1800 mem_usage > window_memory_limit &&1801 count >1) {1802uint32_t tail = (idx + window - count) % window;1803 mem_usage -=free_unpacked(array + tail);1804 count--;1805}18061807/* We do not compute delta to *create* objects we are not1808 * going to pack.1809 */1810if(entry->preferred_base)1811goto next;18121813/*1814 * If the current object is at pack edge, take the depth the1815 * objects that depend on the current object into account1816 * otherwise they would become too deep.1817 */1818 max_depth = depth;1819if(entry->delta_child) {1820 max_depth -=check_delta_limit(entry,0);1821if(max_depth <=0)1822goto next;1823}18241825 j = window;1826while(--j >0) {1827int ret;1828uint32_t other_idx = idx + j;1829struct unpacked *m;1830if(other_idx >= window)1831 other_idx -= window;1832 m = array + other_idx;1833if(!m->entry)1834break;1835 ret =try_delta(n, m, max_depth, &mem_usage);1836if(ret <0)1837break;1838else if(ret >0)1839 best_base = other_idx;1840}18411842/*1843 * If we decided to cache the delta data, then it is best1844 * to compress it right away. First because we have to do1845 * it anyway, and doing it here while we're threaded will1846 * save a lot of time in the non threaded write phase,1847 * as well as allow for caching more deltas within1848 * the same cache size limit.1849 * ...1850 * But only if not writing to stdout, since in that case1851 * the network is most likely throttling writes anyway,1852 * and therefore it is best to go to the write phase ASAP1853 * instead, as we can afford spending more time compressing1854 * between writes at that moment.1855 */1856if(entry->delta_data && !pack_to_stdout) {1857 entry->z_delta_size =do_compress(&entry->delta_data,1858 entry->delta_size);1859cache_lock();1860 delta_cache_size -= entry->delta_size;1861 delta_cache_size += entry->z_delta_size;1862cache_unlock();1863}18641865/* if we made n a delta, and if n is already at max1866 * depth, leaving it in the window is pointless. we1867 * should evict it first.1868 */1869if(entry->delta && max_depth <= n->depth)1870continue;18711872/*1873 * Move the best delta base up in the window, after the1874 * currently deltified object, to keep it longer. It will1875 * be the first base object to be attempted next.1876 */1877if(entry->delta) {1878struct unpacked swap = array[best_base];1879int dist = (window + idx - best_base) % window;1880int dst = best_base;1881while(dist--) {1882int src = (dst +1) % window;1883 array[dst] = array[src];1884 dst = src;1885}1886 array[dst] = swap;1887}18881889 next:1890 idx++;1891if(count +1< window)1892 count++;1893if(idx >= window)1894 idx =0;1895}18961897for(i =0; i < window; ++i) {1898free_delta_index(array[i].index);1899free(array[i].data);1900}1901free(array);1902}19031904#ifndef NO_PTHREADS19051906static voidtry_to_free_from_threads(size_t size)1907{1908read_lock();1909release_pack_memory(size);1910read_unlock();1911}19121913static try_to_free_t old_try_to_free_routine;19141915/*1916 * The main thread waits on the condition that (at least) one of the workers1917 * has stopped working (which is indicated in the .working member of1918 * struct thread_params).1919 * When a work thread has completed its work, it sets .working to 0 and1920 * signals the main thread and waits on the condition that .data_ready1921 * becomes 1.1922 */19231924struct thread_params {1925 pthread_t thread;1926struct object_entry **list;1927unsigned list_size;1928unsigned remaining;1929int window;1930int depth;1931int working;1932int data_ready;1933 pthread_mutex_t mutex;1934 pthread_cond_t cond;1935unsigned*processed;1936};19371938static pthread_cond_t progress_cond;19391940/*1941 * Mutex and conditional variable can't be statically-initialized on Windows.1942 */1943static voidinit_threaded_search(void)1944{1945init_recursive_mutex(&read_mutex);1946pthread_mutex_init(&cache_mutex, NULL);1947pthread_mutex_init(&progress_mutex, NULL);1948pthread_cond_init(&progress_cond, NULL);1949 old_try_to_free_routine =set_try_to_free_routine(try_to_free_from_threads);1950}19511952static voidcleanup_threaded_search(void)1953{1954set_try_to_free_routine(old_try_to_free_routine);1955pthread_cond_destroy(&progress_cond);1956pthread_mutex_destroy(&read_mutex);1957pthread_mutex_destroy(&cache_mutex);1958pthread_mutex_destroy(&progress_mutex);1959}19601961static void*threaded_find_deltas(void*arg)1962{1963struct thread_params *me = arg;19641965while(me->remaining) {1966find_deltas(me->list, &me->remaining,1967 me->window, me->depth, me->processed);19681969progress_lock();1970 me->working =0;1971pthread_cond_signal(&progress_cond);1972progress_unlock();19731974/*1975 * We must not set ->data_ready before we wait on the1976 * condition because the main thread may have set it to 11977 * before we get here. In order to be sure that new1978 * work is available if we see 1 in ->data_ready, it1979 * was initialized to 0 before this thread was spawned1980 * and we reset it to 0 right away.1981 */1982pthread_mutex_lock(&me->mutex);1983while(!me->data_ready)1984pthread_cond_wait(&me->cond, &me->mutex);1985 me->data_ready =0;1986pthread_mutex_unlock(&me->mutex);1987}1988/* leave ->working 1 so that this doesn't get more work assigned */1989return NULL;1990}19911992static voidll_find_deltas(struct object_entry **list,unsigned list_size,1993int window,int depth,unsigned*processed)1994{1995struct thread_params *p;1996int i, ret, active_threads =0;19971998init_threaded_search();19992000if(delta_search_threads <=1) {2001find_deltas(list, &list_size, window, depth, processed);2002cleanup_threaded_search();2003return;2004}2005if(progress > pack_to_stdout)2006fprintf(stderr,"Delta compression using up to%dthreads.\n",2007 delta_search_threads);2008 p =xcalloc(delta_search_threads,sizeof(*p));20092010/* Partition the work amongst work threads. */2011for(i =0; i < delta_search_threads; i++) {2012unsigned sub_size = list_size / (delta_search_threads - i);20132014/* don't use too small segments or no deltas will be found */2015if(sub_size <2*window && i+1< delta_search_threads)2016 sub_size =0;20172018 p[i].window = window;2019 p[i].depth = depth;2020 p[i].processed = processed;2021 p[i].working =1;2022 p[i].data_ready =0;20232024/* try to split chunks on "path" boundaries */2025while(sub_size && sub_size < list_size &&2026 list[sub_size]->hash &&2027 list[sub_size]->hash == list[sub_size-1]->hash)2028 sub_size++;20292030 p[i].list = list;2031 p[i].list_size = sub_size;2032 p[i].remaining = sub_size;20332034 list += sub_size;2035 list_size -= sub_size;2036}20372038/* Start work threads. */2039for(i =0; i < delta_search_threads; i++) {2040if(!p[i].list_size)2041continue;2042pthread_mutex_init(&p[i].mutex, NULL);2043pthread_cond_init(&p[i].cond, NULL);2044 ret =pthread_create(&p[i].thread, NULL,2045 threaded_find_deltas, &p[i]);2046if(ret)2047die("unable to create thread:%s",strerror(ret));2048 active_threads++;2049}20502051/*2052 * Now let's wait for work completion. Each time a thread is done2053 * with its work, we steal half of the remaining work from the2054 * thread with the largest number of unprocessed objects and give2055 * it to that newly idle thread. This ensure good load balancing2056 * until the remaining object list segments are simply too short2057 * to be worth splitting anymore.2058 */2059while(active_threads) {2060struct thread_params *target = NULL;2061struct thread_params *victim = NULL;2062unsigned sub_size =0;20632064progress_lock();2065for(;;) {2066for(i =0; !target && i < delta_search_threads; i++)2067if(!p[i].working)2068 target = &p[i];2069if(target)2070break;2071pthread_cond_wait(&progress_cond, &progress_mutex);2072}20732074for(i =0; i < delta_search_threads; i++)2075if(p[i].remaining >2*window &&2076(!victim || victim->remaining < p[i].remaining))2077 victim = &p[i];2078if(victim) {2079 sub_size = victim->remaining /2;2080 list = victim->list + victim->list_size - sub_size;2081while(sub_size && list[0]->hash &&2082 list[0]->hash == list[-1]->hash) {2083 list++;2084 sub_size--;2085}2086if(!sub_size) {2087/*2088 * It is possible for some "paths" to have2089 * so many objects that no hash boundary2090 * might be found. Let's just steal the2091 * exact half in that case.2092 */2093 sub_size = victim->remaining /2;2094 list -= sub_size;2095}2096 target->list = list;2097 victim->list_size -= sub_size;2098 victim->remaining -= sub_size;2099}2100 target->list_size = sub_size;2101 target->remaining = sub_size;2102 target->working =1;2103progress_unlock();21042105pthread_mutex_lock(&target->mutex);2106 target->data_ready =1;2107pthread_cond_signal(&target->cond);2108pthread_mutex_unlock(&target->mutex);21092110if(!sub_size) {2111pthread_join(target->thread, NULL);2112pthread_cond_destroy(&target->cond);2113pthread_mutex_destroy(&target->mutex);2114 active_threads--;2115}2116}2117cleanup_threaded_search();2118free(p);2119}21202121#else2122#define ll_find_deltas(l, s, w, d, p) find_deltas(l, &s, w, d, p)2123#endif21242125static intadd_ref_tag(const char*path,const struct object_id *oid,int flag,void*cb_data)2126{2127struct object_id peeled;21282129if(starts_with(path,"refs/tags/") &&/* is a tag? */2130!peel_ref(path, peeled.hash) &&/* peelable? */2131packlist_find(&to_pack, peeled.hash, NULL))/* object packed? */2132add_object_entry(oid->hash, OBJ_TAG, NULL,0);2133return0;2134}21352136static voidprepare_pack(int window,int depth)2137{2138struct object_entry **delta_list;2139uint32_t i, nr_deltas;2140unsigned n;21412142get_object_details();21432144/*2145 * If we're locally repacking then we need to be doubly careful2146 * from now on in order to make sure no stealth corruption gets2147 * propagated to the new pack. Clients receiving streamed packs2148 * should validate everything they get anyway so no need to incur2149 * the additional cost here in that case.2150 */2151if(!pack_to_stdout)2152 do_check_packed_object_crc =1;21532154if(!to_pack.nr_objects || !window || !depth)2155return;21562157ALLOC_ARRAY(delta_list, to_pack.nr_objects);2158 nr_deltas = n =0;21592160for(i =0; i < to_pack.nr_objects; i++) {2161struct object_entry *entry = to_pack.objects + i;21622163if(entry->delta)2164/* This happens if we decided to reuse existing2165 * delta from a pack. "reuse_delta &&" is implied.2166 */2167continue;21682169if(entry->size <50)2170continue;21712172if(entry->no_try_delta)2173continue;21742175if(!entry->preferred_base) {2176 nr_deltas++;2177if(entry->type <0)2178die("unable to get type of object%s",2179sha1_to_hex(entry->idx.sha1));2180}else{2181if(entry->type <0) {2182/*2183 * This object is not found, but we2184 * don't have to include it anyway.2185 */2186continue;2187}2188}21892190 delta_list[n++] = entry;2191}21922193if(nr_deltas && n >1) {2194unsigned nr_done =0;2195if(progress)2196 progress_state =start_progress(_("Compressing objects"),2197 nr_deltas);2198qsort(delta_list, n,sizeof(*delta_list), type_size_sort);2199ll_find_deltas(delta_list, n, window+1, depth, &nr_done);2200stop_progress(&progress_state);2201if(nr_done != nr_deltas)2202die("inconsistency with delta count");2203}2204free(delta_list);2205}22062207static intgit_pack_config(const char*k,const char*v,void*cb)2208{2209if(!strcmp(k,"pack.window")) {2210 window =git_config_int(k, v);2211return0;2212}2213if(!strcmp(k,"pack.windowmemory")) {2214 window_memory_limit =git_config_ulong(k, v);2215return0;2216}2217if(!strcmp(k,"pack.depth")) {2218 depth =git_config_int(k, v);2219return0;2220}2221if(!strcmp(k,"pack.compression")) {2222int level =git_config_int(k, v);2223if(level == -1)2224 level = Z_DEFAULT_COMPRESSION;2225else if(level <0|| level > Z_BEST_COMPRESSION)2226die("bad pack compression level%d", level);2227 pack_compression_level = level;2228 pack_compression_seen =1;2229return0;2230}2231if(!strcmp(k,"pack.deltacachesize")) {2232 max_delta_cache_size =git_config_int(k, v);2233return0;2234}2235if(!strcmp(k,"pack.deltacachelimit")) {2236 cache_max_small_delta_size =git_config_int(k, v);2237return0;2238}2239if(!strcmp(k,"pack.writebitmaphashcache")) {2240if(git_config_bool(k, v))2241 write_bitmap_options |= BITMAP_OPT_HASH_CACHE;2242else2243 write_bitmap_options &= ~BITMAP_OPT_HASH_CACHE;2244}2245if(!strcmp(k,"pack.usebitmaps")) {2246 use_bitmap_index =git_config_bool(k, v);2247return0;2248}2249if(!strcmp(k,"pack.threads")) {2250 delta_search_threads =git_config_int(k, v);2251if(delta_search_threads <0)2252die("invalid number of threads specified (%d)",2253 delta_search_threads);2254#ifdef NO_PTHREADS2255if(delta_search_threads !=1)2256warning("no threads support, ignoring%s", k);2257#endif2258return0;2259}2260if(!strcmp(k,"pack.indexversion")) {2261 pack_idx_opts.version =git_config_int(k, v);2262if(pack_idx_opts.version >2)2263die("bad pack.indexversion=%"PRIu32,2264 pack_idx_opts.version);2265return0;2266}2267returngit_default_config(k, v, cb);2268}22692270static voidread_object_list_from_stdin(void)2271{2272char line[40+1+ PATH_MAX +2];2273unsigned char sha1[20];22742275for(;;) {2276if(!fgets(line,sizeof(line), stdin)) {2277if(feof(stdin))2278break;2279if(!ferror(stdin))2280die("fgets returned NULL, not EOF, not error!");2281if(errno != EINTR)2282die_errno("fgets");2283clearerr(stdin);2284continue;2285}2286if(line[0] =='-') {2287if(get_sha1_hex(line+1, sha1))2288die("expected edge sha1, got garbage:\n%s",2289 line);2290add_preferred_base(sha1);2291continue;2292}2293if(get_sha1_hex(line, sha1))2294die("expected sha1, got garbage:\n%s", line);22952296add_preferred_base_object(line+41);2297add_object_entry(sha1,0, line+41,0);2298}2299}23002301#define OBJECT_ADDED (1u<<20)23022303static voidshow_commit(struct commit *commit,void*data)2304{2305add_object_entry(commit->object.oid.hash, OBJ_COMMIT, NULL,0);2306 commit->object.flags |= OBJECT_ADDED;23072308if(write_bitmap_index)2309index_commit_for_bitmap(commit);2310}23112312static voidshow_object(struct object *obj,const char*name,void*data)2313{2314add_preferred_base_object(name);2315add_object_entry(obj->oid.hash, obj->type, name,0);2316 obj->flags |= OBJECT_ADDED;2317}23182319static voidshow_edge(struct commit *commit)2320{2321add_preferred_base(commit->object.oid.hash);2322}23232324struct in_pack_object {2325 off_t offset;2326struct object *object;2327};23282329struct in_pack {2330int alloc;2331int nr;2332struct in_pack_object *array;2333};23342335static voidmark_in_pack_object(struct object *object,struct packed_git *p,struct in_pack *in_pack)2336{2337 in_pack->array[in_pack->nr].offset =find_pack_entry_one(object->oid.hash, p);2338 in_pack->array[in_pack->nr].object = object;2339 in_pack->nr++;2340}23412342/*2343 * Compare the objects in the offset order, in order to emulate the2344 * "git rev-list --objects" output that produced the pack originally.2345 */2346static intofscmp(const void*a_,const void*b_)2347{2348struct in_pack_object *a = (struct in_pack_object *)a_;2349struct in_pack_object *b = (struct in_pack_object *)b_;23502351if(a->offset < b->offset)2352return-1;2353else if(a->offset > b->offset)2354return1;2355else2356returnoidcmp(&a->object->oid, &b->object->oid);2357}23582359static voidadd_objects_in_unpacked_packs(struct rev_info *revs)2360{2361struct packed_git *p;2362struct in_pack in_pack;2363uint32_t i;23642365memset(&in_pack,0,sizeof(in_pack));23662367for(p = packed_git; p; p = p->next) {2368const unsigned char*sha1;2369struct object *o;23702371if(!p->pack_local || p->pack_keep)2372continue;2373if(open_pack_index(p))2374die("cannot open pack index");23752376ALLOC_GROW(in_pack.array,2377 in_pack.nr + p->num_objects,2378 in_pack.alloc);23792380for(i =0; i < p->num_objects; i++) {2381 sha1 =nth_packed_object_sha1(p, i);2382 o =lookup_unknown_object(sha1);2383if(!(o->flags & OBJECT_ADDED))2384mark_in_pack_object(o, p, &in_pack);2385 o->flags |= OBJECT_ADDED;2386}2387}23882389if(in_pack.nr) {2390qsort(in_pack.array, in_pack.nr,sizeof(in_pack.array[0]),2391 ofscmp);2392for(i =0; i < in_pack.nr; i++) {2393struct object *o = in_pack.array[i].object;2394add_object_entry(o->oid.hash, o->type,"",0);2395}2396}2397free(in_pack.array);2398}23992400static intadd_loose_object(const unsigned char*sha1,const char*path,2401void*data)2402{2403enum object_type type =sha1_object_info(sha1, NULL);24042405if(type <0) {2406warning("loose object at%scould not be examined", path);2407return0;2408}24092410add_object_entry(sha1, type,"",0);2411return0;2412}24132414/*2415 * We actually don't even have to worry about reachability here.2416 * add_object_entry will weed out duplicates, so we just add every2417 * loose object we find.2418 */2419static voidadd_unreachable_loose_objects(void)2420{2421for_each_loose_file_in_objdir(get_object_directory(),2422 add_loose_object,2423 NULL, NULL, NULL);2424}24252426static inthas_sha1_pack_kept_or_nonlocal(const unsigned char*sha1)2427{2428static struct packed_git *last_found = (void*)1;2429struct packed_git *p;24302431 p = (last_found != (void*)1) ? last_found : packed_git;24322433while(p) {2434if((!p->pack_local || p->pack_keep) &&2435find_pack_entry_one(sha1, p)) {2436 last_found = p;2437return1;2438}2439if(p == last_found)2440 p = packed_git;2441else2442 p = p->next;2443if(p == last_found)2444 p = p->next;2445}2446return0;2447}24482449/*2450 * Store a list of sha1s that are should not be discarded2451 * because they are either written too recently, or are2452 * reachable from another object that was.2453 *2454 * This is filled by get_object_list.2455 */2456static struct sha1_array recent_objects;24572458static intloosened_object_can_be_discarded(const unsigned char*sha1,2459unsigned long mtime)2460{2461if(!unpack_unreachable_expiration)2462return0;2463if(mtime > unpack_unreachable_expiration)2464return0;2465if(sha1_array_lookup(&recent_objects, sha1) >=0)2466return0;2467return1;2468}24692470static voidloosen_unused_packed_objects(struct rev_info *revs)2471{2472struct packed_git *p;2473uint32_t i;2474const unsigned char*sha1;24752476for(p = packed_git; p; p = p->next) {2477if(!p->pack_local || p->pack_keep)2478continue;24792480if(open_pack_index(p))2481die("cannot open pack index");24822483for(i =0; i < p->num_objects; i++) {2484 sha1 =nth_packed_object_sha1(p, i);2485if(!packlist_find(&to_pack, sha1, NULL) &&2486!has_sha1_pack_kept_or_nonlocal(sha1) &&2487!loosened_object_can_be_discarded(sha1, p->mtime))2488if(force_object_loose(sha1, p->mtime))2489die("unable to force loose object");2490}2491}2492}24932494/*2495 * This tracks any options which a reader of the pack might2496 * not understand, and which would therefore prevent blind reuse2497 * of what we have on disk.2498 */2499static intpack_options_allow_reuse(void)2500{2501return allow_ofs_delta;2502}25032504static intget_object_list_from_bitmap(struct rev_info *revs)2505{2506if(prepare_bitmap_walk(revs) <0)2507return-1;25082509if(pack_options_allow_reuse() &&2510!reuse_partial_packfile_from_bitmap(2511&reuse_packfile,2512&reuse_packfile_objects,2513&reuse_packfile_offset)) {2514assert(reuse_packfile_objects);2515 nr_result += reuse_packfile_objects;2516display_progress(progress_state, nr_result);2517}25182519traverse_bitmap_commit_list(&add_object_entry_from_bitmap);2520return0;2521}25222523static voidrecord_recent_object(struct object *obj,2524const char*name,2525void*data)2526{2527sha1_array_append(&recent_objects, obj->oid.hash);2528}25292530static voidrecord_recent_commit(struct commit *commit,void*data)2531{2532sha1_array_append(&recent_objects, commit->object.oid.hash);2533}25342535static voidget_object_list(int ac,const char**av)2536{2537struct rev_info revs;2538char line[1000];2539int flags =0;25402541init_revisions(&revs, NULL);2542 save_commit_buffer =0;2543setup_revisions(ac, av, &revs, NULL);25442545/* make sure shallows are read */2546is_repository_shallow();25472548while(fgets(line,sizeof(line), stdin) != NULL) {2549int len =strlen(line);2550if(len && line[len -1] =='\n')2551 line[--len] =0;2552if(!len)2553break;2554if(*line =='-') {2555if(!strcmp(line,"--not")) {2556 flags ^= UNINTERESTING;2557 write_bitmap_index =0;2558continue;2559}2560if(starts_with(line,"--shallow ")) {2561unsigned char sha1[20];2562if(get_sha1_hex(line +10, sha1))2563die("not an SHA-1 '%s'", line +10);2564register_shallow(sha1);2565 use_bitmap_index =0;2566continue;2567}2568die("not a rev '%s'", line);2569}2570if(handle_revision_arg(line, &revs, flags, REVARG_CANNOT_BE_FILENAME))2571die("bad revision '%s'", line);2572}25732574if(use_bitmap_index && !get_object_list_from_bitmap(&revs))2575return;25762577if(prepare_revision_walk(&revs))2578die("revision walk setup failed");2579mark_edges_uninteresting(&revs, show_edge);2580traverse_commit_list(&revs, show_commit, show_object, NULL);25812582if(unpack_unreachable_expiration) {2583 revs.ignore_missing_links =1;2584if(add_unseen_recent_objects_to_traversal(&revs,2585 unpack_unreachable_expiration))2586die("unable to add recent objects");2587if(prepare_revision_walk(&revs))2588die("revision walk setup failed");2589traverse_commit_list(&revs, record_recent_commit,2590 record_recent_object, NULL);2591}25922593if(keep_unreachable)2594add_objects_in_unpacked_packs(&revs);2595if(pack_loose_unreachable)2596add_unreachable_loose_objects();2597if(unpack_unreachable)2598loosen_unused_packed_objects(&revs);25992600sha1_array_clear(&recent_objects);2601}26022603static intoption_parse_index_version(const struct option *opt,2604const char*arg,int unset)2605{2606char*c;2607const char*val = arg;2608 pack_idx_opts.version =strtoul(val, &c,10);2609if(pack_idx_opts.version >2)2610die(_("unsupported index version%s"), val);2611if(*c ==','&& c[1])2612 pack_idx_opts.off32_limit =strtoul(c+1, &c,0);2613if(*c || pack_idx_opts.off32_limit &0x80000000)2614die(_("bad index version '%s'"), val);2615return0;2616}26172618static intoption_parse_unpack_unreachable(const struct option *opt,2619const char*arg,int unset)2620{2621if(unset) {2622 unpack_unreachable =0;2623 unpack_unreachable_expiration =0;2624}2625else{2626 unpack_unreachable =1;2627if(arg)2628 unpack_unreachable_expiration =approxidate(arg);2629}2630return0;2631}26322633intcmd_pack_objects(int argc,const char**argv,const char*prefix)2634{2635int use_internal_rev_list =0;2636int thin =0;2637int shallow =0;2638int all_progress_implied =0;2639struct argv_array rp = ARGV_ARRAY_INIT;2640int rev_list_unpacked =0, rev_list_all =0, rev_list_reflog =0;2641int rev_list_index =0;2642struct option pack_objects_options[] = {2643OPT_SET_INT('q',"quiet", &progress,2644N_("do not show progress meter"),0),2645OPT_SET_INT(0,"progress", &progress,2646N_("show progress meter"),1),2647OPT_SET_INT(0,"all-progress", &progress,2648N_("show progress meter during object writing phase"),2),2649OPT_BOOL(0,"all-progress-implied",2650&all_progress_implied,2651N_("similar to --all-progress when progress meter is shown")),2652{ OPTION_CALLBACK,0,"index-version", NULL,N_("version[,offset]"),2653N_("write the pack index file in the specified idx format version"),26540, option_parse_index_version },2655OPT_MAGNITUDE(0,"max-pack-size", &pack_size_limit,2656N_("maximum size of each output pack file")),2657OPT_BOOL(0,"local", &local,2658N_("ignore borrowed objects from alternate object store")),2659OPT_BOOL(0,"incremental", &incremental,2660N_("ignore packed objects")),2661OPT_INTEGER(0,"window", &window,2662N_("limit pack window by objects")),2663OPT_MAGNITUDE(0,"window-memory", &window_memory_limit,2664N_("limit pack window by memory in addition to object limit")),2665OPT_INTEGER(0,"depth", &depth,2666N_("maximum length of delta chain allowed in the resulting pack")),2667OPT_BOOL(0,"reuse-delta", &reuse_delta,2668N_("reuse existing deltas")),2669OPT_BOOL(0,"reuse-object", &reuse_object,2670N_("reuse existing objects")),2671OPT_BOOL(0,"delta-base-offset", &allow_ofs_delta,2672N_("use OFS_DELTA objects")),2673OPT_INTEGER(0,"threads", &delta_search_threads,2674N_("use threads when searching for best delta matches")),2675OPT_BOOL(0,"non-empty", &non_empty,2676N_("do not create an empty pack output")),2677OPT_BOOL(0,"revs", &use_internal_rev_list,2678N_("read revision arguments from standard input")),2679{ OPTION_SET_INT,0,"unpacked", &rev_list_unpacked, NULL,2680N_("limit the objects to those that are not yet packed"),2681 PARSE_OPT_NOARG | PARSE_OPT_NONEG, NULL,1},2682{ OPTION_SET_INT,0,"all", &rev_list_all, NULL,2683N_("include objects reachable from any reference"),2684 PARSE_OPT_NOARG | PARSE_OPT_NONEG, NULL,1},2685{ OPTION_SET_INT,0,"reflog", &rev_list_reflog, NULL,2686N_("include objects referred by reflog entries"),2687 PARSE_OPT_NOARG | PARSE_OPT_NONEG, NULL,1},2688{ OPTION_SET_INT,0,"indexed-objects", &rev_list_index, NULL,2689N_("include objects referred to by the index"),2690 PARSE_OPT_NOARG | PARSE_OPT_NONEG, NULL,1},2691OPT_BOOL(0,"stdout", &pack_to_stdout,2692N_("output pack to stdout")),2693OPT_BOOL(0,"include-tag", &include_tag,2694N_("include tag objects that refer to objects to be packed")),2695OPT_BOOL(0,"keep-unreachable", &keep_unreachable,2696N_("keep unreachable objects")),2697OPT_BOOL(0,"pack-loose-unreachable", &pack_loose_unreachable,2698N_("pack loose unreachable objects")),2699{ OPTION_CALLBACK,0,"unpack-unreachable", NULL,N_("time"),2700N_("unpack unreachable objects newer than <time>"),2701 PARSE_OPT_OPTARG, option_parse_unpack_unreachable },2702OPT_BOOL(0,"thin", &thin,2703N_("create thin packs")),2704OPT_BOOL(0,"shallow", &shallow,2705N_("create packs suitable for shallow fetches")),2706OPT_BOOL(0,"honor-pack-keep", &ignore_packed_keep,2707N_("ignore packs that have companion .keep file")),2708OPT_INTEGER(0,"compression", &pack_compression_level,2709N_("pack compression level")),2710OPT_SET_INT(0,"keep-true-parents", &grafts_replace_parents,2711N_("do not hide commits by grafts"),0),2712OPT_BOOL(0,"use-bitmap-index", &use_bitmap_index,2713N_("use a bitmap index if available to speed up counting objects")),2714OPT_BOOL(0,"write-bitmap-index", &write_bitmap_index,2715N_("write a bitmap index together with the pack index")),2716OPT_END(),2717};27182719 check_replace_refs =0;27202721reset_pack_idx_option(&pack_idx_opts);2722git_config(git_pack_config, NULL);2723if(!pack_compression_seen && core_compression_seen)2724 pack_compression_level = core_compression_level;27252726 progress =isatty(2);2727 argc =parse_options(argc, argv, prefix, pack_objects_options,2728 pack_usage,0);27292730if(argc) {2731 base_name = argv[0];2732 argc--;2733}2734if(pack_to_stdout != !base_name || argc)2735usage_with_options(pack_usage, pack_objects_options);27362737argv_array_push(&rp,"pack-objects");2738if(thin) {2739 use_internal_rev_list =1;2740argv_array_push(&rp, shallow2741?"--objects-edge-aggressive"2742:"--objects-edge");2743}else2744argv_array_push(&rp,"--objects");27452746if(rev_list_all) {2747 use_internal_rev_list =1;2748argv_array_push(&rp,"--all");2749}2750if(rev_list_reflog) {2751 use_internal_rev_list =1;2752argv_array_push(&rp,"--reflog");2753}2754if(rev_list_index) {2755 use_internal_rev_list =1;2756argv_array_push(&rp,"--indexed-objects");2757}2758if(rev_list_unpacked) {2759 use_internal_rev_list =1;2760argv_array_push(&rp,"--unpacked");2761}27622763if(!reuse_object)2764 reuse_delta =0;2765if(pack_compression_level == -1)2766 pack_compression_level = Z_DEFAULT_COMPRESSION;2767else if(pack_compression_level <0|| pack_compression_level > Z_BEST_COMPRESSION)2768die("bad pack compression level%d", pack_compression_level);27692770if(!delta_search_threads)/* --threads=0 means autodetect */2771 delta_search_threads =online_cpus();27722773#ifdef NO_PTHREADS2774if(delta_search_threads !=1)2775warning("no threads support, ignoring --threads");2776#endif2777if(!pack_to_stdout && !pack_size_limit)2778 pack_size_limit = pack_size_limit_cfg;2779if(pack_to_stdout && pack_size_limit)2780die("--max-pack-size cannot be used to build a pack for transfer.");2781if(pack_size_limit && pack_size_limit <1024*1024) {2782warning("minimum pack size limit is 1 MiB");2783 pack_size_limit =1024*1024;2784}27852786if(!pack_to_stdout && thin)2787die("--thin cannot be used to build an indexable pack.");27882789if(keep_unreachable && unpack_unreachable)2790die("--keep-unreachable and --unpack-unreachable are incompatible.");2791if(!rev_list_all || !rev_list_reflog || !rev_list_index)2792 unpack_unreachable_expiration =0;27932794if(!use_internal_rev_list || !pack_to_stdout ||is_repository_shallow())2795 use_bitmap_index =0;27962797if(pack_to_stdout || !rev_list_all)2798 write_bitmap_index =0;27992800if(progress && all_progress_implied)2801 progress =2;28022803prepare_packed_git();2804if(ignore_packed_keep) {2805struct packed_git *p;2806for(p = packed_git; p; p = p->next)2807if(p->pack_local && p->pack_keep)2808break;2809if(!p)/* no keep-able packs found */2810 ignore_packed_keep =0;2811}2812if(local) {2813/*2814 * unlike ignore_packed_keep above, we do not want to2815 * unset "local" based on looking at packs, as it2816 * also covers non-local objects2817 */2818struct packed_git *p;2819for(p = packed_git; p; p = p->next) {2820if(!p->pack_local) {2821 have_non_local_packs =1;2822break;2823}2824}2825}28262827if(progress)2828 progress_state =start_progress(_("Counting objects"),0);2829if(!use_internal_rev_list)2830read_object_list_from_stdin();2831else{2832get_object_list(rp.argc, rp.argv);2833argv_array_clear(&rp);2834}2835cleanup_preferred_base();2836if(include_tag && nr_result)2837for_each_ref(add_ref_tag, NULL);2838stop_progress(&progress_state);28392840if(non_empty && !nr_result)2841return0;2842if(nr_result)2843prepare_pack(window, depth);2844write_pack_file();2845if(progress)2846fprintf(stderr,"Total %"PRIu32" (delta %"PRIu32"),"2847" reused %"PRIu32" (delta %"PRIu32")\n",2848 written, written_delta, reused, reused_delta);2849return0;2850}