Git fork
at 3da4413dbcdb8df021739ca6f20fe4f0bcd1fd3c 753 lines 24 kB view raw
1/* 2 * Copyright (C) 2005 Junio C Hamano 3 */ 4#ifndef DIFF_H 5#define DIFF_H 6 7#include "hash.h" 8#include "pathspec.h" 9#include "strbuf.h" 10 11struct oidset; 12 13/** 14 * The diff API is for programs that compare two sets of files (e.g. two trees, 15 * one tree and the index) and present the found difference in various ways. 16 * The calling program is responsible for feeding the API pairs of files, one 17 * from the "old" set and the corresponding one from "new" set, that are 18 * different. 19 * The library called through this API is called diffcore, and is responsible 20 * for two things. 21 * 22 * - finding total rewrites (`-B`), renames (`-M`) and copies (`-C`), and 23 * changes that touch a string (`-S`), as specified by the caller. 24 * 25 * - outputting the differences in various formats, as specified by the caller. 26 * 27 * Calling sequence 28 * ---------------- 29 * 30 * - Prepare `struct diff_options` to record the set of diff options, and then 31 * call `repo_diff_setup()` to initialize this structure. This sets up the 32 * vanilla default. 33 * 34 * - Fill in the options structure to specify desired output format, rename 35 * detection, etc. `diff_opt_parse()` can be used to parse options given 36 * from the command line in a way consistent with existing git-diff family 37 * of programs. 38 * 39 * - Call `diff_setup_done()`; this inspects the options set up so far for 40 * internal consistency and make necessary tweaking to it (e.g. if textual 41 * patch output was asked, recursive behaviour is turned on); the callback 42 * set_default in diff_options can be used to tweak this more. 43 * 44 * - As you find different pairs of files, call `diff_change()` to feed 45 * modified files, `diff_addremove()` to feed created or deleted files, or 46 * `diff_unmerge()` to feed a file whose state is 'unmerged' to the API. 47 * These are thin wrappers to a lower-level `diff_queue()` function that is 48 * flexible enough to record any of these kinds of changes. 49 * 50 * - Once you finish feeding the pairs of files, call `diffcore_std()`. 51 * This will tell the diffcore library to go ahead and do its work. 52 * 53 * - Calling `diff_flush()` will produce the output, it will call 54 * `diff_free()` to free any resources, e.g. those allocated in 55 * `diff_opt_parse()`. 56 * 57 * - Set `.no_free = 1` before calling `diff_flush()` to defer the 58 * freeing of allocated memory in diff_options. This is useful when 59 * `diff_flush()` is being called in a loop, rather than as a 60 * one-off. When setting `.no_free = 1` you must ensure that 61 * `diff_free()` is called at the end, either by flipping the flag 62 * before the last `diff_flush()` call, or by flipping it before 63 * calling `diff_free()` yourself. 64 */ 65 66struct combine_diff_path; 67struct commit; 68struct diff_filespec; 69struct diff_options; 70struct diff_queue_struct; 71struct oid_array; 72struct option; 73struct repository; 74struct rev_info; 75struct userdiff_driver; 76 77typedef int (*pathchange_fn_t)(struct diff_options *options, 78 struct combine_diff_path *path); 79 80typedef void (*change_fn_t)(struct diff_options *options, 81 unsigned old_mode, unsigned new_mode, 82 const struct object_id *old_oid, 83 const struct object_id *new_oid, 84 int old_oid_valid, int new_oid_valid, 85 const char *fullpath, 86 unsigned old_dirty_submodule, unsigned new_dirty_submodule); 87 88typedef void (*add_remove_fn_t)(struct diff_options *options, 89 int addremove, unsigned mode, 90 const struct object_id *oid, 91 int oid_valid, 92 const char *fullpath, unsigned dirty_submodule); 93 94typedef void (*diff_format_fn_t)(struct diff_queue_struct *q, 95 struct diff_options *options, void *data); 96 97typedef const char *(*diff_prefix_fn_t)(struct diff_options *opt, void *data); 98 99#define DIFF_FORMAT_RAW 0x0001 100#define DIFF_FORMAT_DIFFSTAT 0x0002 101#define DIFF_FORMAT_NUMSTAT 0x0004 102#define DIFF_FORMAT_SUMMARY 0x0008 103#define DIFF_FORMAT_PATCH 0x0010 104#define DIFF_FORMAT_SHORTSTAT 0x0020 105#define DIFF_FORMAT_DIRSTAT 0x0040 106 107/* These override all above */ 108#define DIFF_FORMAT_NAME 0x0100 109#define DIFF_FORMAT_NAME_STATUS 0x0200 110#define DIFF_FORMAT_CHECKDIFF 0x0400 111 112/* Same as output_format = 0 but we know that -s flag was given 113 * and we should not give default value to output_format. 114 */ 115#define DIFF_FORMAT_NO_OUTPUT 0x0800 116 117#define DIFF_FORMAT_CALLBACK 0x1000 118 119#define DIFF_FLAGS_INIT { 0 } 120struct diff_flags { 121 122 /** 123 * Tells if tree traversal done by tree-diff should recursively descend 124 * into a tree object pair that are different in preimage and postimage set. 125 */ 126 unsigned recursive; 127 unsigned tree_in_recursive; 128 129 /* Affects the way how a file that is seemingly binary is treated. */ 130 unsigned binary; 131 unsigned text; 132 133 /** 134 * Tells the patch output format not to use abbreviated object names on the 135 * "index" lines. 136 */ 137 unsigned full_index; 138 139 /* Affects if diff-files shows removed files. */ 140 unsigned silent_on_remove; 141 142 /** 143 * Tells the diffcore library that the caller is feeding unchanged 144 * filepairs to allow copies from unmodified files be detected. 145 */ 146 unsigned find_copies_harder; 147 148 unsigned follow_renames; 149 unsigned rename_empty; 150 151 /* Internal; used for optimization to see if there is any change. */ 152 unsigned has_changes; 153 154 unsigned quick; 155 156 /** 157 * Tells diff-files that the input is not tracked files but files in random 158 * locations on the filesystem. 159 */ 160 unsigned no_index; 161 162 /** 163 * Tells output routine that it is Ok to call user specified patch output 164 * routine. Plumbing disables this to ensure stable output. 165 */ 166 unsigned allow_external; 167 168 /** 169 * For communication between the calling program and the options parser; 170 * tell the calling program to signal the presence of difference using 171 * program exit code. 172 */ 173 unsigned exit_with_status; 174 175 /** 176 * Tells the library that the calling program is feeding the filepairs 177 * reversed; `one` is two, and `two` is one. 178 */ 179 unsigned reverse_diff; 180 181 unsigned check_failed; 182 unsigned relative_name; 183 unsigned ignore_submodules; 184 unsigned dirstat_cumulative; 185 unsigned dirstat_by_file; 186 unsigned allow_textconv; 187 unsigned textconv_set_via_cmdline; 188 unsigned diff_from_contents; 189 unsigned dirty_submodules; 190 unsigned ignore_untracked_in_submodules; 191 unsigned ignore_submodule_set; 192 unsigned ignore_dirty_submodules; 193 unsigned override_submodule_config; 194 unsigned dirstat_by_line; 195 unsigned funccontext; 196 unsigned default_follow_renames; 197 unsigned stat_with_summary; 198 unsigned suppress_diff_headers; 199 unsigned dual_color_diffed_diffs; 200 unsigned suppress_hunk_header_line_count; 201}; 202 203static inline void diff_flags_or(struct diff_flags *a, 204 const struct diff_flags *b) 205{ 206 char *tmp_a = (char *)a; 207 const char *tmp_b = (const char *)b; 208 209 for (size_t i = 0; i < sizeof(struct diff_flags); i++) 210 tmp_a[i] |= tmp_b[i]; 211} 212 213#define DIFF_XDL_TST(opts, flag) ((opts)->xdl_opts & XDF_##flag) 214#define DIFF_XDL_SET(opts, flag) ((opts)->xdl_opts |= XDF_##flag) 215#define DIFF_XDL_CLR(opts, flag) ((opts)->xdl_opts &= ~XDF_##flag) 216 217#define DIFF_WITH_ALG(opts, flag) (((opts)->xdl_opts & ~XDF_DIFF_ALGORITHM_MASK) | XDF_##flag) 218 219enum diff_words_type { 220 DIFF_WORDS_NONE = 0, 221 DIFF_WORDS_PORCELAIN, 222 DIFF_WORDS_PLAIN, 223 DIFF_WORDS_COLOR 224}; 225 226enum diff_submodule_format { 227 DIFF_SUBMODULE_SHORT = 0, 228 DIFF_SUBMODULE_LOG, 229 DIFF_SUBMODULE_INLINE_DIFF 230}; 231 232/** 233 * the set of options the calling program wants to affect the operation of 234 * diffcore library with. 235 */ 236struct diff_options { 237 char *orderfile; 238 239 /* 240 * "--rotate-to=<file>" would start showing at <file> and when 241 * the output reaches the end, wrap around by default. 242 * Setting skip_instead_of_rotate to true stops the output at the 243 * end, effectively discarding the earlier part of the output 244 * before <file>'s diff (this is used to implement the 245 * "--skip-to=<file>" option). 246 * 247 * When rotate_to_strict is set, it is an error if there is no 248 * <file> in the diff. Otherwise, the output starts at the 249 * path that is the same as, or first path that sorts after, 250 * <file>. Because it is unreasonable to require the exact 251 * match for "git log -p --rotate-to=<file>" (i.e. not all 252 * commit would touch that single <file>), "git log" sets it 253 * to false. "git diff" sets it to true to detect an error 254 * in the command line option. 255 */ 256 const char *rotate_to; 257 int skip_instead_of_rotate; 258 int rotate_to_strict; 259 260 /** 261 * A constant string (can and typically does contain newlines to look for 262 * a block of text, not just a single line) to filter out the filepairs 263 * that do not change the number of strings contained in its preimage and 264 * postimage of the diff_queue. 265 */ 266 const char *pickaxe; 267 unsigned pickaxe_opts; 268 269 /* -I<regex> */ 270 regex_t **ignore_regex; 271 size_t ignore_regex_nr, ignore_regex_alloc; 272 273 const char *single_follow; 274 const char *a_prefix, *b_prefix; 275 const char *line_prefix; 276 277 /** 278 * collection of boolean options that affects the operation, but some do 279 * not have anything to do with the diffcore library. 280 */ 281 struct diff_flags flags; 282 283 /* diff-filter bits */ 284 unsigned int filter, filter_not; 285 286 int use_color; 287 288 /* Number of context lines to generate in patch output. */ 289 int context; 290 291 int interhunkcontext; 292 293 /* Affects the way detection logic for complete rewrites, renames and 294 * copies. 295 */ 296 int break_opt; 297 int detect_rename; 298 299 int irreversible_delete; 300 int skip_stat_unmatch; 301 int line_termination; 302 303 /* The output format used when `diff_flush()` is run. */ 304 int output_format; 305 306 /* Affects the way detection logic for complete rewrites, renames and 307 * copies. 308 */ 309 int rename_score; 310 int rename_limit; 311 312 int needed_rename_limit; 313 int degraded_cc_to_c; 314 int show_rename_progress; 315 int dirstat_permille; 316 int setup; 317 318 /* Number of hexdigits to abbreviate raw format output to. */ 319 int abbrev; 320 321 /* If non-zero, then stop computing after this many changes. */ 322 int max_changes; 323 324 int ita_invisible_in_index; 325/* white-space error highlighting */ 326#define WSEH_NEW (1<<12) 327#define WSEH_CONTEXT (1<<13) 328#define WSEH_OLD (1<<14) 329 unsigned ws_error_highlight; 330 const char *prefix; 331 int prefix_length; 332 const char *stat_sep; 333 int xdl_opts; 334 int ignore_driver_algorithm; 335 336 /* see Documentation/diff-options.adoc */ 337 char **anchors; 338 size_t anchors_nr, anchors_alloc; 339 340 int stat_width; 341 int stat_name_width; 342 int stat_graph_width; 343 int stat_count; 344 const char *word_regex; 345 enum diff_words_type word_diff; 346 enum diff_submodule_format submodule_format; 347 348 struct oidset *objfind; 349 350 /* this is set by diffcore for DIFF_FORMAT_PATCH */ 351 int found_changes; 352 353 /* to support internal diff recursion by --follow hack*/ 354 int found_follow; 355 356 /* 357 * By default, diffcore_std() resolves the statuses for queued diff file 358 * pairs by calling diff_resolve_rename_copy(). If status information 359 * has already been manually set, this option prevents diffcore_std() 360 * from resetting statuses. 361 */ 362 int skip_resolving_statuses; 363 364 /* Callback which allows tweaking the options in diff_setup_done(). */ 365 void (*set_default)(struct diff_options *); 366 367 FILE *file; 368 int close_file; 369 370#define OUTPUT_INDICATOR_NEW 0 371#define OUTPUT_INDICATOR_OLD 1 372#define OUTPUT_INDICATOR_CONTEXT 2 373 char output_indicators[3]; 374 375 struct pathspec pathspec; 376 pathchange_fn_t pathchange; 377 change_fn_t change; 378 add_remove_fn_t add_remove; 379 void *change_fn_data; 380 diff_format_fn_t format_callback; 381 void *format_callback_data; 382 diff_prefix_fn_t output_prefix; 383 void *output_prefix_data; 384 385 int diff_path_counter; 386 387 struct emitted_diff_symbols *emitted_symbols; 388 enum { 389 COLOR_MOVED_NO = 0, 390 COLOR_MOVED_PLAIN = 1, 391 COLOR_MOVED_BLOCKS = 2, 392 COLOR_MOVED_ZEBRA = 3, 393 COLOR_MOVED_ZEBRA_DIM = 4, 394 } color_moved; 395 #define COLOR_MOVED_DEFAULT COLOR_MOVED_ZEBRA 396 #define COLOR_MOVED_MIN_ALNUM_COUNT 20 397 398 /* XDF_WHITESPACE_FLAGS regarding block detection are set at 2, 3, 4 */ 399 #define COLOR_MOVED_WS_ALLOW_INDENTATION_CHANGE (1<<5) 400 #define COLOR_MOVED_WS_ERROR (1<<0) 401 unsigned color_moved_ws_handling; 402 403 bool dry_run; 404 405 struct repository *repo; 406 struct strmap *additional_path_headers; 407 408 int no_free; 409}; 410 411unsigned diff_filter_bit(char status); 412 413void diff_emit_submodule_del(struct diff_options *o, const char *line); 414void diff_emit_submodule_add(struct diff_options *o, const char *line); 415void diff_emit_submodule_untracked(struct diff_options *o, const char *path); 416void diff_emit_submodule_modified(struct diff_options *o, const char *path); 417void diff_emit_submodule_header(struct diff_options *o, const char *header); 418void diff_emit_submodule_error(struct diff_options *o, const char *err); 419void diff_emit_submodule_pipethrough(struct diff_options *o, 420 const char *line, int len); 421 422struct diffstat_t { 423 int nr; 424 int alloc; 425 struct diffstat_file { 426 char *from_name; 427 char *name; 428 char *print_name; 429 const char *comments; 430 unsigned is_unmerged:1; 431 unsigned is_binary:1; 432 unsigned is_renamed:1; 433 unsigned is_interesting:1; 434 uintmax_t added, deleted; 435 } **files; 436}; 437 438enum color_diff { 439 DIFF_RESET = 0, 440 DIFF_CONTEXT = 1, 441 DIFF_METAINFO = 2, 442 DIFF_FRAGINFO = 3, 443 DIFF_FILE_OLD = 4, 444 DIFF_FILE_NEW = 5, 445 DIFF_COMMIT = 6, 446 DIFF_WHITESPACE = 7, 447 DIFF_FUNCINFO = 8, 448 DIFF_FILE_OLD_MOVED = 9, 449 DIFF_FILE_OLD_MOVED_ALT = 10, 450 DIFF_FILE_OLD_MOVED_DIM = 11, 451 DIFF_FILE_OLD_MOVED_ALT_DIM = 12, 452 DIFF_FILE_NEW_MOVED = 13, 453 DIFF_FILE_NEW_MOVED_ALT = 14, 454 DIFF_FILE_NEW_MOVED_DIM = 15, 455 DIFF_FILE_NEW_MOVED_ALT_DIM = 16, 456 DIFF_CONTEXT_DIM = 17, 457 DIFF_FILE_OLD_DIM = 18, 458 DIFF_FILE_NEW_DIM = 19, 459 DIFF_CONTEXT_BOLD = 20, 460 DIFF_FILE_OLD_BOLD = 21, 461 DIFF_FILE_NEW_BOLD = 22, 462}; 463 464const char *diff_get_color(int diff_use_color, enum color_diff ix); 465#define diff_get_color_opt(o, ix) \ 466 diff_get_color((o)->use_color, ix) 467 468 469const char *diff_line_prefix(struct diff_options *); 470 471 472extern const char mime_boundary_leader[]; 473 474struct combine_diff_path *diff_tree_paths( 475 const struct object_id *oid, 476 const struct object_id **parents_oid, int nparent, 477 struct strbuf *base, struct diff_options *opt); 478void diff_tree_oid(const struct object_id *old_oid, 479 const struct object_id *new_oid, 480 const char *base, struct diff_options *opt); 481void diff_root_tree_oid(const struct object_id *new_oid, const char *base, 482 struct diff_options *opt); 483 484struct combine_diff_path { 485 struct combine_diff_path *next; 486 char *path; 487 unsigned int mode; 488 struct object_id oid; 489 struct combine_diff_parent { 490 char status; 491 unsigned int mode; 492 struct object_id oid; 493 /* 494 * This per-parent path is filled only when doing a combined 495 * diff with revs.combined_all_paths set, and only if the path 496 * differs from the post-image (e.g., a rename or copy). 497 * Otherwise it is left NULL. 498 */ 499 char *path; 500 } parent[FLEX_ARRAY]; 501}; 502struct combine_diff_path *combine_diff_path_new(const char *path, 503 size_t path_len, 504 unsigned int mode, 505 const struct object_id *oid, 506 size_t num_parents); 507 508void show_combined_diff(struct combine_diff_path *elem, int num_parent, 509 struct rev_info *); 510 511void diff_tree_combined(const struct object_id *oid, const struct oid_array *parents, struct rev_info *rev); 512 513void diff_tree_combined_merge(const struct commit *commit, struct rev_info *rev); 514 515void diff_set_mnemonic_prefix(struct diff_options *options, const char *a, const char *b); 516void diff_set_noprefix(struct diff_options *options); 517void diff_set_default_prefix(struct diff_options *options); 518 519int diff_can_quit_early(struct diff_options *); 520 521/* 522 * Stages changes in the provided diff queue for file additions and deletions. 523 * If a file pair gets queued, it is returned. 524 */ 525struct diff_filepair *diff_queue_addremove(struct diff_queue_struct *queue, 526 struct diff_options *, 527 int addremove, unsigned mode, 528 const struct object_id *oid, 529 int oid_valid, const char *fullpath, 530 unsigned dirty_submodule); 531 532/* 533 * Stages changes in the provided diff queue for file modifications. 534 * If a file pair gets queued, it is returned. 535 */ 536struct diff_filepair *diff_queue_change(struct diff_queue_struct *queue, 537 struct diff_options *, 538 unsigned mode1, unsigned mode2, 539 const struct object_id *old_oid, 540 const struct object_id *new_oid, 541 int old_oid_valid, int new_oid_valid, 542 const char *fullpath, 543 unsigned dirty_submodule1, 544 unsigned dirty_submodule2); 545 546void diff_addremove(struct diff_options *, 547 int addremove, 548 unsigned mode, 549 const struct object_id *oid, 550 int oid_valid, 551 const char *fullpath, unsigned dirty_submodule); 552 553void diff_change(struct diff_options *, 554 unsigned mode1, unsigned mode2, 555 const struct object_id *old_oid, 556 const struct object_id *new_oid, 557 int old_oid_valid, int new_oid_valid, 558 const char *fullpath, 559 unsigned dirty_submodule1, unsigned dirty_submodule2); 560 561struct diff_filepair *diff_unmerge(struct diff_options *, const char *path); 562 563void compute_diffstat(struct diff_options *options, struct diffstat_t *diffstat, 564 struct diff_queue_struct *q); 565void free_diffstat_info(struct diffstat_t *diffstat); 566 567#define DIFF_SETUP_REVERSE 1 568#define DIFF_SETUP_USE_SIZE_CACHE 4 569 570/* 571 * Poor man's alternative to parse-option, to allow both stuck form 572 * (--option=value) and separate form (--option value). 573 */ 574int parse_long_opt(const char *opt, const char **argv, 575 const char **optarg); 576 577struct config_context; 578int git_diff_basic_config(const char *var, const char *value, 579 const struct config_context *ctx, void *cb); 580int git_diff_heuristic_config(const char *var, const char *value, void *cb); 581void init_diff_ui_defaults(void); 582int git_diff_ui_config(const char *var, const char *value, 583 const struct config_context *ctx, void *cb); 584void repo_diff_setup(struct repository *, struct diff_options *); 585struct option *add_diff_options(const struct option *, struct diff_options *); 586int diff_opt_parse(struct diff_options *, const char **, int, const char *); 587void diff_setup_done(struct diff_options *); 588 589/* 590 * Returns true if the pathspec can work with --follow mode. If die_on_error is 591 * set, die() with a specific error message rather than returning false. 592 */ 593int diff_check_follow_pathspec(struct pathspec *ps, int die_on_error); 594 595int git_config_rename(const char *var, const char *value); 596 597#define DIFF_DETECT_RENAME 1 598#define DIFF_DETECT_COPY 2 599 600#define DIFF_PICKAXE_ALL 1 601#define DIFF_PICKAXE_REGEX 2 602 603#define DIFF_PICKAXE_KIND_S 4 /* traditional plumbing counter */ 604#define DIFF_PICKAXE_KIND_G 8 /* grep in the patch */ 605#define DIFF_PICKAXE_KIND_OBJFIND 16 /* specific object IDs */ 606 607#define DIFF_PICKAXE_KINDS_MASK (DIFF_PICKAXE_KIND_S | \ 608 DIFF_PICKAXE_KIND_G | \ 609 DIFF_PICKAXE_KIND_OBJFIND) 610#define DIFF_PICKAXE_KINDS_G_REGEX_MASK (DIFF_PICKAXE_KIND_G | \ 611 DIFF_PICKAXE_REGEX) 612#define DIFF_PICKAXE_KINDS_ALL_OBJFIND_MASK (DIFF_PICKAXE_ALL | \ 613 DIFF_PICKAXE_KIND_OBJFIND) 614 615#define DIFF_PICKAXE_IGNORE_CASE 32 616 617void init_diffstat_widths(struct diff_options *); 618void diffcore_std(struct diff_options *); 619void diffcore_fix_diff_index(void); 620 621#define COMMON_DIFF_OPTIONS_HELP \ 622"\ncommon diff options:\n" \ 623" -z output diff-raw with lines terminated with NUL.\n" \ 624" -p output patch format.\n" \ 625" -u synonym for -p.\n" \ 626" --patch-with-raw\n" \ 627" output both a patch and the diff-raw format.\n" \ 628" --stat show diffstat instead of patch.\n" \ 629" --numstat show numeric diffstat instead of patch.\n" \ 630" --patch-with-stat\n" \ 631" output a patch and prepend its diffstat.\n" \ 632" --name-only show only names of changed files.\n" \ 633" --name-status show names and status of changed files.\n" \ 634" --full-index show full object name on index lines.\n" \ 635" --abbrev=<n> abbreviate object names in diff-tree header and diff-raw.\n" \ 636" -R swap input file pairs.\n" \ 637" -B detect complete rewrites.\n" \ 638" -M detect renames.\n" \ 639" -C detect copies.\n" \ 640" --find-copies-harder\n" \ 641" try unchanged files as candidate for copy detection.\n" \ 642" -l<n> limit rename attempts up to <n> paths.\n" \ 643" -O<file> reorder diffs according to the <file>.\n" \ 644" -S<string> find filepair whose only one side contains the string.\n" \ 645" --pickaxe-all\n" \ 646" show all files diff when -S is used and hit is found.\n" \ 647" -a --text treat all files as text.\n" 648 649int diff_queue_is_empty(struct diff_options *o); 650void diff_flush(struct diff_options*); 651void diff_free(struct diff_options*); 652void diff_warn_rename_limit(const char *varname, int needed, int degraded_cc); 653 654/* diff-raw status letters */ 655#define DIFF_STATUS_ADDED 'A' 656#define DIFF_STATUS_COPIED 'C' 657#define DIFF_STATUS_DELETED 'D' 658#define DIFF_STATUS_MODIFIED 'M' 659#define DIFF_STATUS_RENAMED 'R' 660#define DIFF_STATUS_TYPE_CHANGED 'T' 661#define DIFF_STATUS_UNKNOWN 'X' 662#define DIFF_STATUS_UNMERGED 'U' 663 664/* these are not diff-raw status letters proper, but used by 665 * diffcore-filter insn to specify additional restrictions. 666 */ 667#define DIFF_STATUS_FILTER_AON '*' 668#define DIFF_STATUS_FILTER_BROKEN 'B' 669 670/* 671 * This is different from repo_find_unique_abbrev() in that 672 * it stuffs the result with dots for alignment. 673 */ 674const char *diff_aligned_abbrev(const struct object_id *sha1, int); 675 676void diff_get_merge_base(const struct rev_info *revs, struct object_id *mb); 677 678/* do not report anything on removed paths */ 679#define DIFF_SILENT_ON_REMOVED 01 680/* report racily-clean paths as modified */ 681#define DIFF_RACY_IS_MODIFIED 02 682void run_diff_files(struct rev_info *revs, unsigned int option); 683 684#define DIFF_INDEX_CACHED 01 685#define DIFF_INDEX_MERGE_BASE 02 686void run_diff_index(struct rev_info *revs, unsigned int option); 687 688int do_diff_cache(const struct object_id *, struct diff_options *); 689int diff_flush_patch_id(struct diff_options *, struct object_id *, int); 690void flush_one_hunk(struct object_id *result, struct git_hash_ctx *ctx); 691 692int diff_result_code(struct rev_info *); 693 694int diff_no_index(struct rev_info *, const struct git_hash_algo *algop, 695 int implicit_no_index, int, const char **); 696 697int index_differs_from(struct repository *r, const char *def, 698 const struct diff_flags *flags, 699 int ita_invisible_in_index); 700 701/* 702 * Emit an interdiff of two object ID's to 'diff_options.file' optionally 703 * indented by 'indent' spaces. 704 */ 705void show_interdiff(const struct object_id *, const struct object_id *, 706 int indent, struct diff_options *); 707 708/* 709 * Fill the contents of the filespec "df", respecting any textconv defined by 710 * its userdiff driver. The "driver" parameter must come from a 711 * previous call to get_textconv(), and therefore should either be NULL or have 712 * textconv enabled. 713 * 714 * Note that the memory ownership of the resulting buffer depends on whether 715 * the driver field is NULL. If it is, then the memory belongs to the filespec 716 * struct. If it is non-NULL, then "outbuf" points to a newly allocated buffer 717 * that should be freed by the caller. 718 */ 719size_t fill_textconv(struct repository *r, 720 struct userdiff_driver *driver, 721 struct diff_filespec *df, 722 char **outbuf); 723 724/* 725 * Look up the userdiff driver for the given filespec, and return it if 726 * and only if it has textconv enabled (otherwise return NULL). The result 727 * can be passed to fill_textconv(). 728 */ 729struct userdiff_driver *get_textconv(struct repository *r, 730 struct diff_filespec *one); 731 732/* 733 * Prepare diff_filespec and convert it using diff textconv API 734 * if the textconv driver exists. 735 * Return 1 if the conversion succeeds, 0 otherwise. 736 */ 737int textconv_object(struct repository *repo, 738 const char *path, 739 unsigned mode, 740 const struct object_id *oid, int oid_valid, 741 char **buf, unsigned long *buf_size); 742 743int parse_rename_score(const char **cp_p); 744 745long parse_algorithm_value(const char *value); 746 747void print_stat_summary(FILE *fp, int files, 748 int insertions, int deletions); 749void setup_diff_pager(struct diff_options *); 750 751extern int diff_auto_refresh_index; 752 753#endif /* DIFF_H */