index-pack.c 38.3 KB
Newer Older
1
#include "builtin.h"
S
Sergey Vlasov 已提交
2 3 4
#include "delta.h"
#include "pack.h"
#include "csum-file.h"
5 6 7 8
#include "blob.h"
#include "commit.h"
#include "tag.h"
#include "tree.h"
N
Nicolas Pitre 已提交
9
#include "progress.h"
10
#include "fsck.h"
11
#include "exec_cmd.h"
12
#include "thread-utils.h"
S
Sergey Vlasov 已提交
13 14

static const char index_pack_usage[] =
J
Junio C Hamano 已提交
15
"git index-pack [-v] [-o <index-file>] [--keep | --keep=<msg>] [--verify] [--strict] (<pack-file> | --stdin [--fix-thin] [<pack-file>])";
S
Sergey Vlasov 已提交
16

17
struct object_entry {
G
Geert Bosch 已提交
18
	struct pack_idx_entry idx;
19 20
	unsigned long size;
	unsigned int hdr_size;
S
Sergey Vlasov 已提交
21 22
	enum object_type type;
	enum object_type real_type;
23 24
	unsigned delta_depth;
	int base_object_no;
S
Sergey Vlasov 已提交
25 26
};

27 28
union delta_base {
	unsigned char sha1[20];
29
	off_t offset;
30 31
};

32
struct base_data {
33 34
	struct base_data *base;
	struct base_data *child;
35
	struct object_entry *obj;
36 37
	void *data;
	unsigned long size;
38 39
	int ref_first, ref_last;
	int ofs_first, ofs_last;
40 41
};

42 43 44 45 46
#if !defined(NO_PTHREADS) && defined(NO_PREAD)
/* NO_PREAD uses compat/pread.c, which is not thread-safe. Disable threading. */
#define NO_PTHREADS
#endif

47 48 49 50 51 52 53 54
struct thread_local {
#ifndef NO_PTHREADS
	pthread_t thread;
#endif
	struct base_data *base_cache;
	size_t base_cache_used;
};

55 56 57 58 59 60
/*
 * Even if sizeof(union delta_base) == 24 on 64-bit archs, we really want
 * to memcmp() only the first 20 bytes.
 */
#define UNION_BASE_SZ	20

61 62 63
#define FLAG_LINK (1u<<20)
#define FLAG_CHECKED (1u<<21)

64
struct delta_entry {
65
	union delta_base base;
66
	int obj_no;
S
Sergey Vlasov 已提交
67 68 69 70
};

static struct object_entry *objects;
static struct delta_entry *deltas;
71
static struct thread_local nothread_data;
S
Sergey Vlasov 已提交
72 73
static int nr_objects;
static int nr_deltas;
74
static int nr_resolved_deltas;
75
static int nr_threads;
S
Sergey Vlasov 已提交
76

77
static int from_stdin;
78
static int strict;
N
Nicolas Pitre 已提交
79 80
static int verbose;

81
static struct progress *progress;
82

83 84
/* We always read in 4kB chunks. */
static unsigned char input_buffer[4096];
85 86
static unsigned int input_offset, input_len;
static off_t consumed_bytes;
87
static unsigned deepest_delta;
88
static git_SHA_CTX input_ctx;
89
static uint32_t input_crc32;
90
static int input_fd, output_fd, pack_fd;
91

92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162
#ifndef NO_PTHREADS

static struct thread_local *thread_data;
static int nr_dispatched;
static int threads_active;

static pthread_mutex_t read_mutex;
#define read_lock()		lock_mutex(&read_mutex)
#define read_unlock()		unlock_mutex(&read_mutex)

static pthread_mutex_t counter_mutex;
#define counter_lock()		lock_mutex(&counter_mutex)
#define counter_unlock()	unlock_mutex(&counter_mutex)

static pthread_mutex_t work_mutex;
#define work_lock()		lock_mutex(&work_mutex)
#define work_unlock()		unlock_mutex(&work_mutex)

static pthread_key_t key;

static inline void lock_mutex(pthread_mutex_t *mutex)
{
	if (threads_active)
		pthread_mutex_lock(mutex);
}

static inline void unlock_mutex(pthread_mutex_t *mutex)
{
	if (threads_active)
		pthread_mutex_unlock(mutex);
}

/*
 * Mutex and conditional variable can't be statically-initialized on Windows.
 */
static void init_thread(void)
{
	init_recursive_mutex(&read_mutex);
	pthread_mutex_init(&counter_mutex, NULL);
	pthread_mutex_init(&work_mutex, NULL);
	pthread_key_create(&key, NULL);
	thread_data = xcalloc(nr_threads, sizeof(*thread_data));
	threads_active = 1;
}

static void cleanup_thread(void)
{
	if (!threads_active)
		return;
	threads_active = 0;
	pthread_mutex_destroy(&read_mutex);
	pthread_mutex_destroy(&counter_mutex);
	pthread_mutex_destroy(&work_mutex);
	pthread_key_delete(key);
	free(thread_data);
}

#else

#define read_lock()
#define read_unlock()

#define counter_lock()
#define counter_unlock()

#define work_lock()
#define work_unlock()

#endif


163 164 165 166 167 168
static int mark_link(struct object *obj, int type, void *data)
{
	if (!obj)
		return -1;

	if (type != OBJ_ANY && obj->type != type)
169
		die(_("object type mismatch at %s"), sha1_to_hex(obj->sha1));
170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188

	obj->flags |= FLAG_LINK;
	return 0;
}

/* The content of each linked object must have been checked
   or it must be already present in the object database */
static void check_object(struct object *obj)
{
	if (!obj)
		return;

	if (!(obj->flags & FLAG_LINK))
		return;

	if (!(obj->flags & FLAG_CHECKED)) {
		unsigned long size;
		int type = sha1_object_info(obj->sha1, &size);
		if (type != obj->type || type <= 0)
189
			die(_("object of unexpected type"));
190 191 192 193 194 195 196 197 198 199 200 201 202 203 204
		obj->flags |= FLAG_CHECKED;
		return;
	}
}

static void check_objects(void)
{
	unsigned i, max;

	max = get_max_object_index();
	for (i = 0; i < max; i++)
		check_object(get_indexed_object(i));
}


205
/* Discard current buffer used content. */
206
static void flush(void)
207 208 209 210
{
	if (input_offset) {
		if (output_fd >= 0)
			write_or_die(output_fd, input_buffer, input_offset);
211
		git_SHA1_Update(&input_ctx, input_buffer, input_offset);
212
		memmove(input_buffer, input_buffer + input_offset, input_len);
213 214 215 216
		input_offset = 0;
	}
}

217 218 219 220
/*
 * Make sure at least "min" bytes are available in the buffer, and
 * return the pointer to the buffer.
 */
221
static void *fill(int min)
S
Sergey Vlasov 已提交
222
{
223 224 225
	if (min <= input_len)
		return input_buffer + input_offset;
	if (min > sizeof(input_buffer))
226 227 228 229
		die(Q_("cannot fill %d byte",
		       "cannot fill %d bytes",
		       min),
		    min);
230
	flush();
231
	do {
232
		ssize_t ret = xread(input_fd, input_buffer + input_len,
233 234 235
				sizeof(input_buffer) - input_len);
		if (ret <= 0) {
			if (!ret)
236 237
				die(_("early EOF"));
			die_errno(_("read error on input"));
238 239
		}
		input_len += ret;
240 241
		if (from_stdin)
			display_throughput(progress, consumed_bytes + input_len);
242 243 244 245 246 247 248
	} while (input_len < min);
	return input_buffer;
}

