1 module git2.diff; 2 3 import git2.common; 4 import git2.oid; 5 import git2.refs; 6 import git2.strarray; 7 import git2.util; 8 import git2.tree; 9 import git2.types; 10 11 extern (C): 12 13 enum git_diff_option_t { 14 GIT_DIFF_NORMAL = 0, 15 GIT_DIFF_REVERSE = (1 << 0), 16 GIT_DIFF_FORCE_TEXT = (1 << 1), 17 GIT_DIFF_IGNORE_WHITESPACE = (1 << 2), 18 GIT_DIFF_IGNORE_WHITESPACE_CHANGE = (1 << 3), 19 GIT_DIFF_IGNORE_WHITESPACE_EOL = (1 << 4), 20 GIT_DIFF_IGNORE_SUBMODULES = (1 << 5), 21 GIT_DIFF_PATIENCE = (1 << 6), 22 GIT_DIFF_INCLUDE_IGNORED = (1 << 7), 23 GIT_DIFF_INCLUDE_UNTRACKED = (1 << 8), 24 GIT_DIFF_INCLUDE_UNMODIFIED = (1 << 9), 25 GIT_DIFF_RECURSE_UNTRACKED_DIRS = (1 << 10), 26 GIT_DIFF_DISABLE_PATHSPEC_MATCH = (1 << 11), 27 GIT_DIFF_DELTAS_ARE_ICASE = (1 << 12), 28 GIT_DIFF_INCLUDE_UNTRACKED_CONTENT = (1 << 13), 29 GIT_DIFF_SKIP_BINARY_CHECK = (1 << 14), 30 GIT_DIFF_INCLUDE_TYPECHANGE = (1 << 15), 31 GIT_DIFF_INCLUDE_TYPECHANGE_TREES = (1 << 16), 32 GIT_DIFF_IGNORE_FILEMODE = (1 << 17), 33 GIT_DIFF_RECURSE_IGNORED_DIRS = (1 << 18), 34 GIT_DIFF_FAST_UNTRACKED_DIRS = (1 << 19), 35 GIT_DIFF_FORCE_BINARY = (1 << 20), 36 } 37 mixin _ExportEnumMembers!git_diff_option_t; 38 39 struct git_diff_list 40 { 41 @disable this(); 42 @disable this(this); 43 } 44 45 enum git_diff_flag_t { 46 GIT_DIFF_FLAG_BINARY = (1 << 0), 47 GIT_DIFF_FLAG_NOT_BINARY = (1 << 1), 48 GIT_DIFF_FLAG_VALID_OID = (1 << 2), 49 } 50 mixin _ExportEnumMembers!git_diff_flag_t; 51 52 enum git_delta_t { 53 GIT_DELTA_UNMODIFIED = 0, 54 GIT_DELTA_ADDED = 1, 55 GIT_DELTA_DELETED = 2, 56 GIT_DELTA_MODIFIED = 3, 57 GIT_DELTA_RENAMED = 4, 58 GIT_DELTA_COPIED = 5, 59 GIT_DELTA_IGNORED = 6, 60 GIT_DELTA_UNTRACKED = 7, 61 GIT_DELTA_TYPECHANGE = 8, 62 } 63 mixin _ExportEnumMembers!git_delta_t; 64 65 struct git_diff_file { 66 git_oid oid; 67 const(char)* path; 68 git_off_t size; 69 uint32_t flags; 70 uint16_t mode; 71 } 72 73 struct git_diff_delta { 74 git_diff_file old_file; 75 git_diff_file new_file; 76 git_delta_t status; 77 uint32_t similarity; 78 uint32_t flags; 79 } 80 81 alias git_diff_notify_cb = int function( 82 const(git_diff_list)* diff_so_far, 83 const(git_diff_delta)* delta_to_add, 84 const(char)* matched_pathspec, 85 void *payload); 86 87 struct git_diff_options { 88 uint version_ = GIT_DIFF_OPTIONS_VERSION; 89 uint32_t flags; 90 uint16_t context_lines; 91 uint16_t interhunk_lines; 92 const(char)* old_prefix; 93 const(char)* new_prefix; 94 git_strarray pathspec; 95 git_off_t max_size; 96 git_diff_notify_cb notify_cb; 97 void *notify_payload; 98 } ; 99 100 enum GIT_DIFF_OPTIONS_VERSION = 1; 101 enum git_diff_options GIT_DIFF_OPTIONS_INIT = { GIT_DIFF_OPTIONS_VERSION, GIT_DIFF_NORMAL, 3 }; 102 103 alias git_diff_file_cb = int function( 104 const(git_diff_delta)* delta, 105 float progress, 106 void *payload); 107 108 struct git_diff_range { 109 int old_start; 110 int old_lines; 111 int new_start; 112 int new_lines; 113 } 114 115 alias git_diff_hunk_cb = int function( 116 const(git_diff_delta)* delta, 117 const(git_diff_range)* range, 118 const(char)* header, 119 size_t header_len, 120 void *payload); 121 122 enum git_diff_line_t { 123 GIT_DIFF_LINE_CONTEXT = ' ', 124 GIT_DIFF_LINE_ADDITION = '+', 125 GIT_DIFF_LINE_DELETION = '-', 126 GIT_DIFF_LINE_CONTEXT_EOFNL = '=', 127 GIT_DIFF_LINE_ADD_EOFNL = '>', 128 GIT_DIFF_LINE_DEL_EOFNL = '<', 129 GIT_DIFF_LINE_FILE_HDR = 'F', 130 GIT_DIFF_LINE_HUNK_HDR = 'H', 131 GIT_DIFF_LINE_BINARY = 'B' 132 } 133 mixin _ExportEnumMembers!git_diff_line_t; 134 135 alias git_diff_data_cb = int function( 136 const(git_diff_delta)* delta, 137 const(git_diff_range)* range, 138 char line_origin, 139 const(char)* content, 140 size_t content_len, 141 void *payload); 142 143 struct git_diff_patch 144 { 145 @disable this(); 146 @disable this(this); 147 } 148 149 enum git_diff_find_t { 150 GIT_DIFF_FIND_RENAMES = (1 << 0), 151 GIT_DIFF_FIND_RENAMES_FROM_REWRITES = (1 << 1), 152 GIT_DIFF_FIND_COPIES = (1 << 2), 153 GIT_DIFF_FIND_COPIES_FROM_UNMODIFIED = (1 << 3), 154 GIT_DIFF_FIND_REWRITES = (1 << 4), 155 GIT_DIFF_BREAK_REWRITES = (1 << 5), 156 GIT_DIFF_FIND_AND_BREAK_REWRITES = 157 (GIT_DIFF_FIND_REWRITES | GIT_DIFF_BREAK_REWRITES), 158 GIT_DIFF_FIND_FOR_UNTRACKED = (1 << 6), 159 GIT_DIFF_FIND_ALL = (0x0ff), 160 GIT_DIFF_FIND_IGNORE_LEADING_WHITESPACE = 0, 161 GIT_DIFF_FIND_IGNORE_WHITESPACE = (1 << 12), 162 GIT_DIFF_FIND_DONT_IGNORE_WHITESPACE = (1 << 13), 163 GIT_DIFF_FIND_EXACT_MATCH_ONLY = (1 << 14), 164 } 165 mixin _ExportEnumMembers!git_diff_find_t; 166 167 struct git_diff_similarity_metric { 168 int function( 169 void **out_, const(git_diff_file)* file, 170 const(char)* fullpath, void *payload) file_signature; 171 int function( 172 void **out_, const(git_diff_file)* file, 173 const(char)* buf, size_t buflen, void *payload) buffer_signature; 174 void function(void *sig, void *payload) free_signature; 175 int function(int *score, void *siga, void *sigb, void *payload) similarity; 176 void *payload; 177 } 178 179 struct git_diff_find_options { 180 uint version_ = GIT_DIFF_FIND_OPTIONS_VERSION; 181 uint32_t flags; 182 uint16_t rename_threshold; 183 uint16_t rename_from_rewrite_threshold; 184 uint16_t copy_threshold; 185 uint16_t break_rewrite_threshold; 186 size_t rename_limit; 187 git_diff_similarity_metric *metric; 188 } 189 190 enum GIT_DIFF_FIND_OPTIONS_VERSION = 1; 191 enum git_diff_find_options GIT_DIFF_FIND_OPTIONS_INIT = { GIT_DIFF_FIND_OPTIONS_VERSION }; 192 193 void git_diff_list_free(git_diff_list *diff); 194 int git_diff_tree_to_tree( 195 git_diff_list **diff, 196 git_repository *repo, 197 git_tree *old_tree, 198 git_tree *new_tree, 199 const(git_diff_options)* opts); 200 int git_diff_tree_to_index( 201 git_diff_list **diff, 202 git_repository *repo, 203 git_tree *old_tree, 204 git_index *index, 205 const(git_diff_options)* opts); 206 int git_diff_index_to_workdir( 207 git_diff_list **diff, 208 git_repository *repo, 209 git_index *index, 210 const(git_diff_options)* opts); 211 int git_diff_tree_to_workdir( 212 git_diff_list **diff, 213 git_repository *repo, 214 git_tree *old_tree, 215 const(git_diff_options)* opts); 216 int git_diff_merge( 217 git_diff_list *onto, 218 const(git_diff_list)* from); 219 int git_diff_find_similar( 220 git_diff_list *diff, 221 git_diff_find_options *options); 222 int git_diff_foreach( 223 git_diff_list *diff, 224 git_diff_file_cb file_cb, 225 git_diff_hunk_cb hunk_cb, 226 git_diff_data_cb line_cb, 227 void *payload); 228 int git_diff_print_compact( 229 git_diff_list *diff, 230 git_diff_data_cb print_cb, 231 void *payload); 232 int git_diff_print_raw( 233 git_diff_list *diff, 234 git_diff_data_cb print_cb, 235 void *payload); 236 char git_diff_status_char(git_delta_t status); 237 int git_diff_print_patch( 238 git_diff_list *diff, 239 git_diff_data_cb print_cb, 240 void *payload); 241 size_t git_diff_num_deltas(git_diff_list *diff); 242 size_t git_diff_num_deltas_of_type( 243 git_diff_list *diff, 244 git_delta_t type); 245 int git_diff_get_patch( 246 git_diff_patch **patch_out, 247 const(git_diff_delta)** delta_out, 248 git_diff_list *diff, 249 size_t idx); 250 void git_diff_patch_free( 251 git_diff_patch *patch); 252 const(git_diff_delta)* git_diff_patch_delta( 253 git_diff_patch *patch); 254 size_t git_diff_patch_num_hunks( 255 git_diff_patch *patch); 256 int git_diff_patch_line_stats( 257 size_t *total_context, 258 size_t *total_additions, 259 size_t *total_deletions, 260 const(git_diff_patch)* patch); 261 int git_diff_patch_get_hunk( 262 const(git_diff_range)** range, 263 const(char)** header, 264 size_t *header_len, 265 size_t *lines_in_hunk, 266 git_diff_patch *patch, 267 size_t hunk_idx); 268 int git_diff_patch_num_lines_in_hunk( 269 git_diff_patch *patch, 270 size_t hunk_idx); 271 int git_diff_patch_get_line_in_hunk( 272 char *line_origin, 273 const(char)** content, 274 size_t *content_len, 275 int *old_lineno, 276 int *new_lineno, 277 git_diff_patch *patch, 278 size_t hunk_idx, 279 size_t line_of_hunk); 280 int git_diff_patch_print( 281 git_diff_patch *patch, 282 git_diff_data_cb print_cb, 283 void *payload); 284 int git_diff_patch_to_str( 285 char **string, 286 git_diff_patch *patch); 287 int git_diff_blobs( 288 const(git_blob)* old_blob, 289 const(char)* old_as_path, 290 const(git_blob)* new_blob, 291 const(char)* new_as_path, 292 const(git_diff_options)* options, 293 git_diff_file_cb file_cb, 294 git_diff_hunk_cb hunk_cb, 295 git_diff_data_cb line_cb, 296 void *payload); 297 int git_diff_patch_from_blobs( 298 git_diff_patch **out_, 299 const(git_blob)* old_blob, 300 const(char)* old_as_path, 301 const(git_blob)* new_blob, 302 const(char)* new_as_path, 303 const(git_diff_options)* opts); 304 int git_diff_blob_to_buffer( 305 const(git_blob)* old_blob, 306 const(char)* old_as_path, 307 const(char)* buffer, 308 size_t buffer_len, 309 const(char)* buffer_as_path, 310 const(git_diff_options)* options, 311 git_diff_file_cb file_cb, 312 git_diff_hunk_cb hunk_cb, 313 git_diff_data_cb data_cb, 314 void *payload); 315 int git_diff_patch_from_blob_and_buffer( 316 git_diff_patch **out_, 317 const(git_blob)* old_blob, 318 const(char)* old_as_path, 319 const(char)* buffer, 320 size_t buffer_len, 321 const(char)* buffer_as_path, 322 const(git_diff_options)* opts);