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 incremental; 50static int ignore_packed_keep; 51static int allow_ofs_delta; 52static struct pack_idx_option pack_idx_opts; 53static const char*base_name; 54static int progress =1; 55static int window =10; 56static unsigned long pack_size_limit; 57static int depth =50; 58static int delta_search_threads; 59static int pack_to_stdout; 60static int num_preferred_base; 61static struct progress *progress_state; 62static int pack_compression_level = Z_DEFAULT_COMPRESSION; 63static int pack_compression_seen; 64 65static struct packed_git *reuse_packfile; 66static uint32_t reuse_packfile_objects; 67static off_t reuse_packfile_offset; 68 69static int use_bitmap_index =1; 70static int write_bitmap_index; 71static uint16_t write_bitmap_options; 72 73static unsigned long delta_cache_size =0; 74static unsigned long max_delta_cache_size =256*1024*1024; 75static unsigned long cache_max_small_delta_size =1000; 76 77static unsigned long window_memory_limit =0; 78 79/* 80 * stats 81 */ 82static uint32_t written, written_delta; 83static uint32_t reused, reused_delta; 84 85/* 86 * Indexed commits 87 */ 88static struct commit **indexed_commits; 89static unsigned int indexed_commits_nr; 90static unsigned int indexed_commits_alloc; 91 92static voidindex_commit_for_bitmap(struct commit *commit) 93{ 94if(indexed_commits_nr >= indexed_commits_alloc) { 95 indexed_commits_alloc = (indexed_commits_alloc +32) *2; 96REALLOC_ARRAY(indexed_commits, indexed_commits_alloc); 97} 98 99 indexed_commits[indexed_commits_nr++] = commit; 100} 101 102static void*get_delta(struct object_entry *entry) 103{ 104unsigned long size, base_size, delta_size; 105void*buf, *base_buf, *delta_buf; 106enum object_type type; 107 108 buf =read_sha1_file(entry->idx.sha1, &type, &size); 109if(!buf) 110die("unable to read%s",sha1_to_hex(entry->idx.sha1)); 111 base_buf =read_sha1_file(entry->delta->idx.sha1, &type, &base_size); 112if(!base_buf) 113die("unable to read%s",sha1_to_hex(entry->delta->idx.sha1)); 114 delta_buf =diff_delta(base_buf, base_size, 115 buf, size, &delta_size,0); 116if(!delta_buf || delta_size != entry->delta_size) 117die("delta size changed"); 118free(buf); 119free(base_buf); 120return delta_buf; 121} 122 123static unsigned longdo_compress(void**pptr,unsigned long size) 124{ 125 git_zstream stream; 126void*in, *out; 127unsigned long maxsize; 128 129git_deflate_init(&stream, pack_compression_level); 130 maxsize =git_deflate_bound(&stream, size); 131 132 in = *pptr; 133 out =xmalloc(maxsize); 134*pptr = out; 135 136 stream.next_in = in; 137 stream.avail_in = size; 138 stream.next_out = out; 139 stream.avail_out = maxsize; 140while(git_deflate(&stream, Z_FINISH) == Z_OK) 141;/* nothing */ 142git_deflate_end(&stream); 143 144free(in); 145return stream.total_out; 146} 147 148static unsigned longwrite_large_blob_data(struct git_istream *st,struct sha1file *f, 149const unsigned char*sha1) 150{ 151 git_zstream stream; 152unsigned char ibuf[1024*16]; 153unsigned char obuf[1024*16]; 154unsigned long olen =0; 155 156git_deflate_init(&stream, pack_compression_level); 157 158for(;;) { 159 ssize_t readlen; 160int zret = Z_OK; 161 readlen =read_istream(st, ibuf,sizeof(ibuf)); 162if(readlen == -1) 163die(_("unable to read%s"),sha1_to_hex(sha1)); 164 165 stream.next_in = ibuf; 166 stream.avail_in = readlen; 167while((stream.avail_in || readlen ==0) && 168(zret == Z_OK || zret == Z_BUF_ERROR)) { 169 stream.next_out = obuf; 170 stream.avail_out =sizeof(obuf); 171 zret =git_deflate(&stream, readlen ?0: Z_FINISH); 172sha1write(f, obuf, stream.next_out - obuf); 173 olen += stream.next_out - obuf; 174} 175if(stream.avail_in) 176die(_("deflate error (%d)"), zret); 177if(readlen ==0) { 178if(zret != Z_STREAM_END) 179die(_("deflate error (%d)"), zret); 180break; 181} 182} 183git_deflate_end(&stream); 184return olen; 185} 186 187/* 188 * we are going to reuse the existing object data as is. make 189 * sure it is not corrupt. 190 */ 191static intcheck_pack_inflate(struct packed_git *p, 192struct pack_window **w_curs, 193 off_t offset, 194 off_t len, 195unsigned long expect) 196{ 197 git_zstream stream; 198unsigned char fakebuf[4096], *in; 199int st; 200 201memset(&stream,0,sizeof(stream)); 202git_inflate_init(&stream); 203do{ 204 in =use_pack(p, w_curs, offset, &stream.avail_in); 205 stream.next_in = in; 206 stream.next_out = fakebuf; 207 stream.avail_out =sizeof(fakebuf); 208 st =git_inflate(&stream, Z_FINISH); 209 offset += stream.next_in - in; 210}while(st == Z_OK || st == Z_BUF_ERROR); 211git_inflate_end(&stream); 212return(st == Z_STREAM_END && 213 stream.total_out == expect && 214 stream.total_in == len) ?0: -1; 215} 216 217static voidcopy_pack_data(struct sha1file *f, 218struct packed_git *p, 219struct pack_window **w_curs, 220 off_t offset, 221 off_t len) 222{ 223unsigned char*in; 224unsigned long avail; 225 226while(len) { 227 in =use_pack(p, w_curs, offset, &avail); 228if(avail > len) 229 avail = (unsigned long)len; 230sha1write(f, in, avail); 231 offset += avail; 232 len -= avail; 233} 234} 235 236/* Return 0 if we will bust the pack-size limit */ 237static unsigned longwrite_no_reuse_object(struct sha1file *f,struct object_entry *entry, 238unsigned long limit,int usable_delta) 239{ 240unsigned long size, datalen; 241unsigned char header[10], dheader[10]; 242unsigned hdrlen; 243enum object_type type; 244void*buf; 245struct git_istream *st = NULL; 246 247if(!usable_delta) { 248if(entry->type == OBJ_BLOB && 249 entry->size > big_file_threshold && 250(st =open_istream(entry->idx.sha1, &type, &size, NULL)) != NULL) 251 buf = NULL; 252else{ 253 buf =read_sha1_file(entry->idx.sha1, &type, &size); 254if(!buf) 255die(_("unable to read%s"),sha1_to_hex(entry->idx.sha1)); 256} 257/* 258 * make sure no cached delta data remains from a 259 * previous attempt before a pack split occurred. 260 */ 261free(entry->delta_data); 262 entry->delta_data = NULL; 263 entry->z_delta_size =0; 264}else if(entry->delta_data) { 265 size = entry->delta_size; 266 buf = entry->delta_data; 267 entry->delta_data = NULL; 268 type = (allow_ofs_delta && entry->delta->idx.offset) ? 269 OBJ_OFS_DELTA : OBJ_REF_DELTA; 270}else{ 271 buf =get_delta(entry); 272 size = entry->delta_size; 273 type = (allow_ofs_delta && entry->delta->idx.offset) ? 274 OBJ_OFS_DELTA : OBJ_REF_DELTA; 275} 276 277if(st)/* large blob case, just assume we don't compress well */ 278 datalen = size; 279else if(entry->z_delta_size) 280 datalen = entry->z_delta_size; 281else 282 datalen =do_compress(&buf, size); 283 284/* 285 * The object header is a byte of 'type' followed by zero or 286 * more bytes of length. 287 */ 288 hdrlen =encode_in_pack_object_header(type, size, header); 289 290if(type == OBJ_OFS_DELTA) { 291/* 292 * Deltas with relative base contain an additional 293 * encoding of the relative offset for the delta 294 * base from this object's position in the pack. 295 */ 296 off_t ofs = entry->idx.offset - entry->delta->idx.offset; 297unsigned pos =sizeof(dheader) -1; 298 dheader[pos] = ofs &127; 299while(ofs >>=7) 300 dheader[--pos] =128| (--ofs &127); 301if(limit && hdrlen +sizeof(dheader) - pos + datalen +20>= limit) { 302if(st) 303close_istream(st); 304free(buf); 305return0; 306} 307sha1write(f, header, hdrlen); 308sha1write(f, dheader + pos,sizeof(dheader) - pos); 309 hdrlen +=sizeof(dheader) - pos; 310}else if(type == OBJ_REF_DELTA) { 311/* 312 * Deltas with a base reference contain 313 * an additional 20 bytes for the base sha1. 314 */ 315if(limit && hdrlen +20+ datalen +20>= limit) { 316if(st) 317close_istream(st); 318free(buf); 319return0; 320} 321sha1write(f, header, hdrlen); 322sha1write(f, entry->delta->idx.sha1,20); 323 hdrlen +=20; 324}else{ 325if(limit && hdrlen + datalen +20>= limit) { 326if(st) 327close_istream(st); 328free(buf); 329return0; 330} 331sha1write(f, header, hdrlen); 332} 333if(st) { 334 datalen =write_large_blob_data(st, f, entry->idx.sha1); 335close_istream(st); 336}else{ 337sha1write(f, buf, datalen); 338free(buf); 339} 340 341return hdrlen + datalen; 342} 343 344/* Return 0 if we will bust the pack-size limit */ 345static unsigned longwrite_reuse_object(struct sha1file *f,struct object_entry *entry, 346unsigned long limit,int usable_delta) 347{ 348struct packed_git *p = entry->in_pack; 349struct pack_window *w_curs = NULL; 350struct revindex_entry *revidx; 351 off_t offset; 352enum object_type type = entry->type; 353unsigned long datalen; 354unsigned char header[10], dheader[10]; 355unsigned hdrlen; 356 357if(entry->delta) 358 type = (allow_ofs_delta && entry->delta->idx.offset) ? 359 OBJ_OFS_DELTA : OBJ_REF_DELTA; 360 hdrlen =encode_in_pack_object_header(type, entry->size, header); 361 362 offset = entry->in_pack_offset; 363 revidx =find_pack_revindex(p, offset); 364 datalen = revidx[1].offset - offset; 365if(!pack_to_stdout && p->index_version >1&& 366check_pack_crc(p, &w_curs, offset, datalen, revidx->nr)) { 367error("bad packed object CRC for%s",sha1_to_hex(entry->idx.sha1)); 368unuse_pack(&w_curs); 369returnwrite_no_reuse_object(f, entry, limit, usable_delta); 370} 371 372 offset += entry->in_pack_header_size; 373 datalen -= entry->in_pack_header_size; 374 375if(!pack_to_stdout && p->index_version ==1&& 376check_pack_inflate(p, &w_curs, offset, datalen, entry->size)) { 377error("corrupt packed object for%s",sha1_to_hex(entry->idx.sha1)); 378unuse_pack(&w_curs); 379returnwrite_no_reuse_object(f, entry, limit, usable_delta); 380} 381 382if(type == OBJ_OFS_DELTA) { 383 off_t ofs = entry->idx.offset - entry->delta->idx.offset; 384unsigned pos =sizeof(dheader) -1; 385 dheader[pos] = ofs &127; 386while(ofs >>=7) 387 dheader[--pos] =128| (--ofs &127); 388if(limit && hdrlen +sizeof(dheader) - pos + datalen +20>= limit) { 389unuse_pack(&w_curs); 390return0; 391} 392sha1write(f, header, hdrlen); 393sha1write(f, dheader + pos,sizeof(dheader) - pos); 394 hdrlen +=sizeof(dheader) - pos; 395 reused_delta++; 396}else if(type == OBJ_REF_DELTA) { 397if(limit && hdrlen +20+ datalen +20>= limit) { 398unuse_pack(&w_curs); 399return0; 400} 401sha1write(f, header, hdrlen); 402sha1write(f, entry->delta->idx.sha1,20); 403 hdrlen +=20; 404 reused_delta++; 405}else{ 406if(limit && hdrlen + datalen +20>= limit) { 407unuse_pack(&w_curs); 408return0; 409} 410sha1write(f, header, hdrlen); 411} 412copy_pack_data(f, p, &w_curs, offset, datalen); 413unuse_pack(&w_curs); 414 reused++; 415return hdrlen + datalen; 416} 417 418/* Return 0 if we will bust the pack-size limit */ 419static unsigned longwrite_object(struct sha1file *f, 420struct object_entry *entry, 421 off_t write_offset) 422{ 423unsigned long limit, len; 424int usable_delta, to_reuse; 425 426if(!pack_to_stdout) 427crc32_begin(f); 428 429/* apply size limit if limited packsize and not first object */ 430if(!pack_size_limit || !nr_written) 431 limit =0; 432else if(pack_size_limit <= write_offset) 433/* 434 * the earlier object did not fit the limit; avoid 435 * mistaking this with unlimited (i.e. limit = 0). 436 */ 437 limit =1; 438else 439 limit = pack_size_limit - write_offset; 440 441if(!entry->delta) 442 usable_delta =0;/* no delta */ 443else if(!pack_size_limit) 444 usable_delta =1;/* unlimited packfile */ 445else if(entry->delta->idx.offset == (off_t)-1) 446 usable_delta =0;/* base was written to another pack */ 447else if(entry->delta->idx.offset) 448 usable_delta =1;/* base already exists in this pack */ 449else 450 usable_delta =0;/* base could end up in another pack */ 451 452if(!reuse_object) 453 to_reuse =0;/* explicit */ 454else if(!entry->in_pack) 455 to_reuse =0;/* can't reuse what we don't have */ 456else if(entry->type == OBJ_REF_DELTA || entry->type == OBJ_OFS_DELTA) 457/* check_object() decided it for us ... */ 458 to_reuse = usable_delta; 459/* ... but pack split may override that */ 460else if(entry->type != entry->in_pack_type) 461 to_reuse =0;/* pack has delta which is unusable */ 462else if(entry->delta) 463 to_reuse =0;/* we want to pack afresh */ 464else 465 to_reuse =1;/* we have it in-pack undeltified, 466 * and we do not need to deltify it. 467 */ 468 469if(!to_reuse) 470 len =write_no_reuse_object(f, entry, limit, usable_delta); 471else 472 len =write_reuse_object(f, entry, limit, usable_delta); 473if(!len) 474return0; 475 476if(usable_delta) 477 written_delta++; 478 written++; 479if(!pack_to_stdout) 480 entry->idx.crc32 =crc32_end(f); 481return len; 482} 483 484enum write_one_status { 485 WRITE_ONE_SKIP = -1,/* already written */ 486 WRITE_ONE_BREAK =0,/* writing this will bust the limit; not written */ 487 WRITE_ONE_WRITTEN =1,/* normal */ 488 WRITE_ONE_RECURSIVE =2/* already scheduled to be written */ 489}; 490 491static enum write_one_status write_one(struct sha1file *f, 492struct object_entry *e, 493 off_t *offset) 494{ 495unsigned long size; 496int recursing; 497 498/* 499 * we set offset to 1 (which is an impossible value) to mark 500 * the fact that this object is involved in "write its base 501 * first before writing a deltified object" recursion. 502 */ 503 recursing = (e->idx.offset ==1); 504if(recursing) { 505warning("recursive delta detected for object%s", 506sha1_to_hex(e->idx.sha1)); 507return WRITE_ONE_RECURSIVE; 508}else if(e->idx.offset || e->preferred_base) { 509/* offset is non zero if object is written already. */ 510return WRITE_ONE_SKIP; 511} 512 513/* if we are deltified, write out base object first. */ 514if(e->delta) { 515 e->idx.offset =1;/* now recurse */ 516switch(write_one(f, e->delta, offset)) { 517case WRITE_ONE_RECURSIVE: 518/* we cannot depend on this one */ 519 e->delta = NULL; 520break; 521default: 522break; 523case WRITE_ONE_BREAK: 524 e->idx.offset = recursing; 525return WRITE_ONE_BREAK; 526} 527} 528 529 e->idx.offset = *offset; 530 size =write_object(f, e, *offset); 531if(!size) { 532 e->idx.offset = recursing; 533return WRITE_ONE_BREAK; 534} 535 written_list[nr_written++] = &e->idx; 536 537/* make sure off_t is sufficiently large not to wrap */ 538if(signed_add_overflows(*offset, size)) 539die("pack too large for current definition of off_t"); 540*offset += size; 541return WRITE_ONE_WRITTEN; 542} 543 544static intmark_tagged(const char*path,const struct object_id *oid,int flag, 545void*cb_data) 546{ 547unsigned char peeled[20]; 548struct object_entry *entry =packlist_find(&to_pack, oid->hash, NULL); 549 550if(entry) 551 entry->tagged =1; 552if(!peel_ref(path, peeled)) { 553 entry =packlist_find(&to_pack, peeled, NULL); 554if(entry) 555 entry->tagged =1; 556} 557return0; 558} 559 560staticinlinevoidadd_to_write_order(struct object_entry **wo, 561unsigned int*endp, 562struct object_entry *e) 563{ 564if(e->filled) 565return; 566 wo[(*endp)++] = e; 567 e->filled =1; 568} 569 570static voidadd_descendants_to_write_order(struct object_entry **wo, 571unsigned int*endp, 572struct object_entry *e) 573{ 574int add_to_order =1; 575while(e) { 576if(add_to_order) { 577struct object_entry *s; 578/* add this node... */ 579add_to_write_order(wo, endp, e); 580/* all its siblings... */ 581for(s = e->delta_sibling; s; s = s->delta_sibling) { 582add_to_write_order(wo, endp, s); 583} 584} 585/* drop down a level to add left subtree nodes if possible */ 586if(e->delta_child) { 587 add_to_order =1; 588 e = e->delta_child; 589}else{ 590 add_to_order =0; 591/* our sibling might have some children, it is next */ 592if(e->delta_sibling) { 593 e = e->delta_sibling; 594continue; 595} 596/* go back to our parent node */ 597 e = e->delta; 598while(e && !e->delta_sibling) { 599/* we're on the right side of a subtree, keep 600 * going up until we can go right again */ 601 e = e->delta; 602} 603if(!e) { 604/* done- we hit our original root node */ 605return; 606} 607/* pass it off to sibling at this level */ 608 e = e->delta_sibling; 609} 610}; 611} 612 613static voidadd_family_to_write_order(struct object_entry **wo, 614unsigned int*endp, 615struct object_entry *e) 616{ 617struct object_entry *root; 618 619for(root = e; root->delta; root = root->delta) 620;/* nothing */ 621add_descendants_to_write_order(wo, endp, root); 622} 623 624static struct object_entry **compute_write_order(void) 625{ 626unsigned int i, wo_end, last_untagged; 627 628struct object_entry **wo; 629struct object_entry *objects = to_pack.objects; 630 631for(i =0; i < to_pack.nr_objects; i++) { 632 objects[i].tagged =0; 633 objects[i].filled =0; 634 objects[i].delta_child = NULL; 635 objects[i].delta_sibling = NULL; 636} 637 638/* 639 * Fully connect delta_child/delta_sibling network. 640 * Make sure delta_sibling is sorted in the original 641 * recency order. 642 */ 643for(i = to_pack.nr_objects; i >0;) { 644struct object_entry *e = &objects[--i]; 645if(!e->delta) 646continue; 647/* Mark me as the first child */ 648 e->delta_sibling = e->delta->delta_child; 649 e->delta->delta_child = e; 650} 651 652/* 653 * Mark objects that are at the tip of tags. 654 */ 655for_each_tag_ref(mark_tagged, NULL); 656 657/* 658 * Give the objects in the original recency order until 659 * we see a tagged tip. 660 */ 661ALLOC_ARRAY(wo, to_pack.nr_objects); 662for(i = wo_end =0; i < to_pack.nr_objects; i++) { 663if(objects[i].tagged) 664break; 665add_to_write_order(wo, &wo_end, &objects[i]); 666} 667 last_untagged = i; 668 669/* 670 * Then fill all the tagged tips. 671 */ 672for(; i < to_pack.nr_objects; i++) { 673if(objects[i].tagged) 674add_to_write_order(wo, &wo_end, &objects[i]); 675} 676 677/* 678 * And then all remaining commits and tags. 679 */ 680for(i = last_untagged; i < to_pack.nr_objects; i++) { 681if(objects[i].type != OBJ_COMMIT && 682 objects[i].type != OBJ_TAG) 683continue; 684add_to_write_order(wo, &wo_end, &objects[i]); 685} 686 687/* 688 * And then all the trees. 689 */ 690for(i = last_untagged; i < to_pack.nr_objects; i++) { 691if(objects[i].type != OBJ_TREE) 692continue; 693add_to_write_order(wo, &wo_end, &objects[i]); 694} 695 696/* 697 * Finally all the rest in really tight order 698 */ 699for(i = last_untagged; i < to_pack.nr_objects; i++) { 700if(!objects[i].filled) 701add_family_to_write_order(wo, &wo_end, &objects[i]); 702} 703 704if(wo_end != to_pack.nr_objects) 705die("ordered%uobjects, expected %"PRIu32, wo_end, to_pack.nr_objects); 706 707return wo; 708} 709 710static off_t write_reused_pack(struct sha1file *f) 711{ 712unsigned char buffer[8192]; 713 off_t to_write, total; 714int fd; 715 716if(!is_pack_valid(reuse_packfile)) 717die("packfile is invalid:%s", reuse_packfile->pack_name); 718 719 fd =git_open_noatime(reuse_packfile->pack_name); 720if(fd <0) 721die_errno("unable to open packfile for reuse:%s", 722 reuse_packfile->pack_name); 723 724if(lseek(fd,sizeof(struct pack_header), SEEK_SET) == -1) 725die_errno("unable to seek in reused packfile"); 726 727if(reuse_packfile_offset <0) 728 reuse_packfile_offset = reuse_packfile->pack_size -20; 729 730 total = to_write = reuse_packfile_offset -sizeof(struct pack_header); 731 732while(to_write) { 733int read_pack =xread(fd, buffer,sizeof(buffer)); 734 735if(read_pack <=0) 736die_errno("unable to read from reused packfile"); 737 738if(read_pack > to_write) 739 read_pack = to_write; 740 741sha1write(f, buffer, read_pack); 742 to_write -= read_pack; 743 744/* 745 * We don't know the actual number of objects written, 746 * only how many bytes written, how many bytes total, and 747 * how many objects total. So we can fake it by pretending all 748 * objects we are writing are the same size. This gives us a 749 * smooth progress meter, and at the end it matches the true 750 * answer. 751 */ 752 written = reuse_packfile_objects * 753(((double)(total - to_write)) / total); 754display_progress(progress_state, written); 755} 756 757close(fd); 758 written = reuse_packfile_objects; 759display_progress(progress_state, written); 760return reuse_packfile_offset -sizeof(struct pack_header); 761} 762 763static const char no_split_warning[] =N_( 764"disabling bitmap writing, packs are split due to pack.packSizeLimit" 765); 766 767static voidwrite_pack_file(void) 768{ 769uint32_t i =0, j; 770struct sha1file *f; 771 off_t offset; 772uint32_t nr_remaining = nr_result; 773time_t last_mtime =0; 774struct object_entry **write_order; 775 776if(progress > pack_to_stdout) 777 progress_state =start_progress(_("Writing objects"), nr_result); 778ALLOC_ARRAY(written_list, to_pack.nr_objects); 779 write_order =compute_write_order(); 780 781do{ 782unsigned char sha1[20]; 783char*pack_tmp_name = NULL; 784 785if(pack_to_stdout) 786 f =sha1fd_throughput(1,"<stdout>", progress_state); 787else 788 f =create_tmp_packfile(&pack_tmp_name); 789 790 offset =write_pack_header(f, nr_remaining); 791 792if(reuse_packfile) { 793 off_t packfile_size; 794assert(pack_to_stdout); 795 796 packfile_size =write_reused_pack(f); 797 offset += packfile_size; 798} 799 800 nr_written =0; 801for(; i < to_pack.nr_objects; i++) { 802struct object_entry *e = write_order[i]; 803if(write_one(f, e, &offset) == WRITE_ONE_BREAK) 804break; 805display_progress(progress_state, written); 806} 807 808/* 809 * Did we write the wrong # entries in the header? 810 * If so, rewrite it like in fast-import 811 */ 812if(pack_to_stdout) { 813sha1close(f, sha1, CSUM_CLOSE); 814}else if(nr_written == nr_remaining) { 815sha1close(f, sha1, CSUM_FSYNC); 816}else{ 817int fd =sha1close(f, sha1,0); 818fixup_pack_header_footer(fd, sha1, pack_tmp_name, 819 nr_written, sha1, offset); 820close(fd); 821if(write_bitmap_index) { 822warning(_(no_split_warning)); 823 write_bitmap_index =0; 824} 825} 826 827if(!pack_to_stdout) { 828struct stat st; 829struct strbuf tmpname = STRBUF_INIT; 830 831/* 832 * Packs are runtime accessed in their mtime 833 * order since newer packs are more likely to contain 834 * younger objects. So if we are creating multiple 835 * packs then we should modify the mtime of later ones 836 * to preserve this property. 837 */ 838if(stat(pack_tmp_name, &st) <0) { 839warning_errno("failed to stat%s", pack_tmp_name); 840}else if(!last_mtime) { 841 last_mtime = st.st_mtime; 842}else{ 843struct utimbuf utb; 844 utb.actime = st.st_atime; 845 utb.modtime = --last_mtime; 846if(utime(pack_tmp_name, &utb) <0) 847warning_errno("failed utime() on%s", pack_tmp_name); 848} 849 850strbuf_addf(&tmpname,"%s-", base_name); 851 852if(write_bitmap_index) { 853bitmap_writer_set_checksum(sha1); 854bitmap_writer_build_type_index(written_list, nr_written); 855} 856 857finish_tmp_packfile(&tmpname, pack_tmp_name, 858 written_list, nr_written, 859&pack_idx_opts, sha1); 860 861if(write_bitmap_index) { 862strbuf_addf(&tmpname,"%s.bitmap",sha1_to_hex(sha1)); 863 864stop_progress(&progress_state); 865 866bitmap_writer_show_progress(progress); 867bitmap_writer_reuse_bitmaps(&to_pack); 868bitmap_writer_select_commits(indexed_commits, indexed_commits_nr, -1); 869bitmap_writer_build(&to_pack); 870bitmap_writer_finish(written_list, nr_written, 871 tmpname.buf, write_bitmap_options); 872 write_bitmap_index =0; 873} 874 875strbuf_release(&tmpname); 876free(pack_tmp_name); 877puts(sha1_to_hex(sha1)); 878} 879 880/* mark written objects as written to previous pack */ 881for(j =0; j < nr_written; j++) { 882 written_list[j]->offset = (off_t)-1; 883} 884 nr_remaining -= nr_written; 885}while(nr_remaining && i < to_pack.nr_objects); 886 887free(written_list); 888free(write_order); 889stop_progress(&progress_state); 890if(written != nr_result) 891die("wrote %"PRIu32" objects while expecting %"PRIu32, 892 written, nr_result); 893} 894 895static voidsetup_delta_attr_check(struct git_attr_check *check) 896{ 897static struct git_attr *attr_delta; 898 899if(!attr_delta) 900 attr_delta =git_attr("delta"); 901 902 check[0].attr = attr_delta; 903} 904 905static intno_try_delta(const char*path) 906{ 907struct git_attr_check check[1]; 908 909setup_delta_attr_check(check); 910if(git_check_attr(path,ARRAY_SIZE(check), check)) 911return0; 912if(ATTR_FALSE(check->value)) 913return1; 914return0; 915} 916 917/* 918 * When adding an object, check whether we have already added it 919 * to our packing list. If so, we can skip. However, if we are 920 * being asked to excludei t, but the previous mention was to include 921 * it, make sure to adjust its flags and tweak our numbers accordingly. 922 * 923 * As an optimization, we pass out the index position where we would have 924 * found the item, since that saves us from having to look it up again a 925 * few lines later when we want to add the new entry. 926 */ 927static inthave_duplicate_entry(const unsigned char*sha1, 928int exclude, 929uint32_t*index_pos) 930{ 931struct object_entry *entry; 932 933 entry =packlist_find(&to_pack, sha1, index_pos); 934if(!entry) 935return0; 936 937if(exclude) { 938if(!entry->preferred_base) 939 nr_result--; 940 entry->preferred_base =1; 941} 942 943return1; 944} 945 946/* 947 * Check whether we want the object in the pack (e.g., we do not want 948 * objects found in non-local stores if the "--local" option was used). 949 * 950 * As a side effect of this check, we will find the packed version of this 951 * object, if any. We therefore pass out the pack information to avoid having 952 * to look it up again later. 953 */ 954static intwant_object_in_pack(const unsigned char*sha1, 955int exclude, 956struct packed_git **found_pack, 957 off_t *found_offset) 958{ 959struct packed_git *p; 960 961if(!exclude && local &&has_loose_object_nonlocal(sha1)) 962return0; 963 964*found_pack = NULL; 965*found_offset =0; 966 967for(p = packed_git; p; p = p->next) { 968 off_t offset =find_pack_entry_one(sha1, p); 969if(offset) { 970if(!*found_pack) { 971if(!is_pack_valid(p)) 972continue; 973*found_offset = offset; 974*found_pack = p; 975} 976if(exclude) 977return1; 978if(incremental) 979return0; 980 981/* 982 * When asked to do --local (do not include an 983 * object that appears in a pack we borrow 984 * from elsewhere) or --honor-pack-keep (do not 985 * include an object that appears in a pack marked 986 * with .keep), we need to make sure no copy of this 987 * object come from in _any_ pack that causes us to 988 * omit it, and need to complete this loop. When 989 * neither option is in effect, we know the object 990 * we just found is going to be packed, so break 991 * out of the loop to return 1 now. 992 */ 993if(!ignore_packed_keep && !local) 994break; 995 996if(local && !p->pack_local) 997return0; 998if(ignore_packed_keep && p->pack_local && p->pack_keep) 999return0;1000}1001}10021003return1;1004}10051006static voidcreate_object_entry(const unsigned char*sha1,1007enum object_type type,1008uint32_t hash,1009int exclude,1010int no_try_delta,1011uint32_t index_pos,1012struct packed_git *found_pack,1013 off_t found_offset)1014{1015struct object_entry *entry;10161017 entry =packlist_alloc(&to_pack, sha1, index_pos);1018 entry->hash = hash;1019if(type)1020 entry->type = type;1021if(exclude)1022 entry->preferred_base =1;1023else1024 nr_result++;1025if(found_pack) {1026 entry->in_pack = found_pack;1027 entry->in_pack_offset = found_offset;1028}10291030 entry->no_try_delta = no_try_delta;1031}10321033static const char no_closure_warning[] =N_(1034"disabling bitmap writing, as some objects are not being packed"1035);10361037static intadd_object_entry(const unsigned char*sha1,enum object_type type,1038const char*name,int exclude)1039{1040struct packed_git *found_pack;1041 off_t found_offset;1042uint32_t index_pos;10431044if(have_duplicate_entry(sha1, exclude, &index_pos))1045return0;10461047if(!want_object_in_pack(sha1, exclude, &found_pack, &found_offset)) {1048/* The pack is missing an object, so it will not have closure */1049if(write_bitmap_index) {1050warning(_(no_closure_warning));1051 write_bitmap_index =0;1052}1053return0;1054}10551056create_object_entry(sha1, type,pack_name_hash(name),1057 exclude, name &&no_try_delta(name),1058 index_pos, found_pack, found_offset);10591060display_progress(progress_state, nr_result);1061return1;1062}10631064static intadd_object_entry_from_bitmap(const unsigned char*sha1,1065enum object_type type,1066int flags,uint32_t name_hash,1067struct packed_git *pack, off_t offset)1068{1069uint32_t index_pos;10701071if(have_duplicate_entry(sha1,0, &index_pos))1072return0;10731074create_object_entry(sha1, type, name_hash,0,0, index_pos, pack, offset);10751076display_progress(progress_state, nr_result);1077return1;1078}10791080struct pbase_tree_cache {1081unsigned char sha1[20];1082int ref;1083int temporary;1084void*tree_data;1085unsigned long tree_size;1086};10871088static struct pbase_tree_cache *(pbase_tree_cache[256]);1089static intpbase_tree_cache_ix(const unsigned char*sha1)1090{1091return sha1[0] %ARRAY_SIZE(pbase_tree_cache);1092}1093static intpbase_tree_cache_ix_incr(int ix)1094{1095return(ix+1) %ARRAY_SIZE(pbase_tree_cache);1096}10971098static struct pbase_tree {1099struct pbase_tree *next;1100/* This is a phony "cache" entry; we are not1101 * going to evict it or find it through _get()1102 * mechanism -- this is for the toplevel node that1103 * would almost always change with any commit.1104 */1105struct pbase_tree_cache pcache;1106} *pbase_tree;11071108static struct pbase_tree_cache *pbase_tree_get(const unsigned char*sha1)1109{1110struct pbase_tree_cache *ent, *nent;1111void*data;1112unsigned long size;1113enum object_type type;1114int neigh;1115int my_ix =pbase_tree_cache_ix(sha1);1116int available_ix = -1;11171118/* pbase-tree-cache acts as a limited hashtable.1119 * your object will be found at your index or within a few1120 * slots after that slot if it is cached.1121 */1122for(neigh =0; neigh <8; neigh++) {1123 ent = pbase_tree_cache[my_ix];1124if(ent && !hashcmp(ent->sha1, sha1)) {1125 ent->ref++;1126return ent;1127}1128else if(((available_ix <0) && (!ent || !ent->ref)) ||1129((0<= available_ix) &&1130(!ent && pbase_tree_cache[available_ix])))1131 available_ix = my_ix;1132if(!ent)1133break;1134 my_ix =pbase_tree_cache_ix_incr(my_ix);1135}11361137/* Did not find one. Either we got a bogus request or1138 * we need to read and perhaps cache.1139 */1140 data =read_sha1_file(sha1, &type, &size);1141if(!data)1142return NULL;1143if(type != OBJ_TREE) {1144free(data);1145return NULL;1146}11471148/* We need to either cache or return a throwaway copy */11491150if(available_ix <0)1151 ent = NULL;1152else{1153 ent = pbase_tree_cache[available_ix];1154 my_ix = available_ix;1155}11561157if(!ent) {1158 nent =xmalloc(sizeof(*nent));1159 nent->temporary = (available_ix <0);1160}1161else{1162/* evict and reuse */1163free(ent->tree_data);1164 nent = ent;1165}1166hashcpy(nent->sha1, sha1);1167 nent->tree_data = data;1168 nent->tree_size = size;1169 nent->ref =1;1170if(!nent->temporary)1171 pbase_tree_cache[my_ix] = nent;1172return nent;1173}11741175static voidpbase_tree_put(struct pbase_tree_cache *cache)1176{1177if(!cache->temporary) {1178 cache->ref--;1179return;1180}1181free(cache->tree_data);1182free(cache);1183}11841185static intname_cmp_len(const char*name)1186{1187int i;1188for(i =0; name[i] && name[i] !='\n'&& name[i] !='/'; i++)1189;1190return i;1191}11921193static voidadd_pbase_object(struct tree_desc *tree,1194const char*name,1195int cmplen,1196const char*fullname)1197{1198struct name_entry entry;1199int cmp;12001201while(tree_entry(tree,&entry)) {1202if(S_ISGITLINK(entry.mode))1203continue;1204 cmp =tree_entry_len(&entry) != cmplen ?1:1205memcmp(name, entry.path, cmplen);1206if(cmp >0)1207continue;1208if(cmp <0)1209return;1210if(name[cmplen] !='/') {1211add_object_entry(entry.oid->hash,1212object_type(entry.mode),1213 fullname,1);1214return;1215}1216if(S_ISDIR(entry.mode)) {1217struct tree_desc sub;1218struct pbase_tree_cache *tree;1219const char*down = name+cmplen+1;1220int downlen =name_cmp_len(down);12211222 tree =pbase_tree_get(entry.oid->hash);1223if(!tree)1224return;1225init_tree_desc(&sub, tree->tree_data, tree->tree_size);12261227add_pbase_object(&sub, down, downlen, fullname);1228pbase_tree_put(tree);1229}1230}1231}12321233static unsigned*done_pbase_paths;1234static int done_pbase_paths_num;1235static int done_pbase_paths_alloc;1236static intdone_pbase_path_pos(unsigned hash)1237{1238int lo =0;1239int hi = done_pbase_paths_num;1240while(lo < hi) {1241int mi = (hi + lo) /2;1242if(done_pbase_paths[mi] == hash)1243return mi;1244if(done_pbase_paths[mi] < hash)1245 hi = mi;1246else1247 lo = mi +1;1248}1249return-lo-1;1250}12511252static intcheck_pbase_path(unsigned hash)1253{1254int pos = (!done_pbase_paths) ? -1:done_pbase_path_pos(hash);1255if(0<= pos)1256return1;1257 pos = -pos -1;1258ALLOC_GROW(done_pbase_paths,1259 done_pbase_paths_num +1,1260 done_pbase_paths_alloc);1261 done_pbase_paths_num++;1262if(pos < done_pbase_paths_num)1263memmove(done_pbase_paths + pos +1,1264 done_pbase_paths + pos,1265(done_pbase_paths_num - pos -1) *sizeof(unsigned));1266 done_pbase_paths[pos] = hash;1267return0;1268}12691270static voidadd_preferred_base_object(const char*name)1271{1272struct pbase_tree *it;1273int cmplen;1274unsigned hash =pack_name_hash(name);12751276if(!num_preferred_base ||check_pbase_path(hash))1277return;12781279 cmplen =name_cmp_len(name);1280for(it = pbase_tree; it; it = it->next) {1281if(cmplen ==0) {1282add_object_entry(it->pcache.sha1, OBJ_TREE, NULL,1);1283}1284else{1285struct tree_desc tree;1286init_tree_desc(&tree, it->pcache.tree_data, it->pcache.tree_size);1287add_pbase_object(&tree, name, cmplen, name);1288}1289}1290}12911292static voidadd_preferred_base(unsigned char*sha1)1293{1294struct pbase_tree *it;1295void*data;1296unsigned long size;1297unsigned char tree_sha1[20];12981299if(window <= num_preferred_base++)1300return;13011302 data =read_object_with_reference(sha1, tree_type, &size, tree_sha1);1303if(!data)1304return;13051306for(it = pbase_tree; it; it = it->next) {1307if(!hashcmp(it->pcache.sha1, tree_sha1)) {1308free(data);1309return;1310}1311}13121313 it =xcalloc(1,sizeof(*it));1314 it->next = pbase_tree;1315 pbase_tree = it;13161317hashcpy(it->pcache.sha1, tree_sha1);1318 it->pcache.tree_data = data;1319 it->pcache.tree_size = size;1320}13211322static voidcleanup_preferred_base(void)1323{1324struct pbase_tree *it;1325unsigned i;13261327 it = pbase_tree;1328 pbase_tree = NULL;1329while(it) {1330struct pbase_tree *this= it;1331 it =this->next;1332free(this->pcache.tree_data);1333free(this);1334}13351336for(i =0; i <ARRAY_SIZE(pbase_tree_cache); i++) {1337if(!pbase_tree_cache[i])1338continue;1339free(pbase_tree_cache[i]->tree_data);1340free(pbase_tree_cache[i]);1341 pbase_tree_cache[i] = NULL;1342}13431344free(done_pbase_paths);1345 done_pbase_paths = NULL;1346 done_pbase_paths_num = done_pbase_paths_alloc =0;1347}13481349static voidcheck_object(struct object_entry *entry)1350{1351if(entry->in_pack) {1352struct packed_git *p = entry->in_pack;1353struct pack_window *w_curs = NULL;1354const unsigned char*base_ref = NULL;1355struct object_entry *base_entry;1356unsigned long used, used_0;1357unsigned long avail;1358 off_t ofs;1359unsigned char*buf, c;13601361 buf =use_pack(p, &w_curs, entry->in_pack_offset, &avail);13621363/*1364 * We want in_pack_type even if we do not reuse delta1365 * since non-delta representations could still be reused.1366 */1367 used =unpack_object_header_buffer(buf, avail,1368&entry->in_pack_type,1369&entry->size);1370if(used ==0)1371goto give_up;13721373/*1374 * Determine if this is a delta and if so whether we can1375 * reuse it or not. Otherwise let's find out as cheaply as1376 * possible what the actual type and size for this object is.1377 */1378switch(entry->in_pack_type) {1379default:1380/* Not a delta hence we've already got all we need. */1381 entry->type = entry->in_pack_type;1382 entry->in_pack_header_size = used;1383if(entry->type < OBJ_COMMIT || entry->type > OBJ_BLOB)1384goto give_up;1385unuse_pack(&w_curs);1386return;1387case OBJ_REF_DELTA:1388if(reuse_delta && !entry->preferred_base)1389 base_ref =use_pack(p, &w_curs,1390 entry->in_pack_offset + used, NULL);1391 entry->in_pack_header_size = used +20;1392break;1393case OBJ_OFS_DELTA:1394 buf =use_pack(p, &w_curs,1395 entry->in_pack_offset + used, NULL);1396 used_0 =0;1397 c = buf[used_0++];1398 ofs = c &127;1399while(c &128) {1400 ofs +=1;1401if(!ofs ||MSB(ofs,7)) {1402error("delta base offset overflow in pack for%s",1403sha1_to_hex(entry->idx.sha1));1404goto give_up;1405}1406 c = buf[used_0++];1407 ofs = (ofs <<7) + (c &127);1408}1409 ofs = entry->in_pack_offset - ofs;1410if(ofs <=0|| ofs >= entry->in_pack_offset) {1411error("delta base offset out of bound for%s",1412sha1_to_hex(entry->idx.sha1));1413goto give_up;1414}1415if(reuse_delta && !entry->preferred_base) {1416struct revindex_entry *revidx;1417 revidx =find_pack_revindex(p, ofs);1418if(!revidx)1419goto give_up;1420 base_ref =nth_packed_object_sha1(p, revidx->nr);1421}1422 entry->in_pack_header_size = used + used_0;1423break;1424}14251426if(base_ref && (base_entry =packlist_find(&to_pack, base_ref, NULL))) {1427/*1428 * If base_ref was set above that means we wish to1429 * reuse delta data, and we even found that base1430 * in the list of objects we want to pack. Goodie!1431 *1432 * Depth value does not matter - find_deltas() will1433 * never consider reused delta as the base object to1434 * deltify other objects against, in order to avoid1435 * circular deltas.1436 */1437 entry->type = entry->in_pack_type;1438 entry->delta = base_entry;1439 entry->delta_size = entry->size;1440 entry->delta_sibling = base_entry->delta_child;1441 base_entry->delta_child = entry;1442unuse_pack(&w_curs);1443return;1444}14451446if(entry->type) {1447/*1448 * This must be a delta and we already know what the1449 * final object type is. Let's extract the actual1450 * object size from the delta header.1451 */1452 entry->size =get_size_from_delta(p, &w_curs,1453 entry->in_pack_offset + entry->in_pack_header_size);1454if(entry->size ==0)1455goto give_up;1456unuse_pack(&w_curs);1457return;1458}14591460/*1461 * No choice but to fall back to the recursive delta walk1462 * with sha1_object_info() to find about the object type1463 * at this point...1464 */1465 give_up:1466unuse_pack(&w_curs);1467}14681469 entry->type =sha1_object_info(entry->idx.sha1, &entry->size);1470/*1471 * The error condition is checked in prepare_pack(). This is1472 * to permit a missing preferred base object to be ignored1473 * as a preferred base. Doing so can result in a larger1474 * pack file, but the transfer will still take place.1475 */1476}14771478static intpack_offset_sort(const void*_a,const void*_b)1479{1480const struct object_entry *a = *(struct object_entry **)_a;1481const struct object_entry *b = *(struct object_entry **)_b;14821483/* avoid filesystem trashing with loose objects */1484if(!a->in_pack && !b->in_pack)1485returnhashcmp(a->idx.sha1, b->idx.sha1);14861487if(a->in_pack < b->in_pack)1488return-1;1489if(a->in_pack > b->in_pack)1490return1;1491return a->in_pack_offset < b->in_pack_offset ? -1:1492(a->in_pack_offset > b->in_pack_offset);1493}14941495static voidget_object_details(void)1496{1497uint32_t i;1498struct object_entry **sorted_by_offset;14991500 sorted_by_offset =xcalloc(to_pack.nr_objects,sizeof(struct object_entry *));1501for(i =0; i < to_pack.nr_objects; i++)1502 sorted_by_offset[i] = to_pack.objects + i;1503qsort(sorted_by_offset, to_pack.nr_objects,sizeof(*sorted_by_offset), pack_offset_sort);15041505for(i =0; i < to_pack.nr_objects; i++) {1506struct object_entry *entry = sorted_by_offset[i];1507check_object(entry);1508if(big_file_threshold < entry->size)1509 entry->no_try_delta =1;1510}15111512free(sorted_by_offset);1513}15141515/*1516 * We search for deltas in a list sorted by type, by filename hash, and then1517 * by size, so that we see progressively smaller and smaller files.1518 * That's because we prefer deltas to be from the bigger file1519 * to the smaller -- deletes are potentially cheaper, but perhaps1520 * more importantly, the bigger file is likely the more recent1521 * one. The deepest deltas are therefore the oldest objects which are1522 * less susceptible to be accessed often.1523 */1524static inttype_size_sort(const void*_a,const void*_b)1525{1526const struct object_entry *a = *(struct object_entry **)_a;1527const struct object_entry *b = *(struct object_entry **)_b;15281529if(a->type > b->type)1530return-1;1531if(a->type < b->type)1532return1;1533if(a->hash > b->hash)1534return-1;1535if(a->hash < b->hash)1536return1;1537if(a->preferred_base > b->preferred_base)1538return-1;1539if(a->preferred_base < b->preferred_base)1540return1;1541if(a->size > b->size)1542return-1;1543if(a->size < b->size)1544return1;1545return a < b ? -1: (a > b);/* newest first */1546}15471548struct unpacked {1549struct object_entry *entry;1550void*data;1551struct delta_index *index;1552unsigned depth;1553};15541555static intdelta_cacheable(unsigned long src_size,unsigned long trg_size,1556unsigned long delta_size)1557{1558if(max_delta_cache_size && delta_cache_size + delta_size > max_delta_cache_size)1559return0;15601561if(delta_size < cache_max_small_delta_size)1562return1;15631564/* cache delta, if objects are large enough compared to delta size */1565if((src_size >>20) + (trg_size >>21) > (delta_size >>10))1566return1;15671568return0;1569}15701571#ifndef NO_PTHREADS15721573static pthread_mutex_t read_mutex;1574#define read_lock() pthread_mutex_lock(&read_mutex)1575#define read_unlock() pthread_mutex_unlock(&read_mutex)15761577static pthread_mutex_t cache_mutex;1578#define cache_lock() pthread_mutex_lock(&cache_mutex)1579#define cache_unlock() pthread_mutex_unlock(&cache_mutex)15801581static pthread_mutex_t progress_mutex;1582#define progress_lock() pthread_mutex_lock(&progress_mutex)1583#define progress_unlock() pthread_mutex_unlock(&progress_mutex)15841585#else15861587#define read_lock() (void)01588#define read_unlock() (void)01589#define cache_lock() (void)01590#define cache_unlock() (void)01591#define progress_lock() (void)01592#define progress_unlock() (void)015931594#endif15951596static inttry_delta(struct unpacked *trg,struct unpacked *src,1597unsigned max_depth,unsigned long*mem_usage)1598{1599struct object_entry *trg_entry = trg->entry;1600struct object_entry *src_entry = src->entry;1601unsigned long trg_size, src_size, delta_size, sizediff, max_size, sz;1602unsigned ref_depth;1603enum object_type type;1604void*delta_buf;16051606/* Don't bother doing diffs between different types */1607if(trg_entry->type != src_entry->type)1608return-1;16091610/*1611 * We do not bother to try a delta that we discarded on an1612 * earlier try, but only when reusing delta data. Note that1613 * src_entry that is marked as the preferred_base should always1614 * be considered, as even if we produce a suboptimal delta against1615 * it, we will still save the transfer cost, as we already know1616 * the other side has it and we won't send src_entry at all.1617 */1618if(reuse_delta && trg_entry->in_pack &&1619 trg_entry->in_pack == src_entry->in_pack &&1620!src_entry->preferred_base &&1621 trg_entry->in_pack_type != OBJ_REF_DELTA &&1622 trg_entry->in_pack_type != OBJ_OFS_DELTA)1623return0;16241625/* Let's not bust the allowed depth. */1626if(src->depth >= max_depth)1627return0;16281629/* Now some size filtering heuristics. */1630 trg_size = trg_entry->size;1631if(!trg_entry->delta) {1632 max_size = trg_size/2-20;1633 ref_depth =1;1634}else{1635 max_size = trg_entry->delta_size;1636 ref_depth = trg->depth;1637}1638 max_size = (uint64_t)max_size * (max_depth - src->depth) /1639(max_depth - ref_depth +1);1640if(max_size ==0)1641return0;1642 src_size = src_entry->size;1643 sizediff = src_size < trg_size ? trg_size - src_size :0;1644if(sizediff >= max_size)1645return0;1646if(trg_size < src_size /32)1647return0;16481649/* Load data if not already done */1650if(!trg->data) {1651read_lock();1652 trg->data =read_sha1_file(trg_entry->idx.sha1, &type, &sz);1653read_unlock();1654if(!trg->data)1655die("object%scannot be read",1656sha1_to_hex(trg_entry->idx.sha1));1657if(sz != trg_size)1658die("object%sinconsistent object length (%lu vs%lu)",1659sha1_to_hex(trg_entry->idx.sha1), sz, trg_size);1660*mem_usage += sz;1661}1662if(!src->data) {1663read_lock();1664 src->data =read_sha1_file(src_entry->idx.sha1, &type, &sz);1665read_unlock();1666if(!src->data) {1667if(src_entry->preferred_base) {1668static int warned =0;1669if(!warned++)1670warning("object%scannot be read",1671sha1_to_hex(src_entry->idx.sha1));1672/*1673 * Those objects are not included in the1674 * resulting pack. Be resilient and ignore1675 * them if they can't be read, in case the1676 * pack could be created nevertheless.1677 */1678return0;1679}1680die("object%scannot be read",1681sha1_to_hex(src_entry->idx.sha1));1682}1683if(sz != src_size)1684die("object%sinconsistent object length (%lu vs%lu)",1685sha1_to_hex(src_entry->idx.sha1), sz, src_size);1686*mem_usage += sz;1687}1688if(!src->index) {1689 src->index =create_delta_index(src->data, src_size);1690if(!src->index) {1691static int warned =0;1692if(!warned++)1693warning("suboptimal pack - out of memory");1694return0;1695}1696*mem_usage +=sizeof_delta_index(src->index);1697}16981699 delta_buf =create_delta(src->index, trg->data, trg_size, &delta_size, max_size);1700if(!delta_buf)1701return0;17021703if(trg_entry->delta) {1704/* Prefer only shallower same-sized deltas. */1705if(delta_size == trg_entry->delta_size &&1706 src->depth +1>= trg->depth) {1707free(delta_buf);1708return0;1709}1710}17111712/*1713 * Handle memory allocation outside of the cache1714 * accounting lock. Compiler will optimize the strangeness1715 * away when NO_PTHREADS is defined.1716 */1717free(trg_entry->delta_data);1718cache_lock();1719if(trg_entry->delta_data) {1720 delta_cache_size -= trg_entry->delta_size;1721 trg_entry->delta_data = NULL;1722}1723if(delta_cacheable(src_size, trg_size, delta_size)) {1724 delta_cache_size += delta_size;1725cache_unlock();1726 trg_entry->delta_data =xrealloc(delta_buf, delta_size);1727}else{1728cache_unlock();1729free(delta_buf);1730}17311732 trg_entry->delta = src_entry;1733 trg_entry->delta_size = delta_size;1734 trg->depth = src->depth +1;17351736return1;1737}17381739static unsigned intcheck_delta_limit(struct object_entry *me,unsigned int n)1740{1741struct object_entry *child = me->delta_child;1742unsigned int m = n;1743while(child) {1744unsigned int c =check_delta_limit(child, n +1);1745if(m < c)1746 m = c;1747 child = child->delta_sibling;1748}1749return m;1750}17511752static unsigned longfree_unpacked(struct unpacked *n)1753{1754unsigned long freed_mem =sizeof_delta_index(n->index);1755free_delta_index(n->index);1756 n->index = NULL;1757if(n->data) {1758 freed_mem += n->entry->size;1759free(n->data);1760 n->data = NULL;1761}1762 n->entry = NULL;1763 n->depth =0;1764return freed_mem;1765}17661767static voidfind_deltas(struct object_entry **list,unsigned*list_size,1768int window,int depth,unsigned*processed)1769{1770uint32_t i, idx =0, count =0;1771struct unpacked *array;1772unsigned long mem_usage =0;17731774 array =xcalloc(window,sizeof(struct unpacked));17751776for(;;) {1777struct object_entry *entry;1778struct unpacked *n = array + idx;1779int j, max_depth, best_base = -1;17801781progress_lock();1782if(!*list_size) {1783progress_unlock();1784break;1785}1786 entry = *list++;1787(*list_size)--;1788if(!entry->preferred_base) {1789(*processed)++;1790display_progress(progress_state, *processed);1791}1792progress_unlock();17931794 mem_usage -=free_unpacked(n);1795 n->entry = entry;17961797while(window_memory_limit &&1798 mem_usage > window_memory_limit &&1799 count >1) {1800uint32_t tail = (idx + window - count) % window;1801 mem_usage -=free_unpacked(array + tail);1802 count--;1803}18041805/* We do not compute delta to *create* objects we are not1806 * going to pack.1807 */1808if(entry->preferred_base)1809goto next;18101811/*1812 * If the current object is at pack edge, take the depth the1813 * objects that depend on the current object into account1814 * otherwise they would become too deep.1815 */1816 max_depth = depth;1817if(entry->delta_child) {1818 max_depth -=check_delta_limit(entry,0);1819if(max_depth <=0)1820goto next;1821}18221823 j = window;1824while(--j >0) {1825int ret;1826uint32_t other_idx = idx + j;1827struct unpacked *m;1828if(other_idx >= window)1829 other_idx -= window;1830 m = array + other_idx;1831if(!m->entry)1832break;1833 ret =try_delta(n, m, max_depth, &mem_usage);1834if(ret <0)1835break;1836else if(ret >0)1837 best_base = other_idx;1838}18391840/*1841 * If we decided to cache the delta data, then it is best1842 * to compress it right away. First because we have to do1843 * it anyway, and doing it here while we're threaded will1844 * save a lot of time in the non threaded write phase,1845 * as well as allow for caching more deltas within1846 * the same cache size limit.1847 * ...1848 * But only if not writing to stdout, since in that case1849 * the network is most likely throttling writes anyway,1850 * and therefore it is best to go to the write phase ASAP1851 * instead, as we can afford spending more time compressing1852 * between writes at that moment.1853 */1854if(entry->delta_data && !pack_to_stdout) {1855 entry->z_delta_size =do_compress(&entry->delta_data,1856 entry->delta_size);1857cache_lock();1858 delta_cache_size -= entry->delta_size;1859 delta_cache_size += entry->z_delta_size;1860cache_unlock();1861}18621863/* if we made n a delta, and if n is already at max1864 * depth, leaving it in the window is pointless. we1865 * should evict it first.1866 */1867if(entry->delta && max_depth <= n->depth)1868continue;18691870/*1871 * Move the best delta base up in the window, after the1872 * currently deltified object, to keep it longer. It will1873 * be the first base object to be attempted next.1874 */1875if(entry->delta) {1876struct unpacked swap = array[best_base];1877int dist = (window + idx - best_base) % window;1878int dst = best_base;1879while(dist--) {1880int src = (dst +1) % window;1881 array[dst] = array[src];1882 dst = src;1883}1884 array[dst] = swap;1885}18861887 next:1888 idx++;1889if(count +1< window)1890 count++;1891if(idx >= window)1892 idx =0;1893}18941895for(i =0; i < window; ++i) {1896free_delta_index(array[i].index);1897free(array[i].data);1898}1899free(array);1900}19011902#ifndef NO_PTHREADS19031904static voidtry_to_free_from_threads(size_t size)1905{1906read_lock();1907release_pack_memory(size);1908read_unlock();1909}19101911static try_to_free_t old_try_to_free_routine;19121913/*1914 * The main thread waits on the condition that (at least) one of the workers1915 * has stopped working (which is indicated in the .working member of1916 * struct thread_params).1917 * When a work thread has completed its work, it sets .working to 0 and1918 * signals the main thread and waits on the condition that .data_ready1919 * becomes 1.1920 */19211922struct thread_params {1923 pthread_t thread;1924struct object_entry **list;1925unsigned list_size;1926unsigned remaining;1927int window;1928int depth;1929int working;1930int data_ready;1931 pthread_mutex_t mutex;1932 pthread_cond_t cond;1933unsigned*processed;1934};19351936static pthread_cond_t progress_cond;19371938/*1939 * Mutex and conditional variable can't be statically-initialized on Windows.1940 */1941static voidinit_threaded_search(void)1942{1943init_recursive_mutex(&read_mutex);1944pthread_mutex_init(&cache_mutex, NULL);1945pthread_mutex_init(&progress_mutex, NULL);1946pthread_cond_init(&progress_cond, NULL);1947 old_try_to_free_routine =set_try_to_free_routine(try_to_free_from_threads);1948}19491950static voidcleanup_threaded_search(void)1951{1952set_try_to_free_routine(old_try_to_free_routine);1953pthread_cond_destroy(&progress_cond);1954pthread_mutex_destroy(&read_mutex);1955pthread_mutex_destroy(&cache_mutex);1956pthread_mutex_destroy(&progress_mutex);1957}19581959static void*threaded_find_deltas(void*arg)1960{1961struct thread_params *me = arg;19621963while(me->remaining) {1964find_deltas(me->list, &me->remaining,1965 me->window, me->depth, me->processed);19661967progress_lock();1968 me->working =0;1969pthread_cond_signal(&progress_cond);1970progress_unlock();19711972/*1973 * We must not set ->data_ready before we wait on the1974 * condition because the main thread may have set it to 11975 * before we get here. In order to be sure that new1976 * work is available if we see 1 in ->data_ready, it1977 * was initialized to 0 before this thread was spawned1978 * and we reset it to 0 right away.1979 */1980pthread_mutex_lock(&me->mutex);1981while(!me->data_ready)1982pthread_cond_wait(&me->cond, &me->mutex);1983 me->data_ready =0;1984pthread_mutex_unlock(&me->mutex);1985}1986/* leave ->working 1 so that this doesn't get more work assigned */1987return NULL;1988}19891990static voidll_find_deltas(struct object_entry **list,unsigned list_size,1991int window,int depth,unsigned*processed)1992{1993struct thread_params *p;1994int i, ret, active_threads =0;19951996init_threaded_search();19971998if(delta_search_threads <=1) {1999find_deltas(list, &list_size, window, depth, processed);2000cleanup_threaded_search();2001return;2002}2003if(progress > pack_to_stdout)2004fprintf(stderr,"Delta compression using up to%dthreads.\n",2005 delta_search_threads);2006 p =xcalloc(delta_search_threads,sizeof(*p));20072008/* Partition the work amongst work threads. */2009for(i =0; i < delta_search_threads; i++) {2010unsigned sub_size = list_size / (delta_search_threads - i);20112012/* don't use too small segments or no deltas will be found */2013if(sub_size <2*window && i+1< delta_search_threads)2014 sub_size =0;20152016 p[i].window = window;2017 p[i].depth = depth;2018 p[i].processed = processed;2019 p[i].working =1;2020 p[i].data_ready =0;20212022/* try to split chunks on "path" boundaries */2023while(sub_size && sub_size < list_size &&2024 list[sub_size]->hash &&2025 list[sub_size]->hash == list[sub_size-1]->hash)2026 sub_size++;20272028 p[i].list = list;2029 p[i].list_size = sub_size;2030 p[i].remaining = sub_size;20312032 list += sub_size;2033 list_size -= sub_size;2034}20352036/* Start work threads. */2037for(i =0; i < delta_search_threads; i++) {2038if(!p[i].list_size)2039continue;2040pthread_mutex_init(&p[i].mutex, NULL);2041pthread_cond_init(&p[i].cond, NULL);2042 ret =pthread_create(&p[i].thread, NULL,2043 threaded_find_deltas, &p[i]);2044if(ret)2045die("unable to create thread:%s",strerror(ret));2046 active_threads++;2047}20482049/*2050 * Now let's wait for work completion. Each time a thread is done2051 * with its work, we steal half of the remaining work from the2052 * thread with the largest number of unprocessed objects and give2053 * it to that newly idle thread. This ensure good load balancing2054 * until the remaining object list segments are simply too short2055 * to be worth splitting anymore.2056 */2057while(active_threads) {2058struct thread_params *target = NULL;2059struct thread_params *victim = NULL;2060unsigned sub_size =0;20612062progress_lock();2063for(;;) {2064for(i =0; !target && i < delta_search_threads; i++)2065if(!p[i].working)2066 target = &p[i];2067if(target)2068break;2069pthread_cond_wait(&progress_cond, &progress_mutex);2070}20712072for(i =0; i < delta_search_threads; i++)2073if(p[i].remaining >2*window &&2074(!victim || victim->remaining < p[i].remaining))2075 victim = &p[i];2076if(victim) {2077 sub_size = victim->remaining /2;2078 list = victim->list + victim->list_size - sub_size;2079while(sub_size && list[0]->hash &&2080 list[0]->hash == list[-1]->hash) {2081 list++;2082 sub_size--;2083}2084if(!sub_size) {2085/*2086 * It is possible for some "paths" to have2087 * so many objects that no hash boundary2088 * might be found. Let's just steal the2089 * exact half in that case.2090 */2091 sub_size = victim->remaining /2;2092 list -= sub_size;2093}2094 target->list = list;2095 victim->list_size -= sub_size;2096 victim->remaining -= sub_size;2097}2098 target->list_size = sub_size;2099 target->remaining = sub_size;2100 target->working =1;2101progress_unlock();21022103pthread_mutex_lock(&target->mutex);2104 target->data_ready =1;2105pthread_cond_signal(&target->cond);2106pthread_mutex_unlock(&target->mutex);21072108if(!sub_size) {2109pthread_join(target->thread, NULL);2110pthread_cond_destroy(&target->cond);2111pthread_mutex_destroy(&target->mutex);2112 active_threads--;2113}2114}2115cleanup_threaded_search();2116free(p);2117}21182119#else2120#define ll_find_deltas(l, s, w, d, p) find_deltas(l, &s, w, d, p)2121#endif21222123static intadd_ref_tag(const char*path,const struct object_id *oid,int flag,void*cb_data)2124{2125struct object_id peeled;21262127if(starts_with(path,"refs/tags/") &&/* is a tag? */2128!peel_ref(path, peeled.hash) &&/* peelable? */2129packlist_find(&to_pack, peeled.hash, NULL))/* object packed? */2130add_object_entry(oid->hash, OBJ_TAG, NULL,0);2131return0;2132}21332134static voidprepare_pack(int window,int depth)2135{2136struct object_entry **delta_list;2137uint32_t i, nr_deltas;2138unsigned n;21392140get_object_details();21412142/*2143 * If we're locally repacking then we need to be doubly careful2144 * from now on in order to make sure no stealth corruption gets2145 * propagated to the new pack. Clients receiving streamed packs2146 * should validate everything they get anyway so no need to incur2147 * the additional cost here in that case.2148 */2149if(!pack_to_stdout)2150 do_check_packed_object_crc =1;21512152if(!to_pack.nr_objects || !window || !depth)2153return;21542155ALLOC_ARRAY(delta_list, to_pack.nr_objects);2156 nr_deltas = n =0;21572158for(i =0; i < to_pack.nr_objects; i++) {2159struct object_entry *entry = to_pack.objects + i;21602161if(entry->delta)2162/* This happens if we decided to reuse existing2163 * delta from a pack. "reuse_delta &&" is implied.2164 */2165continue;21662167if(entry->size <50)2168continue;21692170if(entry->no_try_delta)2171continue;21722173if(!entry->preferred_base) {2174 nr_deltas++;2175if(entry->type <0)2176die("unable to get type of object%s",2177sha1_to_hex(entry->idx.sha1));2178}else{2179if(entry->type <0) {2180/*2181 * This object is not found, but we2182 * don't have to include it anyway.2183 */2184continue;2185}2186}21872188 delta_list[n++] = entry;2189}21902191if(nr_deltas && n >1) {2192unsigned nr_done =0;2193if(progress)2194 progress_state =start_progress(_("Compressing objects"),2195 nr_deltas);2196qsort(delta_list, n,sizeof(*delta_list), type_size_sort);2197ll_find_deltas(delta_list, n, window+1, depth, &nr_done);2198stop_progress(&progress_state);2199if(nr_done != nr_deltas)2200die("inconsistency with delta count");2201}2202free(delta_list);2203}22042205static intgit_pack_config(const char*k,const char*v,void*cb)2206{2207if(!strcmp(k,"pack.window")) {2208 window =git_config_int(k, v);2209return0;2210}2211if(!strcmp(k,"pack.windowmemory")) {2212 window_memory_limit =git_config_ulong(k, v);2213return0;2214}2215if(!strcmp(k,"pack.depth")) {2216 depth =git_config_int(k, v);2217return0;2218}2219if(!strcmp(k,"pack.compression")) {2220int level =git_config_int(k, v);2221if(level == -1)2222 level = Z_DEFAULT_COMPRESSION;2223else if(level <0|| level > Z_BEST_COMPRESSION)2224die("bad pack compression level%d", level);2225 pack_compression_level = level;2226 pack_compression_seen =1;2227return0;2228}2229if(!strcmp(k,"pack.deltacachesize")) {2230 max_delta_cache_size =git_config_int(k, v);2231return0;2232}2233if(!strcmp(k,"pack.deltacachelimit")) {2234 cache_max_small_delta_size =git_config_int(k, v);2235return0;2236}2237if(!strcmp(k,"pack.writebitmaphashcache")) {2238if(git_config_bool(k, v))2239 write_bitmap_options |= BITMAP_OPT_HASH_CACHE;2240else2241 write_bitmap_options &= ~BITMAP_OPT_HASH_CACHE;2242}2243if(!strcmp(k,"pack.usebitmaps")) {2244 use_bitmap_index =git_config_bool(k, v);2245return0;2246}2247if(!strcmp(k,"pack.threads")) {2248 delta_search_threads =git_config_int(k, v);2249if(delta_search_threads <0)2250die("invalid number of threads specified (%d)",2251 delta_search_threads);2252#ifdef NO_PTHREADS2253if(delta_search_threads !=1)2254warning("no threads support, ignoring%s", k);2255#endif2256return0;2257}2258if(!strcmp(k,"pack.indexversion")) {2259 pack_idx_opts.version =git_config_int(k, v);2260if(pack_idx_opts.version >2)2261die("bad pack.indexversion=%"PRIu32,2262 pack_idx_opts.version);2263return0;2264}2265returngit_default_config(k, v, cb);2266}22672268static voidread_object_list_from_stdin(void)2269{2270char line[40+1+ PATH_MAX +2];2271unsigned char sha1[20];22722273for(;;) {2274if(!fgets(line,sizeof(line), stdin)) {2275if(feof(stdin))2276break;2277if(!ferror(stdin))2278die("fgets returned NULL, not EOF, not error!");2279if(errno != EINTR)2280die_errno("fgets");2281clearerr(stdin);2282continue;2283}2284if(line[0] =='-') {2285if(get_sha1_hex(line+1, sha1))2286die("expected edge sha1, got garbage:\n%s",2287 line);2288add_preferred_base(sha1);2289continue;2290}2291if(get_sha1_hex(line, sha1))2292die("expected sha1, got garbage:\n%s", line);22932294add_preferred_base_object(line+41);2295add_object_entry(sha1,0, line+41,0);2296}2297}22982299#define OBJECT_ADDED (1u<<20)23002301static voidshow_commit(struct commit *commit,void*data)2302{2303add_object_entry(commit->object.oid.hash, OBJ_COMMIT, NULL,0);2304 commit->object.flags |= OBJECT_ADDED;23052306if(write_bitmap_index)2307index_commit_for_bitmap(commit);2308}23092310static voidshow_object(struct object *obj,const char*name,void*data)2311{2312add_preferred_base_object(name);2313add_object_entry(obj->oid.hash, obj->type, name,0);2314 obj->flags |= OBJECT_ADDED;2315}23162317static voidshow_edge(struct commit *commit)2318{2319add_preferred_base(commit->object.oid.hash);2320}23212322struct in_pack_object {2323 off_t offset;2324struct object *object;2325};23262327struct in_pack {2328int alloc;2329int nr;2330struct in_pack_object *array;2331};23322333static voidmark_in_pack_object(struct object *object,struct packed_git *p,struct in_pack *in_pack)2334{2335 in_pack->array[in_pack->nr].offset =find_pack_entry_one(object->oid.hash, p);2336 in_pack->array[in_pack->nr].object = object;2337 in_pack->nr++;2338}23392340/*2341 * Compare the objects in the offset order, in order to emulate the2342 * "git rev-list --objects" output that produced the pack originally.2343 */2344static intofscmp(const void*a_,const void*b_)2345{2346struct in_pack_object *a = (struct in_pack_object *)a_;2347struct in_pack_object *b = (struct in_pack_object *)b_;23482349if(a->offset < b->offset)2350return-1;2351else if(a->offset > b->offset)2352return1;2353else2354returnoidcmp(&a->object->oid, &b->object->oid);2355}23562357static voidadd_objects_in_unpacked_packs(struct rev_info *revs)2358{2359struct packed_git *p;2360struct in_pack in_pack;2361uint32_t i;23622363memset(&in_pack,0,sizeof(in_pack));23642365for(p = packed_git; p; p = p->next) {2366const unsigned char*sha1;2367struct object *o;23682369if(!p->pack_local || p->pack_keep)2370continue;2371if(open_pack_index(p))2372die("cannot open pack index");23732374ALLOC_GROW(in_pack.array,2375 in_pack.nr + p->num_objects,2376 in_pack.alloc);23772378for(i =0; i < p->num_objects; i++) {2379 sha1 =nth_packed_object_sha1(p, i);2380 o =lookup_unknown_object(sha1);2381if(!(o->flags & OBJECT_ADDED))2382mark_in_pack_object(o, p, &in_pack);2383 o->flags |= OBJECT_ADDED;2384}2385}23862387if(in_pack.nr) {2388qsort(in_pack.array, in_pack.nr,sizeof(in_pack.array[0]),2389 ofscmp);2390for(i =0; i < in_pack.nr; i++) {2391struct object *o = in_pack.array[i].object;2392add_object_entry(o->oid.hash, o->type,"",0);2393}2394}2395free(in_pack.array);2396}23972398static intadd_loose_object(const unsigned char*sha1,const char*path,2399void*data)2400{2401enum object_type type =sha1_object_info(sha1, NULL);24022403if(type <0) {2404warning("loose object at%scould not be examined", path);2405return0;2406}24072408add_object_entry(sha1, type,"",0);2409return0;2410}24112412/*2413 * We actually don't even have to worry about reachability here.2414 * add_object_entry will weed out duplicates, so we just add every2415 * loose object we find.2416 */2417static voidadd_unreachable_loose_objects(void)2418{2419for_each_loose_file_in_objdir(get_object_directory(),2420 add_loose_object,2421 NULL, NULL, NULL);2422}24232424static inthas_sha1_pack_kept_or_nonlocal(const unsigned char*sha1)2425{2426static struct packed_git *last_found = (void*)1;2427struct packed_git *p;24282429 p = (last_found != (void*)1) ? last_found : packed_git;24302431while(p) {2432if((!p->pack_local || p->pack_keep) &&2433find_pack_entry_one(sha1, p)) {2434 last_found = p;2435return1;2436}2437if(p == last_found)2438 p = packed_git;2439else2440 p = p->next;2441if(p == last_found)2442 p = p->next;2443}2444return0;2445}24462447/*2448 * Store a list of sha1s that are should not be discarded2449 * because they are either written too recently, or are2450 * reachable from another object that was.2451 *2452 * This is filled by get_object_list.2453 */2454static struct sha1_array recent_objects;24552456static intloosened_object_can_be_discarded(const unsigned char*sha1,2457unsigned long mtime)2458{2459if(!unpack_unreachable_expiration)2460return0;2461if(mtime > unpack_unreachable_expiration)2462return0;2463if(sha1_array_lookup(&recent_objects, sha1) >=0)2464return0;2465return1;2466}24672468static voidloosen_unused_packed_objects(struct rev_info *revs)2469{2470struct packed_git *p;2471uint32_t i;2472const unsigned char*sha1;24732474for(p = packed_git; p; p = p->next) {2475if(!p->pack_local || p->pack_keep)2476continue;24772478if(open_pack_index(p))2479die("cannot open pack index");24802481for(i =0; i < p->num_objects; i++) {2482 sha1 =nth_packed_object_sha1(p, i);2483if(!packlist_find(&to_pack, sha1, NULL) &&2484!has_sha1_pack_kept_or_nonlocal(sha1) &&2485!loosened_object_can_be_discarded(sha1, p->mtime))2486if(force_object_loose(sha1, p->mtime))2487die("unable to force loose object");2488}2489}2490}24912492/*2493 * This tracks any options which a reader of the pack might2494 * not understand, and which would therefore prevent blind reuse2495 * of what we have on disk.2496 */2497static intpack_options_allow_reuse(void)2498{2499return allow_ofs_delta;2500}25012502static intget_object_list_from_bitmap(struct rev_info *revs)2503{2504if(prepare_bitmap_walk(revs) <0)2505return-1;25062507if(pack_options_allow_reuse() &&2508!reuse_partial_packfile_from_bitmap(2509&reuse_packfile,2510&reuse_packfile_objects,2511&reuse_packfile_offset)) {2512assert(reuse_packfile_objects);2513 nr_result += reuse_packfile_objects;2514display_progress(progress_state, nr_result);2515}25162517traverse_bitmap_commit_list(&add_object_entry_from_bitmap);2518return0;2519}25202521static voidrecord_recent_object(struct object *obj,2522const char*name,2523void*data)2524{2525sha1_array_append(&recent_objects, obj->oid.hash);2526}25272528static voidrecord_recent_commit(struct commit *commit,void*data)2529{2530sha1_array_append(&recent_objects, commit->object.oid.hash);2531}25322533static voidget_object_list(int ac,const char**av)2534{2535struct rev_info revs;2536char line[1000];2537int flags =0;25382539init_revisions(&revs, NULL);2540 save_commit_buffer =0;2541setup_revisions(ac, av, &revs, NULL);25422543/* make sure shallows are read */2544is_repository_shallow();25452546while(fgets(line,sizeof(line), stdin) != NULL) {2547int len =strlen(line);2548if(len && line[len -1] =='\n')2549 line[--len] =0;2550if(!len)2551break;2552if(*line =='-') {2553if(!strcmp(line,"--not")) {2554 flags ^= UNINTERESTING;2555 write_bitmap_index =0;2556continue;2557}2558if(starts_with(line,"--shallow ")) {2559unsigned char sha1[20];2560if(get_sha1_hex(line +10, sha1))2561die("not an SHA-1 '%s'", line +10);2562register_shallow(sha1);2563 use_bitmap_index =0;2564continue;2565}2566die("not a rev '%s'", line);2567}2568if(handle_revision_arg(line, &revs, flags, REVARG_CANNOT_BE_FILENAME))2569die("bad revision '%s'", line);2570}25712572if(use_bitmap_index && !get_object_list_from_bitmap(&revs))2573return;25742575if(prepare_revision_walk(&revs))2576die("revision walk setup failed");2577mark_edges_uninteresting(&revs, show_edge);2578traverse_commit_list(&revs, show_commit, show_object, NULL);25792580if(unpack_unreachable_expiration) {2581 revs.ignore_missing_links =1;2582if(add_unseen_recent_objects_to_traversal(&revs,2583 unpack_unreachable_expiration))2584die("unable to add recent objects");2585if(prepare_revision_walk(&revs))2586die("revision walk setup failed");2587traverse_commit_list(&revs, record_recent_commit,2588 record_recent_object, NULL);2589}25902591if(keep_unreachable)2592add_objects_in_unpacked_packs(&revs);2593if(pack_loose_unreachable)2594add_unreachable_loose_objects();2595if(unpack_unreachable)2596loosen_unused_packed_objects(&revs);25972598sha1_array_clear(&recent_objects);2599}26002601static intoption_parse_index_version(const struct option *opt,2602const char*arg,int unset)2603{2604char*c;2605const char*val = arg;2606 pack_idx_opts.version =strtoul(val, &c,10);2607if(pack_idx_opts.version >2)2608die(_("unsupported index version%s"), val);2609if(*c ==','&& c[1])2610 pack_idx_opts.off32_limit =strtoul(c+1, &c,0);2611if(*c || pack_idx_opts.off32_limit &0x80000000)2612die(_("bad index version '%s'"), val);2613return0;2614}26152616static intoption_parse_unpack_unreachable(const struct option *opt,2617const char*arg,int unset)2618{2619if(unset) {2620 unpack_unreachable =0;2621 unpack_unreachable_expiration =0;2622}2623else{2624 unpack_unreachable =1;2625if(arg)2626 unpack_unreachable_expiration =approxidate(arg);2627}2628return0;2629}26302631intcmd_pack_objects(int argc,const char**argv,const char*prefix)2632{2633int use_internal_rev_list =0;2634int thin =0;2635int shallow =0;2636int all_progress_implied =0;2637struct argv_array rp = ARGV_ARRAY_INIT;2638int rev_list_unpacked =0, rev_list_all =0, rev_list_reflog =0;2639int rev_list_index =0;2640struct option pack_objects_options[] = {2641OPT_SET_INT('q',"quiet", &progress,2642N_("do not show progress meter"),0),2643OPT_SET_INT(0,"progress", &progress,2644N_("show progress meter"),1),2645OPT_SET_INT(0,"all-progress", &progress,2646N_("show progress meter during object writing phase"),2),2647OPT_BOOL(0,"all-progress-implied",2648&all_progress_implied,2649N_("similar to --all-progress when progress meter is shown")),2650{ OPTION_CALLBACK,0,"index-version", NULL,N_("version[,offset]"),2651N_("write the pack index file in the specified idx format version"),26520, option_parse_index_version },2653OPT_MAGNITUDE(0,"max-pack-size", &pack_size_limit,2654N_("maximum size of each output pack file")),2655OPT_BOOL(0,"local", &local,2656N_("ignore borrowed objects from alternate object store")),2657OPT_BOOL(0,"incremental", &incremental,2658N_("ignore packed objects")),2659OPT_INTEGER(0,"window", &window,2660N_("limit pack window by objects")),2661OPT_MAGNITUDE(0,"window-memory", &window_memory_limit,2662N_("limit pack window by memory in addition to object limit")),2663OPT_INTEGER(0,"depth", &depth,2664N_("maximum length of delta chain allowed in the resulting pack")),2665OPT_BOOL(0,"reuse-delta", &reuse_delta,2666N_("reuse existing deltas")),2667OPT_BOOL(0,"reuse-object", &reuse_object,2668N_("reuse existing objects")),2669OPT_BOOL(0,"delta-base-offset", &allow_ofs_delta,2670N_("use OFS_DELTA objects")),2671OPT_INTEGER(0,"threads", &delta_search_threads,2672N_("use threads when searching for best delta matches")),2673OPT_BOOL(0,"non-empty", &non_empty,2674N_("do not create an empty pack output")),2675OPT_BOOL(0,"revs", &use_internal_rev_list,2676N_("read revision arguments from standard input")),2677{ OPTION_SET_INT,0,"unpacked", &rev_list_unpacked, NULL,2678N_("limit the objects to those that are not yet packed"),2679 PARSE_OPT_NOARG | PARSE_OPT_NONEG, NULL,1},2680{ OPTION_SET_INT,0,"all", &rev_list_all, NULL,2681N_("include objects reachable from any reference"),2682 PARSE_OPT_NOARG | PARSE_OPT_NONEG, NULL,1},2683{ OPTION_SET_INT,0,"reflog", &rev_list_reflog, NULL,2684N_("include objects referred by reflog entries"),2685 PARSE_OPT_NOARG | PARSE_OPT_NONEG, NULL,1},2686{ OPTION_SET_INT,0,"indexed-objects", &rev_list_index, NULL,2687N_("include objects referred to by the index"),2688 PARSE_OPT_NOARG | PARSE_OPT_NONEG, NULL,1},2689OPT_BOOL(0,"stdout", &pack_to_stdout,2690N_("output pack to stdout")),2691OPT_BOOL(0,"include-tag", &include_tag,2692N_("include tag objects that refer to objects to be packed")),2693OPT_BOOL(0,"keep-unreachable", &keep_unreachable,2694N_("keep unreachable objects")),2695OPT_BOOL(0,"pack-loose-unreachable", &pack_loose_unreachable,2696N_("pack loose unreachable objects")),2697{ OPTION_CALLBACK,0,"unpack-unreachable", NULL,N_("time"),2698N_("unpack unreachable objects newer than <time>"),2699 PARSE_OPT_OPTARG, option_parse_unpack_unreachable },2700OPT_BOOL(0,"thin", &thin,2701N_("create thin packs")),2702OPT_BOOL(0,"shallow", &shallow,2703N_("create packs suitable for shallow fetches")),2704OPT_BOOL(0,"honor-pack-keep", &ignore_packed_keep,2705N_("ignore packs that have companion .keep file")),2706OPT_INTEGER(0,"compression", &pack_compression_level,2707N_("pack compression level")),2708OPT_SET_INT(0,"keep-true-parents", &grafts_replace_parents,2709N_("do not hide commits by grafts"),0),2710OPT_BOOL(0,"use-bitmap-index", &use_bitmap_index,2711N_("use a bitmap index if available to speed up counting objects")),2712OPT_BOOL(0,"write-bitmap-index", &write_bitmap_index,2713N_("write a bitmap index together with the pack index")),2714OPT_END(),2715};27162717 check_replace_refs =0;27182719reset_pack_idx_option(&pack_idx_opts);2720git_config(git_pack_config, NULL);2721if(!pack_compression_seen && core_compression_seen)2722 pack_compression_level = core_compression_level;27232724 progress =isatty(2);2725 argc =parse_options(argc, argv, prefix, pack_objects_options,2726 pack_usage,0);27272728if(argc) {2729 base_name = argv[0];2730 argc--;2731}2732if(pack_to_stdout != !base_name || argc)2733usage_with_options(pack_usage, pack_objects_options);27342735argv_array_push(&rp,"pack-objects");2736if(thin) {2737 use_internal_rev_list =1;2738argv_array_push(&rp, shallow2739?"--objects-edge-aggressive"2740:"--objects-edge");2741}else2742argv_array_push(&rp,"--objects");27432744if(rev_list_all) {2745 use_internal_rev_list =1;2746argv_array_push(&rp,"--all");2747}2748if(rev_list_reflog) {2749 use_internal_rev_list =1;2750argv_array_push(&rp,"--reflog");2751}2752if(rev_list_index) {2753 use_internal_rev_list =1;2754argv_array_push(&rp,"--indexed-objects");2755}2756if(rev_list_unpacked) {2757 use_internal_rev_list =1;2758argv_array_push(&rp,"--unpacked");2759}27602761if(!reuse_object)2762 reuse_delta =0;2763if(pack_compression_level == -1)2764 pack_compression_level = Z_DEFAULT_COMPRESSION;2765else if(pack_compression_level <0|| pack_compression_level > Z_BEST_COMPRESSION)2766die("bad pack compression level%d", pack_compression_level);27672768if(!delta_search_threads)/* --threads=0 means autodetect */2769 delta_search_threads =online_cpus();27702771#ifdef NO_PTHREADS2772if(delta_search_threads !=1)2773warning("no threads support, ignoring --threads");2774#endif2775if(!pack_to_stdout && !pack_size_limit)2776 pack_size_limit = pack_size_limit_cfg;2777if(pack_to_stdout && pack_size_limit)2778die("--max-pack-size cannot be used to build a pack for transfer.");2779if(pack_size_limit && pack_size_limit <1024*1024) {2780warning("minimum pack size limit is 1 MiB");2781 pack_size_limit =1024*1024;2782}27832784if(!pack_to_stdout && thin)2785die("--thin cannot be used to build an indexable pack.");27862787if(keep_unreachable && unpack_unreachable)2788die("--keep-unreachable and --unpack-unreachable are incompatible.");2789if(!rev_list_all || !rev_list_reflog || !rev_list_index)2790 unpack_unreachable_expiration =0;27912792if(!use_internal_rev_list || !pack_to_stdout ||is_repository_shallow())2793 use_bitmap_index =0;27942795if(pack_to_stdout || !rev_list_all)2796 write_bitmap_index =0;27972798if(progress && all_progress_implied)2799 progress =2;28002801prepare_packed_git();28022803if(progress)2804 progress_state =start_progress(_("Counting objects"),0);2805if(!use_internal_rev_list)2806read_object_list_from_stdin();2807else{2808get_object_list(rp.argc, rp.argv);2809argv_array_clear(&rp);2810}2811cleanup_preferred_base();2812if(include_tag && nr_result)2813for_each_ref(add_ref_tag, NULL);2814stop_progress(&progress_state);28152816if(non_empty && !nr_result)2817return0;2818if(nr_result)2819prepare_pack(window, depth);2820write_pack_file();2821if(progress)2822fprintf(stderr,"Total %"PRIu32" (delta %"PRIu32"),"2823" reused %"PRIu32" (delta %"PRIu32")\n",2824 written, written_delta, reused, reused_delta);2825return0;2826}