static void use(int bytes)
{
	if (bytes > input_len)
249
		die(_("used more bytes than were available"));
250
	input_crc32 = crc32(input_crc32, input_buffer + input_offset, bytes);
251 252
	input_len -= bytes;
	input_offset += bytes;
253 254

	/* make sure off_t is sufficiently large not to wrap */
255
	if (signed_add_overflows(consumed_bytes, bytes))
256
		die(_("pack too large for current definition of off_t"));
257 258
	consumed_bytes += bytes;
}
S
Sergey Vlasov 已提交
259

L
Linus Torvalds 已提交
260
static const char *open_pack_file(const char *pack_name)
261
{
262 263 264
	if (from_stdin) {
		input_fd = 0;
		if (!pack_name) {
265 266
			static char tmp_file[PATH_MAX];
			output_fd = odb_mkstemp(tmp_file, sizeof(tmp_file),
267
						"pack/tmp_pack_XXXXXX");
268
			pack_name = xstrdup(tmp_file);
269 270 271
		} else
			output_fd = open(pack_name, O_CREAT|O_EXCL|O_RDWR, 0600);
		if (output_fd < 0)
272
			die_errno(_("unable to create '%s'"), pack_name);
273
		pack_fd = output_fd;
274 275 276
	} else {
		input_fd = open(pack_name, O_RDONLY);
		if (input_fd < 0)
277
			die_errno(_("cannot open packfile '%s'"), pack_name);
278
		output_fd = -1;
279
		pack_fd = input_fd;
280
	}
281
	git_SHA1_Init(&input_ctx);
282
	return pack_name;
S
Sergey Vlasov 已提交
283 284 285 286
}

static void parse_pack_header(void)
{
287
	struct pack_header *hdr = fill(sizeof(struct pack_header));
S
Sergey Vlasov 已提交
288 289 290

	/* Header consistency check */
	if (hdr->hdr_signature != htonl(PACK_SIGNATURE))
291
		die(_("pack signature mismatch"));
N
Nicolas Pitre 已提交
292
	if (!pack_version_ok(hdr->hdr_version))
293 294
		die("pack version %"PRIu32" unsupported",
			ntohl(hdr->hdr_version));
S
Sergey Vlasov 已提交
295 296

	nr_objects = ntohl(hdr->hdr_entries);
297
	use(sizeof(struct pack_header));
S
Sergey Vlasov 已提交
298 299
}

300 301
static NORETURN void bad_object(unsigned long offset, const char *format,
		       ...) __attribute__((format (printf, 2, 3)));
S
Sergey Vlasov 已提交
302

S
Stephen Boyd 已提交
303
static NORETURN void bad_object(unsigned long offset, const char *format, ...)
S
Sergey Vlasov 已提交
304 305 306 307 308 309 310
{
	va_list params;
	char buf[1024];

	va_start(params, format);
	vsnprintf(buf, sizeof(buf), format, params);
	va_end(params);
311
	die(_("pack has bad object at offset %lu: %s"), offset, buf);
S
Sergey Vlasov 已提交
312 313
}

314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332
static inline struct thread_local *get_thread_data(void)
{
#ifndef NO_PTHREADS
	if (threads_active)
		return pthread_getspecific(key);
	assert(!threads_active &&
	       "This should only be reached when all threads are gone");
#endif
	return &nothread_data;
}

#ifndef NO_PTHREADS
static void set_thread_data(struct thread_local *data)
{
	if (threads_active)
		pthread_setspecific(key, data);
}
#endif

333 334 335 336 337 338 339 340 341
static struct base_data *alloc_base_data(void)
{
	struct base_data *base = xmalloc(sizeof(struct base_data));
	memset(base, 0, sizeof(*base));
	base->ref_last = -1;
	base->ofs_last = -1;
	return base;
}

342 343 344 345 346
static void free_base_data(struct base_data *c)
{
	if (c->data) {
		free(c->data);
		c->data = NULL;
347
		get_thread_data()->base_cache_used -= c->size;
348 349 350
	}
}

351 352
static void prune_base_data(struct base_data *retain)
{
353
	struct base_data *b;
354 355 356
	struct thread_local *data = get_thread_data();
	for (b = data->base_cache;
	     data->base_cache_used > delta_base_cache_limit && b;
357
	     b = b->child) {
358 359
		if (b->data && b != retain)
			free_base_data(b);
360 361 362
	}
}

363 364 365 366 367
static void link_base_data(struct base_data *base, struct base_data *c)
{
	if (base)
		base->child = c;
	else
368
		get_thread_data()->base_cache = c;
369 370 371

	c->base = base;
	c->child = NULL;
372
	if (c->data)
373
		get_thread_data()->base_cache_used += c->size;
374
	prune_base_data(c);
375 376 377 378 379 380 381 382
}

static void unlink_base_data(struct base_data *c)
{
	struct base_data *base = c->base;
	if (base)
		base->child = NULL;
	else
383
		get_thread_data()->base_cache = NULL;
384
	free_base_data(c);
385 386
}

387 388 389 390 391 392 393
static int is_delta_type(enum object_type type)
{
	return (type == OBJ_REF_DELTA || type == OBJ_OFS_DELTA);
}

static void *unpack_entry_data(unsigned long offset, unsigned long size,
			       enum object_type type, unsigned char *sha1)
S
Sergey Vlasov 已提交
394
{
395
	int status;
396
	git_zstream stream;
S
Sergey Vlasov 已提交
397
	void *buf = xmalloc(size);
398 399 400 401 402 403 404 405 406 407
	git_SHA_CTX c;
	char hdr[32];
	int hdrlen;

	if (!is_delta_type(type)) {
		hdrlen = sprintf(hdr, "%s %lu", typename(type), size) + 1;
		git_SHA1_Init(&c);
		git_SHA1_Update(&c, hdr, hdrlen);
	} else
		sha1 = NULL;
S
Sergey Vlasov 已提交
408 409

	memset(&stream, 0, sizeof(stream));
410
	git_inflate_init(&stream);
S
Sergey Vlasov 已提交
411 412 413
	stream.next_out = buf;
	stream.avail_out = size;

414
	do {
415
		unsigned char *last_out = stream.next_out;
416 417
		stream.next_in = fill(1);
		stream.avail_in = input_len;
418 419
		status = git_inflate(&stream, 0);
		use(input_len - stream.avail_in);
420 421
		if (sha1)
			git_SHA1_Update(&c, last_out, stream.next_out - last_out);
422 423
	} while (status == Z_OK);
	if (stream.total_out != size || status != Z_STREAM_END)
424
		bad_object(offset, _("inflate returned %d"), status);
425
	git_inflate_end(&stream);
426 427
	if (sha1)
		git_SHA1_Final(sha1, &c);
S
Sergey Vlasov 已提交
428 429 430
	return buf;
}

431 432 433
static void *unpack_raw_entry(struct object_entry *obj,
			      union delta_base *delta_base,
			      unsigned char *sha1)
