summaryrefslogtreecommitdiff
path: root/include/git2/diff.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/git2/diff.h')
-rw-r--r--include/git2/diff.h58
1 files changed, 51 insertions, 7 deletions
diff --git a/include/git2/diff.h b/include/git2/diff.h
index 1932db029..f9dbb67e0 100644
--- a/include/git2/diff.h
+++ b/include/git2/diff.h
@@ -33,7 +33,7 @@ GIT_BEGIN_DECL
* Flags for diff options. A combination of these flags can be passed
* in via the `flags` value in the `git_diff_options`.
*/
-enum {
+typedef enum {
/** Normal diff, the default */
GIT_DIFF_NORMAL = 0,
/** Reverse the sides of the diff */
@@ -86,7 +86,7 @@ enum {
* mode set to tree. Note: the tree SHA will not be available.
*/
GIT_DIFF_INCLUDE_TYPECHANGE_TREES = (1 << 16),
-};
+} git_diff_option_t;
/**
* Structure describing options about how the diff should be executed.
@@ -95,7 +95,7 @@ enum {
* values. Similarly, passing NULL for the options structure will
* give the defaults. The default values are marked below.
*
- * - flags: a combination of the GIT_DIFF_... values above
+ * - flags: a combination of the git_diff_option_t values above
* - context_lines: number of lines of context to show around diffs
* - interhunk_lines: min lines between diff hunks to merge them
* - old_prefix: "directory" to prefix to old file names (default "a")
@@ -124,7 +124,7 @@ typedef struct git_diff_list git_diff_list;
* Most of the flags are just for internal consumption by libgit2,
* but some of them may be interesting to external users.
*/
-enum {
+typedef enum {
GIT_DIFF_FILE_VALID_OID = (1 << 0), /** `oid` value is known correct */
GIT_DIFF_FILE_FREE_PATH = (1 << 1), /** `path` is allocated memory */
GIT_DIFF_FILE_BINARY = (1 << 2), /** should be considered binary data */
@@ -132,7 +132,7 @@ enum {
GIT_DIFF_FILE_FREE_DATA = (1 << 4), /** internal file data is allocated */
GIT_DIFF_FILE_UNMAP_DATA = (1 << 5), /** internal file data is mmap'ed */
GIT_DIFF_FILE_NO_DATA = (1 << 6), /** file data should not be loaded */
-};
+} git_diff_file_flag_t;
/**
* What type of change is described by a git_diff_delta?
@@ -218,7 +218,7 @@ typedef int (*git_diff_hunk_fn)(
* output callbacks to demarcate lines that are actually part of
* the file or hunk headers.
*/
-enum {
+typedef enum {
/* These values will be sent to `git_diff_data_fn` along with the line */
GIT_DIFF_LINE_CONTEXT = ' ',
GIT_DIFF_LINE_ADDITION = '+',
@@ -233,7 +233,7 @@ enum {
GIT_DIFF_LINE_FILE_HDR = 'F',
GIT_DIFF_LINE_HUNK_HDR = 'H',
GIT_DIFF_LINE_BINARY = 'B'
-};
+} git_diff_line_t;
/**
* When iterating over a diff, callback that will be made per text diff
@@ -259,6 +259,36 @@ typedef int (*git_diff_data_fn)(
*/
typedef struct git_diff_patch git_diff_patch;
+/**
+ * Flags to control the behavior of diff rename/copy detection.
+ */
+typedef enum {
+ /** should we look for renames */
+ GIT_DIFF_DETECT_RENAMES = (1 << 0),
+ /** should we look for copies */
+ GIT_DIFF_DETECT_COPIES = (1 << 1),
+ /** should we consider unmodified files as possible copy sources */
+ GIT_DIFF_DETECT_COPIES_FROM_UNMODIFIED = (1 << 2),
+ /** should we split large rewrites into delete / add pairs */
+ GIT_DIFF_DETECT_BREAK_REWRITES = (1 << 3),
+} git_diff_detect_t;
+
+/**
+ * Control behavior of rename and copy detection
+ */
+typedef struct {
+ /** Combination of git_diff_detect_t values */
+ unsigned int flags;
+ /** Threshold on similarity index to consider a file renamed. */
+ unsigned int rename_threshold;
+ /** Threshold on similarity index to consider a file a copy. */
+ unsigned int copy_threshold;
+ /** Threshold on change % to split modify into delete/add pair. */
+ unsigned int break_rewrite_threshold;
+ /** Maximum rename/copy targets to check (diff.renameLimit) */
+ unsigned int target_limit;
+} git_diff_detect_options;
+
/** @name Diff List Generator Functions
*
@@ -374,6 +404,20 @@ GIT_EXTERN(int) git_diff_merge(
git_diff_list *onto,
const git_diff_list *from);
+/**
+ * Update a diff list with file renames, copies, etc.
+ *
+ * This modifies a diff list in place, replacing old entries that look
+ * like renames or copies with new entries reflecting those changes.
+ *
+ * @param diff Diff list to run detection algorithms on
+ * @param options Control how detection should be run, NULL for defaults
+ * @return 0 on success, -1 on failure
+ */
+GIT_EXTERN(int) git_diff_detect(
+ git_diff_list *diff,
+ git_diff_detect_options *options);
+
/**@}*/