Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix generation of the header of the patch #643

Closed
wants to merge 1 commit into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
3 changes: 0 additions & 3 deletions src/diff.c
Expand Up @@ -256,9 +256,6 @@ static int diff_delta__from_two(
return 0;
}

#define DIFF_SRC_PREFIX_DEFAULT "a/"
#define DIFF_DST_PREFIX_DEFAULT "b/"

static char *diff_strdup_prefix(const char *prefix)
{
size_t len = strlen(prefix);
Expand Down
3 changes: 3 additions & 0 deletions src/diff.h
Expand Up @@ -13,6 +13,9 @@
#include "iterator.h"
#include "repository.h"

#define DIFF_SRC_PREFIX_DEFAULT "a/"
#define DIFF_DST_PREFIX_DEFAULT "b/"

enum {
GIT_DIFFCAPS_HAS_SYMLINKS = (1 << 0), /* symlinks on platform? */
GIT_DIFFCAPS_ASSUME_UNCHANGED = (1 << 1), /* use stat? */
Expand Down
20 changes: 15 additions & 5 deletions src/diff_output.c
Expand Up @@ -553,9 +553,16 @@ static int print_patch_file(void *data, git_diff_delta *delta, float progress)
const char *oldpath = delta->old.path;
const char *newpfx = pi->diff->opts.dst_prefix;
const char *newpath = delta->new.path;
int result;

GIT_UNUSED(progress);

if (!oldpfx)
oldpfx = DIFF_SRC_PREFIX_DEFAULT;

if (!newpfx)
newpfx = DIFF_DST_PREFIX_DEFAULT;

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);

Expand All @@ -567,8 +574,8 @@ static int print_patch_file(void *data, git_diff_delta *delta, float progress)
oldpath = "/dev/null";
}
if (git_oid_iszero(&delta->new.oid)) {
oldpfx = "";
oldpath = "/dev/null";
newpfx = "";
newpath = "/dev/null";
}

if (delta->binary != 1) {
Expand All @@ -579,9 +586,12 @@ static int print_patch_file(void *data, git_diff_delta *delta, float progress)
if (git_buf_oom(pi->buf))
return -1;

if (pi->print_cb(pi->cb_data, GIT_DIFF_LINE_FILE_HDR, pi->buf->ptr) < 0 ||
delta->binary != 1)
return -1;
result = pi->print_cb(pi->cb_data, GIT_DIFF_LINE_FILE_HDR, pi->buf->ptr);
if (result < 0)
return result;

if (delta->binary != 1)
return 0;

git_buf_clear(pi->buf);
git_buf_printf(
Expand Down
68 changes: 68 additions & 0 deletions tests-clar/diff/patch.c
@@ -0,0 +1,68 @@
#include "clar_libgit2.h"
#include "diff_helpers.h"

static git_repository *g_repo = NULL;

void test_diff_patch__initialize(void)
{
g_repo = cl_git_sandbox_init("status");
}

void test_diff_patch__cleanup(void)
{
cl_git_sandbox_cleanup();
}

#define EXPECTED_OUTPUT "diff --git a/subdir.txt b/subdir.txt\n" \
"deleted file mode 100644\n" \
"index e8ee89e..0000000\n" \
"--- a/subdir.txt\n" \
"+++ /dev/null\n"

static int check_removal_cb(
void *cb_data,
char line_origin,
const char *formatted_output)
{
GIT_UNUSED(cb_data);

if (line_origin != 'F')
return 0;

if (strcmp(EXPECTED_OUTPUT, formatted_output) == 0)
return 0;

return -1;
}

void test_diff_patch__can_properly_display_the_removal_of_a_file(void)
{
/*
* $ git diff 26a125e..735b6a2
* diff --git a/subdir.txt b/subdir.txt
* deleted file mode 100644
* index e8ee89e..0000000
* --- a/subdir.txt
* +++ /dev/null
* @@ -1,2 +0,0 @@
* -Is it a bird?
* -Is it a plane?
*/

const char *one_sha = "26a125e";
const char *another_sha = "735b6a2";
git_tree *one, *another;
git_diff_list *diff;

one = resolve_commit_oid_to_tree(g_repo, one_sha);
another = resolve_commit_oid_to_tree(g_repo, another_sha);

cl_git_pass(git_diff_tree_to_tree(g_repo, NULL, one, another, &diff));

cl_git_pass(git_diff_print_patch(diff, NULL, check_removal_cb));

git_diff_list_free(diff);

git_tree_free(another);
git_tree_free(one);
}