S
Sergey Vlasov 已提交
434
{
435 436
	unsigned char *p;
	unsigned long size, c;
437
	off_t base_offset;
S
Sergey Vlasov 已提交
438
	unsigned shift;
439
	void *data;
S
Sergey Vlasov 已提交
440

G
Geert Bosch 已提交
441
	obj->idx.offset = consumed_bytes;
442
	input_crc32 = crc32(0, NULL, 0);
443 444 445 446 447

	p = fill(1);
	c = *p;
	use(1);
	obj->type = (c >> 4) & 7;
S
Sergey Vlasov 已提交
448 449 450
	size = (c & 15);
	shift = 4;
	while (c & 0x80) {
451 452 453
		p = fill(1);
		c = *p;
		use(1);
454
		size += (c & 0x7f) << shift;
S
Sergey Vlasov 已提交
455 456
		shift += 7;
	}
457
	obj->size = size;
S
Sergey Vlasov 已提交
458

459
	switch (obj->type) {
460
	case OBJ_REF_DELTA:
461 462
		hashcpy(delta_base->sha1, fill(20));
		use(20);
463 464 465
		break;
	case OBJ_OFS_DELTA:
		memset(delta_base, 0, sizeof(*delta_base));
466 467 468
		p = fill(1);
		c = *p;
		use(1);
469 470 471
		base_offset = c & 127;
		while (c & 128) {
			base_offset += 1;
472
			if (!base_offset || MSB(base_offset, 7))
473
				bad_object(obj->idx.offset, _("offset value overflow for delta base object"));
474 475 476
			p = fill(1);
			c = *p;
			use(1);
477 478
			base_offset = (base_offset << 7) + (c & 127);
		}
G
Geert Bosch 已提交
479
		delta_base->offset = obj->idx.offset - base_offset;
480
		if (delta_base->offset <= 0 || delta_base->offset >= obj->idx.offset)
481
			bad_object(obj->idx.offset, _("delta base offset is out of bound"));
482
		break;
S
Sergey Vlasov 已提交
483 484 485 486 487 488
	case OBJ_COMMIT:
	case OBJ_TREE:
	case OBJ_BLOB:
	case OBJ_TAG:
		break;
	default:
489
		bad_object(obj->idx.offset, _("unknown object type %d"), obj->type);
S
Sergey Vlasov 已提交
490
	}
G
Geert Bosch 已提交
491
	obj->hdr_size = consumed_bytes - obj->idx.offset;
492

493
	data = unpack_entry_data(obj->idx.offset, obj->size, obj->type, sha1);
G
Geert Bosch 已提交
494
	obj->idx.crc32 = input_crc32;
495
	return data;
496 497
}

498
static void *get_data_from_pack(struct object_entry *obj)
499
{
500
	off_t from = obj[0].idx.offset + obj[0].hdr_size;
G
Geert Bosch 已提交
501
	unsigned long len = obj[1].idx.offset - from;
502
	unsigned char *data, *inbuf;
503
	git_zstream stream;
504
	int status;
S
Sergey Vlasov 已提交
505

506
	data = xmalloc(obj->size);
507 508
	inbuf = xmalloc((len < 64*1024) ? len : 64*1024);

509
	memset(&stream, 0, sizeof(stream));
510
	git_inflate_init(&stream);
511 512
	stream.next_out = data;
	stream.avail_out = obj->size;
513 514 515 516 517

	do {
		ssize_t n = (len < 64*1024) ? len : 64*1024;
		n = pread(pack_fd, inbuf, n, from);
		if (n < 0)
518
			die_errno(_("cannot pread pack file"));
519
		if (!n)
520 521 522 523
			die(Q_("premature end of pack file, %lu byte missing",
			       "premature end of pack file, %lu bytes missing",
			       len),
			    len);
524 525 526 527 528 529 530 531 532
		from += n;
		len -= n;
		stream.next_in = inbuf;
		stream.avail_in = n;
		status = git_inflate(&stream, 0);
	} while (len && status == Z_OK && !stream.avail_in);

	/* This has been inflated OK when first encountered, so... */
	if (status != Z_STREAM_END || stream.total_out != obj->size)
533
		die(_("serious inflate inconsistency"));
534 535 536

	git_inflate_end(&stream);
	free(inbuf);
S
Sergey Vlasov 已提交
537 538 539
	return data;
}

540 541 542 543 544 545 546 547 548 549 550 551
static int compare_delta_bases(const union delta_base *base1,
			       const union delta_base *base2,
			       enum object_type type1,
			       enum object_type type2)
{
	int cmp = type1 - type2;
	if (cmp)
		return cmp;
	return memcmp(base1, base2, UNION_BASE_SZ);
}

static int find_delta(const union delta_base *base, enum object_type type)
S
Sergey Vlasov 已提交
552 553 554 555 556 557 558 559
{
	int first = 0, last = nr_deltas;

        while (first < last) {
                int next = (first + last) / 2;
                struct delta_entry *delta = &deltas[next];
                int cmp;

560 561
		cmp = compare_delta_bases(base, &delta->base,
					  type, objects[delta->obj_no].type);
S
Sergey Vlasov 已提交
562 563 564 565 566 567 568 569 570 571 572
                if (!cmp)
                        return next;
                if (cmp < 0) {
                        last = next;
                        continue;
                }
                first = next+1;
        }
        return -first-1;
}

573
static void find_delta_children(const union delta_base *base,
574 575
				int *first_index, int *last_index,
				enum object_type type)
S
Sergey Vlasov 已提交
576
{
577
	int first = find_delta(base, type);
S
Sergey Vlasov 已提交
578 579 580
	int last = first;
	int end = nr_deltas - 1;

581 582 583 584 585
	if (first < 0) {
		*first_index = 0;
		*last_index = -1;
		return;
	}
586
	while (first > 0 && !memcmp(&deltas[first - 1].base, base, UNION_BASE_SZ))
S
Sergey Vlasov 已提交
587
		--first;
588
	while (last < end && !memcmp(&deltas[last + 1].base, base, UNION_BASE_SZ))
S
Sergey Vlasov 已提交
589 590 591 592 593 594
		++last;
	*first_index = first;
	*last_index = last;
}

static void sha1_object(const void *data, unsigned long size,
595
			enum object_type type, const unsigned char *sha1)
S
Sergey Vlasov 已提交
596
{
597
	read_lock();
598
	if (has_sha1_file(sha1)) {
599 600 601 602
		void *has_data;
		enum object_type has_type;
		unsigned long has_size;
		has_data = read_sha1_file(sha1, &has_type, &has_size);
603
		read_unlock();
604
		if (!has_data)
605
			die(_("cannot read existing object %s"), sha1_to_hex(sha1));
606 607
		if (size != has_size || type != has_type ||
		    memcmp(data, has_data, size) != 0)
608
			die(_("SHA1 COLLISION FOUND WITH %s !"), sha1_to_hex(sha1));
609
		free(has_data);
610 611 612
	} else
		read_unlock();

613
	if (strict) {
614
		read_lock();
615 616 617 618 619
		if (type == OBJ_BLOB) {
			struct blob *blob = lookup_blob(sha1);
			if (blob)
				blob->object.flags |= FLAG_CHECKED;
			else
620
				die(_("invalid blob object %s"), sha1_to_hex(sha1));
621 622 623 624 625 626 627 628 629 630 631
		} else {
			struct object *obj;
			int eaten;
			void *buf = (void *) data;

			/*
			 * we do not need to free the memory here, as the
			 * buf is deleted by the caller.
			 */
			obj = parse_object_buffer(sha1, type, size, buf, &eaten);
			if (!obj)
632
				die(_("invalid %s"), typename(type));
633
			if (fsck_object(obj, 1, fsck_error_function))
634
				die(_("Error in object"));
635
			if (fsck_walk(obj, mark_link, NULL))
636
				die(_("Not all child objects of %s are reachable"), sha1_to_hex(obj->sha1));
637 638 639 640 641 642 643 644 645 646 647

			if (obj->type == OBJ_TREE) {
				struct tree *item = (struct tree *) obj;
				item->buffer = NULL;
			}
			if (obj->type == OBJ_COMMIT) {
				struct commit *commit = (struct commit *) obj;
				commit->buffer = NULL;
			}
			obj->flags |= FLAG_CHECKED;
		}
648
		read_unlock();
649
	}
S
Sergey Vlasov 已提交
650 651
}

