2 * Copyright (C) the libgit2 contributors. All rights reserved.
4 * This file is part of libgit2, distributed under the GNU GPL v2 with
5 * a Linking Exception. For full terms see the included COPYING file.
7 #ifndef INCLUDE_git_types_h__
8 #define INCLUDE_git_types_h__
14 * @brief libgit2 base & compatibility types
21 * Cross-platform compatibility types for off_t / time_t
23 * NOTE: This needs to be in a public header so that both the library
24 * implementation and client applications both agree on the same types.
25 * Otherwise we get undefined behavior.
27 * Use the "best" types that each platform provides. Currently we truncate
28 * these intermediate representations for compatibility with the git ABI, but
29 * if and when it changes to support 64 bit types, our code will naturally
31 * NOTE: These types should match those that are returned by our internal
32 * stat() functions, for all platforms.
34 #include <sys/types.h>
41 typedef __int64 git_off_t
;
42 typedef __time64_t git_time_t
;
44 #elif defined(__MINGW32__)
46 typedef off64_t git_off_t
;
47 typedef __time64_t git_time_t
;
49 #elif defined(__HAIKU__)
51 typedef __haiku_std_int64 git_off_t
;
52 typedef __haiku_std_int64 git_time_t
;
57 * Note: Can't use off_t since if a client program includes <sys/types.h>
58 * before us (directly or indirectly), they'll get 32 bit off_t in their client
59 * app, even though /we/ define _FILE_OFFSET_BITS=64.
61 typedef int64_t git_off_t
;
62 typedef int64_t git_time_t
;
66 /** Basic type (loose or packed) of any Git object. */
68 GIT_OBJ_ANY
= -2, /**< Object can be any of the following */
69 GIT_OBJ_BAD
= -1, /**< Object is invalid. */
70 GIT_OBJ__EXT1
= 0, /**< Reserved for future use. */
71 GIT_OBJ_COMMIT
= 1, /**< A commit object. */
72 GIT_OBJ_TREE
= 2, /**< A tree (directory listing) object. */
73 GIT_OBJ_BLOB
= 3, /**< A file revision object. */
74 GIT_OBJ_TAG
= 4, /**< An annotated tag object. */
75 GIT_OBJ__EXT2
= 5, /**< Reserved for future use. */
76 GIT_OBJ_OFS_DELTA
= 6, /**< A delta, base is given by an offset. */
77 GIT_OBJ_REF_DELTA
= 7, /**< A delta, base is given by object id. */
80 /** An open object database handle. */
81 typedef struct git_odb git_odb
;
83 /** A custom backend in an ODB */
84 typedef struct git_odb_backend git_odb_backend
;
86 /** An object read from the ODB */
87 typedef struct git_odb_object git_odb_object
;
89 /** A stream to read/write from the ODB */
90 typedef struct git_odb_stream git_odb_stream
;
92 /** A stream to write a packfile to the ODB */
93 typedef struct git_odb_writepack git_odb_writepack
;
95 /** An open refs database handle. */
96 typedef struct git_refdb git_refdb
;
98 /** A custom backend for refs */
99 typedef struct git_refdb_backend git_refdb_backend
;
102 * Representation of an existing git repository,
103 * including all its object contents
105 typedef struct git_repository git_repository
;
107 /** Representation of a working tree */
108 typedef struct git_worktree git_worktree
;
110 /** Representation of a generic object in a repository */
111 typedef struct git_object git_object
;
113 /** Representation of an in-progress walk through the commits in a repo */
114 typedef struct git_revwalk git_revwalk
;
116 /** Parsed representation of a tag object. */
117 typedef struct git_tag git_tag
;
119 /** In-memory representation of a blob object. */
120 typedef struct git_blob git_blob
;
122 /** Parsed representation of a commit object. */
123 typedef struct git_commit git_commit
;
125 /** Representation of each one of the entries in a tree object. */
126 typedef struct git_tree_entry git_tree_entry
;
128 /** Representation of a tree object. */
129 typedef struct git_tree git_tree
;
131 /** Constructor for in-memory trees */
132 typedef struct git_treebuilder git_treebuilder
;
134 /** Memory representation of an index file. */
135 typedef struct git_index git_index
;
137 /** An iterator for conflicts in the index. */
138 typedef struct git_index_conflict_iterator git_index_conflict_iterator
;
140 /** Memory representation of a set of config files */
141 typedef struct git_config git_config
;
143 /** Interface to access a configuration file */
144 typedef struct git_config_backend git_config_backend
;
146 /** Representation of a reference log entry */
147 typedef struct git_reflog_entry git_reflog_entry
;
149 /** Representation of a reference log */
150 typedef struct git_reflog git_reflog
;
152 /** Representation of a git note */
153 typedef struct git_note git_note
;
155 /** Representation of a git packbuilder */
156 typedef struct git_packbuilder git_packbuilder
;
158 /** Time in a signature */
159 typedef struct git_time
{
160 git_time_t time
; /**< time in seconds from epoch */
161 int offset
; /**< timezone offset, in minutes */
162 char sign
; /**< indicator for questionable '-0000' offsets in signature */
165 /** An action signature (e.g. for committers, taggers, etc) */
166 typedef struct git_signature
{
167 char *name
; /**< full name of the author */
168 char *email
; /**< email of the author */
169 git_time when
; /**< time when the action happened */
172 /** In-memory representation of a reference. */
173 typedef struct git_reference git_reference
;
175 /** Iterator for references */
176 typedef struct git_reference_iterator git_reference_iterator
;
178 /** Transactional interface to references */
179 typedef struct git_transaction git_transaction
;
181 /** Annotated commits, the input to merge and rebase. */
182 typedef struct git_annotated_commit git_annotated_commit
;
185 typedef struct git_merge_result git_merge_result
;
187 /** Representation of a status collection */
188 typedef struct git_status_list git_status_list
;
190 /** Representation of a rebase */
191 typedef struct git_rebase git_rebase
;
193 /** Basic type of any Git reference. */
195 GIT_REF_INVALID
= 0, /**< Invalid reference */
196 GIT_REF_OID
= 1, /**< A reference which points at an object id */
197 GIT_REF_SYMBOLIC
= 2, /**< A reference which points at another reference */
198 GIT_REF_LISTALL
= GIT_REF_OID
|GIT_REF_SYMBOLIC
,
201 /** Basic type of any Git branch. */
203 GIT_BRANCH_LOCAL
= 1,
204 GIT_BRANCH_REMOTE
= 2,
205 GIT_BRANCH_ALL
= GIT_BRANCH_LOCAL
|GIT_BRANCH_REMOTE
,
208 /** Valid modes for index and tree entries. */
210 GIT_FILEMODE_UNREADABLE
= 0000000,
211 GIT_FILEMODE_TREE
= 0040000,
212 GIT_FILEMODE_BLOB
= 0100644,
213 GIT_FILEMODE_BLOB_EXECUTABLE
= 0100755,
214 GIT_FILEMODE_LINK
= 0120000,
215 GIT_FILEMODE_COMMIT
= 0160000,
219 * A refspec specifies the mapping between remote and local reference
220 * names when fetch or pushing.
222 typedef struct git_refspec git_refspec
;
225 * Git's idea of a remote repository. A remote can be anonymous (in
226 * which case it does not have backing configuration entires).
228 typedef struct git_remote git_remote
;
231 * Interface which represents a transport to communicate with a
234 typedef struct git_transport git_transport
;
237 * Preparation for a push operation. Can be used to configure what to
238 * push and the level of parallelism of the packfile builder.
240 typedef struct git_push git_push
;
242 /* documentation in the definition */
243 typedef struct git_remote_head git_remote_head
;
244 typedef struct git_remote_callbacks git_remote_callbacks
;
247 * This is passed as the first argument to the callback to allow the
248 * user to see the progress.
250 * - total_objects: number of objects in the packfile being downloaded
251 * - indexed_objects: received objects that have been hashed
252 * - received_objects: objects which have been downloaded
253 * - local_objects: locally-available objects that have been injected
254 * in order to fix a thin pack.
255 * - received-bytes: size of the packfile received up to now
257 typedef struct git_transfer_progress
{
258 unsigned int total_objects
;
259 unsigned int indexed_objects
;
260 unsigned int received_objects
;
261 unsigned int local_objects
;
262 unsigned int total_deltas
;
263 unsigned int indexed_deltas
;
264 size_t received_bytes
;
265 } git_transfer_progress
;
268 * Type for progress callbacks during indexing. Return a value less than zero
269 * to cancel the transfer.
271 * @param stats Structure containing information about the state of the transfer
272 * @param payload Payload provided by caller
274 typedef int (*git_transfer_progress_cb
)(const git_transfer_progress
*stats
, void *payload
);
277 * Type for messages delivered by the transport. Return a negative value
278 * to cancel the network operation.
280 * @param str The message from the transport
281 * @param len The length of the message
282 * @param payload Payload provided by the caller
284 typedef int (*git_transport_message_cb
)(const char *str
, int len
, void *payload
);
288 * Type of host certificate structure that is passed to the check callback
290 typedef enum git_cert_t
{
292 * No information about the certificate is available. This may
293 * happen when using curl.
297 * The `data` argument to the callback will be a pointer to
298 * the DER-encoded data.
302 * The `data` argument to the callback will be a pointer to a
303 * `git_cert_hostkey` structure.
305 GIT_CERT_HOSTKEY_LIBSSH2
,
307 * The `data` argument to the callback will be a pointer to a
308 * `git_strarray` with `name:content` strings containing
309 * information about the certificate. This is used when using
316 * Parent type for `git_cert_hostkey` and `git_cert_x509`.
320 * Type of certificate. A `GIT_CERT_` value.
322 git_cert_t cert_type
;
326 * Callback for the user's custom certificate checks.
328 * @param cert The host certificate
329 * @param valid Whether the libgit2 checks (OpenSSL or WinHTTP) think
330 * this certificate is valid
331 * @param host Hostname of the host libgit2 connected to
332 * @param payload Payload provided by the caller
334 typedef int (*git_transport_certificate_check_cb
)(git_cert
*cert
, int valid
, const char *host
, void *payload
);
337 * Opaque structure representing a submodule.
339 typedef struct git_submodule git_submodule
;
342 * Submodule update values
344 * These values represent settings for the `submodule.$name.update`
345 * configuration value which says how to handle `git submodule update` for
346 * this submodule. The value is usually set in the ".gitmodules" file and
347 * copied to ".git/config" when the submodule is initialized.
349 * You can override this setting on a per-submodule basis with
350 * `git_submodule_set_update()` and write the changed value to disk using
351 * `git_submodule_save()`. If you have overwritten the value, you can
352 * revert it by passing `GIT_SUBMODULE_UPDATE_RESET` to the set function.
356 * - GIT_SUBMODULE_UPDATE_CHECKOUT: the default; when a submodule is
357 * updated, checkout the new detached HEAD to the submodule directory.
358 * - GIT_SUBMODULE_UPDATE_REBASE: update by rebasing the current checked
359 * out branch onto the commit from the superproject.
360 * - GIT_SUBMODULE_UPDATE_MERGE: update by merging the commit in the
361 * superproject into the current checkout out branch of the submodule.
362 * - GIT_SUBMODULE_UPDATE_NONE: do not update this submodule even when
363 * the commit in the superproject is updated.
364 * - GIT_SUBMODULE_UPDATE_DEFAULT: not used except as static initializer
365 * when we don't want any particular update rule to be specified.
368 GIT_SUBMODULE_UPDATE_CHECKOUT
= 1,
369 GIT_SUBMODULE_UPDATE_REBASE
= 2,
370 GIT_SUBMODULE_UPDATE_MERGE
= 3,
371 GIT_SUBMODULE_UPDATE_NONE
= 4,
373 GIT_SUBMODULE_UPDATE_DEFAULT
= 0
374 } git_submodule_update_t
;
377 * Submodule ignore values
379 * These values represent settings for the `submodule.$name.ignore`
380 * configuration value which says how deeply to look at the working
381 * directory when getting submodule status.
383 * You can override this value in memory on a per-submodule basis with
384 * `git_submodule_set_ignore()` and can write the changed value to disk
385 * with `git_submodule_save()`. If you have overwritten the value, you
386 * can revert to the on disk value by using `GIT_SUBMODULE_IGNORE_RESET`.
390 * - GIT_SUBMODULE_IGNORE_UNSPECIFIED: use the submodule's configuration
391 * - GIT_SUBMODULE_IGNORE_NONE: don't ignore any change - i.e. even an
392 * untracked file, will mark the submodule as dirty. Ignored files are
393 * still ignored, of course.
394 * - GIT_SUBMODULE_IGNORE_UNTRACKED: ignore untracked files; only changes
395 * to tracked files, or the index or the HEAD commit will matter.
396 * - GIT_SUBMODULE_IGNORE_DIRTY: ignore changes in the working directory,
397 * only considering changes if the HEAD of submodule has moved from the
398 * value in the superproject.
399 * - GIT_SUBMODULE_IGNORE_ALL: never check if the submodule is dirty
400 * - GIT_SUBMODULE_IGNORE_DEFAULT: not used except as static initializer
401 * when we don't want any particular ignore rule to be specified.
404 GIT_SUBMODULE_IGNORE_UNSPECIFIED
= -1, /**< use the submodule's configuration */
406 GIT_SUBMODULE_IGNORE_NONE
= 1, /**< any change or untracked == dirty */
407 GIT_SUBMODULE_IGNORE_UNTRACKED
= 2, /**< dirty if tracked files change */
408 GIT_SUBMODULE_IGNORE_DIRTY
= 3, /**< only dirty if HEAD moved */
409 GIT_SUBMODULE_IGNORE_ALL
= 4, /**< never dirty */
410 } git_submodule_ignore_t
;
413 * Options for submodule recurse.
415 * Represent the value of `submodule.$name.fetchRecurseSubmodules`
417 * * GIT_SUBMODULE_RECURSE_NO - do no recurse into submodules
418 * * GIT_SUBMODULE_RECURSE_YES - recurse into submodules
419 * * GIT_SUBMODULE_RECURSE_ONDEMAND - recurse into submodules only when
420 * commit not already in local clone
423 GIT_SUBMODULE_RECURSE_NO
= 0,
424 GIT_SUBMODULE_RECURSE_YES
= 1,
425 GIT_SUBMODULE_RECURSE_ONDEMAND
= 2,
426 } git_submodule_recurse_t
;
428 /** A type to write in a streaming fashion, for example, for filters. */
429 typedef struct git_writestream git_writestream
;
431 struct git_writestream
{
432 int (*write
)(git_writestream
*stream
, const char *buffer
, size_t len
);
433 int (*close
)(git_writestream
*stream
);
434 void (*free
)(git_writestream
*stream
);