1 /* 2 * Copyright (C) the libgit2 contributors. All rights reserved. 3 * 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. 6 */ 7 #ifndef _INCLUDE_git_indexer_h__ 8 #define _INCLUDE_git_indexer_h__ 9 10 #include "common.h" 11 #include "types.h" 12 #include "oid.h" 13 14 GIT_BEGIN_DECL 15 16 /** A git indexer object */ 17 typedef struct git_indexer git_indexer; 18 19 /** 20 * This structure is used to provide callers information about the 21 * progress of indexing a packfile, either directly or part of a 22 * fetch or clone that downloads a packfile. 23 */ 24 typedef struct git_indexer_progress { 25 /** number of objects in the packfile being indexed */ 26 unsigned int total_objects; 27 28 /** received objects that have been hashed */ 29 unsigned int indexed_objects; 30 31 /** received_objects: objects which have been downloaded */ 32 unsigned int received_objects; 33 34 /** 35 * locally-available objects that have been injected in order 36 * to fix a thin pack 37 */ 38 unsigned int local_objects; 39 40 /** number of deltas in the packfile being indexed */ 41 unsigned int total_deltas; 42 43 /** received deltas that have been indexed */ 44 unsigned int indexed_deltas; 45 46 /** size of the packfile received up to now */ 47 size_t received_bytes; 48 } git_indexer_progress; 49 50 /** 51 * Type for progress callbacks during indexing. Return a value less 52 * than zero to cancel the indexing or download. 53 * 54 * @param stats Structure containing information about the state of the tran sfer 55 * @param payload Payload provided by caller 56 */ 57 typedef int GIT_CALLBACK(git_indexer_progress_cb)(const git_indexer_progress *stats, void *payload); 58 59 /** 60 * Options for indexer configuration 61 */ 62 typedef struct git_indexer_options { 63 unsigned int version; 64 65 /** progress_cb function to call with progress information */ 66 git_indexer_progress_cb progress_cb; 67 /** progress_cb_payload payload for the progress callback */ 68 void *progress_cb_payload; 69 70 /** Do connectivity checks for the received pack */ 71 unsigned char verify; 72 } git_indexer_options; 73 74 #define GIT_INDEXER_OPTIONS_VERSION 1 75 #define GIT_INDEXER_OPTIONS_INIT { GIT_INDEXER_OPTIONS_VERSION } 76 77 /** 78 * Initializes a `git_indexer_options` with default values. Equivalent to 79 * creating an instance with GIT_INDEXER_OPTIONS_INIT. 80 * 81 * @param opts the `git_indexer_options` struct to initialize. 82 * @param version Version of struct; pass `GIT_INDEXER_OPTIONS_VERSION` 83 * @return Zero on success; -1 on failure. 84 */ 85 GIT_EXTERN(int) git_indexer_options_init( 86 git_indexer_options *opts, 87 unsigned int version); 88 89 /** 90 * Create a new indexer instance 91 * 92 * @param out where to store the indexer instance 93 * @param path to the directory where the packfile should be stored 94 * @param mode permissions to use creating packfile or 0 for defaults 95 * @param odb object database from which to read base objects when 96 * fixing thin packs. Pass NULL if no thin pack is expected (an error 97 * will be returned if there are bases missing) 98 * @param opts Optional structure containing additional options. See 99 * `git_indexer_options` above. 100 */ 101 GIT_EXTERN(int) git_indexer_new( 102 git_indexer **out, 103 const char *path, 104 unsigned int mode, 105 git_odb *odb, 106 git_indexer_options *opts); 107 108 /** 109 * Add data to the indexer 110 * 111 * @param idx the indexer 112 * @param data the data to add 113 * @param size the size of the data in bytes 114 * @param stats stat storage 115 */ 116 GIT_EXTERN(int) git_indexer_append(git_indexer *idx, const void *data, size_t size, git_indexer_progress *stats); 117 118 /** 119 * Finalize the pack and index 120 * 121 * Resolve any pending deltas and write out the index file 122 * 123 * @param idx the indexer 124 */ 125 GIT_EXTERN(int) git_indexer_commit(git_indexer *idx, git_indexer_progress *stats); 126 127 /** 128 * Get the packfile's hash 129 * 130 * A packfile's name is derived from the sorted hashing of all object 131 * names. This is only correct after the index has been finalized. 132 * 133 * @param idx the indexer instance 134 */ 135 GIT_EXTERN(const git_oid *) git_indexer_hash(const git_indexer *idx); 136 137 /** 138 * Free the indexer and its resources 139 * 140 * @param idx the indexer to free 141 */ 142 GIT_EXTERN(void) git_indexer_free(git_indexer *idx); 143 144 GIT_END_DECL 145 146 #endif 147