652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673
/*
 * This function is part of find_unresolved_deltas(). There are two
 * walkers going in the opposite ways.
 *
 * The first one in find_unresolved_deltas() traverses down from
 * parent node to children, deflating nodes along the way. However,
 * memory for deflated nodes is limited by delta_base_cache_limit, so
 * at some point parent node's deflated content may be freed.
 *
 * The second walker is this function, which goes from current node up
 * to top parent if necessary to deflate the node. In normal
 * situation, its parent node would be already deflated, so it just
 * needs to apply delta.
 *
 * In the worst case scenario, parent node is no longer deflated because
 * we're running out of delta_base_cache_limit; we need to re-deflate
 * parents, possibly up to the top base.
 *
 * All deflated objects here are subject to be freed if we exceed
 * delta_base_cache_limit, just like in find_unresolved_deltas(), we
 * just need to make sure the last node is not freed.
 */
674 675 676 677
static void *get_base_data(struct base_data *c)
{
	if (!c->data) {
		struct object_entry *obj = c->obj;
678 679
		struct base_data **delta = NULL;
		int delta_nr = 0, delta_alloc = 0;
680

681 682 683 684 685 686 687 688
		while (is_delta_type(c->obj->type) && !c->data) {
			ALLOC_GROW(delta, delta_nr + 1, delta_alloc);
			delta[delta_nr++] = c;
			c = c->base;
		}
		if (!delta_nr) {
			c->data = get_data_from_pack(obj);
			c->size = obj->size;
689
			get_thread_data()->base_cache_used += c->size;
690 691 692 693 694 695 696 697
			prune_base_data(c);
		}
		for (; delta_nr > 0; delta_nr--) {
			void *base, *raw;
			c = delta[delta_nr - 1];
			obj = c->obj;
			base = get_base_data(c->base);
			raw = get_data_from_pack(obj);
698 699 700 701 702 703
			c->data = patch_delta(
				base, c->base->size,
				raw, obj->size,
				&c->size);
			free(raw);
			if (!c->data)
704
				bad_object(obj->idx.offset, _("failed to apply delta"));
705
			get_thread_data()->base_cache_used += c->size;
706
			prune_base_data(c);
707
		}
708
		free(delta);
709 710 711 712
	}
	return c->data;
}

713
static void resolve_delta(struct object_entry *delta_obj,
714
			  struct base_data *base, struct base_data *result)
S
Sergey Vlasov 已提交
715
{
N
Nicolas Pitre 已提交
716
	void *base_data, *delta_data;
S
Sergey Vlasov 已提交
717

N
Nicolas Pitre 已提交
718
	delta_obj->real_type = base->obj->real_type;
719
	delta_obj->delta_depth = base->obj->delta_depth + 1;
720 721
	if (deepest_delta < delta_obj->delta_depth)
		deepest_delta = delta_obj->delta_depth;
722
	delta_obj->base_object_no = base->obj - objects;
723
	delta_data = get_data_from_pack(delta_obj);
N
Nicolas Pitre 已提交
724
	base_data = get_base_data(base);
725
	result->obj = delta_obj;
N
Nicolas Pitre 已提交
726 727
	result->data = patch_delta(base_data, base->size,
				   delta_data, delta_obj->size, &result->size);
S
Sergey Vlasov 已提交
728
	free(delta_data);
729
	if (!result->data)
730
		bad_object(delta_obj->idx.offset, _("failed to apply delta"));
731 732
	hash_sha1_file(result->data, result->size,
		       typename(delta_obj->real_type), delta_obj->idx.sha1);
733 734
	sha1_object(result->data, result->size, delta_obj->real_type,
		    delta_obj->idx.sha1);
735
	counter_lock();
736
	nr_resolved_deltas++;
737
	counter_unlock();
738 739
}

740 741
static struct base_data *find_unresolved_deltas_1(struct base_data *base,
						  struct base_data *prev_base)
742
{
743
	if (base->ref_last == -1 && base->ofs_last == -1) {
744 745 746
		union delta_base base_spec;

		hashcpy(base_spec.sha1, base->obj->idx.sha1);
747
		find_delta_children(&base_spec,
748
				    &base->ref_first, &base->ref_last, OBJ_REF_DELTA);
749

750 751
		memset(&base_spec, 0, sizeof(base_spec));
		base_spec.offset = base->obj->idx.offset;
752
		find_delta_children(&base_spec,
753
				    &base->ofs_first, &base->ofs_last, OBJ_OFS_DELTA);
754

755 756 757 758
		if (base->ref_last == -1 && base->ofs_last == -1) {
			free(base->data);
			return NULL;
		}
759

760 761
		link_base_data(prev_base, base);
	}
762

763 764 765
	if (base->ref_first <= base->ref_last) {
		struct object_entry *child = objects + deltas[base->ref_first].obj_no;
		struct base_data *result = alloc_base_data();
766 767

		assert(child->real_type == OBJ_REF_DELTA);
768 769
		resolve_delta(child, base, result);
		if (base->ref_first == base->ref_last && base->ofs_last == -1)
770
			free_base_data(base);
771 772 773

		base->ref_first++;
		return result;
774 775
	}

776 777 778
	if (base->ofs_first <= base->ofs_last) {
		struct object_entry *child = objects + deltas[base->ofs_first].obj_no;
		struct base_data *result = alloc_base_data();
779 780

		assert(child->real_type == OBJ_OFS_DELTA);
781 782
		resolve_delta(child, base, result);
		if (base->ofs_first == base->ofs_last)
783
			free_base_data(base);
784 785 786

		base->ofs_first++;
		return result;
S
Sergey Vlasov 已提交
787
	}
788

789
	unlink_base_data(base);
790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809
	return NULL;
}

static void find_unresolved_deltas(struct base_data *base)
{
	struct base_data *new_base, *prev_base = NULL;
	for (;;) {
		new_base = find_unresolved_deltas_1(base, prev_base);

		if (new_base) {
			prev_base = base;
			base = new_base;
		} else {
			free(base);
			base = prev_base;
			if (!base)
				return;
			prev_base = base->base;
		}
	}
S
Sergey Vlasov 已提交
810 811 812 813 814 815
}

