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
8d44f8b7
Commit
8d44f8b7
authored
Nov 24, 2015
by
Edward Thomson
Committed by
Edward Thomson
May 26, 2016
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
patch: `patch_diff` -> `patch_generated`
parent
53571f2f
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
119 additions
and
112 deletions
+119
-112
src/diff_print.c
+1
-1
src/diff_stats.c
+1
-1
src/diff_xdiff.c
+8
-8
src/diff_xdiff.h
+5
-5
src/patch_generate.c
+85
-81
src/patch_generate.h
+19
-16
No files found.
src/diff_print.c
View file @
8d44f8b7
...
@@ -7,7 +7,7 @@
...
@@ -7,7 +7,7 @@
#include "common.h"
#include "common.h"
#include "diff.h"
#include "diff.h"
#include "diff_file.h"
#include "diff_file.h"
#include "patch_
diff
.h"
#include "patch_
generate
.h"
#include "fileops.h"
#include "fileops.h"
#include "zstream.h"
#include "zstream.h"
#include "blob.h"
#include "blob.h"
...
...
src/diff_stats.c
View file @
8d44f8b7
...
@@ -7,7 +7,7 @@
...
@@ -7,7 +7,7 @@
#include "common.h"
#include "common.h"
#include "vector.h"
#include "vector.h"
#include "diff.h"
#include "diff.h"
#include "patch_
diff
.h"
#include "patch_
generate
.h"
#define DIFF_RENAME_FILE_SEPARATOR " => "
#define DIFF_RENAME_FILE_SEPARATOR " => "
#define STATS_FULL_MIN_SCALE 7
#define STATS_FULL_MIN_SCALE 7
...
...
src/diff_xdiff.c
View file @
8d44f8b7
...
@@ -9,7 +9,7 @@
...
@@ -9,7 +9,7 @@
#include "diff.h"
#include "diff.h"
#include "diff_driver.h"
#include "diff_driver.h"
#include "diff_xdiff.h"
#include "diff_xdiff.h"
#include "patch_
diff
.h"
#include "patch_
generate
.h"
static
int
git_xdiff_scan_int
(
const
char
**
str
,
int
*
value
)
static
int
git_xdiff_scan_int
(
const
char
**
str
,
int
*
value
)
{
{
...
@@ -56,7 +56,7 @@ fail:
...
@@ -56,7 +56,7 @@ fail:
typedef
struct
{
typedef
struct
{
git_xdiff_output
*
xo
;
git_xdiff_output
*
xo
;
git_patch_
diff
*
patch
;
git_patch_
generated
*
patch
;
git_diff_hunk
hunk
;
git_diff_hunk
hunk
;
int
old_lineno
,
new_lineno
;
int
old_lineno
,
new_lineno
;
mmfile_t
xd_old_data
,
xd_new_data
;
mmfile_t
xd_old_data
,
xd_new_data
;
...
@@ -110,9 +110,9 @@ static int diff_update_lines(
...
@@ -110,9 +110,9 @@ static int diff_update_lines(
static
int
git_xdiff_cb
(
void
*
priv
,
mmbuffer_t
*
bufs
,
int
len
)
static
int
git_xdiff_cb
(
void
*
priv
,
mmbuffer_t
*
bufs
,
int
len
)
{
{
git_xdiff_info
*
info
=
priv
;
git_xdiff_info
*
info
=
priv
;
git_patch_
diff
*
patch
=
info
->
patch
;
git_patch_
generated
*
patch
=
info
->
patch
;
const
git_diff_delta
*
delta
=
patch
->
base
.
delta
;
const
git_diff_delta
*
delta
=
patch
->
base
.
delta
;
git_patch_
diff
_output
*
output
=
&
info
->
xo
->
output
;
git_patch_
generated
_output
*
output
=
&
info
->
xo
->
output
;
git_diff_line
line
;
git_diff_line
line
;
if
(
len
==
1
)
{
if
(
len
==
1
)
{
...
@@ -181,7 +181,7 @@ static int git_xdiff_cb(void *priv, mmbuffer_t *bufs, int len)
...
@@ -181,7 +181,7 @@ static int git_xdiff_cb(void *priv, mmbuffer_t *bufs, int len)
return
output
->
error
;
return
output
->
error
;
}
}
static
int
git_xdiff
(
git_patch_
diff_output
*
output
,
git_patch_diff
*
patch
)
static
int
git_xdiff
(
git_patch_
generated_output
*
output
,
git_patch_generated
*
patch
)
{
{
git_xdiff_output
*
xo
=
(
git_xdiff_output
*
)
output
;
git_xdiff_output
*
xo
=
(
git_xdiff_output
*
)
output
;
git_xdiff_info
info
;
git_xdiff_info
info
;
...
@@ -194,7 +194,7 @@ static int git_xdiff(git_patch_diff_output *output, git_patch_diff *patch)
...
@@ -194,7 +194,7 @@ static int git_xdiff(git_patch_diff_output *output, git_patch_diff *patch)
xo
->
callback
.
priv
=
&
info
;
xo
->
callback
.
priv
=
&
info
;
git_diff_find_context_init
(
git_diff_find_context_init
(
&
xo
->
config
.
find_func
,
&
findctxt
,
git_patch_
diff
_driver
(
patch
));
&
xo
->
config
.
find_func
,
&
findctxt
,
git_patch_
generated
_driver
(
patch
));
xo
->
config
.
find_func_priv
=
&
findctxt
;
xo
->
config
.
find_func_priv
=
&
findctxt
;
if
(
xo
->
config
.
find_func
!=
NULL
)
if
(
xo
->
config
.
find_func
!=
NULL
)
...
@@ -206,8 +206,8 @@ static int git_xdiff(git_patch_diff_output *output, git_patch_diff *patch)
...
@@ -206,8 +206,8 @@ static int git_xdiff(git_patch_diff_output *output, git_patch_diff *patch)
* updates are needed to xo->params.flags
* updates are needed to xo->params.flags
*/
*/
git_patch_
diff
_old_data
(
&
info
.
xd_old_data
.
ptr
,
&
info
.
xd_old_data
.
size
,
patch
);
git_patch_
generated
_old_data
(
&
info
.
xd_old_data
.
ptr
,
&
info
.
xd_old_data
.
size
,
patch
);
git_patch_
diff
_new_data
(
&
info
.
xd_new_data
.
ptr
,
&
info
.
xd_new_data
.
size
,
patch
);
git_patch_
generated
_new_data
(
&
info
.
xd_new_data
.
ptr
,
&
info
.
xd_new_data
.
size
,
patch
);
if
(
info
.
xd_old_data
.
size
>
GIT_XDIFF_MAX_SIZE
||
if
(
info
.
xd_old_data
.
size
>
GIT_XDIFF_MAX_SIZE
||
info
.
xd_new_data
.
size
>
GIT_XDIFF_MAX_SIZE
)
{
info
.
xd_new_data
.
size
>
GIT_XDIFF_MAX_SIZE
)
{
...
...
src/diff_xdiff.h
View file @
8d44f8b7
...
@@ -9,19 +9,19 @@
...
@@ -9,19 +9,19 @@
#include "diff.h"
#include "diff.h"
#include "xdiff/xdiff.h"
#include "xdiff/xdiff.h"
#include "patch_
diff
.h"
#include "patch_
generate
.h"
/* xdiff cannot cope with large files. these files should not be passed to
/* xdiff cannot cope with large files. these files should not be passed to
* xdiff. callers should treat these large files as binary.
* xdiff. callers should treat these large files as binary.
*/
*/
#define GIT_XDIFF_MAX_SIZE (1024LL * 1024 * 1023)
#define GIT_XDIFF_MAX_SIZE (1024LL * 1024 * 1023)
/* A git_xdiff_output is a git_patch_
diff_output with extra fields necessary
/* A git_xdiff_output is a git_patch_
generate_output with extra fields
*
to use libxdiff. Calling git_xdiff_init() will set the diff_cb field
*
necessary to use libxdiff. Calling git_xdiff_init() will set the diff_cb
* of the output to use xdiff to generate the diffs.
*
field
of the output to use xdiff to generate the diffs.
*/
*/
typedef
struct
{
typedef
struct
{
git_patch_
diff
_output
output
;
git_patch_
generated
_output
output
;
xdemitconf_t
config
;
xdemitconf_t
config
;
xpparam_t
params
;
xpparam_t
params
;
...
...
src/patch_
diff
.c
→
src/patch_
generate
.c
View file @
8d44f8b7
...
@@ -9,21 +9,22 @@
...
@@ -9,21 +9,22 @@
#include "diff.h"
#include "diff.h"
#include "diff_file.h"
#include "diff_file.h"
#include "diff_driver.h"
#include "diff_driver.h"
#include "patch_
diff
.h"
#include "patch_
generate
.h"
#include "diff_xdiff.h"
#include "diff_xdiff.h"
#include "delta.h"
#include "delta.h"
#include "zstream.h"
#include "zstream.h"
#include "fileops.h"
#include "fileops.h"
static
void
diff_output_init
(
static
void
diff_output_init
(
git_patch_
diff
_output
*
,
const
git_diff_options
*
,
git_diff_file_cb
,
git_patch_
generated
_output
*
,
const
git_diff_options
*
,
git_diff_file_cb
,
git_diff_binary_cb
,
git_diff_hunk_cb
,
git_diff_line_cb
,
void
*
);
git_diff_binary_cb
,
git_diff_hunk_cb
,
git_diff_line_cb
,
void
*
);
static
void
diff_output_to_patch
(
git_patch_diff_output
*
,
git_patch_diff
*
);
static
void
diff_output_to_patch
(
git_patch_generated_output
*
,
git_patch_generated
*
);
static
void
patch_
diff
_free
(
git_patch
*
p
)
static
void
patch_
generated
_free
(
git_patch
*
p
)
{
{
git_patch_
diff
*
patch
=
(
git_patch_diff
*
)
p
;
git_patch_
generated
*
patch
=
(
git_patch_generated
*
)
p
;
git_array_clear
(
patch
->
base
.
lines
);
git_array_clear
(
patch
->
base
.
lines
);
git_array_clear
(
patch
->
base
.
hunks
);
git_array_clear
(
patch
->
base
.
hunks
);
...
@@ -42,11 +43,11 @@ static void patch_diff_free(git_patch *p)
...
@@ -42,11 +43,11 @@ static void patch_diff_free(git_patch *p)
git__free
((
char
*
)
patch
->
base
.
diff_opts
.
old_prefix
);
git__free
((
char
*
)
patch
->
base
.
diff_opts
.
old_prefix
);
git__free
((
char
*
)
patch
->
base
.
diff_opts
.
new_prefix
);
git__free
((
char
*
)
patch
->
base
.
diff_opts
.
new_prefix
);
if
(
patch
->
flags
&
GIT_PATCH_
DIFF
_ALLOCATED
)
if
(
patch
->
flags
&
GIT_PATCH_
GENERATED
_ALLOCATED
)
git__free
(
patch
);
git__free
(
patch
);
}
}
static
void
patch_
diff_update_binary
(
git_patch_diff
*
patch
)
static
void
patch_
generated_update_binary
(
git_patch_generated
*
patch
)
{
{
if
((
patch
->
base
.
delta
->
flags
&
DIFF_FLAGS_KNOWN_BINARY
)
!=
0
)
if
((
patch
->
base
.
delta
->
flags
&
DIFF_FLAGS_KNOWN_BINARY
)
!=
0
)
return
;
return
;
...
@@ -64,19 +65,19 @@ static void patch_diff_update_binary(git_patch_diff *patch)
...
@@ -64,19 +65,19 @@ static void patch_diff_update_binary(git_patch_diff *patch)
patch
->
base
.
delta
->
flags
|=
GIT_DIFF_FLAG_NOT_BINARY
;
patch
->
base
.
delta
->
flags
|=
GIT_DIFF_FLAG_NOT_BINARY
;
}
}
static
void
patch_
diff_init_common
(
git_patch_diff
*
patch
)
static
void
patch_
generated_init_common
(
git_patch_generated
*
patch
)
{
{
patch
->
base
.
free_fn
=
patch_
diff
_free
;
patch
->
base
.
free_fn
=
patch_
generated
_free
;
patch_
diff
_update_binary
(
patch
);
patch_
generated
_update_binary
(
patch
);
patch
->
flags
|=
GIT_PATCH_
DIFF
_INITIALIZED
;
patch
->
flags
|=
GIT_PATCH_
GENERATED
_INITIALIZED
;
if
(
patch
->
diff
)
if
(
patch
->
diff
)
git_diff_addref
(
patch
->
diff
);
git_diff_addref
(
patch
->
diff
);
}
}
static
int
patch_
diff
_normalize_options
(
static
int
patch_
generated
_normalize_options
(
git_diff_options
*
out
,
git_diff_options
*
out
,
const
git_diff_options
*
opts
)
const
git_diff_options
*
opts
)
{
{
...
@@ -102,8 +103,8 @@ static int patch_diff_normalize_options(
...
@@ -102,8 +103,8 @@ static int patch_diff_normalize_options(
return
0
;
return
0
;
}
}
static
int
patch_
diff
_init
(
static
int
patch_
generated
_init
(
git_patch_
diff
*
patch
,
git_diff
*
diff
,
size_t
delta_index
)
git_patch_
generated
*
patch
,
git_diff
*
diff
,
size_t
delta_index
)
{
{
int
error
=
0
;
int
error
=
0
;
...
@@ -114,7 +115,7 @@ static int patch_diff_init(
...
@@ -114,7 +115,7 @@ static int patch_diff_init(
patch
->
base
.
delta
=
git_vector_get
(
&
diff
->
deltas
,
delta_index
);
patch
->
base
.
delta
=
git_vector_get
(
&
diff
->
deltas
,
delta_index
);
patch
->
delta_index
=
delta_index
;
patch
->
delta_index
=
delta_index
;
if
((
error
=
patch_
diff
_normalize_options
(
if
((
error
=
patch_
generated
_normalize_options
(
&
patch
->
base
.
diff_opts
,
&
diff
->
opts
))
<
0
||
&
patch
->
base
.
diff_opts
,
&
diff
->
opts
))
<
0
||
(
error
=
git_diff_file_content__init_from_diff
(
(
error
=
git_diff_file_content__init_from_diff
(
&
patch
->
ofile
,
diff
,
patch
->
base
.
delta
,
true
))
<
0
||
&
patch
->
ofile
,
diff
,
patch
->
base
.
delta
,
true
))
<
0
||
...
@@ -122,20 +123,20 @@ static int patch_diff_init(
...
@@ -122,20 +123,20 @@ static int patch_diff_init(
&
patch
->
nfile
,
diff
,
patch
->
base
.
delta
,
false
))
<
0
)
&
patch
->
nfile
,
diff
,
patch
->
base
.
delta
,
false
))
<
0
)
return
error
;
return
error
;
patch_
diff
_init_common
(
patch
);
patch_
generated
_init_common
(
patch
);
return
0
;
return
0
;
}
}
static
int
patch_
diff
_alloc_from_diff
(
static
int
patch_
generated
_alloc_from_diff
(
git_patch_
diff
**
out
,
git_diff
*
diff
,
size_t
delta_index
)
git_patch_
generated
**
out
,
git_diff
*
diff
,
size_t
delta_index
)
{
{
int
error
;
int
error
;
git_patch_
diff
*
patch
=
git__calloc
(
1
,
sizeof
(
git_patch_diff
));
git_patch_
generated
*
patch
=
git__calloc
(
1
,
sizeof
(
git_patch_generated
));
GITERR_CHECK_ALLOC
(
patch
);
GITERR_CHECK_ALLOC
(
patch
);
if
(
!
(
error
=
patch_
diff
_init
(
patch
,
diff
,
delta_index
)))
{
if
(
!
(
error
=
patch_
generated
_init
(
patch
,
diff
,
delta_index
)))
{
patch
->
flags
|=
GIT_PATCH_
DIFF
_ALLOCATED
;
patch
->
flags
|=
GIT_PATCH_
GENERATED
_ALLOCATED
;
GIT_REFCOUNT_INC
(
patch
);
GIT_REFCOUNT_INC
(
patch
);
}
else
{
}
else
{
git__free
(
patch
);
git__free
(
patch
);
...
@@ -146,7 +147,7 @@ static int patch_diff_alloc_from_diff(
...
@@ -146,7 +147,7 @@ static int patch_diff_alloc_from_diff(
return
error
;
return
error
;
}
}
GIT_INLINE
(
bool
)
should_skip_binary
(
git_patch_
diff
*
patch
,
git_diff_file
*
file
)
GIT_INLINE
(
bool
)
should_skip_binary
(
git_patch_
generated
*
patch
,
git_diff_file
*
file
)
{
{
if
((
patch
->
base
.
diff_opts
.
flags
&
GIT_DIFF_SHOW_BINARY
)
!=
0
)
if
((
patch
->
base
.
diff_opts
.
flags
&
GIT_DIFF_SHOW_BINARY
)
!=
0
)
return
false
;
return
false
;
...
@@ -154,7 +155,7 @@ GIT_INLINE(bool) should_skip_binary(git_patch_diff *patch, git_diff_file *file)
...
@@ -154,7 +155,7 @@ GIT_INLINE(bool) should_skip_binary(git_patch_diff *patch, git_diff_file *file)
return
(
file
->
flags
&
GIT_DIFF_FLAG_BINARY
)
!=
0
;
return
(
file
->
flags
&
GIT_DIFF_FLAG_BINARY
)
!=
0
;
}
}
static
bool
patch_
diff_diffable
(
git_patch_diff
*
patch
)
static
bool
patch_
generated_diffable
(
git_patch_generated
*
patch
)
{
{
size_t
olen
,
nlen
;
size_t
olen
,
nlen
;
...
@@ -183,12 +184,12 @@ static bool patch_diff_diffable(git_patch_diff *patch)
...
@@ -183,12 +184,12 @@ static bool patch_diff_diffable(git_patch_diff *patch)
!
git_oid_equal
(
&
patch
->
ofile
.
file
->
id
,
&
patch
->
nfile
.
file
->
id
));
!
git_oid_equal
(
&
patch
->
ofile
.
file
->
id
,
&
patch
->
nfile
.
file
->
id
));
}
}
static
int
patch_
diff_load
(
git_patch_diff
*
patch
,
git_patch_diff
_output
*
output
)
static
int
patch_
generated_load
(
git_patch_generated
*
patch
,
git_patch_generated
_output
*
output
)
{
{
int
error
=
0
;
int
error
=
0
;
bool
incomplete_data
;
bool
incomplete_data
;
if
((
patch
->
flags
&
GIT_PATCH_
DIFF
_LOADED
)
!=
0
)
if
((
patch
->
flags
&
GIT_PATCH_
GENERATED
_LOADED
)
!=
0
)
return
0
;
return
0
;
/* if no hunk and data callbacks and user doesn't care if data looks
/* if no hunk and data callbacks and user doesn't care if data looks
...
@@ -245,20 +246,20 @@ static int patch_diff_load(git_patch_diff *patch, git_patch_diff_output *output)
...
@@ -245,20 +246,20 @@ static int patch_diff_load(git_patch_diff *patch, git_patch_diff_output *output)
patch
->
base
.
delta
->
status
=
GIT_DELTA_UNMODIFIED
;
patch
->
base
.
delta
->
status
=
GIT_DELTA_UNMODIFIED
;
cleanup
:
cleanup
:
patch_
diff
_update_binary
(
patch
);
patch_
generated
_update_binary
(
patch
);
if
(
!
error
)
{
if
(
!
error
)
{
if
(
patch_
diff
_diffable
(
patch
))
if
(
patch_
generated
_diffable
(
patch
))
patch
->
flags
|=
GIT_PATCH_
DIFF
_DIFFABLE
;
patch
->
flags
|=
GIT_PATCH_
GENERATED
_DIFFABLE
;
patch
->
flags
|=
GIT_PATCH_
DIFF
_LOADED
;
patch
->
flags
|=
GIT_PATCH_
GENERATED
_LOADED
;
}
}
return
error
;
return
error
;
}
}
static
int
patch_
diff
_invoke_file_callback
(
static
int
patch_
generated
_invoke_file_callback
(
git_patch_
diff
*
patch
,
git_patch_diff
_output
*
output
)
git_patch_
generated
*
patch
,
git_patch_generated
_output
*
output
)
{
{
float
progress
=
patch
->
diff
?
float
progress
=
patch
->
diff
?
((
float
)
patch
->
delta_index
/
patch
->
diff
->
deltas
.
length
)
:
1
.
0
f
;
((
float
)
patch
->
delta_index
/
patch
->
diff
->
deltas
.
length
)
:
1
.
0
f
;
...
@@ -338,7 +339,7 @@ done:
...
@@ -338,7 +339,7 @@ done:
return
error
;
return
error
;
}
}
static
int
diff_binary
(
git_patch_
diff_output
*
output
,
git_patch_diff
*
patch
)
static
int
diff_binary
(
git_patch_
generated_output
*
output
,
git_patch_generated
*
patch
)
{
{
git_diff_binary
binary
=
{{
0
}};
git_diff_binary
binary
=
{{
0
}};
const
char
*
old_data
=
patch
->
ofile
.
map
.
data
;
const
char
*
old_data
=
patch
->
ofile
.
map
.
data
;
...
@@ -372,22 +373,24 @@ static int diff_binary(git_patch_diff_output *output, git_patch_diff *patch)
...
@@ -372,22 +373,24 @@ static int diff_binary(git_patch_diff_output *output, git_patch_diff *patch)
return
error
;
return
error
;
}
}
static
int
patch_diff_generate
(
git_patch_diff
*
patch
,
git_patch_diff_output
*
output
)
static
int
patch_generated_create
(
git_patch_generated
*
patch
,
git_patch_generated_output
*
output
)
{
{
int
error
=
0
;
int
error
=
0
;
if
((
patch
->
flags
&
GIT_PATCH_
DIFF
_DIFFED
)
!=
0
)
if
((
patch
->
flags
&
GIT_PATCH_
GENERATED
_DIFFED
)
!=
0
)
return
0
;
return
0
;
/* if we are not looking at the binary or text data, don't do the diff */
/* if we are not looking at the binary or text data, don't do the diff */
if
(
!
output
->
binary_cb
&&
!
output
->
hunk_cb
&&
!
output
->
data_cb
)
if
(
!
output
->
binary_cb
&&
!
output
->
hunk_cb
&&
!
output
->
data_cb
)
return
0
;
return
0
;
if
((
patch
->
flags
&
GIT_PATCH_
DIFF
_LOADED
)
==
0
&&
if
((
patch
->
flags
&
GIT_PATCH_
GENERATED
_LOADED
)
==
0
&&
(
error
=
patch_
diff
_load
(
patch
,
output
))
<
0
)
(
error
=
patch_
generated
_load
(
patch
,
output
))
<
0
)
return
error
;
return
error
;
if
((
patch
->
flags
&
GIT_PATCH_
DIFF
_DIFFABLE
)
==
0
)
if
((
patch
->
flags
&
GIT_PATCH_
GENERATED
_DIFFABLE
)
==
0
)
return
0
;
return
0
;
if
((
patch
->
base
.
delta
->
flags
&
GIT_DIFF_FLAG_BINARY
)
!=
0
)
{
if
((
patch
->
base
.
delta
->
flags
&
GIT_DIFF_FLAG_BINARY
)
!=
0
)
{
...
@@ -399,7 +402,7 @@ static int patch_diff_generate(git_patch_diff *patch, git_patch_diff_output *out
...
@@ -399,7 +402,7 @@ static int patch_diff_generate(git_patch_diff *patch, git_patch_diff_output *out
error
=
output
->
diff_cb
(
output
,
patch
);
error
=
output
->
diff_cb
(
output
,
patch
);
}
}
patch
->
flags
|=
GIT_PATCH_
DIFF
_DIFFED
;
patch
->
flags
|=
GIT_PATCH_
GENERATED
_DIFFED
;
return
error
;
return
error
;
}
}
...
@@ -422,7 +425,7 @@ int git_diff_foreach(
...
@@ -422,7 +425,7 @@ int git_diff_foreach(
int
error
=
0
;
int
error
=
0
;
git_xdiff_output
xo
;
git_xdiff_output
xo
;
size_t
idx
;
size_t
idx
;
git_patch_
diff
patch
;
git_patch_
generated
patch
;
if
((
error
=
diff_required
(
diff
,
"git_diff_foreach"
))
<
0
)
if
((
error
=
diff_required
(
diff
,
"git_diff_foreach"
))
<
0
)
return
error
;
return
error
;
...
@@ -440,14 +443,14 @@ int git_diff_foreach(
...
@@ -440,14 +443,14 @@ int git_diff_foreach(
continue
;
continue
;
if
(
binary_cb
||
hunk_cb
||
data_cb
)
{
if
(
binary_cb
||
hunk_cb
||
data_cb
)
{
if
((
error
=
patch_
diff
_init
(
&
patch
,
diff
,
idx
))
!=
0
||
if
((
error
=
patch_
generated
_init
(
&
patch
,
diff
,
idx
))
!=
0
||
(
error
=
patch_
diff
_load
(
&
patch
,
&
xo
.
output
))
!=
0
)
(
error
=
patch_
generated
_load
(
&
patch
,
&
xo
.
output
))
!=
0
)
return
error
;
return
error
;
}
}
if
((
error
=
patch_
diff
_invoke_file_callback
(
&
patch
,
&
xo
.
output
))
==
0
)
{
if
((
error
=
patch_
generated
_invoke_file_callback
(
&
patch
,
&
xo
.
output
))
==
0
)
{
if
(
binary_cb
||
hunk_cb
||
data_cb
)
if
(
binary_cb
||
hunk_cb
||
data_cb
)
error
=
patch_
diff_gener
ate
(
&
patch
,
&
xo
.
output
);
error
=
patch_
generated_cre
ate
(
&
patch
,
&
xo
.
output
);
}
}
git_patch_free
(
&
patch
.
base
);
git_patch_free
(
&
patch
.
base
);
...
@@ -460,15 +463,15 @@ int git_diff_foreach(
...
@@ -460,15 +463,15 @@ int git_diff_foreach(
}
}
typedef
struct
{
typedef
struct
{
git_patch_
diff
patch
;
git_patch_
generated
patch
;
git_diff_delta
delta
;
git_diff_delta
delta
;
char
paths
[
GIT_FLEX_ARRAY
];
char
paths
[
GIT_FLEX_ARRAY
];
}
patch_
diff
_with_delta
;
}
patch_
generated
_with_delta
;
static
int
diff_single_generate
(
patch_
diff
_with_delta
*
pd
,
git_xdiff_output
*
xo
)
static
int
diff_single_generate
(
patch_
generated
_with_delta
*
pd
,
git_xdiff_output
*
xo
)
{
{
int
error
=
0
;
int
error
=
0
;
git_patch_
diff
*
patch
=
&
pd
->
patch
;
git_patch_
generated
*
patch
=
&
pd
->
patch
;
bool
has_old
=
((
patch
->
ofile
.
flags
&
GIT_DIFF_FLAG__NO_DATA
)
==
0
);
bool
has_old
=
((
patch
->
ofile
.
flags
&
GIT_DIFF_FLAG__NO_DATA
)
==
0
);
bool
has_new
=
((
patch
->
nfile
.
flags
&
GIT_DIFF_FLAG__NO_DATA
)
==
0
);
bool
has_new
=
((
patch
->
nfile
.
flags
&
GIT_DIFF_FLAG__NO_DATA
)
==
0
);
...
@@ -481,22 +484,22 @@ static int diff_single_generate(patch_diff_with_delta *pd, git_xdiff_output *xo)
...
@@ -481,22 +484,22 @@ static int diff_single_generate(patch_diff_with_delta *pd, git_xdiff_output *xo)
patch
->
base
.
delta
=
&
pd
->
delta
;
patch
->
base
.
delta
=
&
pd
->
delta
;
patch_
diff
_init_common
(
patch
);
patch_
generated
_init_common
(
patch
);
if
(
pd
->
delta
.
status
==
GIT_DELTA_UNMODIFIED
&&
if
(
pd
->
delta
.
status
==
GIT_DELTA_UNMODIFIED
&&
!
(
patch
->
ofile
.
opts_flags
&
GIT_DIFF_INCLUDE_UNMODIFIED
))
!
(
patch
->
ofile
.
opts_flags
&
GIT_DIFF_INCLUDE_UNMODIFIED
))
return
error
;
return
error
;
error
=
patch_
diff_invoke_file_callback
(
patch
,
(
git_patch_diff
_output
*
)
xo
);
error
=
patch_
generated_invoke_file_callback
(
patch
,
(
git_patch_generated
_output
*
)
xo
);
if
(
!
error
)
if
(
!
error
)
error
=
patch_
diff_generate
(
patch
,
(
git_patch_diff
_output
*
)
xo
);
error
=
patch_
generated_create
(
patch
,
(
git_patch_generated
_output
*
)
xo
);
return
error
;
return
error
;
}
}
static
int
patch_
diff
_from_sources
(
static
int
patch_
generated
_from_sources
(
patch_
diff
_with_delta
*
pd
,
patch_
generated
_with_delta
*
pd
,
git_xdiff_output
*
xo
,
git_xdiff_output
*
xo
,
git_diff_file_content_src
*
oldsrc
,
git_diff_file_content_src
*
oldsrc
,
git_diff_file_content_src
*
newsrc
,
git_diff_file_content_src
*
newsrc
,
...
@@ -509,7 +512,7 @@ static int patch_diff_from_sources(
...
@@ -509,7 +512,7 @@ static int patch_diff_from_sources(
git_diff_file
*
lfile
=
&
pd
->
delta
.
old_file
,
*
rfile
=
&
pd
->
delta
.
new_file
;
git_diff_file
*
lfile
=
&
pd
->
delta
.
old_file
,
*
rfile
=
&
pd
->
delta
.
new_file
;
git_diff_file_content
*
ldata
=
&
pd
->
patch
.
ofile
,
*
rdata
=
&
pd
->
patch
.
nfile
;
git_diff_file_content
*
ldata
=
&
pd
->
patch
.
ofile
,
*
rdata
=
&
pd
->
patch
.
nfile
;
if
((
error
=
patch_
diff
_normalize_options
(
&
pd
->
patch
.
base
.
diff_opts
,
opts
))
<
0
)
if
((
error
=
patch_
generated
_normalize_options
(
&
pd
->
patch
.
base
.
diff_opts
,
opts
))
<
0
)
return
error
;
return
error
;
if
(
opts
&&
(
opts
->
flags
&
GIT_DIFF_REVERSE
)
!=
0
)
{
if
(
opts
&&
(
opts
->
flags
&
GIT_DIFF_REVERSE
)
!=
0
)
{
...
@@ -540,12 +543,12 @@ static int patch_diff_from_sources(
...
@@ -540,12 +543,12 @@ static int patch_diff_from_sources(
return
diff_single_generate
(
pd
,
xo
);
return
diff_single_generate
(
pd
,
xo
);
}
}
static
int
patch_
diff
_with_delta_alloc
(
static
int
patch_
generated
_with_delta_alloc
(
patch_
diff
_with_delta
**
out
,
patch_
generated
_with_delta
**
out
,
const
char
**
old_path
,
const
char
**
old_path
,
const
char
**
new_path
)
const
char
**
new_path
)
{
{
patch_
diff
_with_delta
*
pd
;
patch_
generated
_with_delta
*
pd
;
size_t
old_len
=
*
old_path
?
strlen
(
*
old_path
)
:
0
;
size_t
old_len
=
*
old_path
?
strlen
(
*
old_path
)
:
0
;
size_t
new_len
=
*
new_path
?
strlen
(
*
new_path
)
:
0
;
size_t
new_len
=
*
new_path
?
strlen
(
*
new_path
)
:
0
;
size_t
alloc_len
;
size_t
alloc_len
;
...
@@ -557,7 +560,7 @@ static int patch_diff_with_delta_alloc(
...
@@ -557,7 +560,7 @@ static int patch_diff_with_delta_alloc(
*
out
=
pd
=
git__calloc
(
1
,
alloc_len
);
*
out
=
pd
=
git__calloc
(
1
,
alloc_len
);
GITERR_CHECK_ALLOC
(
pd
);
GITERR_CHECK_ALLOC
(
pd
);
pd
->
patch
.
flags
=
GIT_PATCH_
DIFF
_ALLOCATED
;
pd
->
patch
.
flags
=
GIT_PATCH_
GENERATED
_ALLOCATED
;
if
(
*
old_path
)
{
if
(
*
old_path
)
{
memcpy
(
&
pd
->
paths
[
0
],
*
old_path
,
old_len
);
memcpy
(
&
pd
->
paths
[
0
],
*
old_path
,
old_len
);
...
@@ -585,7 +588,7 @@ static int diff_from_sources(
...
@@ -585,7 +588,7 @@ static int diff_from_sources(
void
*
payload
)
void
*
payload
)
{
{
int
error
=
0
;
int
error
=
0
;
patch_
diff
_with_delta
pd
;
patch_
generated
_with_delta
pd
;
git_xdiff_output
xo
;
git_xdiff_output
xo
;
memset
(
&
xo
,
0
,
sizeof
(
xo
));
memset
(
&
xo
,
0
,
sizeof
(
xo
));
...
@@ -595,7 +598,7 @@ static int diff_from_sources(
...
@@ -595,7 +598,7 @@ static int diff_from_sources(
memset
(
&
pd
,
0
,
sizeof
(
pd
));
memset
(
&
pd
,
0
,
sizeof
(
pd
));
error
=
patch_
diff
_from_sources
(
&
pd
,
&
xo
,
oldsrc
,
newsrc
,
opts
);
error
=
patch_
generated
_from_sources
(
&
pd
,
&
xo
,
oldsrc
,
newsrc
,
opts
);
git_patch_free
(
&
pd
.
patch
.
base
);
git_patch_free
(
&
pd
.
patch
.
base
);
...
@@ -609,13 +612,13 @@ static int patch_from_sources(
...
@@ -609,13 +612,13 @@ static int patch_from_sources(
const
git_diff_options
*
opts
)
const
git_diff_options
*
opts
)
{
{
int
error
=
0
;
int
error
=
0
;
patch_
diff
_with_delta
*
pd
;
patch_
generated
_with_delta
*
pd
;
git_xdiff_output
xo
;
git_xdiff_output
xo
;
assert
(
out
);
assert
(
out
);
*
out
=
NULL
;
*
out
=
NULL
;
if
((
error
=
patch_
diff
_with_delta_alloc
(
if
((
error
=
patch_
generated
_with_delta_alloc
(
&
pd
,
&
oldsrc
->
as_path
,
&
newsrc
->
as_path
))
<
0
)
&
pd
,
&
oldsrc
->
as_path
,
&
newsrc
->
as_path
))
<
0
)
return
error
;
return
error
;
...
@@ -623,7 +626,7 @@ static int patch_from_sources(
...
@@ -623,7 +626,7 @@ static int patch_from_sources(
diff_output_to_patch
(
&
xo
.
output
,
&
pd
->
patch
);
diff_output_to_patch
(
&
xo
.
output
,
&
pd
->
patch
);
git_xdiff_init
(
&
xo
,
opts
);
git_xdiff_init
(
&
xo
,
opts
);
if
(
!
(
error
=
patch_
diff
_from_sources
(
pd
,
&
xo
,
oldsrc
,
newsrc
,
opts
)))
if
(
!
(
error
=
patch_
generated
_from_sources
(
pd
,
&
xo
,
oldsrc
,
newsrc
,
opts
)))
*
out
=
(
git_patch
*
)
pd
;
*
out
=
(
git_patch
*
)
pd
;
else
else
git_patch_free
((
git_patch
*
)
pd
);
git_patch_free
((
git_patch
*
)
pd
);
...
@@ -748,7 +751,7 @@ int git_patch_from_diff(
...
@@ -748,7 +751,7 @@ int git_patch_from_diff(
int
error
=
0
;
int
error
=
0
;
git_xdiff_output
xo
;
git_xdiff_output
xo
;
git_diff_delta
*
delta
=
NULL
;
git_diff_delta
*
delta
=
NULL
;
git_patch_
diff
*
patch
=
NULL
;
git_patch_
generated
*
patch
=
NULL
;
if
(
patch_ptr
)
*
patch_ptr
=
NULL
;
if
(
patch_ptr
)
*
patch_ptr
=
NULL
;
...
@@ -770,17 +773,17 @@ int git_patch_from_diff(
...
@@ -770,17 +773,17 @@ int git_patch_from_diff(
(
diff
->
opts
.
flags
&
GIT_DIFF_SKIP_BINARY_CHECK
)
!=
0
))
(
diff
->
opts
.
flags
&
GIT_DIFF_SKIP_BINARY_CHECK
)
!=
0
))
return
0
;
return
0
;
if
((
error
=
patch_
diff
_alloc_from_diff
(
&
patch
,
diff
,
idx
))
<
0
)
if
((
error
=
patch_
generated
_alloc_from_diff
(
&
patch
,
diff
,
idx
))
<
0
)
return
error
;
return
error
;
memset
(
&
xo
,
0
,
sizeof
(
xo
));
memset
(
&
xo
,
0
,
sizeof
(
xo
));
diff_output_to_patch
(
&
xo
.
output
,
patch
);
diff_output_to_patch
(
&
xo
.
output
,
patch
);
git_xdiff_init
(
&
xo
,
&
diff
->
opts
);
git_xdiff_init
(
&
xo
,
&
diff
->
opts
);
error
=
patch_
diff
_invoke_file_callback
(
patch
,
&
xo
.
output
);
error
=
patch_
generated
_invoke_file_callback
(
patch
,
&
xo
.
output
);
if
(
!
error
)
if
(
!
error
)
error
=
patch_
diff_gener
ate
(
patch
,
&
xo
.
output
);
error
=
patch_
generated_cre
ate
(
patch
,
&
xo
.
output
);
if
(
!
error
)
{
if
(
!
error
)
{
/* TODO: if cumulative diff size is < 0.5 total size, flatten patch */
/* TODO: if cumulative diff size is < 0.5 total size, flatten patch */
...
@@ -795,27 +798,27 @@ int git_patch_from_diff(
...
@@ -795,27 +798,27 @@ int git_patch_from_diff(
return
error
;
return
error
;
}
}
git_diff_driver
*
git_patch_
diff_driver
(
git_patch_diff
*
patch
)
git_diff_driver
*
git_patch_
generated_driver
(
git_patch_generated
*
patch
)
{
{
/* ofile driver is representative for whole patch */
/* ofile driver is representative for whole patch */
return
patch
->
ofile
.
driver
;
return
patch
->
ofile
.
driver
;
}
}
void
git_patch_
diff
_old_data
(
void
git_patch_
generated
_old_data
(
char
**
ptr
,
size_t
*
len
,
git_patch_
diff
*
patch
)
char
**
ptr
,
size_t
*
len
,
git_patch_
generated
*
patch
)
{
{
*
ptr
=
patch
->
ofile
.
map
.
data
;
*
ptr
=
patch
->
ofile
.
map
.
data
;
*
len
=
patch
->
ofile
.
map
.
len
;
*
len
=
patch
->
ofile
.
map
.
len
;
}
}
void
git_patch_
diff
_new_data
(
void
git_patch_
generated
_new_data
(
char
**
ptr
,
size_t
*
len
,
git_patch_
diff
*
patch
)
char
**
ptr
,
size_t
*
len
,
git_patch_
generated
*
patch
)
{
{
*
ptr
=
patch
->
nfile
.
map
.
data
;
*
ptr
=
patch
->
nfile
.
map
.
data
;
*
len
=
patch
->
nfile
.
map
.
len
;
*
len
=
patch
->
nfile
.
map
.
len
;
}
}
static
int
patch_
diff
_file_cb
(
static
int
patch_
generated
_file_cb
(
const
git_diff_delta
*
delta
,
const
git_diff_delta
*
delta
,
float
progress
,
float
progress
,
void
*
payload
)
void
*
payload
)
...
@@ -824,7 +827,7 @@ static int patch_diff_file_cb(
...
@@ -824,7 +827,7 @@ static int patch_diff_file_cb(
return
0
;
return
0
;
}
}
static
int
patch_
diff
_binary_cb
(
static
int
patch_
generated
_binary_cb
(
const
git_diff_delta
*
delta
,
const
git_diff_delta
*
delta
,
const
git_diff_binary
*
binary
,
const
git_diff_binary
*
binary
,
void
*
payload
)
void
*
payload
)
...
@@ -859,7 +862,7 @@ static int git_patch_hunk_cb(
...
@@ -859,7 +862,7 @@ static int git_patch_hunk_cb(
const
git_diff_hunk
*
hunk_
,
const
git_diff_hunk
*
hunk_
,
void
*
payload
)
void
*
payload
)
{
{
git_patch_
diff
*
patch
=
payload
;
git_patch_
generated
*
patch
=
payload
;
git_patch_hunk
*
hunk
;
git_patch_hunk
*
hunk
;
GIT_UNUSED
(
delta
);
GIT_UNUSED
(
delta
);
...
@@ -877,13 +880,13 @@ static int git_patch_hunk_cb(
...
@@ -877,13 +880,13 @@ static int git_patch_hunk_cb(
return
0
;
return
0
;
}
}
static
int
patch_
diff
_line_cb
(
static
int
patch_
generated
_line_cb
(
const
git_diff_delta
*
delta
,
const
git_diff_delta
*
delta
,
const
git_diff_hunk
*
hunk_
,
const
git_diff_hunk
*
hunk_
,
const
git_diff_line
*
line_
,
const
git_diff_line
*
line_
,
void
*
payload
)
void
*
payload
)
{
{
git_patch_
diff
*
patch
=
payload
;
git_patch_
generated
*
patch
=
payload
;
git_patch_hunk
*
hunk
;
git_patch_hunk
*
hunk
;
git_diff_line
*
line
;
git_diff_line
*
line
;
...
@@ -917,7 +920,7 @@ static int patch_diff_line_cb(
...
@@ -917,7 +920,7 @@ static int patch_diff_line_cb(
}
}
static
void
diff_output_init
(
static
void
diff_output_init
(
git_patch_
diff
_output
*
out
,
git_patch_
generated
_output
*
out
,
const
git_diff_options
*
opts
,
const
git_diff_options
*
opts
,
git_diff_file_cb
file_cb
,
git_diff_file_cb
file_cb
,
git_diff_binary_cb
binary_cb
,
git_diff_binary_cb
binary_cb
,
...
@@ -936,14 +939,15 @@ static void diff_output_init(
...
@@ -936,14 +939,15 @@ static void diff_output_init(
out
->
payload
=
payload
;
out
->
payload
=
payload
;
}
}
static
void
diff_output_to_patch
(
git_patch_diff_output
*
out
,
git_patch_diff
*
patch
)
static
void
diff_output_to_patch
(
git_patch_generated_output
*
out
,
git_patch_generated
*
patch
)
{
{
diff_output_init
(
diff_output_init
(
out
,
out
,
NULL
,
NULL
,
patch_
diff
_file_cb
,
patch_
generated
_file_cb
,
patch_
diff
_binary_cb
,
patch_
generated
_binary_cb
,
git_patch_hunk_cb
,
git_patch_hunk_cb
,
patch_
diff
_line_cb
,
patch_
generated
_line_cb
,
patch
);
patch
);
}
}
src/patch_
diff
.h
→
src/patch_
generate
.h
View file @
8d44f8b7
...
@@ -4,8 +4,8 @@
...
@@ -4,8 +4,8 @@
* This file is part of libgit2, distributed under the GNU GPL v2 with
* This file is part of libgit2, distributed under the GNU GPL v2 with
* a Linking Exception. For full terms see the included COPYING file.
* a Linking Exception. For full terms see the included COPYING file.
*/
*/
#ifndef INCLUDE_
diff_patch
_h__
#ifndef INCLUDE_
patch_generate
_h__
#define INCLUDE_
diff_patch
_h__
#define INCLUDE_
patch_generate
_h__
#include "common.h"
#include "common.h"
#include "diff.h"
#include "diff.h"
...
@@ -13,17 +13,17 @@
...
@@ -13,17 +13,17 @@
#include "patch.h"
#include "patch.h"
enum
{
enum
{
GIT_PATCH_
DIFF
_ALLOCATED
=
(
1
<<
0
),
GIT_PATCH_
GENERATED
_ALLOCATED
=
(
1
<<
0
),
GIT_PATCH_
DIFF
_INITIALIZED
=
(
1
<<
1
),
GIT_PATCH_
GENERATED
_INITIALIZED
=
(
1
<<
1
),
GIT_PATCH_
DIFF
_LOADED
=
(
1
<<
2
),
GIT_PATCH_
GENERATED
_LOADED
=
(
1
<<
2
),
/* the two sides are different */
/* the two sides are different */
GIT_PATCH_
DIFF
_DIFFABLE
=
(
1
<<
3
),
GIT_PATCH_
GENERATED
_DIFFABLE
=
(
1
<<
3
),
/* the difference between the two sides has been computed */
/* the difference between the two sides has been computed */
GIT_PATCH_
DIFF
_DIFFED
=
(
1
<<
4
),
GIT_PATCH_
GENERATED
_DIFFED
=
(
1
<<
4
),
GIT_PATCH_
DIFF
_FLATTENED
=
(
1
<<
5
),
GIT_PATCH_
GENERATED
_FLATTENED
=
(
1
<<
5
),
};
};
struct
git_patch_
diff
{
struct
git_patch_
generated
{
struct
git_patch
base
;
struct
git_patch
base
;
git_diff
*
diff
;
/* for refcount purposes, maybe NULL for blob diffs */
git_diff
*
diff
;
/* for refcount purposes, maybe NULL for blob diffs */
...
@@ -34,16 +34,18 @@ struct git_patch_diff {
...
@@ -34,16 +34,18 @@ struct git_patch_diff {
git_pool
flattened
;
git_pool
flattened
;
};
};
typedef
struct
git_patch_
diff
git_patch_diff
;
typedef
struct
git_patch_
generated
git_patch_generated
;
extern
git_diff_driver
*
git_patch_
diff_driver
(
git_patch_diff
*
);
extern
git_diff_driver
*
git_patch_
generated_driver
(
git_patch_generated
*
);
extern
void
git_patch_diff_old_data
(
char
**
,
size_t
*
,
git_patch_diff
*
);
extern
void
git_patch_generated_old_data
(
extern
void
git_patch_diff_new_data
(
char
**
,
size_t
*
,
git_patch_diff
*
);
char
**
,
size_t
*
,
git_patch_generated
*
);
extern
void
git_patch_generated_new_data
(
char
**
,
size_t
*
,
git_patch_generated
*
);
typedef
struct
git_patch_
diff_output
git_patch_diff
_output
;
typedef
struct
git_patch_
generated_output
git_patch_generated
_output
;
struct
git_patch_
diff
_output
{
struct
git_patch_
generated
_output
{
/* these callbacks are issued with the diff data */
/* these callbacks are issued with the diff data */
git_diff_file_cb
file_cb
;
git_diff_file_cb
file_cb
;
git_diff_binary_cb
binary_cb
;
git_diff_binary_cb
binary_cb
;
...
@@ -57,7 +59,8 @@ struct git_patch_diff_output {
...
@@ -57,7 +59,8 @@ struct git_patch_diff_output {
/* this callback is used to do the diff and drive the other callbacks.
/* this callback is used to do the diff and drive the other callbacks.
* see diff_xdiff.h for how to use this in practice for now.
* see diff_xdiff.h for how to use this in practice for now.
*/
*/
int
(
*
diff_cb
)(
git_patch_diff_output
*
output
,
git_patch_diff
*
patch
);
int
(
*
diff_cb
)(
git_patch_generated_output
*
output
,
git_patch_generated
*
patch
);
};
};
#endif
#endif
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