pack-objects.h 2.14 KB
Newer Older
Michael Schubert committed
1
/*
Edward Thomson committed
2
 * Copyright (C) the libgit2 contributors. All rights reserved.
Michael Schubert committed
3 4 5 6 7 8 9 10 11 12 13 14
 *
 * This file is part of libgit2, distributed under the GNU GPL v2 with
 * a Linking Exception. For full terms see the included COPYING file.
 */

#ifndef INCLUDE_pack_objects_h__
#define INCLUDE_pack_objects_h__

#include "common.h"

#include "buffer.h"
#include "hash.h"
15
#include "oidmap.h"
16
#include "netops.h"
17
#include "zstream.h"
Michael Schubert committed
18 19

#include "git2/oid.h"
20
#include "git2/pack.h"
Michael Schubert committed
21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56

#define GIT_PACK_WINDOW 10 /* number of objects to possibly delta against */
#define GIT_PACK_DEPTH 50 /* max delta depth */
#define GIT_PACK_DELTA_CACHE_SIZE (256 * 1024 * 1024)
#define GIT_PACK_DELTA_CACHE_LIMIT 1000
#define GIT_PACK_BIG_FILE_THRESHOLD (512 * 1024 * 1024)

typedef struct git_pobject {
	git_oid id;
	git_otype type;
	git_off_t offset;

	size_t size;

	unsigned int hash; /* name hint hash */

	struct git_pobject *delta; /* delta base object */
	struct git_pobject *delta_child; /* deltified objects who bases me */
	struct git_pobject *delta_sibling; /* other deltified objects
					    * who uses the same base as
					    * me */

	void *delta_data;
	unsigned long delta_size;
	unsigned long z_delta_size;

	int written:1,
	    recursing:1,
	    tagged:1,
	    filled:1;
} git_pobject;

struct git_packbuilder {
	git_repository *repo; /* associated repository */
	git_odb *odb; /* associated object database */

57
	git_hash_ctx ctx;
58
	git_zstream zstream;
Michael Schubert committed
59 60 61 62 63 64 65 66

	uint32_t nr_objects,
		 nr_alloc,
		 nr_written,
		 nr_remaining;

	git_pobject *object_list;

67
	git_oidmap *object_ix;
Michael Schubert committed
68 69 70

	git_oid pack_oid; /* hash of written pack */

71 72 73 74 75
	/* synchronization objects */
	git_mutex cache_mutex;
	git_mutex progress_mutex;
	git_cond progress_cond;

Michael Schubert committed
76
	/* configs */
77 78 79 80 81
	uint64_t delta_cache_size;
	uint64_t max_delta_cache_size;
	uint64_t cache_max_small_delta_size;
	uint64_t big_file_threshold;
	uint64_t window_memory_limit;
Michael Schubert committed
82 83 84

	int nr_threads; /* nr of threads to use */

85 86 87 88
	git_packbuilder_progress progress_cb;
	void *progress_cb_payload;
	double last_progress_report_time; /* the time progress was last reported */

Michael Schubert committed
89 90 91 92 93
	bool done;
};

int git_packbuilder_write_buf(git_buf *buf, git_packbuilder *pb);

94
#endif /* INCLUDE_pack_objects_h__ */