static int compare_delta_entry(const void *a, const void *b)
{
	const struct delta_entry *delta_a = a;
	const struct delta_entry *delta_b = b;
816 817 818 819 820

	/* group by type (ref vs ofs) and then by value (sha-1 or offset) */
	return compare_delta_bases(&delta_a->base, &delta_b->base,
				   objects[delta_a->obj_no].type,
				   objects[delta_b->obj_no].type);
S
Sergey Vlasov 已提交
821 822
}

823 824 825 826 827 828 829 830
static void resolve_base(struct object_entry *obj)
{
	struct base_data *base_obj = alloc_base_data();
	base_obj->obj = obj;
	base_obj->data = NULL;
	find_unresolved_deltas(base_obj);
}

831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854
#ifndef NO_PTHREADS
static void *threaded_second_pass(void *data)
{
	set_thread_data(data);
	for (;;) {
		int i;
		work_lock();
		display_progress(progress, nr_resolved_deltas);
		while (nr_dispatched < nr_objects &&
		       is_delta_type(objects[nr_dispatched].type))
			nr_dispatched++;
		if (nr_dispatched >= nr_objects) {
			work_unlock();
			break;
		}
		i = nr_dispatched++;
		work_unlock();

		resolve_base(&objects[i]);
	}
	return NULL;
}
#endif

855 856 857 858 859 860
/*
 * First pass:
 * - find locations of all objects;
 * - calculate SHA1 of all non-delta objects;
 * - remember base (SHA1 or offset) for all deltas.
 */
861
static void parse_pack_objects(unsigned char *sha1)
S
Sergey Vlasov 已提交
862
{
N
Nicolas Pitre 已提交
863
	int i;
864
	struct delta_entry *delta = deltas;
865
	struct stat st;
S
Sergey Vlasov 已提交
866

867
	if (verbose)
868
		progress = start_progress(
869
				from_stdin ? _("Receiving objects") : _("Indexing objects"),
870
				nr_objects);
S
Sergey Vlasov 已提交
871 872
	for (i = 0; i < nr_objects; i++) {
		struct object_entry *obj = &objects[i];
873
		void *data = unpack_raw_entry(obj, &delta->base, obj->idx.sha1);
S
Sergey Vlasov 已提交
874
		obj->real_type = obj->type;
875
		if (is_delta_type(obj->type)) {
876
			nr_deltas++;
877
			delta->obj_no = i;
878
			delta++;
S
Sergey Vlasov 已提交
879
		} else
G
Geert Bosch 已提交
880
			sha1_object(data, obj->size, obj->type, obj->idx.sha1);
S
Sergey Vlasov 已提交
881
		free(data);
N
Nicolas Pitre 已提交
882
		display_progress(progress, i+1);
S
Sergey Vlasov 已提交
883
	}
G
Geert Bosch 已提交
884
	objects[i].idx.offset = consumed_bytes;
N
Nicolas Pitre 已提交
885
	stop_progress(&progress);
886 887

	/* Check pack integrity */
888
	flush();
889
	git_SHA1_Final(sha1, &input_ctx);
890
	if (hashcmp(fill(20), sha1))
891
		die(_("pack is corrupted (SHA1 mismatch)"));
892
	use(20);
893 894 895

	/* If input_fd is a file, we should have reached its end now. */
	if (fstat(input_fd, &st))
896
		die_errno(_("cannot fstat packfile"));
J
Johannes Schindelin 已提交
897 898
	if (S_ISREG(st.st_mode) &&
			lseek(input_fd, 0, SEEK_CUR) - input_len != st.st_size)
899
		die(_("pack has junk at the end"));
900 901 902 903 904 905 906 907 908 909 910 911 912
}

/*
 * Second pass:
 * - for all non-delta objects, look if it is used as a base for
 *   deltas;
 * - if used as a base, uncompress the object and apply all deltas,
 *   recursively checking if the resulting object is used as a base
 *   for some more deltas.
 */
static void resolve_deltas(void)
{
	int i;
S
Sergey Vlasov 已提交
913

N
Nicolas Pitre 已提交
914 915 916
	if (!nr_deltas)
		return;

917
	/* Sort deltas by base SHA1/offset for fast searching */
S
Sergey Vlasov 已提交
918 919 920
	qsort(deltas, nr_deltas, sizeof(struct delta_entry),
	      compare_delta_entry);

921
	if (verbose)
922
		progress = start_progress(_("Resolving deltas"), nr_deltas);
923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940

#ifndef NO_PTHREADS
	nr_dispatched = 0;
	if (nr_threads > 1 || getenv("GIT_FORCE_THREADS")) {
		init_thread();
		for (i = 0; i < nr_threads; i++) {
			int ret = pthread_create(&thread_data[i].thread, NULL,
						 threaded_second_pass, thread_data + i);
			if (ret)
				die("unable to create thread: %s", strerror(ret));
		}
		for (i = 0; i < nr_threads; i++)
			pthread_join(thread_data[i].thread, NULL);
		cleanup_thread();
		return;
	}
#endif

S
Sergey Vlasov 已提交
941 942 943
	for (i = 0; i < nr_objects; i++) {
		struct object_entry *obj = &objects[i];

944
		if (is_delta_type(obj->type))
S
Sergey Vlasov 已提交
945
			continue;
946
		resolve_base(obj);
N
Nicolas Pitre 已提交
947
		display_progress(progress, nr_resolved_deltas);
S
Sergey Vlasov 已提交
948
	}
949 950
}

951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972
/*
 * Third pass:
 * - append objects to convert thin pack to full pack if required
 * - write the final 20-byte SHA-1
 */
static void fix_unresolved_deltas(struct sha1file *f, int nr_unresolved);
static void conclude_pack(int fix_thin_pack, const char *curr_pack, unsigned char *pack_sha1)
{
	if (nr_deltas == nr_resolved_deltas) {
		stop_progress(&progress);
		/* Flush remaining pack final 20-byte SHA1. */
		flush();
		return;
	}

	if (fix_thin_pack) {
		struct sha1file *f;
		unsigned char read_sha1[20], tail_sha1[20];
		char msg[48];
		int nr_unresolved = nr_deltas - nr_resolved_deltas;
		int nr_objects_initial = nr_objects;
		if (nr_unresolved <= 0)
973
			die(_("confusion beyond insanity"));
974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991
		objects = xrealloc(objects,
				   (nr_objects + nr_unresolved + 1)
				   * sizeof(*objects));
		f = sha1fd(output_fd, curr_pack);
		fix_unresolved_deltas(f, nr_unresolved);
		sprintf(msg, "completed with %d local objects",
			nr_objects - nr_objects_initial);
		stop_progress_msg(&progress, msg);
		sha1close(f, tail_sha1, 0);
		hashcpy(read_sha1, pack_sha1);
		fixup_pack_header_footer(output_fd, pack_sha1,
					 curr_pack, nr_objects,
					 read_sha1, consumed_bytes-20);
		if (hashcmp(read_sha1, tail_sha1) != 0)
			die("Unexpected tail checksum for %s "
			    "(disk corruption?)", curr_pack);
	}
	if (nr_deltas != nr_resolved_deltas)
992 993 994
		die(Q_("pack has %d unresolved delta",
		       "pack has %d unresolved deltas",
		       nr_deltas - nr_resolved_deltas),
995 996 997
		    nr_deltas - nr_resolved_deltas);
}

998
static int write_compressed(struct sha1file *f, void *in, unsigned int size)
999
{
1000
	git_zstream stream;
1001 1002
	int status;
	unsigned char outbuf[4096];
1003 1004

	memset(&stream, 0, sizeof(stream));
1005
	git_deflate_init(&stream, zlib_compression_level);
1006 1007 1008
	stream.next_in = in;
	stream.avail_in = size;

1009 1010 1011
	do {
		stream.next_out = outbuf;
		stream.avail_out = sizeof(outbuf);
1012
		status = git_deflate(&stream, Z_FINISH);
1013 1014 1015 1016
		sha1write(f, outbuf, sizeof(outbuf) - stream.avail_out);
	} while (status == Z_OK);

	if (status != Z_STREAM_END)
1017
		die(_("unable to deflate appended object (%d)"), status);
1018
	size = stream.total_out;
1019
	git_deflate_end(&stream);
1020 1021 1022
	return size;
}

1023
static struct object_entry *append_obj_to_pack(struct sha1file *f,
1024
			       const unsigned char *sha1, void *buf,
1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038
			       unsigned long size, enum object_type type)
{
	struct object_entry *obj = &objects[nr_objects++];
	unsigned char header[10];
	unsigned long s = size;
	int n = 0;
	unsigned char c = (type << 4) | (s & 15);
	s >>= 4;
	while (s) {
		header[n++] = c | 0x80;
		c = s & 0x7f;
		s >>= 7;
	}
	header[n++] = c;
1039 1040
	crc32_begin(f);
	sha1write(f, header, n);
1041 1042 1043 1044
	obj[0].size = size;
	obj[0].hdr_size = n;
	obj[0].type = type;
	obj[0].real_type = type;
G
Geert Bosch 已提交
1045
	obj[1].idx.offset = obj[0].idx.offset + n;
1046 1047
	obj[1].idx.offset += write_compressed(f, buf, size);
	obj[0].idx.crc32 = crc32_end(f);
1048
	sha1flush(f);
G
Geert Bosch 已提交
1049
	hashcpy(obj->idx.sha1, sha1);
1050
	return obj;
1051 1052 1053 1054 1055 1056 1057 1058
}

static int delta_pos_compare(const void *_a, const void *_b)
{
	struct delta_entry *a = *(struct delta_entry **)_a;
	struct delta_entry *b = *(struct delta_entry **)_b;
	return a->obj_no - b->obj_no;
}
S
Sergey Vlasov 已提交
1059

1060
static void fix_unresolved_deltas(struct sha1file *f, int nr_unresolved)
1061 1062
{
	struct delta_entry **sorted_by_pos;
N
Nicolas Pitre 已提交
1063
	int i, n = 0;
1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075

	/*
	 * Since many unresolved deltas may well be themselves base objects
	 * for more unresolved deltas, we really want to include the
	 * smallest number of base objects that would cover as much delta
	 * as possible by picking the
	 * trunc deltas first, allowing for other deltas to resolve without
	 * additional base objects.  Since most base objects are to be found
	 * before deltas depending on them, a good heuristic is to start
	 * resolving deltas in the same order as their position in the pack.
	 */
	sorted_by_pos = xmalloc(nr_unresolved * sizeof(*sorted_by_pos));
S
Sergey Vlasov 已提交
1076
	for (i = 0; i < nr_deltas; i++) {
1077 1078 1079
		if (objects[deltas[i].obj_no].real_type != OBJ_REF_DELTA)
			continue;
		sorted_by_pos[n++] = &deltas[i];
S
Sergey Vlasov 已提交
1080
	}
1081 1082 1083 1084
	qsort(sorted_by_pos, n, sizeof(*sorted_by_pos), delta_pos_compare);

	for (i = 0; i < n; i++) {
		struct delta_entry *d = sorted_by_pos[i];
1085
		enum object_type type;
1086
		struct base_data *base_obj = alloc_base_data();
1087 1088 1089

		if (objects[d->obj_no].real_type != OBJ_REF_DELTA)
			continue;
1090 1091
		base_obj->data = read_sha1_file(d->base.sha1, &type, &base_obj->size);
		if (!base_obj->data)
1092 1093
			continue;

1094 1095
		if (check_sha1_signature(d->base.sha1, base_obj->data,
				base_obj->size, typename(type)))
1096
			die(_("local object %s is corrupt"), sha1_to_hex(d->base.sha1));
1097 1098 1099
		base_obj->obj = append_obj_to_pack(f, d->base.sha1,
					base_obj->data, base_obj->size, type);
		find_unresolved_deltas(base_obj);
N
Nicolas Pitre 已提交
1100
		display_progress(progress, nr_resolved_deltas);
1101 1102 1103 1104
	}
	free(sorted_by_pos);
}

1105 1106
static void final(const char *final_pack_name, const char *curr_pack_name,
		  const char *final_index_name, const char *curr_index_name,
1107
		  const char *keep_name, const char *keep_msg,
1108 1109
		  unsigned char *sha1)
{
1110
	const char *report = "pack";
1111 1112 1113 1114 1115 1116
	char name[PATH_MAX];
	int err;

	if (!from_stdin) {
		close(input_fd);
	} else {
1117
		fsync_or_die(output_fd, curr_pack_name);
1118 1119
		err = close(output_fd);
		if (err)
1120
			die_errno(_("error while closing pack file"));
1121 1122
	}

1123 1124
	if (keep_msg) {
		int keep_fd, keep_msg_len = strlen(keep_msg);
1125 1126 1127 1128 1129 1130

		if (!keep_name)
			keep_fd = odb_pack_keep(name, sizeof(name), sha1);
		else
			keep_fd = open(keep_name, O_RDWR|O_CREAT|O_EXCL, 0600);

1131 1132
		if (keep_fd < 0) {
			if (errno != EEXIST)
1133
				die_errno(_("cannot write keep file '%s'"),
1134
					  keep_name);
1135 1136 1137 1138 1139
		} else {
			if (keep_msg_len > 0) {
				write_or_die(keep_fd, keep_msg, keep_msg_len);
				write_or_die(keep_fd, "\n", 1);
			}
1140
			if (close(keep_fd) != 0)
1141
				die_errno(_("cannot close written keep file '%s'"),
1142
				    keep_name);
1143
			report = "keep";
1144 1145 1146
		}
	}

1147 1148 1149 1150 1151 1152 1153
	if (final_pack_name != curr_pack_name) {
		if (!final_pack_name) {
			snprintf(name, sizeof(name), "%s/pack/pack-%s.pack",
				 get_object_directory(), sha1_to_hex(sha1));
			final_pack_name = name;
		}
		if (move_temp_to_file(curr_pack_name, final_pack_name))
1154
			die(_("cannot store pack file"));
1155
	} else if (from_stdin)
1156
		chmod(final_pack_name, 0444);
1157 1158 1159 1160 1161 1162 1163 1164

	if (final_index_name != curr_index_name) {
		if (!final_index_name) {
			snprintf(name, sizeof(name), "%s/pack/pack-%s.idx",
				 get_object_directory(), sha1_to_hex(sha1));
			final_index_name = name;
		}
		if (move_temp_to_file(curr_index_name, final_index_name))
1165
			die(_("cannot store index file"));
1166 1167
	} else
		chmod(final_index_name, 0444);
1168 1169 1170 1171 1172 1173 1174

	if (!from_stdin) {
		printf("%s\n", sha1_to_hex(sha1));
	} else {
		char buf[48];
		int len = snprintf(buf, sizeof(buf), "%s\t%s\n",
				   report, sha1_to_hex(sha1));
1175
		write_or_die(1, buf, len);
1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188

		/*
		 * Let's just mimic git-unpack-objects here and write
		 * the last part of the input buffer to stdout.
		 */
		while (input_len) {
			err = xwrite(1, input_buffer + input_offset, input_len);
			if (err <= 0)
				break;
			input_len -= err;
			input_offset += err;
		}
	}
S
Sergey Vlasov 已提交
1189 1190
}

