Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
李少辉-开发者
git
提交
8fcd4218
G
git
项目概览
李少辉-开发者
/
git
与 Fork 源项目一致
从无法访问的项目Fork
通知
2
Star
1
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
G
git
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
8fcd4218
编写于
4月 10, 2006
作者:
J
Junio C Hamano
浏览文件
操作
浏览文件
下载
差异文件
Merge branch 'eb/apply' into next
* eb/apply: Implement limited context matching in git-apply.
上级
6b32ee23
47495887
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
112 addition
and
19 deletion
+112
-19
Documentation/git-apply.txt
Documentation/git-apply.txt
+7
-1
apply.c
apply.c
+105
-18
未找到文件。
Documentation/git-apply.txt
浏览文件 @
8fcd4218
...
...
@@ -11,7 +11,7 @@ SYNOPSIS
[verse]
'git-apply' [--stat] [--numstat] [--summary] [--check] [--index] [--apply]
[--no-add] [--index-info] [--allow-binary-replacement] [-z] [-pNUM]
[--whitespace=<nowarn|warn|error|error-all|strip>]
[-
CNUM] [-
-whitespace=<nowarn|warn|error|error-all|strip>]
[<patch>...]
DESCRIPTION
...
...
@@ -73,6 +73,12 @@ OPTIONS
Remove <n> leading slashes from traditional diff paths. The
default is 1.
-C<n>::
Ensure at least <n> lines of surrounding context match before
and after each change. When fewer lines of surrounding
context exist they all most match. By default no context is
ever ignored.
--apply::
If you use any of the options marked ``Turns off
"apply"'' above, git-apply reads and outputs the
...
...
apply.c
浏览文件 @
8fcd4218
...
...
@@ -32,8 +32,9 @@ static int apply = 1;
static
int
no_add
=
0
;
static
int
show_index_info
=
0
;
static
int
line_termination
=
'\n'
;
static
unsigned
long
p_context
=
-
1
;
static
const
char
apply_usage
[]
=
"git-apply [--stat] [--numstat] [--summary] [--check] [--index] [--apply] [--no-add] [--index-info] [--allow-binary-replacement] [-z] [-pNUM] [--whitespace=<nowarn|warn|error|error-all|strip>] <patch>..."
;
"git-apply [--stat] [--numstat] [--summary] [--check] [--index] [--apply] [--no-add] [--index-info] [--allow-binary-replacement] [-z] [-pNUM] [-
CNUM] [-
-whitespace=<nowarn|warn|error|error-all|strip>] <patch>..."
;
static
enum
whitespace_eol
{
nowarn_whitespace
,
...
...
@@ -100,6 +101,7 @@ static int max_change, max_len;
static
int
linenr
=
1
;
struct
fragment
{
unsigned
long
leading
,
trailing
;
unsigned
long
oldpos
,
oldlines
;
unsigned
long
newpos
,
newlines
;
const
char
*
patch
;
...
...
@@ -817,12 +819,15 @@ static int parse_fragment(char *line, unsigned long size, struct patch *patch, s
int
added
,
deleted
;
int
len
=
linelen
(
line
,
size
),
offset
;
unsigned
long
oldlines
,
newlines
;
unsigned
long
leading
,
trailing
;
offset
=
parse_fragment_header
(
line
,
len
,
fragment
);
if
(
offset
<
0
)
return
-
1
;
oldlines
=
fragment
->
oldlines
;
newlines
=
fragment
->
newlines
;
leading
=
0
;
trailing
=
0
;
if
(
patch
->
is_new
<
0
)
{
patch
->
is_new
=
!
oldlines
;
...
...
@@ -860,10 +865,14 @@ static int parse_fragment(char *line, unsigned long size, struct patch *patch, s
case
' '
:
oldlines
--
;
newlines
--
;
if
(
!
deleted
&&
!
added
)
leading
++
;
trailing
++
;
break
;
case
'-'
:
deleted
++
;
oldlines
--
;
trailing
=
0
;
break
;
case
'+'
:
/*
...
...
@@ -887,6 +896,7 @@ static int parse_fragment(char *line, unsigned long size, struct patch *patch, s
}
added
++
;
newlines
--
;
trailing
=
0
;
break
;
/* We allow "\ No newline at end of file". Depending
...
...
@@ -904,6 +914,9 @@ static int parse_fragment(char *line, unsigned long size, struct patch *patch, s
}
if
(
oldlines
||
newlines
)
return
-
1
;
fragment
->
leading
=
leading
;
fragment
->
trailing
=
trailing
;
/* If a fragment ends with an incomplete line, we failed to include
* it in the above loop because we hit oldlines == newlines == 0
* before seeing it.
...
...
@@ -1087,7 +1100,7 @@ static int read_old_data(struct stat *st, const char *path, void *buf, unsigned
}
}
static
int
find_offset
(
const
char
*
buf
,
unsigned
long
size
,
const
char
*
fragment
,
unsigned
long
fragsize
,
int
line
)
static
int
find_offset
(
const
char
*
buf
,
unsigned
long
size
,
const
char
*
fragment
,
unsigned
long
fragsize
,
int
line
,
int
*
lines
)
{
int
i
;
unsigned
long
start
,
backwards
,
forwards
;
...
...
@@ -1148,6 +1161,7 @@ static int find_offset(const char *buf, unsigned long size, const char *fragment
n
=
(
i
>>
1
)
+
1
;
if
(
i
&
1
)
n
=
-
n
;
*
lines
=
n
;
return
try
;
}
...
...
@@ -1157,6 +1171,33 @@ static int find_offset(const char *buf, unsigned long size, const char *fragment
return
-
1
;
}
static
void
remove_first_line
(
const
char
**
rbuf
,
int
*
rsize
)
{
const
char
*
buf
=
*
rbuf
;
int
size
=
*
rsize
;
unsigned
long
offset
;
offset
=
0
;
while
(
offset
<=
size
)
{
if
(
buf
[
offset
++
]
==
'\n'
)
break
;
}
*
rsize
=
size
-
offset
;
*
rbuf
=
buf
+
offset
;
}
static
void
remove_last_line
(
const
char
**
rbuf
,
int
*
rsize
)
{
const
char
*
buf
=
*
rbuf
;
int
size
=
*
rsize
;
unsigned
long
offset
;
offset
=
size
-
1
;
while
(
offset
>
0
)
{
if
(
buf
[
--
offset
]
==
'\n'
)
break
;
}
*
rsize
=
offset
+
1
;
}
struct
buffer_desc
{
char
*
buffer
;
unsigned
long
size
;
...
...
@@ -1192,7 +1233,10 @@ static int apply_one_fragment(struct buffer_desc *desc, struct fragment *frag)
int
offset
,
size
=
frag
->
size
;
char
*
old
=
xmalloc
(
size
);
char
*
new
=
xmalloc
(
size
);
const
char
*
oldlines
,
*
newlines
;
int
oldsize
=
0
,
newsize
=
0
;
unsigned
long
leading
,
trailing
;
int
pos
,
lines
;
while
(
size
>
0
)
{
int
len
=
linelen
(
patch
,
size
);
...
...
@@ -1241,23 +1285,59 @@ static int apply_one_fragment(struct buffer_desc *desc, struct fragment *frag)
newsize
--
;
}
#endif
offset
=
find_offset
(
buf
,
desc
->
size
,
old
,
oldsize
,
frag
->
newpos
);
if
(
offset
>=
0
)
{
int
diff
=
newsize
-
oldsize
;
unsigned
long
size
=
desc
->
size
+
diff
;
unsigned
long
alloc
=
desc
->
alloc
;
if
(
size
>
alloc
)
{
alloc
=
size
+
8192
;
desc
->
alloc
=
alloc
;
buf
=
xrealloc
(
buf
,
alloc
);
desc
->
buffer
=
buf
;
oldlines
=
old
;
newlines
=
new
;
leading
=
frag
->
leading
;
trailing
=
frag
->
trailing
;
lines
=
0
;
pos
=
frag
->
newpos
;
for
(;;)
{
offset
=
find_offset
(
buf
,
desc
->
size
,
oldlines
,
oldsize
,
pos
,
&
lines
);
if
(
offset
>=
0
)
{
int
diff
=
newsize
-
oldsize
;
unsigned
long
size
=
desc
->
size
+
diff
;
unsigned
long
alloc
=
desc
->
alloc
;
/* Warn if it was necessary to reduce the number
* of context lines.
*/
if
((
leading
!=
frag
->
leading
)
||
(
trailing
!=
frag
->
trailing
))
fprintf
(
stderr
,
"Context reduced to (%ld/%ld) to apply fragment at %d
\n
"
,
leading
,
trailing
,
pos
+
lines
);
if
(
size
>
alloc
)
{
alloc
=
size
+
8192
;
desc
->
alloc
=
alloc
;
buf
=
xrealloc
(
buf
,
alloc
);
desc
->
buffer
=
buf
;
}
desc
->
size
=
size
;
memmove
(
buf
+
offset
+
newsize
,
buf
+
offset
+
oldsize
,
size
-
offset
-
newsize
);
memcpy
(
buf
+
offset
,
newlines
,
newsize
);
offset
=
0
;
break
;
}
/* Am I at my context limits? */
if
((
leading
<=
p_context
)
&&
(
trailing
<=
p_context
))
break
;
/* Reduce the number of context lines
* Reduce both leading and trailing if they are equal
* otherwise just reduce the larger context.
*/
if
(
leading
>=
trailing
)
{
remove_first_line
(
&
oldlines
,
&
oldsize
);
remove_first_line
(
&
newlines
,
&
newsize
);
pos
--
;
leading
--
;
}
if
(
trailing
>
leading
)
{
remove_last_line
(
&
oldlines
,
&
oldsize
);
remove_last_line
(
&
newlines
,
&
newsize
);
trailing
--
;
}
desc
->
size
=
size
;
memmove
(
buf
+
offset
+
newsize
,
buf
+
offset
+
oldsize
,
size
-
offset
-
newsize
);
memcpy
(
buf
+
offset
,
new
,
newsize
);
offset
=
0
;
}
free
(
old
);
...
...
@@ -1882,6 +1962,7 @@ int main(int argc, char **argv)
for
(
i
=
1
;
i
<
argc
;
i
++
)
{
const
char
*
arg
=
argv
[
i
];
char
*
end
;
int
fd
;
if
(
!
strcmp
(
arg
,
"-"
))
{
...
...
@@ -1945,6 +2026,12 @@ int main(int argc, char **argv)
line_termination
=
0
;
continue
;
}
if
(
!
strncmp
(
arg
,
"-C"
,
2
))
{
p_context
=
strtoul
(
arg
+
2
,
&
end
,
0
);
if
(
*
end
!=
'\0'
)
die
(
"unrecognized context count '%s'"
,
arg
+
2
);
continue
;
}
if
(
!
strncmp
(
arg
,
"--whitespace="
,
13
))
{
whitespace_option
=
arg
+
13
;
parse_whitespace_option
(
arg
+
13
);
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录