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
a31f4c4b
Unverified
Commit
a31f4c4b
authored
Oct 24, 2019
by
Patrick Steinhardt
Committed by
GitHub
Oct 24, 2019
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #5227 from ddevault/check
apply: add GIT_APPLY_CHECK
parents
c405f231
02af1fcb
Show whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
158 additions
and
0 deletions
+158
-0
include/git2/apply.h
+12
-0
src/apply.c
+4
-0
tests/apply/apply_helpers.h
+21
-0
tests/apply/check.c
+121
-0
No files found.
include/git2/apply.h
View file @
a31f4c4b
...
...
@@ -53,6 +53,15 @@ typedef int GIT_CALLBACK(git_apply_hunk_cb)(
const
git_diff_hunk
*
hunk
,
void
*
payload
);
/** Flags controlling the behavior of git_apply */
typedef
enum
{
/**
* Don't actually make changes, just test that the patch applies.
* This is the equivalent of `git apply --check`.
*/
GIT_APPLY_CHECK
=
(
1
<<
0
),
}
git_apply_flags_t
;
/**
* Apply options structure
*
...
...
@@ -72,6 +81,9 @@ typedef struct {
/** Payload passed to both delta_cb & hunk_cb. */
void
*
payload
;
/** Bitmask of git_apply_flags_t */
unsigned
int
flags
;
}
git_apply_options
;
#define GIT_APPLY_OPTIONS_VERSION 1
...
...
src/apply.c
View file @
a31f4c4b
...
...
@@ -845,6 +845,7 @@ int git_apply(
(
error
=
git_reader_for_index
(
&
post_reader
,
repo
,
postimage
))
<
0
)
goto
done
;
if
(
!
(
opts
.
flags
&
GIT_APPLY_CHECK
))
if
((
error
=
git_repository_index
(
&
index
,
repo
))
<
0
||
(
error
=
git_indexwriter_init
(
&
indexwriter
,
index
))
<
0
)
goto
done
;
...
...
@@ -852,6 +853,9 @@ int git_apply(
if
((
error
=
apply_deltas
(
repo
,
pre_reader
,
preimage
,
post_reader
,
postimage
,
diff
,
&
opts
))
<
0
)
goto
done
;
if
((
opts
.
flags
&
GIT_APPLY_CHECK
))
goto
done
;
switch
(
location
)
{
case
GIT_APPLY_LOCATION_BOTH
:
error
=
git_apply__to_workdir
(
repo
,
diff
,
preimage
,
postimage
,
location
,
&
opts
);
...
...
tests/apply/apply_helpers.h
View file @
a31f4c4b
...
...
@@ -21,6 +21,27 @@
"-longer. take out the slices of ham, and skim off the grease if any\n" \
"+longer; take out the slices of ham, and skim off the grease if any\n"
/* This is the binary equivalent of DIFF_MODIFY_TWO_FILES */
#define DIFF_MODIFY_TWO_FILES_BINARY \
"diff --git a/asparagus.txt b/asparagus.txt\n" \
"index f51658077d85f2264fa179b4d0848268cb3475c3..ffb36e513f5fdf8a6ba850a20142676a2ac4807d 100644\n" \
"GIT binary patch\n" \
"delta 24\n" \
"fcmX@ja+-zTF*v|6$k9DCSRvRyG(c}7zYP-rT_OhP\n" \
"\n" \
"delta 24\n" \
"fcmX@ja+-zTF*v|6$k9DCSRvRyG(d49zYP-rT;T@W\n" \
"\n" \
"diff --git a/veal.txt b/veal.txt\n" \
"index 94d2c01087f48213bd157222d54edfefd77c9bba..a7b066537e6be7109abfe4ff97b675d4e077da20 100644\n" \
"GIT binary patch\n" \
"delta 26\n" \
"hcmX@kah!uI%+=9HA=p1OKyM?L03)OIW@$zpW&mXg25bNT\n" \
"\n" \
"delta 26\n" \
"hcmX@kah!uI%+=9HA=p1OKyf3N03)N`W@$zpW&mU#22ub3\n" \
"\n"
#define DIFF_DELETE_FILE \
"diff --git a/gravy.txt b/gravy.txt\n" \
"deleted file mode 100644\n" \
...
...
tests/apply/check.c
0 → 100644
View file @
a31f4c4b
#include "clar_libgit2.h"
#include "apply_helpers.h"
static
git_repository
*
repo
;
#define TEST_REPO_PATH "merge-recursive"
void
test_apply_check__initialize
(
void
)
{
git_oid
oid
;
git_commit
*
commit
;
repo
=
cl_git_sandbox_init
(
TEST_REPO_PATH
);
git_oid_fromstr
(
&
oid
,
"539bd011c4822c560c1d17cab095006b7a10f707"
);
cl_git_pass
(
git_commit_lookup
(
&
commit
,
repo
,
&
oid
));
cl_git_pass
(
git_reset
(
repo
,
(
git_object
*
)
commit
,
GIT_RESET_HARD
,
NULL
));
git_commit_free
(
commit
);
}
void
test_apply_check__cleanup
(
void
)
{
cl_git_sandbox_cleanup
();
}
void
test_apply_check__generate_diff
(
void
)
{
git_oid
a_oid
,
b_oid
;
git_commit
*
a_commit
,
*
b_commit
;
git_tree
*
a_tree
,
*
b_tree
;
git_diff
*
diff
;
git_diff_options
diff_opts
=
GIT_DIFF_OPTIONS_INIT
;
git_apply_options
opts
=
GIT_APPLY_OPTIONS_INIT
;
cl_git_pass
(
git_oid_fromstr
(
&
a_oid
,
"539bd011c4822c560c1d17cab095006b7a10f707"
));
cl_git_pass
(
git_oid_fromstr
(
&
b_oid
,
"7c7bf85e978f1d18c0566f702d2cb7766b9c8d4f"
));
cl_git_pass
(
git_commit_lookup
(
&
a_commit
,
repo
,
&
a_oid
));
cl_git_pass
(
git_commit_lookup
(
&
b_commit
,
repo
,
&
b_oid
));
cl_git_pass
(
git_commit_tree
(
&
a_tree
,
a_commit
));
cl_git_pass
(
git_commit_tree
(
&
b_tree
,
b_commit
));
opts
.
flags
|=
GIT_APPLY_CHECK
;
cl_git_pass
(
git_diff_tree_to_tree
(
&
diff
,
repo
,
a_tree
,
b_tree
,
&
diff_opts
));
cl_git_pass
(
git_apply
(
repo
,
diff
,
GIT_APPLY_LOCATION_BOTH
,
&
opts
));
validate_index_unchanged
(
repo
);
validate_workdir_unchanged
(
repo
);
git_diff_free
(
diff
);
git_tree_free
(
a_tree
);
git_tree_free
(
b_tree
);
git_commit_free
(
a_commit
);
git_commit_free
(
b_commit
);
}
void
test_apply_check__parsed_diff
(
void
)
{
git_diff
*
diff
;
git_apply_options
opts
=
GIT_APPLY_OPTIONS_INIT
;
opts
.
flags
|=
GIT_APPLY_CHECK
;
cl_git_pass
(
git_diff_from_buffer
(
&
diff
,
DIFF_MODIFY_TWO_FILES
,
strlen
(
DIFF_MODIFY_TWO_FILES
)));
cl_git_pass
(
git_apply
(
repo
,
diff
,
GIT_APPLY_LOCATION_INDEX
,
&
opts
));
validate_index_unchanged
(
repo
);
validate_workdir_unchanged
(
repo
);
git_diff_free
(
diff
);
}
void
test_apply_check__binary
(
void
)
{
git_diff
*
diff
;
git_apply_options
opts
=
GIT_APPLY_OPTIONS_INIT
;
opts
.
flags
|=
GIT_APPLY_CHECK
;
cl_git_pass
(
git_diff_from_buffer
(
&
diff
,
DIFF_MODIFY_TWO_FILES_BINARY
,
strlen
(
DIFF_MODIFY_TWO_FILES_BINARY
)));
cl_git_pass
(
git_apply
(
repo
,
diff
,
GIT_APPLY_LOCATION_INDEX
,
&
opts
));
validate_index_unchanged
(
repo
);
validate_workdir_unchanged
(
repo
);
git_diff_free
(
diff
);
}
void
test_apply_check__does_not_apply
(
void
)
{
git_diff
*
diff
;
git_index
*
index
;
git_apply_options
opts
=
GIT_APPLY_OPTIONS_INIT
;
const
char
*
diff_file
=
DIFF_MODIFY_TWO_FILES
;
struct
merge_index_entry
index_expected
[]
=
{
{
0100644
,
"f51658077d85f2264fa179b4d0848268cb3475c3"
,
0
,
"asparagus.txt"
},
{
0100644
,
"68f6182f4c85d39e1309d97c7e456156dc9c0096"
,
0
,
"beef.txt"
},
{
0100644
,
"4b7c5650008b2e747fe1809eeb5a1dde0e80850a"
,
0
,
"bouilli.txt"
},
{
0100644
,
"c4e6cca3ec6ae0148ed231f97257df8c311e015f"
,
0
,
"gravy.txt"
},
{
0100644
,
"68af1fc7407fd9addf1701a87eb1c95c7494c598"
,
0
,
"oyster.txt"
},
};
size_t
index_expected_cnt
=
sizeof
(
index_expected
)
/
sizeof
(
struct
merge_index_entry
);
/* mutate the index */
cl_git_pass
(
git_repository_index
(
&
index
,
repo
));
cl_git_pass
(
git_index_remove
(
index
,
"veal.txt"
,
0
));
cl_git_pass
(
git_index_write
(
index
));
git_index_free
(
index
);
opts
.
flags
|=
GIT_APPLY_CHECK
;
cl_git_pass
(
git_diff_from_buffer
(
&
diff
,
diff_file
,
strlen
(
diff_file
)));
cl_git_fail_with
(
GIT_EAPPLYFAIL
,
git_apply
(
repo
,
diff
,
GIT_APPLY_LOCATION_INDEX
,
&
opts
));
validate_apply_index
(
repo
,
index_expected
,
index_expected_cnt
);
git_diff_free
(
diff
);
}
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