1191
static int git_index_pack_config(const char *k, const char *v, void *cb)
1192
{
1193 1194
	struct pack_idx_option *opts = cb;

1195
	if (!strcmp(k, "pack.indexversion")) {
1196 1197 1198
		opts->version = git_config_int(k, v);
		if (opts->version > 2)
			die("bad pack.indexversion=%"PRIu32, opts->version);
1199 1200
		return 0;
	}
1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212
	if (!strcmp(k, "pack.threads")) {
		nr_threads = git_config_int(k, v);
		if (nr_threads < 0)
			die("invalid number of threads specified (%d)",
			    nr_threads);
#ifdef NO_PTHREADS
		if (nr_threads != 1)
			warning("no threads support, ignoring %s", k);
		nr_threads = 1;
#endif
		return 0;
	}
1213
	return git_default_config(k, v, cb);
1214 1215
}

1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260
static int cmp_uint32(const void *a_, const void *b_)
{
	uint32_t a = *((uint32_t *)a_);
	uint32_t b = *((uint32_t *)b_);

	return (a < b) ? -1 : (a != b);
}

static void read_v2_anomalous_offsets(struct packed_git *p,
				      struct pack_idx_option *opts)
{
	const uint32_t *idx1, *idx2;
	uint32_t i;

	/* The address of the 4-byte offset table */
	idx1 = (((const uint32_t *)p->index_data)
		+ 2 /* 8-byte header */
		+ 256 /* fan out */
		+ 5 * p->num_objects /* 20-byte SHA-1 table */
		+ p->num_objects /* CRC32 table */
		);

	/* The address of the 8-byte offset table */
	idx2 = idx1 + p->num_objects;

	for (i = 0; i < p->num_objects; i++) {
		uint32_t off = ntohl(idx1[i]);
		if (!(off & 0x80000000))
			continue;
		off = off & 0x7fffffff;
		if (idx2[off * 2])
			continue;
		/*
		 * The real offset is ntohl(idx2[off * 2]) in high 4
		 * octets, and ntohl(idx2[off * 2 + 1]) in low 4
		 * octets.  But idx2[off * 2] is Zero!!!
		 */
		ALLOC_GROW(opts->anomaly, opts->anomaly_nr + 1, opts->anomaly_alloc);
		opts->anomaly[opts->anomaly_nr++] = ntohl(idx2[off * 2 + 1]);
	}

	if (1 < opts->anomaly_nr)
		qsort(opts->anomaly, opts->anomaly_nr, sizeof(uint32_t), cmp_uint32);
}

J
Junio C Hamano 已提交
1261 1262 1263 1264 1265
static void read_idx_option(struct pack_idx_option *opts, const char *pack_name)
{
	struct packed_git *p = add_packed_git(pack_name, strlen(pack_name), 1);

	if (!p)
1266
		die(_("Cannot open existing pack file '%s'"), pack_name);
J
Junio C Hamano 已提交
1267
	if (open_pack_index(p))
1268
		die(_("Cannot open existing pack idx file for '%s'"), pack_name);
J
Junio C Hamano 已提交
1269 1270 1271 1272

	/* Read the attributes from the existing idx file */
	opts->version = p->index_version;

1273 1274 1275
	if (opts->version == 2)
		read_v2_anomalous_offsets(p, opts);

J
Junio C Hamano 已提交
1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286
	/*
	 * Get rid of the idx file as we do not need it anymore.
	 * NEEDSWORK: extract this bit from free_pack_by_name() in
	 * sha1_file.c, perhaps?  It shouldn't matter very much as we
	 * know we haven't installed this pack (hence we never have
	 * read anything from it).
	 */
	close_pack_index(p);
	free(p);
}

1287 1288
static void show_pack_info(int stat_only)
{
1289 1290 1291 1292 1293 1294
	int i, baseobjects = nr_objects - nr_deltas;
	unsigned long *chain_histogram = NULL;

	if (deepest_delta)
		chain_histogram = xcalloc(deepest_delta, sizeof(unsigned long));

1295 1296 1297
	for (i = 0; i < nr_objects; i++) {
		struct object_entry *obj = &objects[i];

1298 1299
		if (is_delta_type(obj->type))
			chain_histogram[obj->delta_depth - 1]++;
1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312
		if (stat_only)
			continue;
		printf("%s %-6s %lu %lu %"PRIuMAX,
		       sha1_to_hex(obj->idx.sha1),
		       typename(obj->real_type), obj->size,
		       (unsigned long)(obj[1].idx.offset - obj->idx.offset),
		       (uintmax_t)obj->idx.offset);
		if (is_delta_type(obj->type)) {
			struct object_entry *bobj = &objects[obj->base_object_no];
			printf(" %u %s", obj->delta_depth, sha1_to_hex(bobj->idx.sha1));
		}
		putchar('\n');
	}
1313 1314

	if (baseobjects)
1315 1316 1317 1318
		printf_ln(Q_("non delta: %d object",
			     "non delta: %d objects",
			     baseobjects),
			  baseobjects);
1319 1320 1321
	for (i = 0; i < deepest_delta; i++) {
		if (!chain_histogram[i])
			continue;
1322 1323 1324 1325 1326
		printf_ln(Q_("chain length = %d: %lu object",
			     "chain length = %d: %lu objects",
			     chain_histogram[i]),
			  i + 1,
			  chain_histogram[i]);
1327
	}
1328 1329
}

