pack-objects.h 2.29 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"
18
#include "pool.h"
Michael Schubert committed
19 20

#include "git2/oid.h"
21
#include "git2/pack.h"
Michael Schubert committed
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

#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;

54 55 56 57 58 59
typedef struct {
	git_oid id;
	unsigned int uninteresting:1,
		seen:1;
} git_walk_object;

Michael Schubert committed
60 61 62 63
struct git_packbuilder {
	git_repository *repo; /* associated repository */
	git_odb *odb; /* associated object database */

64
	git_hash_ctx ctx;
65
	git_zstream zstream;
Michael Schubert committed
66 67 68 69 70 71 72 73

	uint32_t nr_objects,
		 nr_alloc,
		 nr_written,
		 nr_remaining;

	git_pobject *object_list;

74
	git_oidmap *object_ix;
Michael Schubert committed
75

76 77 78
	git_oidmap *walk_objects;
	git_pool object_pool;

Michael Schubert committed
79 80
	git_oid pack_oid; /* hash of written pack */

81 82 83 84 85
	/* synchronization objects */
	git_mutex cache_mutex;
	git_mutex progress_mutex;
	git_cond progress_cond;

Michael Schubert committed
86
	/* configs */
87 88 89 90 91
	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
92 93 94

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

95 96 97 98
	git_packbuilder_progress progress_cb;
	void *progress_cb_payload;
	double last_progress_report_time; /* the time progress was last reported */

Michael Schubert committed
99 100 101 102 103
	bool done;
};

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

104
#endif /* INCLUDE_pack_objects_h__ */