mirror of
https://git.proxmox.com/git/libgit2
synced 2025-08-06 02:38:08 +00:00
Fix usage of "new" for fieldname in public header
This should restore the ability to include libgit2 headers in C++ projects.
This commit is contained in:
parent
bb97278ae8
commit
2de60205df
@ -55,8 +55,8 @@ typedef struct {
|
||||
uint32_t flags; /**< defaults to GIT_DIFF_NORMAL */
|
||||
uint16_t context_lines; /**< defaults to 3 */
|
||||
uint16_t interhunk_lines; /**< defaults to 3 */
|
||||
char *src_prefix; /**< defaults to "a" */
|
||||
char *dst_prefix; /**< defaults to "b" */
|
||||
char *old_prefix; /**< defaults to "a" */
|
||||
char *new_prefix; /**< defaults to "b" */
|
||||
git_strarray pathspec; /**< defaults to show all paths */
|
||||
} git_diff_options;
|
||||
|
||||
@ -113,11 +113,11 @@ typedef struct {
|
||||
* It will just use the git attributes for those files.
|
||||
*/
|
||||
typedef struct {
|
||||
git_diff_file old;
|
||||
git_diff_file new;
|
||||
git_diff_file old_file;
|
||||
git_diff_file new_file;
|
||||
git_delta_t status;
|
||||
unsigned int similarity; /**< for RENAMED and COPIED, value from 0 to 100 */
|
||||
int binary;
|
||||
unsigned int similarity; /**< for RENAMED and COPIED, value 0-100 */
|
||||
int binary;
|
||||
} git_diff_delta;
|
||||
|
||||
/**
|
||||
@ -209,15 +209,15 @@ GIT_EXTERN(void) git_diff_list_free(git_diff_list *diff);
|
||||
*
|
||||
* @param repo The repository containing the trees.
|
||||
* @param opts Structure with options to influence diff or NULL for defaults.
|
||||
* @param old A git_tree object to diff from.
|
||||
* @param new A git_tree object to diff to.
|
||||
* @param old_tree A git_tree object to diff from.
|
||||
* @param new_tree A git_tree object to diff to.
|
||||
* @param diff A pointer to a git_diff_list pointer that will be allocated.
|
||||
*/
|
||||
GIT_EXTERN(int) git_diff_tree_to_tree(
|
||||
git_repository *repo,
|
||||
const git_diff_options *opts, /**< can be NULL for defaults */
|
||||
git_tree *old,
|
||||
git_tree *new,
|
||||
git_tree *old_tree,
|
||||
git_tree *new_tree,
|
||||
git_diff_list **diff);
|
||||
|
||||
/**
|
||||
@ -225,13 +225,13 @@ GIT_EXTERN(int) git_diff_tree_to_tree(
|
||||
*
|
||||
* @param repo The repository containing the tree and index.
|
||||
* @param opts Structure with options to influence diff or NULL for defaults.
|
||||
* @param old A git_tree object to diff from.
|
||||
* @param old_tree A git_tree object to diff from.
|
||||
* @param diff A pointer to a git_diff_list pointer that will be allocated.
|
||||
*/
|
||||
GIT_EXTERN(int) git_diff_index_to_tree(
|
||||
git_repository *repo,
|
||||
const git_diff_options *opts, /**< can be NULL for defaults */
|
||||
git_tree *old,
|
||||
git_tree *old_tree,
|
||||
git_diff_list **diff);
|
||||
|
||||
/**
|
||||
@ -260,13 +260,13 @@ GIT_EXTERN(int) git_diff_workdir_to_index(
|
||||
*
|
||||
* @param repo The repository containing the tree.
|
||||
* @param opts Structure with options to influence diff or NULL for defaults.
|
||||
* @param old A git_tree object to diff from.
|
||||
* @param old_tree A git_tree object to diff from.
|
||||
* @param diff A pointer to a git_diff_list pointer that will be allocated.
|
||||
*/
|
||||
GIT_EXTERN(int) git_diff_workdir_to_tree(
|
||||
git_repository *repo,
|
||||
const git_diff_options *opts, /**< can be NULL for defaults */
|
||||
git_tree *old,
|
||||
git_tree *old_tree,
|
||||
git_diff_list **diff);
|
||||
|
||||
/**
|
||||
@ -341,8 +341,8 @@ GIT_EXTERN(int) git_diff_print_patch(
|
||||
*/
|
||||
GIT_EXTERN(int) git_diff_blobs(
|
||||
git_repository *repo,
|
||||
git_blob *old,
|
||||
git_blob *new,
|
||||
git_blob *old_blob,
|
||||
git_blob *new_blob,
|
||||
git_diff_options *options,
|
||||
void *cb_data,
|
||||
git_diff_hunk_fn hunk_cb,
|
||||
|
198
src/diff.c
198
src/diff.c
@ -14,14 +14,14 @@ static void diff_delta__free(git_diff_delta *delta)
|
||||
if (!delta)
|
||||
return;
|
||||
|
||||
if (delta->new.flags & GIT_DIFF_FILE_FREE_PATH) {
|
||||
git__free((char *)delta->new.path);
|
||||
delta->new.path = NULL;
|
||||
if (delta->new_file.flags & GIT_DIFF_FILE_FREE_PATH) {
|
||||
git__free((char *)delta->new_file.path);
|
||||
delta->new_file.path = NULL;
|
||||
}
|
||||
|
||||
if (delta->old.flags & GIT_DIFF_FILE_FREE_PATH) {
|
||||
git__free((char *)delta->old.path);
|
||||
delta->old.path = NULL;
|
||||
if (delta->old_file.flags & GIT_DIFF_FILE_FREE_PATH) {
|
||||
git__free((char *)delta->old_file.path);
|
||||
delta->old_file.path = NULL;
|
||||
}
|
||||
|
||||
git__free(delta);
|
||||
@ -36,13 +36,13 @@ static git_diff_delta *diff_delta__alloc(
|
||||
if (!delta)
|
||||
return NULL;
|
||||
|
||||
delta->old.path = git__strdup(path);
|
||||
if (delta->old.path == NULL) {
|
||||
delta->old_file.path = git__strdup(path);
|
||||
if (delta->old_file.path == NULL) {
|
||||
git__free(delta);
|
||||
return NULL;
|
||||
}
|
||||
delta->old.flags |= GIT_DIFF_FILE_FREE_PATH;
|
||||
delta->new.path = delta->old.path;
|
||||
delta->old_file.flags |= GIT_DIFF_FILE_FREE_PATH;
|
||||
delta->new_file.path = delta->old_file.path;
|
||||
|
||||
if (diff->opts.flags & GIT_DIFF_REVERSE) {
|
||||
switch (status) {
|
||||
@ -64,24 +64,24 @@ static git_diff_delta *diff_delta__dup(const git_diff_delta *d)
|
||||
|
||||
memcpy(delta, d, sizeof(git_diff_delta));
|
||||
|
||||
delta->old.path = git__strdup(d->old.path);
|
||||
if (delta->old.path == NULL) {
|
||||
delta->old_file.path = git__strdup(d->old_file.path);
|
||||
if (delta->old_file.path == NULL) {
|
||||
git__free(delta);
|
||||
return NULL;
|
||||
}
|
||||
delta->old.flags |= GIT_DIFF_FILE_FREE_PATH;
|
||||
delta->old_file.flags |= GIT_DIFF_FILE_FREE_PATH;
|
||||
|
||||
if (d->new.path != d->old.path) {
|
||||
delta->new.path = git__strdup(d->new.path);
|
||||
if (delta->new.path == NULL) {
|
||||
git__free(delta->old.path);
|
||||
if (d->new_file.path != d->old_file.path) {
|
||||
delta->new_file.path = git__strdup(d->new_file.path);
|
||||
if (delta->new_file.path == NULL) {
|
||||
git__free(delta->old_file.path);
|
||||
git__free(delta);
|
||||
return NULL;
|
||||
}
|
||||
delta->new.flags |= GIT_DIFF_FILE_FREE_PATH;
|
||||
delta->new_file.flags |= GIT_DIFF_FILE_FREE_PATH;
|
||||
} else {
|
||||
delta->new.path = delta->old.path;
|
||||
delta->new.flags &= ~GIT_DIFF_FILE_FREE_PATH;
|
||||
delta->new_file.path = delta->old_file.path;
|
||||
delta->new_file.flags &= ~GIT_DIFF_FILE_FREE_PATH;
|
||||
}
|
||||
|
||||
return delta;
|
||||
@ -94,16 +94,16 @@ static git_diff_delta *diff_delta__merge_like_cgit(
|
||||
if (!dup)
|
||||
return NULL;
|
||||
|
||||
if (git_oid_cmp(&dup->new.oid, &b->new.oid) == 0)
|
||||
if (git_oid_cmp(&dup->new_file.oid, &b->new_file.oid) == 0)
|
||||
return dup;
|
||||
|
||||
git_oid_cpy(&dup->new.oid, &b->new.oid);
|
||||
git_oid_cpy(&dup->new_file.oid, &b->new_file.oid);
|
||||
|
||||
dup->new.mode = b->new.mode;
|
||||
dup->new.size = b->new.size;
|
||||
dup->new.flags =
|
||||
(dup->new.flags & GIT_DIFF_FILE_FREE_PATH) |
|
||||
(b->new.flags & ~GIT_DIFF_FILE_FREE_PATH);
|
||||
dup->new_file.mode = b->new_file.mode;
|
||||
dup->new_file.size = b->new_file.size;
|
||||
dup->new_file.flags =
|
||||
(dup->new_file.flags & GIT_DIFF_FILE_FREE_PATH) |
|
||||
(b->new_file.flags & ~GIT_DIFF_FILE_FREE_PATH);
|
||||
|
||||
/* Emulate C git for merging two diffs (a la 'git diff <sha>').
|
||||
*
|
||||
@ -111,7 +111,7 @@ static git_diff_delta *diff_delta__merge_like_cgit(
|
||||
* diffs with the index but uses the workdir contents. This emulates
|
||||
* those choices so we can emulate the type of diff.
|
||||
*/
|
||||
if (git_oid_cmp(&dup->old.oid, &dup->new.oid) == 0) {
|
||||
if (git_oid_cmp(&dup->old_file.oid, &dup->new_file.oid) == 0) {
|
||||
if (dup->status == GIT_DELTA_DELETED)
|
||||
/* preserve pending delete info */;
|
||||
else if (b->status == GIT_DELTA_UNTRACKED ||
|
||||
@ -141,17 +141,17 @@ static int diff_delta__from_one(
|
||||
assert(status != GIT_DELTA_MODIFIED);
|
||||
|
||||
if (delta->status == GIT_DELTA_DELETED) {
|
||||
delta->old.mode = entry->mode;
|
||||
delta->old.size = entry->file_size;
|
||||
git_oid_cpy(&delta->old.oid, &entry->oid);
|
||||
delta->old_file.mode = entry->mode;
|
||||
delta->old_file.size = entry->file_size;
|
||||
git_oid_cpy(&delta->old_file.oid, &entry->oid);
|
||||
} else /* ADDED, IGNORED, UNTRACKED */ {
|
||||
delta->new.mode = entry->mode;
|
||||
delta->new.size = entry->file_size;
|
||||
git_oid_cpy(&delta->new.oid, &entry->oid);
|
||||
delta->new_file.mode = entry->mode;
|
||||
delta->new_file.size = entry->file_size;
|
||||
git_oid_cpy(&delta->new_file.oid, &entry->oid);
|
||||
}
|
||||
|
||||
delta->old.flags |= GIT_DIFF_FILE_VALID_OID;
|
||||
delta->new.flags |= GIT_DIFF_FILE_VALID_OID;
|
||||
delta->old_file.flags |= GIT_DIFF_FILE_VALID_OID;
|
||||
delta->new_file.flags |= GIT_DIFF_FILE_VALID_OID;
|
||||
|
||||
if ((error = git_vector_insert(&diff->deltas, delta)) < GIT_SUCCESS)
|
||||
diff_delta__free(delta);
|
||||
@ -162,31 +162,31 @@ static int diff_delta__from_one(
|
||||
static int diff_delta__from_two(
|
||||
git_diff_list *diff,
|
||||
git_delta_t status,
|
||||
const git_index_entry *old,
|
||||
const git_index_entry *new,
|
||||
const git_index_entry *old_entry,
|
||||
const git_index_entry *new_entry,
|
||||
git_oid *new_oid)
|
||||
{
|
||||
int error;
|
||||
git_diff_delta *delta;
|
||||
|
||||
if ((diff->opts.flags & GIT_DIFF_REVERSE) != 0) {
|
||||
const git_index_entry *temp = old;
|
||||
old = new;
|
||||
new = temp;
|
||||
const git_index_entry *temp = old_entry;
|
||||
old_entry = new_entry;
|
||||
new_entry = temp;
|
||||
}
|
||||
|
||||
delta = diff_delta__alloc(diff, status, old->path);
|
||||
delta = diff_delta__alloc(diff, status, old_entry->path);
|
||||
if (!delta)
|
||||
return git__rethrow(GIT_ENOMEM, "Could not allocate diff record");
|
||||
|
||||
delta->old.mode = old->mode;
|
||||
git_oid_cpy(&delta->old.oid, &old->oid);
|
||||
delta->old.flags |= GIT_DIFF_FILE_VALID_OID;
|
||||
delta->old_file.mode = old_entry->mode;
|
||||
git_oid_cpy(&delta->old_file.oid, &old_entry->oid);
|
||||
delta->old_file.flags |= GIT_DIFF_FILE_VALID_OID;
|
||||
|
||||
delta->new.mode = new->mode;
|
||||
git_oid_cpy(&delta->new.oid, new_oid ? new_oid : &new->oid);
|
||||
if (new_oid || !git_oid_iszero(&new->oid))
|
||||
delta->new.flags |= GIT_DIFF_FILE_VALID_OID;
|
||||
delta->new_file.mode = new_entry->mode;
|
||||
git_oid_cpy(&delta->new_file.oid, new_oid ? new_oid : &new_entry->oid);
|
||||
if (new_oid || !git_oid_iszero(&new_entry->oid))
|
||||
delta->new_file.flags |= GIT_DIFF_FILE_VALID_OID;
|
||||
|
||||
if ((error = git_vector_insert(&diff->deltas, delta)) < GIT_SUCCESS)
|
||||
diff_delta__free(delta);
|
||||
@ -194,8 +194,8 @@ static int diff_delta__from_two(
|
||||
return error;
|
||||
}
|
||||
|
||||
#define DIFF_SRC_PREFIX_DEFAULT "a/"
|
||||
#define DIFF_DST_PREFIX_DEFAULT "b/"
|
||||
#define DIFF_OLD_PREFIX_DEFAULT "a/"
|
||||
#define DIFF_NEW_PREFIX_DEFAULT "b/"
|
||||
|
||||
static char *diff_strdup_prefix(const char *prefix)
|
||||
{
|
||||
@ -215,7 +215,7 @@ static char *diff_strdup_prefix(const char *prefix)
|
||||
static int diff_delta__cmp(const void *a, const void *b)
|
||||
{
|
||||
const git_diff_delta *da = a, *db = b;
|
||||
int val = strcmp(da->old.path, db->old.path);
|
||||
int val = strcmp(da->old_file.path, db->old_file.path);
|
||||
return val ? val : ((int)da->status - (int)db->status);
|
||||
}
|
||||
|
||||
@ -233,25 +233,25 @@ static git_diff_list *git_diff_list_alloc(
|
||||
|
||||
memcpy(&diff->opts, opts, sizeof(git_diff_options));
|
||||
|
||||
diff->opts.src_prefix = diff_strdup_prefix(
|
||||
opts->src_prefix ? opts->src_prefix : DIFF_SRC_PREFIX_DEFAULT);
|
||||
diff->opts.dst_prefix = diff_strdup_prefix(
|
||||
opts->dst_prefix ? opts->dst_prefix : DIFF_DST_PREFIX_DEFAULT);
|
||||
diff->opts.old_prefix = diff_strdup_prefix(
|
||||
opts->old_prefix ? opts->old_prefix : DIFF_OLD_PREFIX_DEFAULT);
|
||||
diff->opts.new_prefix = diff_strdup_prefix(
|
||||
opts->new_prefix ? opts->new_prefix : DIFF_NEW_PREFIX_DEFAULT);
|
||||
|
||||
if (!diff->opts.src_prefix || !diff->opts.dst_prefix) {
|
||||
if (!diff->opts.old_prefix || !diff->opts.new_prefix) {
|
||||
git__free(diff);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (diff->opts.flags & GIT_DIFF_REVERSE) {
|
||||
char *swap = diff->opts.src_prefix;
|
||||
diff->opts.src_prefix = diff->opts.dst_prefix;
|
||||
diff->opts.dst_prefix = swap;
|
||||
char *swap = diff->opts.old_prefix;
|
||||
diff->opts.old_prefix = diff->opts.new_prefix;
|
||||
diff->opts.new_prefix = swap;
|
||||
}
|
||||
|
||||
if (git_vector_init(&diff->deltas, 0, diff_delta__cmp) < GIT_SUCCESS) {
|
||||
git__free(diff->opts.src_prefix);
|
||||
git__free(diff->opts.dst_prefix);
|
||||
git__free(diff->opts.old_prefix);
|
||||
git__free(diff->opts.new_prefix);
|
||||
git__free(diff);
|
||||
return NULL;
|
||||
}
|
||||
@ -274,8 +274,8 @@ void git_diff_list_free(git_diff_list *diff)
|
||||
diff->deltas.contents[i] = NULL;
|
||||
}
|
||||
git_vector_free(&diff->deltas);
|
||||
git__free(diff->opts.src_prefix);
|
||||
git__free(diff->opts.dst_prefix);
|
||||
git__free(diff->opts.old_prefix);
|
||||
git__free(diff->opts.new_prefix);
|
||||
git__free(diff);
|
||||
}
|
||||
|
||||
@ -316,16 +316,16 @@ static int oid_for_workdir_item(
|
||||
}
|
||||
|
||||
static int maybe_modified(
|
||||
git_iterator *old,
|
||||
git_iterator *old_iter,
|
||||
const git_index_entry *oitem,
|
||||
git_iterator *new,
|
||||
git_iterator *new_iter,
|
||||
const git_index_entry *nitem,
|
||||
git_diff_list *diff)
|
||||
{
|
||||
int error = GIT_SUCCESS;
|
||||
git_oid noid, *use_noid = NULL;
|
||||
|
||||
GIT_UNUSED(old);
|
||||
GIT_UNUSED(old_iter);
|
||||
|
||||
/* support "assume unchanged" & "skip worktree" bits */
|
||||
if ((oitem->flags_extended & GIT_IDXENTRY_INTENT_TO_ADD) != 0 ||
|
||||
@ -343,7 +343,7 @@ static int maybe_modified(
|
||||
oitem->mode == nitem->mode)
|
||||
return GIT_SUCCESS;
|
||||
|
||||
if (git_oid_iszero(&nitem->oid) && new->type == GIT_ITERATOR_WORKDIR) {
|
||||
if (git_oid_iszero(&nitem->oid) && new_iter->type == GIT_ITERATOR_WORKDIR) {
|
||||
/* if they files look exactly alike, then we'll assume the same */
|
||||
if (oitem->file_size == nitem->file_size &&
|
||||
oitem->ctime.seconds == nitem->ctime.seconds &&
|
||||
@ -376,8 +376,8 @@ static int maybe_modified(
|
||||
static int diff_from_iterators(
|
||||
git_repository *repo,
|
||||
const git_diff_options *opts, /**< can be NULL for defaults */
|
||||
git_iterator *old,
|
||||
git_iterator *new,
|
||||
git_iterator *old_iter,
|
||||
git_iterator *new_iter,
|
||||
git_diff_list **diff_ptr)
|
||||
{
|
||||
int error;
|
||||
@ -389,11 +389,11 @@ static int diff_from_iterators(
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
diff->old_src = old->type;
|
||||
diff->new_src = new->type;
|
||||
diff->old_src = old_iter->type;
|
||||
diff->new_src = new_iter->type;
|
||||
|
||||
if ((error = git_iterator_current(old, &oitem)) < GIT_SUCCESS ||
|
||||
(error = git_iterator_current(new, &nitem)) < GIT_SUCCESS)
|
||||
if ((error = git_iterator_current(old_iter, &oitem)) < GIT_SUCCESS ||
|
||||
(error = git_iterator_current(new_iter, &nitem)) < GIT_SUCCESS)
|
||||
goto cleanup;
|
||||
|
||||
/* run iterators building diffs */
|
||||
@ -403,7 +403,7 @@ static int diff_from_iterators(
|
||||
if (oitem && (!nitem || strcmp(oitem->path, nitem->path) < 0)) {
|
||||
error = diff_delta__from_one(diff, GIT_DELTA_DELETED, oitem);
|
||||
if (error == GIT_SUCCESS)
|
||||
error = git_iterator_advance(old, &oitem);
|
||||
error = git_iterator_advance(old_iter, &oitem);
|
||||
continue;
|
||||
}
|
||||
|
||||
@ -418,29 +418,29 @@ static int diff_from_iterators(
|
||||
if (ignore_prefix != NULL &&
|
||||
git__prefixcmp(nitem->path, ignore_prefix) == 0)
|
||||
{
|
||||
error = git_iterator_advance(new, &nitem);
|
||||
error = git_iterator_advance(new_iter, &nitem);
|
||||
continue;
|
||||
}
|
||||
|
||||
is_ignored = git_iterator_current_is_ignored(new);
|
||||
is_ignored = git_iterator_current_is_ignored(new_iter);
|
||||
|
||||
if (S_ISDIR(nitem->mode)) {
|
||||
if (git__prefixcmp(oitem->path, nitem->path) == 0) {
|
||||
if (is_ignored)
|
||||
ignore_prefix = nitem->path;
|
||||
error = git_iterator_advance_into_directory(new, &nitem);
|
||||
error = git_iterator_advance_into_directory(new_iter, &nitem);
|
||||
continue;
|
||||
}
|
||||
delta_type = GIT_DELTA_UNTRACKED;
|
||||
}
|
||||
else if (is_ignored)
|
||||
delta_type = GIT_DELTA_IGNORED;
|
||||
else if (new->type == GIT_ITERATOR_WORKDIR)
|
||||
else if (new_iter->type == GIT_ITERATOR_WORKDIR)
|
||||
delta_type = GIT_DELTA_UNTRACKED;
|
||||
|
||||
error = diff_delta__from_one(diff, delta_type, nitem);
|
||||
if (error == GIT_SUCCESS)
|
||||
error = git_iterator_advance(new, &nitem);
|
||||
error = git_iterator_advance(new_iter, &nitem);
|
||||
continue;
|
||||
}
|
||||
|
||||
@ -449,16 +449,16 @@ static int diff_from_iterators(
|
||||
*/
|
||||
assert(oitem && nitem && strcmp(oitem->path, nitem->path) == 0);
|
||||
|
||||
error = maybe_modified(old, oitem, new, nitem, diff);
|
||||
error = maybe_modified(old_iter, oitem, new_iter, nitem, diff);
|
||||
if (error == GIT_SUCCESS)
|
||||
error = git_iterator_advance(old, &oitem);
|
||||
error = git_iterator_advance(old_iter, &oitem);
|
||||
if (error == GIT_SUCCESS)
|
||||
error = git_iterator_advance(new, &nitem);
|
||||
error = git_iterator_advance(new_iter, &nitem);
|
||||
}
|
||||
|
||||
cleanup:
|
||||
git_iterator_free(old);
|
||||
git_iterator_free(new);
|
||||
git_iterator_free(old_iter);
|
||||
git_iterator_free(new_iter);
|
||||
|
||||
if (error != GIT_SUCCESS) {
|
||||
git_diff_list_free(diff);
|
||||
@ -474,17 +474,17 @@ cleanup:
|
||||
int git_diff_tree_to_tree(
|
||||
git_repository *repo,
|
||||
const git_diff_options *opts, /**< can be NULL for defaults */
|
||||
git_tree *old,
|
||||
git_tree *new,
|
||||
git_tree *old_tree,
|
||||
git_tree *new_tree,
|
||||
git_diff_list **diff)
|
||||
{
|
||||
int error;
|
||||
git_iterator *a = NULL, *b = NULL;
|
||||
|
||||
assert(repo && old && new && diff);
|
||||
assert(repo && old_tree && new_tree && diff);
|
||||
|
||||
if ((error = git_iterator_for_tree(repo, old, &a)) < GIT_SUCCESS ||
|
||||
(error = git_iterator_for_tree(repo, new, &b)) < GIT_SUCCESS)
|
||||
if ((error = git_iterator_for_tree(repo, old_tree, &a)) < GIT_SUCCESS ||
|
||||
(error = git_iterator_for_tree(repo, new_tree, &b)) < GIT_SUCCESS)
|
||||
return error;
|
||||
|
||||
return diff_from_iterators(repo, opts, a, b, diff);
|
||||
@ -493,15 +493,15 @@ int git_diff_tree_to_tree(
|
||||
int git_diff_index_to_tree(
|
||||
git_repository *repo,
|
||||
const git_diff_options *opts,
|
||||
git_tree *old,
|
||||
git_tree *old_tree,
|
||||
git_diff_list **diff)
|
||||
{
|
||||
int error;
|
||||
git_iterator *a = NULL, *b = NULL;
|
||||
|
||||
assert(repo && old && diff);
|
||||
assert(repo && old_tree && diff);
|
||||
|
||||
if ((error = git_iterator_for_tree(repo, old, &a)) < GIT_SUCCESS ||
|
||||
if ((error = git_iterator_for_tree(repo, old_tree, &a)) < GIT_SUCCESS ||
|
||||
(error = git_iterator_for_index(repo, &b)) < GIT_SUCCESS)
|
||||
return error;
|
||||
|
||||
@ -529,15 +529,15 @@ int git_diff_workdir_to_index(
|
||||
int git_diff_workdir_to_tree(
|
||||
git_repository *repo,
|
||||
const git_diff_options *opts,
|
||||
git_tree *old,
|
||||
git_tree *old_tree,
|
||||
git_diff_list **diff)
|
||||
{
|
||||
int error;
|
||||
git_iterator *a = NULL, *b = NULL;
|
||||
|
||||
assert(repo && old && diff);
|
||||
assert(repo && old_tree && diff);
|
||||
|
||||
if ((error = git_iterator_for_tree(repo, old, &a)) < GIT_SUCCESS ||
|
||||
if ((error = git_iterator_for_tree(repo, old_tree, &a)) < GIT_SUCCESS ||
|
||||
(error = git_iterator_for_workdir(repo, &b)) < GIT_SUCCESS)
|
||||
return error;
|
||||
|
||||
@ -560,8 +560,10 @@ int git_diff_merge(
|
||||
while (i < onto->deltas.length || j < from->deltas.length) {
|
||||
git_diff_delta *o = git_vector_get(&onto->deltas, i);
|
||||
const git_diff_delta *f = git_vector_get_const(&from->deltas, j);
|
||||
const char *opath = !o ? NULL : o->old.path ? o->old.path : o->new.path;
|
||||
const char *fpath = !f ? NULL : f->old.path ? f->old.path : f->new.path;
|
||||
const char *opath =
|
||||
!o ? NULL : o->old_file.path ? o->old_file.path : o->new_file.path;
|
||||
const char *fpath =
|
||||
!f ? NULL : f->old_file.path ? f->old_file.path : f->new_file.path;
|
||||
|
||||
if (opath && (!fpath || strcmp(opath, fpath) < 0)) {
|
||||
delta = diff_delta__dup(o);
|
||||
|
@ -103,11 +103,11 @@ static int set_file_is_binary_by_attr(git_repository *repo, git_diff_file *file)
|
||||
|
||||
static void set_delta_is_binary(git_diff_delta *delta)
|
||||
{
|
||||
if ((delta->old.flags & GIT_DIFF_FILE_BINARY) != 0 ||
|
||||
(delta->new.flags & GIT_DIFF_FILE_BINARY) != 0)
|
||||
if ((delta->old_file.flags & GIT_DIFF_FILE_BINARY) != 0 ||
|
||||
(delta->new_file.flags & GIT_DIFF_FILE_BINARY) != 0)
|
||||
delta->binary = 1;
|
||||
else if ((delta->old.flags & GIT_DIFF_FILE_NOT_BINARY) != 0 ||
|
||||
(delta->new.flags & GIT_DIFF_FILE_NOT_BINARY) != 0)
|
||||
else if ((delta->old_file.flags & GIT_DIFF_FILE_NOT_BINARY) != 0 ||
|
||||
(delta->new_file.flags & GIT_DIFF_FILE_NOT_BINARY) != 0)
|
||||
delta->binary = 0;
|
||||
/* otherwise leave delta->binary value untouched */
|
||||
}
|
||||
@ -121,34 +121,34 @@ static int file_is_binary_by_attr(
|
||||
delta->binary = -1;
|
||||
|
||||
/* make sure files are conceivably mmap-able */
|
||||
if ((git_off_t)((size_t)delta->old.size) != delta->old.size ||
|
||||
(git_off_t)((size_t)delta->new.size) != delta->new.size)
|
||||
if ((git_off_t)((size_t)delta->old_file.size) != delta->old_file.size ||
|
||||
(git_off_t)((size_t)delta->new_file.size) != delta->new_file.size)
|
||||
{
|
||||
delta->old.flags |= GIT_DIFF_FILE_BINARY;
|
||||
delta->new.flags |= GIT_DIFF_FILE_BINARY;
|
||||
delta->old_file.flags |= GIT_DIFF_FILE_BINARY;
|
||||
delta->new_file.flags |= GIT_DIFF_FILE_BINARY;
|
||||
delta->binary = 1;
|
||||
return GIT_SUCCESS;
|
||||
}
|
||||
|
||||
/* check if user is forcing us to text diff these files */
|
||||
if (diff->opts.flags & GIT_DIFF_FORCE_TEXT) {
|
||||
delta->old.flags |= GIT_DIFF_FILE_NOT_BINARY;
|
||||
delta->new.flags |= GIT_DIFF_FILE_NOT_BINARY;
|
||||
delta->old_file.flags |= GIT_DIFF_FILE_NOT_BINARY;
|
||||
delta->new_file.flags |= GIT_DIFF_FILE_NOT_BINARY;
|
||||
delta->binary = 0;
|
||||
return GIT_SUCCESS;
|
||||
}
|
||||
|
||||
/* check diff attribute +, -, or 0 */
|
||||
error = set_file_is_binary_by_attr(diff->repo, &delta->old);
|
||||
error = set_file_is_binary_by_attr(diff->repo, &delta->old_file);
|
||||
if (error != GIT_SUCCESS)
|
||||
return error;
|
||||
|
||||
mirror_new = (delta->new.path == delta->old.path ||
|
||||
strcmp(delta->new.path, delta->old.path) == 0);
|
||||
mirror_new = (delta->new_file.path == delta->old_file.path ||
|
||||
strcmp(delta->new_file.path, delta->old_file.path) == 0);
|
||||
if (mirror_new)
|
||||
delta->new.flags &= (delta->old.flags & BINARY_DIFF_FLAGS);
|
||||
delta->new_file.flags &= (delta->old_file.flags & BINARY_DIFF_FLAGS);
|
||||
else
|
||||
error = set_file_is_binary_by_attr(diff->repo, &delta->new);
|
||||
error = set_file_is_binary_by_attr(diff->repo, &delta->new_file);
|
||||
|
||||
set_delta_is_binary(delta);
|
||||
|
||||
@ -163,20 +163,20 @@ static int file_is_binary_by_content(
|
||||
{
|
||||
GIT_UNUSED(diff);
|
||||
|
||||
if ((delta->old.flags & BINARY_DIFF_FLAGS) == 0) {
|
||||
if ((delta->old_file.flags & BINARY_DIFF_FLAGS) == 0) {
|
||||
size_t search_len = min(old_data->len, 4000);
|
||||
if (strnlen(old_data->data, search_len) != search_len)
|
||||
delta->old.flags |= GIT_DIFF_FILE_BINARY;
|
||||
delta->old_file.flags |= GIT_DIFF_FILE_BINARY;
|
||||
else
|
||||
delta->old.flags |= GIT_DIFF_FILE_NOT_BINARY;
|
||||
delta->old_file.flags |= GIT_DIFF_FILE_NOT_BINARY;
|
||||
}
|
||||
|
||||
if ((delta->new.flags & BINARY_DIFF_FLAGS) == 0) {
|
||||
if ((delta->new_file.flags & BINARY_DIFF_FLAGS) == 0) {
|
||||
size_t search_len = min(new_data->len, 4000);
|
||||
if (strnlen(new_data->data, search_len) != search_len)
|
||||
delta->new.flags |= GIT_DIFF_FILE_BINARY;
|
||||
delta->new_file.flags |= GIT_DIFF_FILE_BINARY;
|
||||
else
|
||||
delta->new.flags |= GIT_DIFF_FILE_NOT_BINARY;
|
||||
delta->new_file.flags |= GIT_DIFF_FILE_NOT_BINARY;
|
||||
}
|
||||
|
||||
set_delta_is_binary(delta);
|
||||
@ -341,37 +341,37 @@ int git_diff_foreach(
|
||||
delta->status == GIT_DELTA_MODIFIED))
|
||||
{
|
||||
if (diff->old_src == GIT_ITERATOR_WORKDIR)
|
||||
error = get_workdir_content(diff->repo, &delta->old, &old_data);
|
||||
error = get_workdir_content(diff->repo, &delta->old_file, &old_data);
|
||||
else
|
||||
error = get_blob_content(
|
||||
diff->repo, &delta->old.oid, &old_data, &old_blob);
|
||||
diff->repo, &delta->old_file.oid, &old_data, &old_blob);
|
||||
if (error != GIT_SUCCESS)
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
if (delta->binary != 1 &&
|
||||
(hunk_cb || line_cb || git_oid_iszero(&delta->new.oid)) &&
|
||||
(hunk_cb || line_cb || git_oid_iszero(&delta->new_file.oid)) &&
|
||||
(delta->status == GIT_DELTA_ADDED ||
|
||||
delta->status == GIT_DELTA_MODIFIED))
|
||||
{
|
||||
if (diff->new_src == GIT_ITERATOR_WORKDIR)
|
||||
error = get_workdir_content(diff->repo, &delta->new, &new_data);
|
||||
error = get_workdir_content(diff->repo, &delta->new_file, &new_data);
|
||||
else
|
||||
error = get_blob_content(
|
||||
diff->repo, &delta->new.oid, &new_data, &new_blob);
|
||||
diff->repo, &delta->new_file.oid, &new_data, &new_blob);
|
||||
if (error != GIT_SUCCESS)
|
||||
goto cleanup;
|
||||
|
||||
if ((delta->new.flags | GIT_DIFF_FILE_VALID_OID) == 0) {
|
||||
if ((delta->new_file.flags | GIT_DIFF_FILE_VALID_OID) == 0) {
|
||||
error = git_odb_hash(
|
||||
&delta->new.oid, new_data.data, new_data.len, GIT_OBJ_BLOB);
|
||||
&delta->new_file.oid, new_data.data, new_data.len, GIT_OBJ_BLOB);
|
||||
if (error != GIT_SUCCESS)
|
||||
goto cleanup;
|
||||
|
||||
/* since we did not have the definitive oid, we may have
|
||||
* incorrect status and need to skip this item.
|
||||
*/
|
||||
if (git_oid_cmp(&delta->old.oid, &delta->new.oid) == 0) {
|
||||
if (git_oid_cmp(&delta->old_file.oid, &delta->new_file.oid) == 0) {
|
||||
delta->status = GIT_DELTA_UNMODIFIED;
|
||||
goto cleanup;
|
||||
}
|
||||
@ -414,8 +414,8 @@ int git_diff_foreach(
|
||||
&xdiff_params, &xdiff_config, &xdiff_callback);
|
||||
|
||||
cleanup:
|
||||
release_content(&delta->old, &old_data, old_blob);
|
||||
release_content(&delta->new, &new_data, new_blob);
|
||||
release_content(&delta->old_file, &old_data, old_blob);
|
||||
release_content(&delta->new_file, &new_data, new_blob);
|
||||
|
||||
if (error != GIT_SUCCESS)
|
||||
break;
|
||||
@ -464,23 +464,23 @@ static int print_compact(void *data, git_diff_delta *delta, float progress)
|
||||
if (!code)
|
||||
return GIT_SUCCESS;
|
||||
|
||||
old_suffix = pick_suffix(delta->old.mode);
|
||||
new_suffix = pick_suffix(delta->new.mode);
|
||||
old_suffix = pick_suffix(delta->old_file.mode);
|
||||
new_suffix = pick_suffix(delta->new_file.mode);
|
||||
|
||||
git_buf_clear(pi->buf);
|
||||
|
||||
if (delta->old.path != delta->new.path &&
|
||||
strcmp(delta->old.path,delta->new.path) != 0)
|
||||
if (delta->old_file.path != delta->new_file.path &&
|
||||
strcmp(delta->old_file.path,delta->new_file.path) != 0)
|
||||
git_buf_printf(pi->buf, "%c\t%s%c -> %s%c\n", code,
|
||||
delta->old.path, old_suffix, delta->new.path, new_suffix);
|
||||
else if (delta->old.mode != delta->new.mode &&
|
||||
delta->old.mode != 0 && delta->new.mode != 0)
|
||||
delta->old_file.path, old_suffix, delta->new_file.path, new_suffix);
|
||||
else if (delta->old_file.mode != delta->new_file.mode &&
|
||||
delta->old_file.mode != 0 && delta->new_file.mode != 0)
|
||||
git_buf_printf(pi->buf, "%c\t%s%c (%o -> %o)\n", code,
|
||||
delta->old.path, new_suffix, delta->old.mode, delta->new.mode);
|
||||
delta->old_file.path, new_suffix, delta->old_file.mode, delta->new_file.mode);
|
||||
else if (old_suffix != ' ')
|
||||
git_buf_printf(pi->buf, "%c\t%s%c\n", code, delta->old.path, old_suffix);
|
||||
git_buf_printf(pi->buf, "%c\t%s%c\n", code, delta->old_file.path, old_suffix);
|
||||
else
|
||||
git_buf_printf(pi->buf, "%c\t%s\n", code, delta->old.path);
|
||||
git_buf_printf(pi->buf, "%c\t%s\n", code, delta->old_file.path);
|
||||
|
||||
if (git_buf_lasterror(pi->buf) != GIT_SUCCESS)
|
||||
return git_buf_lasterror(pi->buf);
|
||||
@ -515,21 +515,21 @@ static int print_oid_range(diff_print_info *pi, git_diff_delta *delta)
|
||||
char start_oid[8], end_oid[8];
|
||||
|
||||
/* TODO: Determine a good actual OID range to print */
|
||||
git_oid_to_string(start_oid, sizeof(start_oid), &delta->old.oid);
|
||||
git_oid_to_string(end_oid, sizeof(end_oid), &delta->new.oid);
|
||||
git_oid_to_string(start_oid, sizeof(start_oid), &delta->old_file.oid);
|
||||
git_oid_to_string(end_oid, sizeof(end_oid), &delta->new_file.oid);
|
||||
|
||||
/* TODO: Match git diff more closely */
|
||||
if (delta->old.mode == delta->new.mode) {
|
||||
if (delta->old_file.mode == delta->new_file.mode) {
|
||||
git_buf_printf(pi->buf, "index %s..%s %o\n",
|
||||
start_oid, end_oid, delta->old.mode);
|
||||
start_oid, end_oid, delta->old_file.mode);
|
||||
} else {
|
||||
if (delta->old.mode == 0) {
|
||||
git_buf_printf(pi->buf, "new file mode %o\n", delta->new.mode);
|
||||
} else if (delta->new.mode == 0) {
|
||||
git_buf_printf(pi->buf, "deleted file mode %o\n", delta->old.mode);
|
||||
if (delta->old_file.mode == 0) {
|
||||
git_buf_printf(pi->buf, "new file mode %o\n", delta->new_file.mode);
|
||||
} else if (delta->new_file.mode == 0) {
|
||||
git_buf_printf(pi->buf, "deleted file mode %o\n", delta->old_file.mode);
|
||||
} else {
|
||||
git_buf_printf(pi->buf, "old mode %o\n", delta->old.mode);
|
||||
git_buf_printf(pi->buf, "new mode %o\n", delta->new.mode);
|
||||
git_buf_printf(pi->buf, "old mode %o\n", delta->old_file.mode);
|
||||
git_buf_printf(pi->buf, "new mode %o\n", delta->new_file.mode);
|
||||
}
|
||||
git_buf_printf(pi->buf, "index %s..%s\n", start_oid, end_oid);
|
||||
}
|
||||
@ -541,23 +541,23 @@ static int print_patch_file(void *data, git_diff_delta *delta, float progress)
|
||||
{
|
||||
int error;
|
||||
diff_print_info *pi = data;
|
||||
const char *oldpfx = pi->diff->opts.src_prefix;
|
||||
const char *oldpath = delta->old.path;
|
||||
const char *newpfx = pi->diff->opts.dst_prefix;
|
||||
const char *newpath = delta->new.path;
|
||||
const char *oldpfx = pi->diff->opts.old_prefix;
|
||||
const char *oldpath = delta->old_file.path;
|
||||
const char *newpfx = pi->diff->opts.new_prefix;
|
||||
const char *newpath = delta->new_file.path;
|
||||
|
||||
GIT_UNUSED(progress);
|
||||
|
||||
git_buf_clear(pi->buf);
|
||||
git_buf_printf(pi->buf, "diff --git %s%s %s%s\n", oldpfx, delta->old.path, newpfx, delta->new.path);
|
||||
git_buf_printf(pi->buf, "diff --git %s%s %s%s\n", oldpfx, delta->old_file.path, newpfx, delta->new_file.path);
|
||||
if ((error = print_oid_range(pi, delta)) < GIT_SUCCESS)
|
||||
return error;
|
||||
|
||||
if (git_oid_iszero(&delta->old.oid)) {
|
||||
if (git_oid_iszero(&delta->old_file.oid)) {
|
||||
oldpfx = "";
|
||||
oldpath = "/dev/null";
|
||||
}
|
||||
if (git_oid_iszero(&delta->new.oid)) {
|
||||
if (git_oid_iszero(&delta->new_file.oid)) {
|
||||
oldpfx = "";
|
||||
oldpath = "/dev/null";
|
||||
}
|
||||
@ -664,7 +664,7 @@ int git_diff_blobs(
|
||||
{
|
||||
diff_output_info info;
|
||||
git_diff_delta delta;
|
||||
mmfile_t old, new;
|
||||
mmfile_t old_data, new_data;
|
||||
xpparam_t xdiff_params;
|
||||
xdemitconf_t xdiff_config;
|
||||
xdemitcb_t xdiff_callback;
|
||||
@ -678,31 +678,31 @@ int git_diff_blobs(
|
||||
}
|
||||
|
||||
if (old_blob) {
|
||||
old.ptr = (char *)git_blob_rawcontent(old_blob);
|
||||
old.size = git_blob_rawsize(old_blob);
|
||||
old_data.ptr = (char *)git_blob_rawcontent(old_blob);
|
||||
old_data.size = git_blob_rawsize(old_blob);
|
||||
} else {
|
||||
old.ptr = "";
|
||||
old.size = 0;
|
||||
old_data.ptr = "";
|
||||
old_data.size = 0;
|
||||
}
|
||||
|
||||
if (new_blob) {
|
||||
new.ptr = (char *)git_blob_rawcontent(new_blob);
|
||||
new.size = git_blob_rawsize(new_blob);
|
||||
new_data.ptr = (char *)git_blob_rawcontent(new_blob);
|
||||
new_data.size = git_blob_rawsize(new_blob);
|
||||
} else {
|
||||
new.ptr = "";
|
||||
new.size = 0;
|
||||
new_data.ptr = "";
|
||||
new_data.size = 0;
|
||||
}
|
||||
|
||||
/* populate a "fake" delta record */
|
||||
delta.status = old.ptr ?
|
||||
(new.ptr ? GIT_DELTA_MODIFIED : GIT_DELTA_DELETED) :
|
||||
(new.ptr ? GIT_DELTA_ADDED : GIT_DELTA_UNTRACKED);
|
||||
delta.old.mode = 0100644; /* can't know the truth from a blob alone */
|
||||
delta.new.mode = 0100644;
|
||||
git_oid_cpy(&delta.old.oid, git_object_id((const git_object *)old_blob));
|
||||
git_oid_cpy(&delta.new.oid, git_object_id((const git_object *)new_blob));
|
||||
delta.old.path = NULL;
|
||||
delta.new.path = NULL;
|
||||
delta.status = old_data.ptr ?
|
||||
(new_data.ptr ? GIT_DELTA_MODIFIED : GIT_DELTA_DELETED) :
|
||||
(new_data.ptr ? GIT_DELTA_ADDED : GIT_DELTA_UNTRACKED);
|
||||
delta.old_file.mode = 0100644; /* can't know the truth from a blob alone */
|
||||
delta.new_file.mode = 0100644;
|
||||
git_oid_cpy(&delta.old_file.oid, git_object_id((const git_object *)old_blob));
|
||||
git_oid_cpy(&delta.new_file.oid, git_object_id((const git_object *)new_blob));
|
||||
delta.old_file.path = NULL;
|
||||
delta.new_file.path = NULL;
|
||||
delta.similarity = 0;
|
||||
|
||||
info.diff = NULL;
|
||||
@ -716,7 +716,7 @@ int git_diff_blobs(
|
||||
xdiff_callback.outf = diff_output_cb;
|
||||
xdiff_callback.priv = &info;
|
||||
|
||||
xdl_diff(&old, &new, &xdiff_params, &xdiff_config, &xdiff_callback);
|
||||
xdl_diff(&old_data, &new_data, &xdiff_params, &xdiff_config, &xdiff_callback);
|
||||
|
||||
return GIT_SUCCESS;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user