L
Linus Torvalds 已提交
1330
int cmd_index_pack(int argc, const char **argv, const char *prefix)
S
Sergey Vlasov 已提交
1331
{
1332
	int i, fix_thin_pack = 0, verify = 0, stat_only = 0, stat = 0;
L
Linus Torvalds 已提交
1333 1334
	const char *curr_pack, *curr_index;
	const char *index_name = NULL, *pack_name = NULL;
1335 1336
	const char *keep_name = NULL, *keep_msg = NULL;
	char *index_name_buf = NULL, *keep_name_buf = NULL;
G
Geert Bosch 已提交
1337
	struct pack_idx_entry **idx_objects;
1338
	struct pack_idx_option opts;
1339
	unsigned char pack_sha1[20];
S
Sergey Vlasov 已提交
1340

1341 1342 1343
	if (argc == 2 && !strcmp(argv[1], "-h"))
		usage(index_pack_usage);

1344 1345
	read_replace_refs = 0;

1346 1347
	reset_pack_idx_option(&opts);
	git_config(git_index_pack_config, &opts);
1348
	if (prefix && chdir(prefix))
1349
		die(_("Cannot come back to cwd"));
1350

S
Sergey Vlasov 已提交
1351
	for (i = 1; i < argc; i++) {
L
Linus Torvalds 已提交
1352
		const char *arg = argv[i];
S
Sergey Vlasov 已提交
1353 1354

		if (*arg == '-') {
1355 1356
			if (!strcmp(arg, "--stdin")) {
				from_stdin = 1;
1357 1358
			} else if (!strcmp(arg, "--fix-thin")) {
				fix_thin_pack = 1;
1359 1360
			} else if (!strcmp(arg, "--strict")) {
				strict = 1;
J
Junio C Hamano 已提交
1361 1362
			} else if (!strcmp(arg, "--verify")) {
				verify = 1;
1363 1364 1365 1366 1367 1368 1369
			} else if (!strcmp(arg, "--verify-stat")) {
				verify = 1;
				stat = 1;
			} else if (!strcmp(arg, "--verify-stat-only")) {
				verify = 1;
				stat = 1;
				stat_only = 1;
1370 1371
			} else if (!strcmp(arg, "--keep")) {
				keep_msg = "";
1372
			} else if (!prefixcmp(arg, "--keep=")) {
1373
				keep_msg = arg + 7;
1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384
			} else if (!prefixcmp(arg, "--threads=")) {
				char *end;
				nr_threads = strtoul(arg+10, &end, 0);
				if (!arg[10] || *end || nr_threads < 0)
					usage(index_pack_usage);
#ifdef NO_PTHREADS
				if (nr_threads != 1)
					warning("no threads support, "
						"ignoring %s", arg);
				nr_threads = 1;
#endif
1385
			} else if (!prefixcmp(arg, "--pack_header=")) {
1386 1387 1388 1389 1390 1391 1392
				struct pack_header *hdr;
				char *c;

				hdr = (struct pack_header *)input_buffer;
				hdr->hdr_signature = htonl(PACK_SIGNATURE);
				hdr->hdr_version = htonl(strtoul(arg + 14, &c, 10));
				if (*c != ',')
1393
					die(_("bad %s"), arg);
1394 1395
				hdr->hdr_entries = htonl(strtoul(c + 1, &c, 10));
				if (*c)
1396
					die(_("bad %s"), arg);
1397
				input_len = sizeof(*hdr);
N
Nicolas Pitre 已提交
1398 1399
			} else if (!strcmp(arg, "-v")) {
				verbose = 1;
1400
			} else if (!strcmp(arg, "-o")) {
S
Sergey Vlasov 已提交
1401 1402 1403
				if (index_name || (i+1) >= argc)
					usage(index_pack_usage);
				index_name = argv[++i];
1404 1405
			} else if (!prefixcmp(arg, "--index-version=")) {
				char *c;
1406 1407
				opts.version = strtoul(arg + 16, &c, 10);
				if (opts.version > 2)
1408
					die(_("bad %s"), arg);
1409
				if (*c == ',')
1410 1411
					opts.off32_limit = strtoul(c+1, &c, 0);
				if (*c || opts.off32_limit & 0x80000000)
1412
					die(_("bad %s"), arg);
S
Sergey Vlasov 已提交
1413 1414 1415 1416 1417 1418 1419 1420 1421 1422
			} else
				usage(index_pack_usage);
			continue;
		}

		if (pack_name)
			usage(index_pack_usage);
		pack_name = arg;
	}

1423
	if (!pack_name && !from_stdin)
S
Sergey Vlasov 已提交
1424
		usage(index_pack_usage);
1425
	if (fix_thin_pack && !from_stdin)
1426
		die(_("--fix-thin cannot be used without --stdin"));
1427
	if (!index_name && pack_name) {
S
Sergey Vlasov 已提交
1428
		int len = strlen(pack_name);
1429
		if (!has_extension(pack_name, ".pack"))
1430
			die(_("packfile name '%s' does not end with '.pack'"),
S
Sergey Vlasov 已提交
1431
			    pack_name);
P
Pavel Roskin 已提交
1432
		index_name_buf = xmalloc(len);
S
Sergey Vlasov 已提交
1433 1434 1435 1436
		memcpy(index_name_buf, pack_name, len - 5);
		strcpy(index_name_buf + len - 5, ".idx");
		index_name = index_name_buf;
	}
1437 1438 1439
	if (keep_msg && !keep_name && pack_name) {
		int len = strlen(pack_name);
		if (!has_extension(pack_name, ".pack"))
1440
			die(_("packfile name '%s' does not end with '.pack'"),
1441 1442 1443 1444 1445 1446
			    pack_name);
		keep_name_buf = xmalloc(len);
		memcpy(keep_name_buf, pack_name, len - 5);
		strcpy(keep_name_buf + len - 5, ".keep");
		keep_name = keep_name_buf;
	}
J
Junio C Hamano 已提交
1447 1448
	if (verify) {
		if (!index_name)
1449
			die(_("--verify with no packfile name given"));
J
Junio C Hamano 已提交
1450
		read_idx_option(&opts, index_name);
1451
		opts.flags |= WRITE_IDX_VERIFY | WRITE_IDX_STRICT;
J
Junio C Hamano 已提交
1452
	}
1453 1454
	if (strict)
		opts.flags |= WRITE_IDX_STRICT;
S
Sergey Vlasov 已提交
1455

1456 1457 1458 1459 1460 1461 1462 1463 1464
#ifndef NO_PTHREADS
	if (!nr_threads) {
		nr_threads = online_cpus();
		/* An experiment showed that more threads does not mean faster */
		if (nr_threads > 3)
			nr_threads = 3;
	}
#endif

1465
	curr_pack = open_pack_file(pack_name);
S
Sergey Vlasov 已提交
1466
	parse_pack_header();
1467 1468
	objects = xcalloc(nr_objects + 1, sizeof(struct object_entry));
	deltas = xcalloc(nr_objects, sizeof(struct delta_entry));
1469
	parse_pack_objects(pack_sha1);
1470 1471
	resolve_deltas();
	conclude_pack(fix_thin_pack, curr_pack, pack_sha1);
S
Sergey Vlasov 已提交
1472
	free(deltas);
1473 1474
	if (strict)
		check_objects();
G
Geert Bosch 已提交
1475

1476 1477 1478
	if (stat)
		show_pack_info(stat_only);

G
Geert Bosch 已提交
1479 1480 1481
	idx_objects = xmalloc((nr_objects) * sizeof(struct pack_idx_entry *));
	for (i = 0; i < nr_objects; i++)
		idx_objects[i] = &objects[i].idx;
1482
	curr_index = write_idx_file(index_name, idx_objects, nr_objects, &opts, pack_sha1);
G
Geert Bosch 已提交
1483 1484
	free(idx_objects);

J
Junio C Hamano 已提交
1485 1486 1487 1488 1489 1490 1491
	if (!verify)
		final(pack_name, curr_pack,
		      index_name, curr_index,
		      keep_name, keep_msg,
		      pack_sha1);
	else
		close(input_fd);
S
Sergey Vlasov 已提交
1492 1493
	free(objects);
	free(index_name_buf);
1494
	free(keep_name_buf);
N
Nicolas Pitre 已提交
1495
	if (pack_name == NULL)
L
Linus Torvalds 已提交
1496
		free((void *) curr_pack);
N
Nicolas Pitre 已提交
1497
	if (index_name == NULL)
L
Linus Torvalds 已提交
1498
		free((void *) curr_index);
S
Sergey Vlasov 已提交
1499 1500 1501

	return 0;
}