diff options
Diffstat (limited to 'diff.h')
-rw-r--r-- | diff.h | 177 |
1 files changed, 111 insertions, 66 deletions
@@ -14,7 +14,7 @@ struct diff_queue_struct; struct strbuf; struct diff_filespec; struct userdiff_driver; -struct sha1_array; +struct oid_array; struct commit; struct combine_diff_path; @@ -23,16 +23,16 @@ typedef int (*pathchange_fn_t)(struct diff_options *options, typedef void (*change_fn_t)(struct diff_options *options, unsigned old_mode, unsigned new_mode, - const unsigned char *old_sha1, - const unsigned char *new_sha1, - int old_sha1_valid, int new_sha1_valid, + const struct object_id *old_oid, + const struct object_id *new_oid, + int old_oid_valid, int new_oid_valid, const char *fullpath, unsigned old_dirty_submodule, unsigned new_dirty_submodule); typedef void (*add_remove_fn_t)(struct diff_options *options, int addremove, unsigned mode, - const unsigned char *sha1, - int sha1_valid, + const struct object_id *oid, + int oid_valid, const char *fullpath, unsigned dirty_submodule); typedef void (*diff_format_fn_t)(struct diff_queue_struct *q, @@ -60,42 +60,52 @@ typedef struct strbuf *(*diff_prefix_fn_t)(struct diff_options *opt, void *data) #define DIFF_FORMAT_CALLBACK 0x1000 -#define DIFF_OPT_RECURSIVE (1 << 0) -#define DIFF_OPT_TREE_IN_RECURSIVE (1 << 1) -#define DIFF_OPT_BINARY (1 << 2) -#define DIFF_OPT_TEXT (1 << 3) -#define DIFF_OPT_FULL_INDEX (1 << 4) -#define DIFF_OPT_SILENT_ON_REMOVE (1 << 5) -#define DIFF_OPT_FIND_COPIES_HARDER (1 << 6) -#define DIFF_OPT_FOLLOW_RENAMES (1 << 7) -#define DIFF_OPT_RENAME_EMPTY (1 << 8) -/* (1 << 9) unused */ -#define DIFF_OPT_HAS_CHANGES (1 << 10) -#define DIFF_OPT_QUICK (1 << 11) -#define DIFF_OPT_NO_INDEX (1 << 12) -#define DIFF_OPT_ALLOW_EXTERNAL (1 << 13) -#define DIFF_OPT_EXIT_WITH_STATUS (1 << 14) -#define DIFF_OPT_REVERSE_DIFF (1 << 15) -#define DIFF_OPT_CHECK_FAILED (1 << 16) -#define DIFF_OPT_RELATIVE_NAME (1 << 17) -#define DIFF_OPT_IGNORE_SUBMODULES (1 << 18) -#define DIFF_OPT_DIRSTAT_CUMULATIVE (1 << 19) -#define DIFF_OPT_DIRSTAT_BY_FILE (1 << 20) -#define DIFF_OPT_ALLOW_TEXTCONV (1 << 21) -#define DIFF_OPT_DIFF_FROM_CONTENTS (1 << 22) -#define DIFF_OPT_DIRTY_SUBMODULES (1 << 24) -#define DIFF_OPT_IGNORE_UNTRACKED_IN_SUBMODULES (1 << 25) -#define DIFF_OPT_IGNORE_DIRTY_SUBMODULES (1 << 26) -#define DIFF_OPT_OVERRIDE_SUBMODULE_CONFIG (1 << 27) -#define DIFF_OPT_DIRSTAT_BY_LINE (1 << 28) -#define DIFF_OPT_FUNCCONTEXT (1 << 29) -#define DIFF_OPT_PICKAXE_IGNORE_CASE (1 << 30) -#define DIFF_OPT_DEFAULT_FOLLOW_RENAMES (1U << 31) - -#define DIFF_OPT_TST(opts, flag) ((opts)->flags & DIFF_OPT_##flag) -#define DIFF_OPT_TOUCHED(opts, flag) ((opts)->touched_flags & DIFF_OPT_##flag) -#define DIFF_OPT_SET(opts, flag) (((opts)->flags |= DIFF_OPT_##flag),((opts)->touched_flags |= DIFF_OPT_##flag)) -#define DIFF_OPT_CLR(opts, flag) (((opts)->flags &= ~DIFF_OPT_##flag),((opts)->touched_flags |= DIFF_OPT_##flag)) +#define DIFF_FLAGS_INIT { 0 } +struct diff_flags { + unsigned recursive:1; + unsigned tree_in_recursive:1; + unsigned binary:1; + unsigned text:1; + unsigned full_index:1; + unsigned silent_on_remove:1; + unsigned find_copies_harder:1; + unsigned follow_renames:1; + unsigned rename_empty:1; + unsigned has_changes:1; + unsigned quick:1; + unsigned no_index:1; + unsigned allow_external:1; + unsigned exit_with_status:1; + unsigned reverse_diff:1; + unsigned check_failed:1; + unsigned relative_name:1; + unsigned ignore_submodules:1; + unsigned dirstat_cumulative:1; + unsigned dirstat_by_file:1; + unsigned allow_textconv:1; + unsigned textconv_set_via_cmdline:1; + unsigned diff_from_contents:1; + unsigned dirty_submodules:1; + unsigned ignore_untracked_in_submodules:1; + unsigned ignore_dirty_submodules:1; + unsigned override_submodule_config:1; + unsigned dirstat_by_line:1; + unsigned funccontext:1; + unsigned pickaxe_ignore_case:1; + unsigned default_follow_renames:1; +}; + +static inline void diff_flags_or(struct diff_flags *a, + const struct diff_flags *b) +{ + char *tmp_a = (char *)a; + const char *tmp_b = (const char *)b; + int i; + + for (i = 0; i < sizeof(struct diff_flags); i++) + tmp_a[i] |= tmp_b[i]; +} + #define DIFF_XDL_TST(opts, flag) ((opts)->xdl_opts & XDF_##flag) #define DIFF_XDL_SET(opts, flag) ((opts)->xdl_opts |= XDF_##flag) #define DIFF_XDL_CLR(opts, flag) ((opts)->xdl_opts &= ~XDF_##flag) @@ -122,8 +132,7 @@ struct diff_options { const char *a_prefix, *b_prefix; const char *line_prefix; size_t line_prefix_length; - unsigned flags; - unsigned touched_flags; + struct diff_flags flags; /* diff-filter bits */ unsigned int filter; @@ -148,9 +157,9 @@ struct diff_options { int abbrev; int ita_invisible_in_index; /* white-space error highlighting */ -#define WSEH_NEW 1 -#define WSEH_CONTEXT 2 -#define WSEH_OLD 4 +#define WSEH_NEW (1<<12) +#define WSEH_CONTEXT (1<<13) +#define WSEH_OLD (1<<14) unsigned ws_error_highlight; const char *prefix; int prefix_length; @@ -180,14 +189,34 @@ struct diff_options { pathchange_fn_t pathchange; change_fn_t change; add_remove_fn_t add_remove; + void *change_fn_data; diff_format_fn_t format_callback; void *format_callback_data; diff_prefix_fn_t output_prefix; void *output_prefix_data; int diff_path_counter; + + struct emitted_diff_symbols *emitted_symbols; + enum { + COLOR_MOVED_NO = 0, + COLOR_MOVED_PLAIN = 1, + COLOR_MOVED_ZEBRA = 2, + COLOR_MOVED_ZEBRA_DIM = 3, + } color_moved; + #define COLOR_MOVED_DEFAULT COLOR_MOVED_ZEBRA + #define COLOR_MOVED_MIN_ALNUM_COUNT 20 }; +void diff_emit_submodule_del(struct diff_options *o, const char *line); +void diff_emit_submodule_add(struct diff_options *o, const char *line); +void diff_emit_submodule_untracked(struct diff_options *o, const char *path); +void diff_emit_submodule_modified(struct diff_options *o, const char *path); +void diff_emit_submodule_header(struct diff_options *o, const char *header); +void diff_emit_submodule_error(struct diff_options *o, const char *err); +void diff_emit_submodule_pipethrough(struct diff_options *o, + const char *line, int len); + enum color_diff { DIFF_RESET = 0, DIFF_CONTEXT = 1, @@ -197,7 +226,15 @@ enum color_diff { DIFF_FILE_NEW = 5, DIFF_COMMIT = 6, DIFF_WHITESPACE = 7, - DIFF_FUNCINFO = 8 + DIFF_FUNCINFO = 8, + DIFF_FILE_OLD_MOVED = 9, + DIFF_FILE_OLD_MOVED_ALT = 10, + DIFF_FILE_OLD_MOVED_DIM = 11, + DIFF_FILE_OLD_MOVED_ALT_DIM = 12, + DIFF_FILE_NEW_MOVED = 13, + DIFF_FILE_NEW_MOVED_ALT = 14, + DIFF_FILE_NEW_MOVED_DIM = 15, + DIFF_FILE_NEW_MOVED_ALT_DIM = 16 }; const char *diff_get_color(int diff_use_color, enum color_diff ix); #define diff_get_color_opt(o, ix) \ @@ -210,13 +247,14 @@ const char *diff_line_prefix(struct diff_options *); extern const char mime_boundary_leader[]; extern struct combine_diff_path *diff_tree_paths( - struct combine_diff_path *p, const unsigned char *sha1, - const unsigned char **parent_sha1, int nparent, + struct combine_diff_path *p, const struct object_id *oid, + const struct object_id **parents_oid, int nparent, struct strbuf *base, struct diff_options *opt); -extern int diff_tree_sha1(const unsigned char *old, const unsigned char *new, - const char *base, struct diff_options *opt); -extern int diff_root_tree_sha1(const unsigned char *new, const char *base, - struct diff_options *opt); +extern int diff_tree_oid(const struct object_id *old_oid, + const struct object_id *new_oid, + const char *base, struct diff_options *opt); +extern int diff_root_tree_oid(const struct object_id *new_oid, const char *base, + struct diff_options *opt); struct combine_diff_path { struct combine_diff_path *next; @@ -236,7 +274,7 @@ struct combine_diff_path { extern void show_combined_diff(struct combine_diff_path *elem, int num_parent, int dense, struct rev_info *); -extern void diff_tree_combined(const unsigned char *sha1, const struct sha1_array *parents, int dense, struct rev_info *rev); +extern void diff_tree_combined(const struct object_id *oid, const struct oid_array *parents, int dense, struct rev_info *rev); extern void diff_tree_combined_merge(const struct commit *commit, int dense, struct rev_info *rev); @@ -247,16 +285,15 @@ extern int diff_can_quit_early(struct diff_options *); extern void diff_addremove(struct diff_options *, int addremove, unsigned mode, - const unsigned char *sha1, - int sha1_valid, + const struct object_id *oid, + int oid_valid, const char *fullpath, unsigned dirty_submodule); extern void diff_change(struct diff_options *, unsigned mode1, unsigned mode2, - const unsigned char *sha1, - const unsigned char *sha2, - int sha1_valid, - int sha2_valid, + const struct object_id *old_oid, + const struct object_id *new_oid, + int old_oid_valid, int new_oid_valid, const char *fullpath, unsigned dirty_submodule1, unsigned dirty_submodule2); @@ -354,14 +391,15 @@ extern const char *diff_aligned_abbrev(const struct object_id *sha1, int); extern int run_diff_files(struct rev_info *revs, unsigned int option); extern int run_diff_index(struct rev_info *revs, int cached); -extern int do_diff_cache(const unsigned char *, struct diff_options *); -extern int diff_flush_patch_id(struct diff_options *, unsigned char *, int); +extern int do_diff_cache(const struct object_id *, struct diff_options *); +extern int diff_flush_patch_id(struct diff_options *, struct object_id *, int); extern int diff_result_code(struct diff_options *, int); extern void diff_no_index(struct rev_info *, int, const char **); -extern int index_differs_from(const char *def, int diff_flags, int ita_invisible_in_index); +extern int index_differs_from(const char *def, const struct diff_flags *flags, + int ita_invisible_in_index); /* * Fill the contents of the filespec "df", respecting any textconv defined by @@ -385,12 +423,19 @@ extern size_t fill_textconv(struct userdiff_driver *driver, */ extern struct userdiff_driver *get_textconv(struct diff_filespec *one); +/* + * Prepare diff_filespec and convert it using diff textconv API + * if the textconv driver exists. + * Return 1 if the conversion succeeds, 0 otherwise. + */ +extern int textconv_object(const char *path, unsigned mode, const struct object_id *oid, int oid_valid, char **buf, unsigned long *buf_size); + extern int parse_rename_score(const char **cp_p); extern long parse_algorithm_value(const char *value); -extern int print_stat_summary(FILE *fp, int files, - int insertions, int deletions); +extern void print_stat_summary(FILE *fp, int files, + int insertions, int deletions); extern void setup_diff_pager(struct diff_options *); #endif /* DIFF_H */ |