summaryrefslogtreecommitdiff
path: root/include/git2/indexer.h
blob: a434d243f267102a771424d1769ecea75e73aec8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
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
/*
 * Copyright (C) the libgit2 contributors. All rights reserved.
 *
 * 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_git_indexer_h__
#define _INCLUDE_git_indexer_h__

#include "common.h"
#include "types.h"
#include "oid.h"

GIT_BEGIN_DECL

/** A git indexer object */
typedef struct git_indexer git_indexer;

/**
 * This structure is used to provide callers information about the
 * progress of indexing a packfile, either directly or part of a
 * fetch or clone that downloads a packfile.
 */
typedef struct git_indexer_progress {
	/** number of objects in the packfile being indexed */
	unsigned int total_objects;

	/** received objects that have been hashed */
	unsigned int indexed_objects;

	/** received_objects: objects which have been downloaded */
	unsigned int received_objects;

	/**
	 * locally-available objects that have been injected in order
	 * to fix a thin pack
	 */
	unsigned int local_objects;

	/** number of deltas in the packfile being indexed */
	unsigned int total_deltas;

	/** received deltas that have been indexed */
	unsigned int indexed_deltas;

	/** size of the packfile received up to now */
	size_t received_bytes;
} git_indexer_progress;

/**
 * Type for progress callbacks during indexing.  Return a value less
 * than zero to cancel the indexing or download.
 *
 * @param stats Structure containing information about the state of the transfer
 * @param payload Payload provided by caller
 */
typedef int GIT_CALLBACK(git_indexer_progress_cb)(const git_indexer_progress *stats, void *payload);

/**
 * Options for indexer configuration
 */
typedef struct git_indexer_options {
	unsigned int version;

	/** progress_cb function to call with progress information */
	git_indexer_progress_cb progress_cb;

	/** progress_cb_payload payload for the progress callback */
	void *progress_cb_payload;

	/** Do connectivity checks for the received pack */
	unsigned char verify;
} git_indexer_options;

#define GIT_INDEXER_OPTIONS_VERSION 1
#define GIT_INDEXER_OPTIONS_INIT { GIT_INDEXER_OPTIONS_VERSION }

/**
 * Initializes a `git_indexer_options` with default values. Equivalent to
 * creating an instance with GIT_INDEXER_OPTIONS_INIT.
 *
 * @param opts the `git_indexer_options` struct to initialize.
 * @param version Version of struct; pass `GIT_INDEXER_OPTIONS_VERSION`
 * @return Zero on success; -1 on failure.
 */
GIT_EXTERN(int) git_indexer_options_init(
	git_indexer_options *opts,
	unsigned int version);

/**
 * Create a new indexer instance
 *
 * @param out where to store the indexer instance
 * @param path to the directory where the packfile should be stored
 * @param mode permissions to use creating packfile or 0 for defaults
 * @param odb object database from which to read base objects when
 * fixing thin packs. Pass NULL if no thin pack is expected (an error
 * will be returned if there are bases missing)
 * @param opts Optional structure containing additional options. See
 * `git_indexer_options` above.
 */
GIT_EXTERN(int) git_indexer_new(
		git_indexer **out,
		const char *path,
		unsigned int mode,
		git_odb *odb,
		git_indexer_options *opts);

/**
 * Add data to the indexer
 *
 * @param idx the indexer
 * @param data the data to add
 * @param size the size of the data in bytes
 * @param stats stat storage
 */
GIT_EXTERN(int) git_indexer_append(git_indexer *idx, const void *data, size_t size, git_indexer_progress *stats);

/**
 * Finalize the pack and index
 *
 * Resolve any pending deltas and write out the index file
 *
 * @param idx the indexer
 */
GIT_EXTERN(int) git_indexer_commit(git_indexer *idx, git_indexer_progress *stats);

/**
 * Get the packfile's hash
 *
 * A packfile's name is derived from the sorted hashing of all object
 * names. This is only correct after the index has been finalized.
 *
 * @param idx the indexer instance
 */
GIT_EXTERN(const git_oid *) git_indexer_hash(const git_indexer *idx);

/**
 * Free the indexer and its resources
 *
 * @param idx the indexer to free
 */
GIT_EXTERN(void) git_indexer_free(git_indexer *idx);

GIT_END_DECL

#endif