return 1;
}
-static char * find_name(const char *line, char *def, int p_value, int terminate)
+static char *find_name(const char *line, char *def, int p_value, int terminate)
{
int len;
const char *start = line;
static char *gitdiff_verify_name(const char *line, int isnull, char *orig_name, const char *oldnew)
{
if (!orig_name && !isnull)
- return find_name(line, NULL, 1, TERM_TAB);
+ return find_name(line, NULL, p_value, TERM_TAB);
if (orig_name) {
int len;
len = strlen(name);
if (isnull)
die("git-apply: bad git-diff - expected /dev/null, got %s on line %d", name, linenr);
- another = find_name(line, NULL, 1, TERM_TAB);
+ another = find_name(line, NULL, p_value, TERM_TAB);
if (!another || memcmp(another, name, len))
die("git-apply: bad git-diff - inconsistent %s filename on line %d", oldnew, linenr);
free(another);
static int gitdiff_copysrc(const char *line, struct patch *patch)
{
patch->is_copy = 1;
- patch->old_name = find_name(line, NULL, 0, 0);
+ patch->old_name = find_name(line, NULL, p_value-1, 0);
return 0;
}
static int gitdiff_copydst(const char *line, struct patch *patch)
{
patch->is_copy = 1;
- patch->new_name = find_name(line, NULL, 0, 0);
+ patch->new_name = find_name(line, NULL, p_value-1, 0);
return 0;
}
static int gitdiff_renamesrc(const char *line, struct patch *patch)
{
patch->is_rename = 1;
- patch->old_name = find_name(line, NULL, 0, 0);
+ patch->old_name = find_name(line, NULL, p_value-1, 0);
return 0;
}
static int gitdiff_renamedst(const char *line, struct patch *patch)
{
patch->is_rename = 1;
- patch->new_name = find_name(line, NULL, 0, 0);
+ patch->new_name = find_name(line, NULL, p_value-1, 0);
return 0;
}
return 0;
x = x->next;
}
- if (0 < prefix_length) {
- int pathlen = strlen(pathname);
- if (pathlen <= prefix_length ||
- memcmp(prefix, pathname, prefix_length))
- return 0;
- }
return 1;
}
+static char *prefix_one(char *name)
+{
+ if (!name)
+ return name;
+ return xstrdup(prefix_filename(prefix, prefix_length, name));
+}
+
+static void prefix_patches(struct patch *p)
+{
+ if (!prefix)
+ return;
+ for ( ; p; p = p->next) {
+ p->new_name = prefix_one(p->new_name);
+ p->old_name = prefix_one(p->old_name);
+ }
+}
+
static int apply_patch(int fd, const char *filename, int inaccurate_eof)
{
unsigned long offset, size;
break;
if (apply_in_reverse)
reverse_patches(patch);
+ if (prefix)
+ prefix_patches(patch);
if (use_patch(patch)) {
patch_stats(patch);
*listp = patch;
listp = &patch->next;
- } else {
+ }
+ else {
/* perhaps free it a bit better? */
free(patch);
skipped_patch++;
. ./test-lib.sh
test_expect_success setup '
- echo A >file1 &&
- cp file1 saved &&
- git add file1 &&
- echo "B " >file1 &&
+ mkdir sub &&
+ echo A >sub/file1 &&
+ cp sub/file1 saved &&
+ git add sub/file1 &&
+ echo "B " >sub/file1 &&
git diff >patch.file
'
test_expect_success 'apply --whitespace=strip' '
- cp saved file1 &&
+ rm -f sub/file1 &&
+ cp saved sub/file1 &&
git update-index --refresh &&
git apply --whitespace=strip patch.file &&
- if grep " " file1
+ if grep " " sub/file1
then
echo "Eh?"
false
test_expect_success 'apply --whitespace=strip from config' '
- cp saved file1 &&
+ rm -f sub/file1 &&
+ cp saved sub/file1 &&
git update-index --refresh &&
git config apply.whitespace strip &&
git apply patch.file &&
- if grep " " file1
+ if grep " " sub/file1
then
echo "Eh?"
false
fi
'
-mkdir sub
D=`pwd`
test_expect_success 'apply --whitespace=strip in subdir' '
cd "$D" &&
git config --unset-all apply.whitespace
- cp saved file1 &&
+ rm -f sub/file1 &&
+ cp saved sub/file1 &&
git update-index --refresh &&
cd sub &&
- git apply --whitespace=strip ../patch.file &&
- if grep " " ../file1
+ git apply --whitespace=strip -p2 ../patch.file &&
+ if grep " " file1
then
echo "Eh?"
false
cd "$D" &&
git config apply.whitespace strip &&
- cp saved file1 &&
+ rm -f sub/file1 &&
+ cp saved sub/file1 &&
git update-index --refresh &&
cd sub &&
- git apply ../patch.file &&
+ git apply -p2 ../patch.file &&
if grep " " file1
then
echo "Eh?"