Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
G
git2
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
lvzhengyang
git2
Commits
5d17d726
Commit
5d17d726
authored
10 years ago
by
Edward Thomson
Committed by
Edward Thomson
9 years ago
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
patch parsing: parse binary patch files
parent
b8dc2fdb
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
268 additions
and
64 deletions
+268
-64
src/patch.c
+145
-9
tests/apply/fromfile.c
+123
-55
No files found.
src/patch.c
View file @
5d17d726
...
@@ -65,6 +65,15 @@ static int parse_advance_ws(patch_parse_ctx *ctx)
...
@@ -65,6 +65,15 @@ static int parse_advance_ws(patch_parse_ctx *ctx)
return
ret
;
return
ret
;
}
}
static
int
parse_advance_nl
(
patch_parse_ctx
*
ctx
)
{
if
(
ctx
->
line_len
!=
1
||
ctx
->
line
[
0
]
!=
'\n'
)
return
-
1
;
parse_advance_line
(
ctx
);
return
0
;
}
static
int
header_path_len
(
patch_parse_ctx
*
ctx
)
static
int
header_path_len
(
patch_parse_ctx
*
ctx
)
{
{
bool
inquote
=
0
;
bool
inquote
=
0
;
...
@@ -354,6 +363,7 @@ typedef struct {
...
@@ -354,6 +363,7 @@ typedef struct {
static
const
header_git_op
header_git_ops
[]
=
{
static
const
header_git_op
header_git_ops
[]
=
{
{
"@@ -"
,
NULL
},
{
"@@ -"
,
NULL
},
{
"GIT binary patch"
,
NULL
},
{
"--- "
,
parse_header_git_oldpath
},
{
"--- "
,
parse_header_git_oldpath
},
{
"+++ "
,
parse_header_git_newpath
},
{
"+++ "
,
parse_header_git_newpath
},
{
"index "
,
parse_header_git_index
},
{
"index "
,
parse_header_git_index
},
...
@@ -426,7 +436,7 @@ done:
...
@@ -426,7 +436,7 @@ done:
return
error
;
return
error
;
}
}
static
int
parse_number
(
in
t
*
out
,
patch_parse_ctx
*
ctx
)
static
int
parse_number
(
git_off_
t
*
out
,
patch_parse_ctx
*
ctx
)
{
{
const
char
*
end
;
const
char
*
end
;
int64_t
num
;
int64_t
num
;
...
@@ -440,12 +450,23 @@ static int parse_number(int *out, patch_parse_ctx *ctx)
...
@@ -440,12 +450,23 @@ static int parse_number(int *out, patch_parse_ctx *ctx)
if
(
num
<
0
)
if
(
num
<
0
)
return
-
1
;
return
-
1
;
*
out
=
(
int
)
num
;
*
out
=
num
;
parse_advance_chars
(
ctx
,
(
end
-
ctx
->
line
));
parse_advance_chars
(
ctx
,
(
end
-
ctx
->
line
));
return
0
;
return
0
;
}
}
static
int
parse_int
(
int
*
out
,
patch_parse_ctx
*
ctx
)
{
git_off_t
num
;
if
(
parse_number
(
&
num
,
ctx
)
<
0
||
!
git__is_int
(
num
))
return
-
1
;
*
out
=
(
int
)
num
;
return
0
;
}
static
int
parse_hunk_header
(
static
int
parse_hunk_header
(
diff_patch_hunk
*
hunk
,
diff_patch_hunk
*
hunk
,
patch_parse_ctx
*
ctx
)
patch_parse_ctx
*
ctx
)
...
@@ -456,22 +477,22 @@ static int parse_hunk_header(
...
@@ -456,22 +477,22 @@ static int parse_hunk_header(
hunk
->
hunk
.
new_lines
=
1
;
hunk
->
hunk
.
new_lines
=
1
;
if
(
parse_advance_expected
(
ctx
,
"@@ -"
,
4
)
<
0
||
if
(
parse_advance_expected
(
ctx
,
"@@ -"
,
4
)
<
0
||
parse_
number
(
&
hunk
->
hunk
.
old_start
,
ctx
)
<
0
)
parse_
int
(
&
hunk
->
hunk
.
old_start
,
ctx
)
<
0
)
goto
fail
;
goto
fail
;
if
(
ctx
->
line_len
>
0
&&
ctx
->
line
[
0
]
==
','
)
{
if
(
ctx
->
line_len
>
0
&&
ctx
->
line
[
0
]
==
','
)
{
if
(
parse_advance_expected
(
ctx
,
","
,
1
)
<
0
||
if
(
parse_advance_expected
(
ctx
,
","
,
1
)
<
0
||
parse_
number
(
&
hunk
->
hunk
.
old_lines
,
ctx
)
<
0
)
parse_
int
(
&
hunk
->
hunk
.
old_lines
,
ctx
)
<
0
)
goto
fail
;
goto
fail
;
}
}
if
(
parse_advance_expected
(
ctx
,
" +"
,
2
)
<
0
||
if
(
parse_advance_expected
(
ctx
,
" +"
,
2
)
<
0
||
parse_
number
(
&
hunk
->
hunk
.
new_start
,
ctx
)
<
0
)
parse_
int
(
&
hunk
->
hunk
.
new_start
,
ctx
)
<
0
)
goto
fail
;
goto
fail
;
if
(
ctx
->
line_len
>
0
&&
ctx
->
line
[
0
]
==
','
)
{
if
(
ctx
->
line_len
>
0
&&
ctx
->
line
[
0
]
==
','
)
{
if
(
parse_advance_expected
(
ctx
,
","
,
1
)
<
0
||
if
(
parse_advance_expected
(
ctx
,
","
,
1
)
<
0
||
parse_
number
(
&
hunk
->
hunk
.
new_lines
,
ctx
)
<
0
)
parse_
int
(
&
hunk
->
hunk
.
new_lines
,
ctx
)
<
0
)
goto
fail
;
goto
fail
;
}
}
...
@@ -672,7 +693,110 @@ done:
...
@@ -672,7 +693,110 @@ done:
return
error
;
return
error
;
}
}
static
int
parse_patch_body
(
static
int
parse_patch_binary_side
(
git_diff_binary_file
*
binary
,
patch_parse_ctx
*
ctx
)
{
git_diff_binary_t
type
=
GIT_DIFF_BINARY_NONE
;
git_buf
base85
=
GIT_BUF_INIT
,
decoded
=
GIT_BUF_INIT
;
git_off_t
len
;
int
error
=
0
;
if
(
ctx
->
line_len
>=
8
&&
memcmp
(
ctx
->
line
,
"literal "
,
8
)
==
0
)
{
type
=
GIT_DIFF_BINARY_LITERAL
;
parse_advance_chars
(
ctx
,
8
);
}
else
if
(
ctx
->
line_len
>=
6
&&
memcmp
(
ctx
->
line
,
"delta "
,
6
)
==
0
)
{
type
=
GIT_DIFF_BINARY_DELTA
;
parse_advance_chars
(
ctx
,
6
);
}
else
{
error
=
parse_err
(
"unknown binary delta type at line %d"
,
ctx
->
line_num
);
goto
done
;
}
if
(
parse_number
(
&
len
,
ctx
)
<
0
||
parse_advance_nl
(
ctx
)
<
0
||
len
<
0
)
{
error
=
parse_err
(
"invalid binary size at line %d"
,
ctx
->
line_num
);
goto
done
;
}
while
(
ctx
->
line_len
)
{
char
c
=
ctx
->
line
[
0
];
size_t
encoded_len
,
decoded_len
=
0
,
decoded_orig
=
decoded
.
size
;
if
(
c
==
'\n'
)
break
;
else
if
(
c
>=
'A'
&&
c
<=
'Z'
)
decoded_len
=
c
-
'A'
+
1
;
else
if
(
c
>=
'a'
&&
c
<=
'z'
)
decoded_len
=
c
-
'a'
+
26
+
1
;
if
(
!
decoded_len
)
{
error
=
parse_err
(
"invalid binary length at line %d"
,
ctx
->
line_num
);
goto
done
;
}
parse_advance_chars
(
ctx
,
1
);
encoded_len
=
((
decoded_len
/
4
)
+
!!
(
decoded_len
%
4
))
*
5
;
if
(
encoded_len
>
ctx
->
line_len
-
1
)
{
error
=
parse_err
(
"truncated binary data at line %d"
,
ctx
->
line_num
);
goto
done
;
}
if
((
error
=
git_buf_decode_base85
(
&
decoded
,
ctx
->
line
,
encoded_len
,
decoded_len
))
<
0
)
goto
done
;
if
(
decoded
.
size
-
decoded_orig
!=
decoded_len
)
{
error
=
parse_err
(
"truncated binary data at line %d"
,
ctx
->
line_num
);
goto
done
;
}
parse_advance_chars
(
ctx
,
encoded_len
);
if
(
parse_advance_nl
(
ctx
)
<
0
)
{
error
=
parse_err
(
"trailing data at line %d"
,
ctx
->
line_num
);
goto
done
;
}
}
binary
->
type
=
type
;
binary
->
inflatedlen
=
(
size_t
)
len
;
binary
->
datalen
=
decoded
.
size
;
binary
->
data
=
git_buf_detach
(
&
decoded
);
done:
git_buf_free
(
&
base85
);
git_buf_free
(
&
decoded
);
return
error
;
}
static
int
parse_patch_binary
(
git_patch
*
patch
,
patch_parse_ctx
*
ctx
)
{
int
error
;
if
(
parse_advance_expected
(
ctx
,
"GIT binary patch"
,
16
)
<
0
||
parse_advance_nl
(
ctx
)
<
0
)
return
parse_err
(
"corrupt git binary header at line %d"
,
ctx
->
line_num
);
/* parse old->new binary diff */
if
((
error
=
parse_patch_binary_side
(
&
patch
->
binary
.
new_file
,
ctx
))
<
0
)
return
error
;
if
(
parse_advance_nl
(
ctx
)
<
0
)
return
parse_err
(
"corrupt git binary separator at line %d"
,
ctx
->
line_num
);
/* parse new->old binary diff */
if
((
error
=
parse_patch_binary_side
(
&
patch
->
binary
.
old_file
,
ctx
))
<
0
)
return
error
;
patch
->
delta
->
flags
|=
GIT_DIFF_FLAG_BINARY
;
return
0
;
}
static
int
parse_patch_hunks
(
git_patch
*
patch
,
git_patch
*
patch
,
patch_parse_ctx
*
ctx
)
patch_parse_ctx
*
ctx
)
{
{
...
@@ -698,6 +822,17 @@ done:
...
@@ -698,6 +822,17 @@ done:
return
error
;
return
error
;
}
}
static
int
parse_patch_body
(
git_patch
*
patch
,
patch_parse_ctx
*
ctx
)
{
if
(
ctx
->
line_len
>=
16
&&
memcmp
(
ctx
->
line
,
"GIT binary patch"
,
16
)
==
0
)
return
parse_patch_binary
(
patch
,
ctx
);
else
if
(
ctx
->
line_len
>=
4
&&
memcmp
(
ctx
->
line
,
"@@ -"
,
4
)
==
0
)
return
parse_patch_hunks
(
patch
,
ctx
);
return
0
;
}
static
int
check_patch
(
git_patch
*
patch
)
static
int
check_patch
(
git_patch
*
patch
)
{
{
if
(
!
patch
->
ofile
.
file
->
path
&&
patch
->
delta
->
status
!=
GIT_DELTA_ADDED
)
if
(
!
patch
->
ofile
.
file
->
path
&&
patch
->
delta
->
status
!=
GIT_DELTA_ADDED
)
...
@@ -712,8 +847,9 @@ static int check_patch(git_patch *patch)
...
@@ -712,8 +847,9 @@ static int check_patch(git_patch *patch)
}
}
if
(
patch
->
delta
->
status
==
GIT_DELTA_MODIFIED
&&
if
(
patch
->
delta
->
status
==
GIT_DELTA_MODIFIED
&&
patch
->
nfile
.
file
->
mode
==
patch
->
ofile
.
file
->
mode
&&
!
(
patch
->
delta
->
flags
&
GIT_DIFF_FLAG_BINARY
)
&&
git_array_size
(
patch
->
hunks
)
==
0
)
patch
->
nfile
.
file
->
mode
==
patch
->
ofile
.
file
->
mode
&&
git_array_size
(
patch
->
hunks
)
==
0
)
return
parse_err
(
"patch with no hunks"
);
return
parse_err
(
"patch with no hunks"
);
return
0
;
return
0
;
...
...
This diff is collapsed.
Click to expand it.
tests/apply/fromfile.c
View file @
5d17d726
...
@@ -21,7 +21,9 @@ void test_apply_fromfile__cleanup(void)
...
@@ -21,7 +21,9 @@ void test_apply_fromfile__cleanup(void)
static
int
apply_patchfile
(
static
int
apply_patchfile
(
const
char
*
old
,
const
char
*
old
,
size_t
old_len
,
const
char
*
new
,
const
char
*
new
,
size_t
new_len
,
const
char
*
patchfile
,
const
char
*
patchfile
,
const
char
*
filename_expected
,
const
char
*
filename_expected
,
unsigned
int
mode_expected
)
unsigned
int
mode_expected
)
...
@@ -35,13 +37,11 @@ static int apply_patchfile(
...
@@ -35,13 +37,11 @@ static int apply_patchfile(
cl_git_pass
(
git_patch_from_patchfile
(
&
patch
,
patchfile
,
strlen
(
patchfile
)));
cl_git_pass
(
git_patch_from_patchfile
(
&
patch
,
patchfile
,
strlen
(
patchfile
)));
error
=
git_apply__patch
(
&
result
,
&
filename
,
&
mode
,
old
,
old
?
strlen
(
old
)
:
0
,
patch
);
error
=
git_apply__patch
(
&
result
,
&
filename
,
&
mode
,
old
,
old
_len
,
patch
);
if
(
error
==
0
)
{
if
(
error
==
0
)
{
if
(
new
==
NULL
)
cl_assert_equal_i
(
new_len
,
result
.
size
);
cl_assert_equal_i
(
0
,
result
.
size
);
cl_assert
(
memcmp
(
new
,
result
.
ptr
,
new_len
)
==
0
);
else
cl_assert_equal_s
(
new
,
result
.
ptr
);
cl_assert_equal_s
(
filename_expected
,
filename
);
cl_assert_equal_s
(
filename_expected
,
filename
);
cl_assert_equal_i
(
mode_expected
,
mode
);
cl_assert_equal_i
(
mode_expected
,
mode
);
...
@@ -57,7 +57,9 @@ static int apply_patchfile(
...
@@ -57,7 +57,9 @@ static int apply_patchfile(
static
int
validate_and_apply_patchfile
(
static
int
validate_and_apply_patchfile
(
const
char
*
old
,
const
char
*
old
,
size_t
old_len
,
const
char
*
new
,
const
char
*
new
,
size_t
new_len
,
const
char
*
patchfile
,
const
char
*
patchfile
,
const
git_diff_options
*
diff_opts
,
const
git_diff_options
*
diff_opts
,
const
char
*
filename_expected
,
const
char
*
filename_expected
,
...
@@ -68,14 +70,14 @@ static int validate_and_apply_patchfile(
...
@@ -68,14 +70,14 @@ static int validate_and_apply_patchfile(
int
error
;
int
error
;
cl_git_pass
(
git_patch_from_buffers
(
&
patch_fromdiff
,
cl_git_pass
(
git_patch_from_buffers
(
&
patch_fromdiff
,
old
,
old
?
strlen
(
old
)
:
0
,
"file.txt"
,
old
,
old
_len
,
"file.txt"
,
new
,
new
?
strlen
(
new
)
:
0
,
"file.txt"
,
new
,
new
_len
,
"file.txt"
,
diff_opts
));
diff_opts
));
cl_git_pass
(
git_patch_to_buf
(
&
validated
,
patch_fromdiff
));
cl_git_pass
(
git_patch_to_buf
(
&
validated
,
patch_fromdiff
));
cl_assert_equal_s
(
patchfile
,
validated
.
ptr
);
cl_assert_equal_s
(
patchfile
,
validated
.
ptr
);
error
=
apply_patchfile
(
old
,
new
,
patchfile
,
filename_expected
,
mode_expected
);
error
=
apply_patchfile
(
old
,
old_len
,
new
,
new_len
,
patchfile
,
filename_expected
,
mode_expected
);
git_buf_free
(
&
validated
);
git_buf_free
(
&
validated
);
git_patch_free
(
patch_fromdiff
);
git_patch_free
(
patch_fromdiff
);
...
@@ -85,8 +87,10 @@ static int validate_and_apply_patchfile(
...
@@ -85,8 +87,10 @@ static int validate_and_apply_patchfile(
void
test_apply_fromfile__change_middle
(
void
)
void
test_apply_fromfile__change_middle
(
void
)
{
{
cl_git_pass
(
validate_and_apply_patchfile
(
FILE_ORIGINAL
,
cl_git_pass
(
validate_and_apply_patchfile
(
FILE_CHANGE_MIDDLE
,
PATCH_ORIGINAL_TO_CHANGE_MIDDLE
,
NULL
,
FILE_ORIGINAL
,
strlen
(
FILE_ORIGINAL
),
FILE_CHANGE_MIDDLE
,
strlen
(
FILE_CHANGE_MIDDLE
),
PATCH_ORIGINAL_TO_CHANGE_MIDDLE
,
NULL
,
"b/file.txt"
,
0100644
));
"b/file.txt"
,
0100644
));
}
}
...
@@ -95,28 +99,36 @@ void test_apply_fromfile__change_middle_nocontext(void)
...
@@ -95,28 +99,36 @@ void test_apply_fromfile__change_middle_nocontext(void)
git_diff_options
diff_opts
=
GIT_DIFF_OPTIONS_INIT
;
git_diff_options
diff_opts
=
GIT_DIFF_OPTIONS_INIT
;
diff_opts
.
context_lines
=
0
;
diff_opts
.
context_lines
=
0
;
cl_git_pass
(
validate_and_apply_patchfile
(
FILE_ORIGINAL
,
cl_git_pass
(
validate_and_apply_patchfile
(
FILE_CHANGE_MIDDLE
,
PATCH_ORIGINAL_TO_CHANGE_MIDDLE_NOCONTEXT
,
FILE_ORIGINAL
,
strlen
(
FILE_ORIGINAL
),
FILE_CHANGE_MIDDLE
,
strlen
(
FILE_CHANGE_MIDDLE
),
PATCH_ORIGINAL_TO_CHANGE_MIDDLE_NOCONTEXT
,
&
diff_opts
,
"b/file.txt"
,
0100644
));
&
diff_opts
,
"b/file.txt"
,
0100644
));
}
}
void
test_apply_fromfile__change_firstline
(
void
)
void
test_apply_fromfile__change_firstline
(
void
)
{
{
cl_git_pass
(
validate_and_apply_patchfile
(
FILE_ORIGINAL
,
cl_git_pass
(
validate_and_apply_patchfile
(
FILE_CHANGE_FIRSTLINE
,
PATCH_ORIGINAL_TO_CHANGE_FIRSTLINE
,
NULL
,
FILE_ORIGINAL
,
strlen
(
FILE_ORIGINAL
),
FILE_CHANGE_FIRSTLINE
,
strlen
(
FILE_CHANGE_FIRSTLINE
),
PATCH_ORIGINAL_TO_CHANGE_FIRSTLINE
,
NULL
,
"b/file.txt"
,
0100644
));
"b/file.txt"
,
0100644
));
}
}
void
test_apply_fromfile__lastline
(
void
)
void
test_apply_fromfile__lastline
(
void
)
{
{
cl_git_pass
(
validate_and_apply_patchfile
(
FILE_ORIGINAL
,
cl_git_pass
(
validate_and_apply_patchfile
(
FILE_CHANGE_LASTLINE
,
PATCH_ORIGINAL_TO_CHANGE_LASTLINE
,
NULL
,
FILE_ORIGINAL
,
strlen
(
FILE_ORIGINAL
),
FILE_CHANGE_LASTLINE
,
strlen
(
FILE_CHANGE_LASTLINE
),
PATCH_ORIGINAL_TO_CHANGE_LASTLINE
,
NULL
,
"b/file.txt"
,
0100644
));
"b/file.txt"
,
0100644
));
}
}
void
test_apply_fromfile__prepend
(
void
)
void
test_apply_fromfile__prepend
(
void
)
{
{
cl_git_pass
(
validate_and_apply_patchfile
(
FILE_ORIGINAL
,
FILE_PREPEND
,
cl_git_pass
(
validate_and_apply_patchfile
(
FILE_ORIGINAL
,
strlen
(
FILE_ORIGINAL
),
FILE_PREPEND
,
strlen
(
FILE_PREPEND
),
PATCH_ORIGINAL_TO_PREPEND
,
NULL
,
"b/file.txt"
,
0100644
));
PATCH_ORIGINAL_TO_PREPEND
,
NULL
,
"b/file.txt"
,
0100644
));
}
}
...
@@ -125,14 +137,18 @@ void test_apply_fromfile__prepend_nocontext(void)
...
@@ -125,14 +137,18 @@ void test_apply_fromfile__prepend_nocontext(void)
git_diff_options
diff_opts
=
GIT_DIFF_OPTIONS_INIT
;
git_diff_options
diff_opts
=
GIT_DIFF_OPTIONS_INIT
;
diff_opts
.
context_lines
=
0
;
diff_opts
.
context_lines
=
0
;
cl_git_pass
(
validate_and_apply_patchfile
(
FILE_ORIGINAL
,
FILE_PREPEND
,
cl_git_pass
(
validate_and_apply_patchfile
(
FILE_ORIGINAL
,
strlen
(
FILE_ORIGINAL
),
FILE_PREPEND
,
strlen
(
FILE_PREPEND
),
PATCH_ORIGINAL_TO_PREPEND_NOCONTEXT
,
&
diff_opts
,
PATCH_ORIGINAL_TO_PREPEND_NOCONTEXT
,
&
diff_opts
,
"b/file.txt"
,
0100644
));
"b/file.txt"
,
0100644
));
}
}
void
test_apply_fromfile__append
(
void
)
void
test_apply_fromfile__append
(
void
)
{
{
cl_git_pass
(
validate_and_apply_patchfile
(
FILE_ORIGINAL
,
FILE_APPEND
,
cl_git_pass
(
validate_and_apply_patchfile
(
FILE_ORIGINAL
,
strlen
(
FILE_ORIGINAL
),
FILE_APPEND
,
strlen
(
FILE_APPEND
),
PATCH_ORIGINAL_TO_APPEND
,
NULL
,
"b/file.txt"
,
0100644
));
PATCH_ORIGINAL_TO_APPEND
,
NULL
,
"b/file.txt"
,
0100644
));
}
}
...
@@ -141,82 +157,108 @@ void test_apply_fromfile__append_nocontext(void)
...
@@ -141,82 +157,108 @@ void test_apply_fromfile__append_nocontext(void)
git_diff_options
diff_opts
=
GIT_DIFF_OPTIONS_INIT
;
git_diff_options
diff_opts
=
GIT_DIFF_OPTIONS_INIT
;
diff_opts
.
context_lines
=
0
;
diff_opts
.
context_lines
=
0
;
cl_git_pass
(
validate_and_apply_patchfile
(
FILE_ORIGINAL
,
FILE_APPEND
,
cl_git_pass
(
validate_and_apply_patchfile
(
FILE_ORIGINAL
,
strlen
(
FILE_ORIGINAL
),
FILE_APPEND
,
strlen
(
FILE_APPEND
),
PATCH_ORIGINAL_TO_APPEND_NOCONTEXT
,
&
diff_opts
,
PATCH_ORIGINAL_TO_APPEND_NOCONTEXT
,
&
diff_opts
,
"b/file.txt"
,
0100644
));
"b/file.txt"
,
0100644
));
}
}
void
test_apply_fromfile__prepend_and_append
(
void
)
void
test_apply_fromfile__prepend_and_append
(
void
)
{
{
cl_git_pass
(
validate_and_apply_patchfile
(
FILE_ORIGINAL
,
cl_git_pass
(
validate_and_apply_patchfile
(
FILE_PREPEND_AND_APPEND
,
PATCH_ORIGINAL_TO_PREPEND_AND_APPEND
,
NULL
,
FILE_ORIGINAL
,
strlen
(
FILE_ORIGINAL
),
FILE_PREPEND_AND_APPEND
,
strlen
(
FILE_PREPEND_AND_APPEND
),
PATCH_ORIGINAL_TO_PREPEND_AND_APPEND
,
NULL
,
"b/file.txt"
,
0100644
));
"b/file.txt"
,
0100644
));
}
}
void
test_apply_fromfile__to_empty_file
(
void
)
void
test_apply_fromfile__to_empty_file
(
void
)
{
{
cl_git_pass
(
validate_and_apply_patchfile
(
FILE_ORIGINAL
,
""
,
cl_git_pass
(
validate_and_apply_patchfile
(
FILE_ORIGINAL
,
strlen
(
FILE_ORIGINAL
),
""
,
0
,
PATCH_ORIGINAL_TO_EMPTY_FILE
,
NULL
,
"b/file.txt"
,
0100644
));
PATCH_ORIGINAL_TO_EMPTY_FILE
,
NULL
,
"b/file.txt"
,
0100644
));
}
}
void
test_apply_fromfile__from_empty_file
(
void
)
void
test_apply_fromfile__from_empty_file
(
void
)
{
{
cl_git_pass
(
validate_and_apply_patchfile
(
""
,
FILE_ORIGINAL
,
cl_git_pass
(
validate_and_apply_patchfile
(
""
,
0
,
FILE_ORIGINAL
,
strlen
(
FILE_ORIGINAL
),
PATCH_EMPTY_FILE_TO_ORIGINAL
,
NULL
,
"b/file.txt"
,
0100644
));
PATCH_EMPTY_FILE_TO_ORIGINAL
,
NULL
,
"b/file.txt"
,
0100644
));
}
}
void
test_apply_fromfile__add
(
void
)
void
test_apply_fromfile__add
(
void
)
{
{
cl_git_pass
(
validate_and_apply_patchfile
(
NULL
,
FILE_ORIGINAL
,
cl_git_pass
(
validate_and_apply_patchfile
(
NULL
,
0
,
FILE_ORIGINAL
,
strlen
(
FILE_ORIGINAL
),
PATCH_ADD_ORIGINAL
,
NULL
,
"b/file.txt"
,
0100644
));
PATCH_ADD_ORIGINAL
,
NULL
,
"b/file.txt"
,
0100644
));
}
}
void
test_apply_fromfile__delete
(
void
)
void
test_apply_fromfile__delete
(
void
)
{
{
cl_git_pass
(
validate_and_apply_patchfile
(
FILE_ORIGINAL
,
NULL
,
cl_git_pass
(
validate_and_apply_patchfile
(
FILE_ORIGINAL
,
strlen
(
FILE_ORIGINAL
),
NULL
,
0
,
PATCH_DELETE_ORIGINAL
,
NULL
,
NULL
,
0
));
PATCH_DELETE_ORIGINAL
,
NULL
,
NULL
,
0
));
}
}
void
test_apply_fromfile__rename_exact
(
void
)
void
test_apply_fromfile__rename_exact
(
void
)
{
{
cl_git_pass
(
apply_patchfile
(
FILE_ORIGINAL
,
FILE_ORIGINAL
,
cl_git_pass
(
apply_patchfile
(
FILE_ORIGINAL
,
strlen
(
FILE_ORIGINAL
),
FILE_ORIGINAL
,
strlen
(
FILE_ORIGINAL
),
PATCH_RENAME_EXACT
,
"b/newfile.txt"
,
0100644
));
PATCH_RENAME_EXACT
,
"b/newfile.txt"
,
0100644
));
}
}
void
test_apply_fromfile__rename_similar
(
void
)
void
test_apply_fromfile__rename_similar
(
void
)
{
{
cl_git_pass
(
apply_patchfile
(
FILE_ORIGINAL
,
FILE_CHANGE_MIDDLE
,
cl_git_pass
(
apply_patchfile
(
FILE_ORIGINAL
,
strlen
(
FILE_ORIGINAL
),
FILE_CHANGE_MIDDLE
,
strlen
(
FILE_CHANGE_MIDDLE
),
PATCH_RENAME_SIMILAR
,
"b/newfile.txt"
,
0100644
));
PATCH_RENAME_SIMILAR
,
"b/newfile.txt"
,
0100644
));
}
}
void
test_apply_fromfile__rename_similar_quotedname
(
void
)
void
test_apply_fromfile__rename_similar_quotedname
(
void
)
{
{
cl_git_pass
(
apply_patchfile
(
FILE_ORIGINAL
,
FILE_CHANGE_MIDDLE
,
cl_git_pass
(
apply_patchfile
(
FILE_ORIGINAL
,
strlen
(
FILE_ORIGINAL
),
FILE_CHANGE_MIDDLE
,
strlen
(
FILE_CHANGE_MIDDLE
),
PATCH_RENAME_SIMILAR_QUOTEDNAME
,
"b/foo
\"
bar.txt"
,
0100644
));
PATCH_RENAME_SIMILAR_QUOTEDNAME
,
"b/foo
\"
bar.txt"
,
0100644
));
}
}
void
test_apply_fromfile__modechange
(
void
)
void
test_apply_fromfile__modechange
(
void
)
{
{
cl_git_pass
(
apply_patchfile
(
FILE_ORIGINAL
,
FILE_ORIGINAL
,
cl_git_pass
(
apply_patchfile
(
FILE_ORIGINAL
,
strlen
(
FILE_ORIGINAL
),
FILE_ORIGINAL
,
strlen
(
FILE_ORIGINAL
),
PATCH_MODECHANGE_UNCHANGED
,
"b/file.txt"
,
0100755
));
PATCH_MODECHANGE_UNCHANGED
,
"b/file.txt"
,
0100755
));
}
}
void
test_apply_fromfile__modechange_with_modification
(
void
)
void
test_apply_fromfile__modechange_with_modification
(
void
)
{
{
cl_git_pass
(
apply_patchfile
(
FILE_ORIGINAL
,
FILE_CHANGE_MIDDLE
,
cl_git_pass
(
apply_patchfile
(
FILE_ORIGINAL
,
strlen
(
FILE_ORIGINAL
),
FILE_CHANGE_MIDDLE
,
strlen
(
FILE_CHANGE_MIDDLE
),
PATCH_MODECHANGE_MODIFIED
,
"b/file.txt"
,
0100755
));
PATCH_MODECHANGE_MODIFIED
,
"b/file.txt"
,
0100755
));
}
}
void
test_apply_fromfile__noisy
(
void
)
void
test_apply_fromfile__noisy
(
void
)
{
{
cl_git_pass
(
apply_patchfile
(
FILE_ORIGINAL
,
FILE_CHANGE_MIDDLE
,
cl_git_pass
(
apply_patchfile
(
FILE_ORIGINAL
,
strlen
(
FILE_ORIGINAL
),
FILE_CHANGE_MIDDLE
,
strlen
(
FILE_CHANGE_MIDDLE
),
PATCH_NOISY
,
"b/file.txt"
,
0100644
));
PATCH_NOISY
,
"b/file.txt"
,
0100644
));
}
}
void
test_apply_fromfile__noisy_nocontext
(
void
)
void
test_apply_fromfile__noisy_nocontext
(
void
)
{
{
cl_git_pass
(
apply_patchfile
(
FILE_ORIGINAL
,
FILE_CHANGE_MIDDLE
,
cl_git_pass
(
apply_patchfile
(
FILE_ORIGINAL
,
strlen
(
FILE_ORIGINAL
),
FILE_CHANGE_MIDDLE
,
strlen
(
FILE_CHANGE_MIDDLE
),
PATCH_NOISY_NOCONTEXT
,
"b/file.txt"
,
0100644
));
PATCH_NOISY_NOCONTEXT
,
"b/file.txt"
,
0100644
));
}
}
...
@@ -250,15 +292,19 @@ void test_apply_fromfile__fail_corrupt_githeader(void)
...
@@ -250,15 +292,19 @@ void test_apply_fromfile__fail_corrupt_githeader(void)
void
test_apply_fromfile__empty_context
(
void
)
void
test_apply_fromfile__empty_context
(
void
)
{
{
cl_git_pass
(
apply_patchfile
(
FILE_EMPTY_CONTEXT_ORIGINAL
,
cl_git_pass
(
apply_patchfile
(
FILE_EMPTY_CONTEXT_MODIFIED
,
PATCH_EMPTY_CONTEXT
,
FILE_EMPTY_CONTEXT_ORIGINAL
,
strlen
(
FILE_EMPTY_CONTEXT_ORIGINAL
),
FILE_EMPTY_CONTEXT_MODIFIED
,
strlen
(
FILE_EMPTY_CONTEXT_MODIFIED
),
PATCH_EMPTY_CONTEXT
,
"b/file.txt"
,
0100644
));
"b/file.txt"
,
0100644
));
}
}
void
test_apply_fromfile__append_no_nl
(
void
)
void
test_apply_fromfile__append_no_nl
(
void
)
{
{
cl_git_pass
(
validate_and_apply_patchfile
(
cl_git_pass
(
validate_and_apply_patchfile
(
FILE_ORIGINAL
,
FILE_APPEND_NO_NL
,
PATCH_APPEND_NO_NL
,
NULL
,
"b/file.txt"
,
0100644
));
FILE_ORIGINAL
,
strlen
(
FILE_ORIGINAL
),
FILE_APPEND_NO_NL
,
strlen
(
FILE_APPEND_NO_NL
),
PATCH_APPEND_NO_NL
,
NULL
,
"b/file.txt"
,
0100644
));
}
}
void
test_apply_fromfile__fail_missing_new_file
(
void
)
void
test_apply_fromfile__fail_missing_new_file
(
void
)
...
@@ -300,29 +346,51 @@ void test_apply_fromfile__fail_not_a_patch(void)
...
@@ -300,29 +346,51 @@ void test_apply_fromfile__fail_not_a_patch(void)
strlen
(
PATCH_NOT_A_PATCH
)));
strlen
(
PATCH_NOT_A_PATCH
)));
}
}
/*
void
test_apply_fromfile__binary_add
(
void
)
void test_apply_fromdiff__binary_change_must_be_reversible(void)
{
{
git_buf original = GIT_BUF_INIT, modified = GIT_BUF_INIT,
cl_git_pass
(
apply_patchfile
(
result = GIT_BUF_INIT;
NULL
,
0
,
char *filename;
FILE_BINARY_DELTA_MODIFIED
,
FILE_BINARY_DELTA_MODIFIED_LEN
,
unsigned int mode;
PATCH_BINARY_ADD
,
"b/binary.bin"
,
0100644
));
}
original.ptr = FILE_BINARY_DELTA_ORIGINAL;
void
test_apply_fromfile__binary_change_delta
(
void
)
original.size = FILE_BINARY_DELTA_ORIGINAL_LEN;
{
cl_git_pass
(
apply_patchfile
(
FILE_BINARY_DELTA_ORIGINAL
,
FILE_BINARY_DELTA_ORIGINAL_LEN
,
FILE_BINARY_DELTA_MODIFIED
,
FILE_BINARY_DELTA_MODIFIED_LEN
,
PATCH_BINARY_DELTA
,
"b/binary.bin"
,
0100644
));
}
modified.ptr = FILE_BINARY_DELTA_MODIFIED;
void
test_apply_fromfile__binary_change_literal
(
void
)
modified.size = FILE_BINARY_DELTA_MODIFIED_LEN;
{
cl_git_pass
(
apply_patchfile
(
FILE_BINARY_LITERAL_ORIGINAL
,
FILE_BINARY_LITERAL_ORIGINAL_LEN
,
FILE_BINARY_LITERAL_MODIFIED
,
FILE_BINARY_LITERAL_MODIFIED_LEN
,
PATCH_BINARY_LITERAL
,
"b/binary.bin"
,
0100644
));
}
cl_git_fail(git_apply__patch(&result, &filename, &mode, old ? old->ptr : NULL, old ? old->size : 0, patch);
void
test_apply_fromfile__binary_delete
(
void
)
{
cl_git_pass
(
apply_patchfile
(
FILE_BINARY_DELTA_MODIFIED
,
FILE_BINARY_DELTA_MODIFIED_LEN
,
NULL
,
0
,
PATCH_BINARY_DELETE
,
NULL
,
0
));
}
cl_git_fail(apply_gitbuf(
void
test_apply_fromfile__binary_change_does_not_apply
(
void
)
&original, "binary.bin",
{
&modified, "binary.bin",
/* try to apply patch backwards, ensure it does not apply */
PATCH_BINARY_NOT_REVERSIBLE, &binary_opts));
cl_git_fail
(
apply_patchfile
(
cl_assert_equal_s("binary patch did not apply cleanly", giterr_last()->message);
FILE_BINARY_DELTA_MODIFIED
,
FILE_BINARY_DELTA_MODIFIED_LEN
,
FILE_BINARY_DELTA_ORIGINAL
,
FILE_BINARY_DELTA_ORIGINAL_LEN
,
PATCH_BINARY_DELTA
,
"b/binary.bin"
,
0100644
));
}
git_buf_free(&result);
void
test_apply_fromfile__binary_change_must_be_reversible
(
void
)
git__free(filename);
{
cl_git_fail
(
apply_patchfile
(
FILE_BINARY_DELTA_MODIFIED
,
FILE_BINARY_DELTA_MODIFIED_LEN
,
NULL
,
0
,
PATCH_BINARY_NOT_REVERSIBLE
,
NULL
,
0
));
}
}
*/
This diff is collapsed.
Click to expand it.
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment