Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
李少辉-开发者
git
提交
f97ccded
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,发现更多精彩内容 >>
提交
f97ccded
编写于
6月 22, 2006
作者:
J
Junio C Hamano
浏览文件
操作
浏览文件
下载
差异文件
Merge branch 'lt/objlist'
* lt/objlist: Add "named object array" concept
上级
ec9d00d0
1f1e895f
变更
14
隐藏空白更改
内联
并排
Showing
14 changed file
with
151 addition
and
131 deletion
+151
-131
builtin-diff-files.c
builtin-diff-files.c
+1
-1
builtin-diff-index.c
builtin-diff-index.c
+1
-1
builtin-diff-tree.c
builtin-diff-tree.c
+12
-30
builtin-diff.c
builtin-diff.c
+14
-12
builtin-grep.c
builtin-grep.c
+6
-10
builtin-log.c
builtin-log.c
+2
-2
builtin-rev-list.c
builtin-rev-list.c
+33
-31
diff-lib.c
diff-lib.c
+2
-2
http-push.c
http-push.c
+19
-9
name-rev.c
name-rev.c
+10
-9
object.c
object.c
+17
-0
object.h
object.h
+12
-1
revision.c
revision.c
+15
-18
revision.h
revision.h
+7
-5
未找到文件。
builtin-diff-files.c
浏览文件 @
f97ccded
...
...
@@ -41,7 +41,7 @@ int cmd_diff_files(int argc, const char **argv, char **envp)
* rev.max_count is reasonable (0 <= n <= 3),
* there is no other revision filtering parameters.
*/
if
(
rev
.
pending
_objects
||
if
(
rev
.
pending
.
nr
||
rev
.
min_age
!=
-
1
||
rev
.
max_age
!=
-
1
)
usage
(
diff_files_usage
);
/*
...
...
builtin-diff-index.c
浏览文件 @
f97ccded
...
...
@@ -32,7 +32,7 @@ int cmd_diff_index(int argc, const char **argv, char **envp)
* Make sure there is one revision (i.e. pending object),
* and there is no revision filtering parameters.
*/
if
(
!
rev
.
pending_objects
||
rev
.
pending_objects
->
next
||
if
(
rev
.
pending
.
nr
!=
1
||
rev
.
max_count
!=
-
1
||
rev
.
min_age
!=
-
1
||
rev
.
max_age
!=
-
1
)
usage
(
diff_cache_usage
);
return
run_diff_index
(
&
rev
,
cached
);
...
...
builtin-diff-tree.c
浏览文件 @
f97ccded
...
...
@@ -65,7 +65,6 @@ int cmd_diff_tree(int argc, const char **argv, char **envp)
char
line
[
1000
];
struct
object
*
tree1
,
*
tree2
;
static
struct
rev_info
*
opt
=
&
log_tree_opt
;
struct
object_list
*
list
;
int
read_stdin
=
0
;
git_config
(
git_diff_config
);
...
...
@@ -86,45 +85,28 @@ int cmd_diff_tree(int argc, const char **argv, char **envp)
}
/*
* NOTE! "setup_revisions()" will have inserted the revisions
* it parsed in reverse order. So if you do
*
* git-diff-tree a b
*
* the commit list will be "b" -> "a" -> NULL, so we reverse
* the order of the objects if the first one is not marked
* UNINTERESTING.
* NOTE! We expect "a ^b" to be equal to "a..b", so we
* reverse the order of the objects if the second one
* is marked UNINTERESTING.
*/
nr_sha1
=
0
;
list
=
opt
->
pending_objects
;
if
(
list
)
{
nr_sha1
++
;
tree1
=
list
->
item
;
list
=
list
->
next
;
if
(
list
)
{
nr_sha1
++
;
tree2
=
tree1
;
tree1
=
list
->
item
;
if
(
list
->
next
)
usage
(
diff_tree_usage
);
/* Switch them around if the second one was uninteresting.. */
if
(
tree2
->
flags
&
UNINTERESTING
)
{
struct
object
*
tmp
=
tree2
;
tree2
=
tree1
;
tree1
=
tmp
;
}
}
}
nr_sha1
=
opt
->
pending
.
nr
;
switch
(
nr_sha1
)
{
case
0
:
if
(
!
read_stdin
)
usage
(
diff_tree_usage
);
break
;
case
1
:
tree1
=
opt
->
pending
.
objects
[
0
].
item
;
diff_tree_commit_sha1
(
tree1
->
sha1
);
break
;
case
2
:
tree1
=
opt
->
pending
.
objects
[
0
].
item
;
tree2
=
opt
->
pending
.
objects
[
1
].
item
;
if
(
tree2
->
flags
&
UNINTERESTING
)
{
struct
object
*
tmp
=
tree2
;
tree2
=
tree1
;
tree1
=
tmp
;
}
diff_tree_sha1
(
tree1
->
sha1
,
tree2
->
sha1
,
""
,
&
opt
->
diffopt
);
...
...
builtin-diff.c
浏览文件 @
f97ccded
...
...
@@ -50,7 +50,7 @@ static int builtin_diff_files(struct rev_info *revs,
* specified rev.max_count is reasonable (0 <= n <= 3), and
* there is no other revision filtering parameter.
*/
if
(
revs
->
pending
_objects
||
if
(
revs
->
pending
.
nr
||
revs
->
min_age
!=
-
1
||
revs
->
max_age
!=
-
1
||
3
<
revs
->
max_count
)
...
...
@@ -172,7 +172,7 @@ static int builtin_diff_index(struct rev_info *revs,
* Make sure there is one revision (i.e. pending object),
* and there is no revision filtering parameters.
*/
if
(
!
revs
->
pending_objects
||
revs
->
pending_objects
->
next
||
if
(
revs
->
pending
.
nr
!=
1
||
revs
->
max_count
!=
-
1
||
revs
->
min_age
!=
-
1
||
revs
->
max_age
!=
-
1
)
usage
(
builtin_diff_usage
);
...
...
@@ -181,10 +181,10 @@ static int builtin_diff_index(struct rev_info *revs,
static
int
builtin_diff_tree
(
struct
rev_info
*
revs
,
int
argc
,
const
char
**
argv
,
struct
object_
list
*
ent
)
struct
object_
array_entry
*
ent
)
{
const
unsigned
char
*
(
sha1
[
2
]);
int
swap
=
1
;
int
swap
=
0
;
while
(
1
<
argc
)
{
const
char
*
arg
=
argv
[
1
];
if
(
!
strcmp
(
arg
,
"--raw"
))
...
...
@@ -195,10 +195,10 @@ static int builtin_diff_tree(struct rev_info *revs,
}
/* We saw two trees, ent[0] and ent[1].
*
unless ent[0
] is unintesting, they are swapped
*
if ent[1
] is unintesting, they are swapped
*/
if
(
ent
[
0
].
item
->
flags
&
UNINTERESTING
)
swap
=
0
;
if
(
ent
[
1
].
item
->
flags
&
UNINTERESTING
)
swap
=
1
;
sha1
[
swap
]
=
ent
[
0
].
item
->
sha1
;
sha1
[
1
-
swap
]
=
ent
[
1
].
item
->
sha1
;
diff_tree_sha1
(
sha1
[
0
],
sha1
[
1
],
""
,
&
revs
->
diffopt
);
...
...
@@ -208,7 +208,7 @@ static int builtin_diff_tree(struct rev_info *revs,
static
int
builtin_diff_combined
(
struct
rev_info
*
revs
,
int
argc
,
const
char
**
argv
,
struct
object_
list
*
ent
,
struct
object_
array_entry
*
ent
,
int
ents
)
{
const
unsigned
char
(
*
parent
)[
20
];
...
...
@@ -242,13 +242,14 @@ void add_head(struct rev_info *revs)
obj
=
parse_object
(
sha1
);
if
(
!
obj
)
return
;
add_
object
(
obj
,
&
revs
->
pending_objects
,
NULL
,
"HEAD"
);
add_
pending_object
(
revs
,
obj
,
"HEAD"
);
}
int
cmd_diff
(
int
argc
,
const
char
**
argv
,
char
**
envp
)
{
int
i
;
struct
rev_info
rev
;
struct
object_
list
*
list
,
ent
[
100
];
struct
object_
array_entry
ent
[
100
];
int
ents
=
0
,
blobs
=
0
,
paths
=
0
;
const
char
*
path
=
NULL
;
struct
blobinfo
blob
[
2
];
...
...
@@ -281,7 +282,7 @@ int cmd_diff(int argc, const char **argv, char **envp)
/* Do we have --cached and not have a pending object, then
* default to HEAD by hand. Eek.
*/
if
(
!
rev
.
pending
_objects
)
{
if
(
!
rev
.
pending
.
nr
)
{
int
i
;
for
(
i
=
1
;
i
<
argc
;
i
++
)
{
const
char
*
arg
=
argv
[
i
];
...
...
@@ -294,7 +295,8 @@ int cmd_diff(int argc, const char **argv, char **envp)
}
}
for
(
list
=
rev
.
pending_objects
;
list
;
list
=
list
->
next
)
{
for
(
i
=
0
;
i
<
rev
.
pending
.
nr
;
i
++
)
{
struct
object_array_entry
*
list
=
rev
.
pending
.
objects
+
i
;
struct
object
*
obj
=
list
->
item
;
const
char
*
name
=
list
->
name
;
int
flags
=
(
obj
->
flags
&
UNINTERESTING
);
...
...
builtin-grep.c
浏览文件 @
f97ccded
...
...
@@ -658,7 +658,7 @@ int cmd_grep(int argc, const char **argv, char **envp)
int
cached
=
0
;
int
seen_dashdash
=
0
;
struct
grep_opt
opt
;
struct
object_
list
*
list
,
**
tail
,
*
object_list
=
NULL
;
struct
object_
array
list
=
{
0
,
0
,
NULL
}
;
const
char
*
prefix
=
setup_git_directory
();
const
char
**
paths
=
NULL
;
int
i
;
...
...
@@ -678,7 +678,6 @@ int cmd_grep(int argc, const char **argv, char **envp)
* that continues up to the -- (if exists), and then paths.
*/
tail
=
&
object_list
;
while
(
1
<
argc
)
{
const
char
*
arg
=
argv
[
1
];
argc
--
;
argv
++
;
...
...
@@ -852,12 +851,9 @@ int cmd_grep(int argc, const char **argv, char **envp)
/* Is it a rev? */
if
(
!
get_sha1
(
arg
,
sha1
))
{
struct
object
*
object
=
parse_object
(
sha1
);
struct
object_list
*
elem
;
if
(
!
object
)
die
(
"bad object %s"
,
arg
);
elem
=
object_list_insert
(
object
,
tail
);
elem
->
name
=
arg
;
tail
=
&
elem
->
next
;
add_object_array
(
object
,
arg
,
&
list
);
continue
;
}
if
(
!
strcmp
(
arg
,
"--"
))
{
...
...
@@ -882,16 +878,16 @@ int cmd_grep(int argc, const char **argv, char **envp)
paths
[
1
]
=
NULL
;
}
if
(
!
object_list
)
if
(
!
list
.
nr
)
return
!
grep_cache
(
&
opt
,
paths
,
cached
);
if
(
cached
)
die
(
"both --cached and trees are given."
);
for
(
list
=
object_list
;
list
;
list
=
list
->
next
)
{
for
(
i
=
0
;
i
<
list
.
nr
;
i
++
)
{
struct
object
*
real_obj
;
real_obj
=
deref_tag
(
list
->
item
,
NULL
,
0
);
if
(
grep_object
(
&
opt
,
paths
,
real_obj
,
list
->
name
))
real_obj
=
deref_tag
(
list
.
objects
[
i
].
item
,
NULL
,
0
);
if
(
grep_object
(
&
opt
,
paths
,
real_obj
,
list
.
objects
[
i
].
name
))
hit
=
1
;
}
return
!
hit
;
...
...
builtin-log.c
浏览文件 @
f97ccded
...
...
@@ -257,8 +257,8 @@ int cmd_format_patch(int argc, const char **argv, char **envp)
output_directory
);
}
if
(
rev
.
pending
_objects
&&
rev
.
pending_objects
->
next
==
NULL
)
{
rev
.
pending
_objects
->
item
->
flags
|=
UNINTERESTING
;
if
(
rev
.
pending
.
nr
==
1
)
{
rev
.
pending
.
objects
[
0
].
item
->
flags
|=
UNINTERESTING
;
add_head
(
&
rev
);
}
...
...
builtin-rev-list.c
浏览文件 @
f97ccded
...
...
@@ -99,26 +99,26 @@ static void show_commit(struct commit *commit)
}
}
static
struct
object_list
**
process_blob
(
struct
blob
*
blob
,
struct
object_list
*
*
p
,
struct
name_path
*
path
,
const
char
*
name
)
static
void
process_blob
(
struct
blob
*
blob
,
struct
object_array
*
p
,
struct
name_path
*
path
,
const
char
*
name
)
{
struct
object
*
obj
=
&
blob
->
object
;
if
(
!
revs
.
blob_objects
)
return
p
;
return
;
if
(
obj
->
flags
&
(
UNINTERESTING
|
SEEN
))
return
p
;
return
;
obj
->
flags
|=
SEEN
;
name
=
strdup
(
name
);
return
add_object
(
obj
,
p
,
path
,
name
);
add_object
(
obj
,
p
,
path
,
name
);
}
static
struct
object_list
**
process_tree
(
struct
tree
*
tree
,
struct
object_list
*
*
p
,
struct
name_path
*
path
,
const
char
*
name
)
static
void
process_tree
(
struct
tree
*
tree
,
struct
object_array
*
p
,
struct
name_path
*
path
,
const
char
*
name
)
{
struct
object
*
obj
=
&
tree
->
object
;
struct
tree_desc
desc
;
...
...
@@ -126,14 +126,14 @@ static struct object_list **process_tree(struct tree *tree,
struct
name_path
me
;
if
(
!
revs
.
tree_objects
)
return
p
;
return
;
if
(
obj
->
flags
&
(
UNINTERESTING
|
SEEN
))
return
p
;
return
;
if
(
parse_tree
(
tree
)
<
0
)
die
(
"bad tree object %s"
,
sha1_to_hex
(
obj
->
sha1
));
obj
->
flags
|=
SEEN
;
name
=
strdup
(
name
);
p
=
add_object
(
obj
,
p
,
path
,
name
);
add_object
(
obj
,
p
,
path
,
name
);
me
.
up
=
path
;
me
.
elem
=
name
;
me
.
elem_len
=
strlen
(
name
);
...
...
@@ -143,57 +143,59 @@ static struct object_list **process_tree(struct tree *tree,
while
(
tree_entry
(
&
desc
,
&
entry
))
{
if
(
S_ISDIR
(
entry
.
mode
))
p
=
p
rocess_tree
(
lookup_tree
(
entry
.
sha1
),
p
,
&
me
,
entry
.
path
);
process_tree
(
lookup_tree
(
entry
.
sha1
),
p
,
&
me
,
entry
.
path
);
else
p
=
p
rocess_blob
(
lookup_blob
(
entry
.
sha1
),
p
,
&
me
,
entry
.
path
);
process_blob
(
lookup_blob
(
entry
.
sha1
),
p
,
&
me
,
entry
.
path
);
}
free
(
tree
->
buffer
);
tree
->
buffer
=
NULL
;
return
p
;
}
static
void
show_commit_list
(
struct
rev_info
*
revs
)
{
int
i
;
struct
commit
*
commit
;
struct
object_
list
*
objects
=
NULL
,
**
p
=
&
objects
,
*
pending
;
struct
object_
array
objects
=
{
0
,
0
,
NULL
}
;
while
((
commit
=
get_revision
(
revs
))
!=
NULL
)
{
p
=
process_tree
(
commit
->
tree
,
p
,
NULL
,
""
);
p
rocess_tree
(
commit
->
tree
,
&
objects
,
NULL
,
""
);
show_commit
(
commit
);
}
for
(
pending
=
revs
->
pending_objects
;
pending
;
pending
=
pending
->
next
)
{
for
(
i
=
0
;
i
<
revs
->
pending
.
nr
;
i
++
)
{
struct
object_array_entry
*
pending
=
revs
->
pending
.
objects
+
i
;
struct
object
*
obj
=
pending
->
item
;
const
char
*
name
=
pending
->
name
;
if
(
obj
->
flags
&
(
UNINTERESTING
|
SEEN
))
continue
;
if
(
obj
->
type
==
TYPE_TAG
)
{
obj
->
flags
|=
SEEN
;
p
=
add_object
(
obj
,
p
,
NULL
,
name
);
add_object_array
(
obj
,
name
,
&
objects
);
continue
;
}
if
(
obj
->
type
==
TYPE_TREE
)
{
p
=
process_tree
((
struct
tree
*
)
obj
,
p
,
NULL
,
name
);
p
rocess_tree
((
struct
tree
*
)
obj
,
&
objects
,
NULL
,
name
);
continue
;
}
if
(
obj
->
type
==
TYPE_BLOB
)
{
p
=
process_blob
((
struct
blob
*
)
obj
,
p
,
NULL
,
name
);
p
rocess_blob
((
struct
blob
*
)
obj
,
&
objects
,
NULL
,
name
);
continue
;
}
die
(
"unknown pending object %s (%s)"
,
sha1_to_hex
(
obj
->
sha1
),
name
);
}
while
(
objects
)
{
for
(
i
=
0
;
i
<
objects
.
nr
;
i
++
)
{
struct
object_array_entry
*
p
=
objects
.
objects
+
i
;
/* An object with name "foo\n0000000..." can be used to
* confuse downstream git-pack-objects very badly.
*/
const
char
*
ep
=
strchr
(
objects
->
name
,
'\n'
);
const
char
*
ep
=
strchr
(
p
->
name
,
'\n'
);
if
(
ep
)
{
printf
(
"%s %.*s
\n
"
,
sha1_to_hex
(
objects
->
item
->
sha1
),
(
int
)
(
ep
-
objects
->
name
),
objects
->
name
);
printf
(
"%s %.*s
\n
"
,
sha1_to_hex
(
p
->
item
->
sha1
),
(
int
)
(
ep
-
p
->
name
),
p
->
name
);
}
else
printf
(
"%s %s
\n
"
,
sha1_to_hex
(
objects
->
item
->
sha1
),
objects
->
name
);
objects
=
objects
->
next
;
printf
(
"%s %s
\n
"
,
sha1_to_hex
(
p
->
item
->
sha1
),
p
->
name
);
}
}
...
...
@@ -348,7 +350,7 @@ int cmd_rev_list(int argc, const char **argv, char **envp)
if
((
!
list
&&
(
!
(
revs
.
tag_objects
||
revs
.
tree_objects
||
revs
.
blob_objects
)
&&
!
revs
.
pending
_objects
))
||
!
revs
.
pending
.
nr
))
||
revs
.
diff
)
usage
(
rev_list_usage
);
...
...
diff-lib.c
浏览文件 @
f97ccded
...
...
@@ -329,8 +329,8 @@ int run_diff_index(struct rev_info *revs, int cached)
}
mark_merge_entries
();
ent
=
revs
->
pending
_objects
->
item
;
tree_name
=
revs
->
pending
_objects
->
name
;
ent
=
revs
->
pending
.
objects
[
0
].
item
;
tree_name
=
revs
->
pending
.
objects
[
0
].
name
;
tree
=
parse_tree_indirect
(
ent
->
sha1
);
if
(
!
tree
)
return
error
(
"bad tree object %s"
,
tree_name
);
...
...
http-push.c
浏览文件 @
f97ccded
...
...
@@ -1171,7 +1171,7 @@ static void one_remote_object(const char *hex)
obj
->
flags
|=
REMOTE
;
if
(
!
object_list_contains
(
objects
,
obj
))
add_object
(
obj
,
&
objects
,
NULL
,
""
);
object_list_insert
(
obj
,
&
objects
);
}
static
void
handle_lockprop_ctx
(
struct
xml_ctx
*
ctx
,
int
tag_closed
)
...
...
@@ -1699,6 +1699,15 @@ static int locking_available(void)
return
lock_flags
;
}
struct
object_list
**
add_one_object
(
struct
object
*
obj
,
struct
object_list
**
p
)
{
struct
object_list
*
entry
=
xmalloc
(
sizeof
(
struct
object_list
));
entry
->
item
=
obj
;
entry
->
next
=
*
p
;
*
p
=
entry
;
return
&
entry
->
next
;
}
static
struct
object_list
**
process_blob
(
struct
blob
*
blob
,
struct
object_list
**
p
,
struct
name_path
*
path
,
...
...
@@ -1712,8 +1721,7 @@ static struct object_list **process_blob(struct blob *blob,
return
p
;
obj
->
flags
|=
SEEN
;
name
=
strdup
(
name
);
return
add_object
(
obj
,
p
,
path
,
name
);
return
add_one_object
(
obj
,
p
);
}
static
struct
object_list
**
process_tree
(
struct
tree
*
tree
,
...
...
@@ -1735,7 +1743,7 @@ static struct object_list **process_tree(struct tree *tree,
obj
->
flags
|=
SEEN
;
name
=
strdup
(
name
);
p
=
add_o
bject
(
obj
,
p
,
NULL
,
name
);
p
=
add_o
ne_object
(
obj
,
p
);
me
.
up
=
path
;
me
.
elem
=
name
;
me
.
elem_len
=
strlen
(
name
);
...
...
@@ -1756,8 +1764,9 @@ static struct object_list **process_tree(struct tree *tree,
static
int
get_delta
(
struct
rev_info
*
revs
,
struct
remote_lock
*
lock
)
{
int
i
;
struct
commit
*
commit
;
struct
object_list
**
p
=
&
objects
,
*
pending
;
struct
object_list
**
p
=
&
objects
;
int
count
=
0
;
while
((
commit
=
get_revision
(
revs
))
!=
NULL
)
{
...
...
@@ -1767,15 +1776,16 @@ static int get_delta(struct rev_info *revs, struct remote_lock *lock)
count
+=
add_send_request
(
&
commit
->
object
,
lock
);
}
for
(
pending
=
revs
->
pending_objects
;
pending
;
pending
=
pending
->
next
)
{
struct
object
*
obj
=
pending
->
item
;
const
char
*
name
=
pending
->
name
;
for
(
i
=
0
;
i
<
revs
->
pending
.
nr
;
i
++
)
{
struct
object_array_entry
*
entry
=
revs
->
pending
.
objects
+
i
;
struct
object
*
obj
=
entry
->
item
;
const
char
*
name
=
entry
->
name
;
if
(
obj
->
flags
&
(
UNINTERESTING
|
SEEN
))
continue
;
if
(
obj
->
type
==
TYPE_TAG
)
{
obj
->
flags
|=
SEEN
;
p
=
add_o
bject
(
obj
,
p
,
NULL
,
name
);
p
=
add_o
ne_object
(
obj
,
p
);
continue
;
}
if
(
obj
->
type
==
TYPE_TREE
)
{
...
...
name-rev.c
浏览文件 @
f97ccded
...
...
@@ -125,11 +125,10 @@ static const char* get_rev_name(struct object *o)
return
buffer
;
}
int
main
(
int
argc
,
char
**
argv
)
{
struct
object_list
*
revs
=
NULL
;
struct
object_list
**
walker
=
&
revs
;
struct
object_array
revs
=
{
0
,
0
,
NULL
};
int
as_is
=
0
,
all
=
0
,
transform_stdin
=
0
;
setup_git_directory
();
...
...
@@ -184,9 +183,7 @@ int main(int argc, char **argv)
if
(
cutoff
>
commit
->
date
)
cutoff
=
commit
->
date
;
object_list_append
((
struct
object
*
)
commit
,
walker
);
(
*
walker
)
->
name
=
*
argv
;
walker
=
&
((
*
walker
)
->
next
);
add_object_array
((
struct
object
*
)
commit
,
*
argv
,
&
revs
);
}
for_each_ref
(
name_ref
);
...
...
@@ -243,9 +240,13 @@ int main(int argc, char **argv)
if
(
objs
[
i
])
printf
(
"%s %s
\n
"
,
sha1_to_hex
(
objs
[
i
]
->
sha1
),
get_rev_name
(
objs
[
i
]));
}
else
for
(
;
revs
;
revs
=
revs
->
next
)
printf
(
"%s %s
\n
"
,
revs
->
name
,
get_rev_name
(
revs
->
item
));
}
else
{
int
i
;
for
(
i
=
0
;
i
<
revs
.
nr
;
i
++
)
printf
(
"%s %s
\n
"
,
revs
.
objects
[
i
].
name
,
get_rev_name
(
revs
.
objects
[
i
].
item
));
}
return
0
;
}
...
...
object.c
浏览文件 @
f97ccded
...
...
@@ -200,3 +200,20 @@ int object_list_contains(struct object_list *list, struct object *obj)
}
return
0
;
}
void
add_object_array
(
struct
object
*
obj
,
const
char
*
name
,
struct
object_array
*
array
)
{
unsigned
nr
=
array
->
nr
;
unsigned
alloc
=
array
->
alloc
;
struct
object_array_entry
*
objects
=
array
->
objects
;
if
(
nr
>=
alloc
)
{
alloc
=
(
alloc
+
32
)
*
2
;
objects
=
xrealloc
(
objects
,
alloc
*
sizeof
(
*
objects
));
array
->
alloc
=
alloc
;
array
->
objects
=
objects
;
}
objects
[
nr
].
item
=
obj
;
objects
[
nr
].
name
=
name
;
array
->
nr
=
++
nr
;
}
object.h
浏览文件 @
f97ccded
...
...
@@ -4,7 +4,6 @@
struct
object_list
{
struct
object
*
item
;
struct
object_list
*
next
;
const
char
*
name
;
};
struct
object_refs
{
...
...
@@ -13,6 +12,15 @@ struct object_refs {
struct
object
*
ref
[
FLEX_ARRAY
];
/* more */
};
struct
object_array
{
unsigned
int
nr
;
unsigned
int
alloc
;
struct
object_array_entry
{
struct
object
*
item
;
const
char
*
name
;
}
*
objects
;
};
#define TYPE_BITS 3
#define FLAG_BITS 27
...
...
@@ -72,4 +80,7 @@ unsigned object_list_length(struct object_list *list);
int
object_list_contains
(
struct
object_list
*
list
,
struct
object
*
obj
);
/* Object array handling .. */
void
add_object_array
(
struct
object
*
obj
,
const
char
*
name
,
struct
object_array
*
array
);
#endif
/* OBJECT_H */
revision.c
浏览文件 @
f97ccded
...
...
@@ -31,17 +31,12 @@ static char *path_name(struct name_path *path, const char *name)
return
n
;
}
struct
object_list
**
add_object
(
struct
object
*
obj
,
struct
object_list
*
*
p
,
struct
name_path
*
path
,
const
char
*
name
)
void
add_object
(
struct
object
*
obj
,
struct
object_array
*
p
,
struct
name_path
*
path
,
const
char
*
name
)
{
struct
object_list
*
entry
=
xmalloc
(
sizeof
(
*
entry
));
entry
->
item
=
obj
;
entry
->
next
=
*
p
;
entry
->
name
=
path_name
(
path
,
name
);
*
p
=
entry
;
return
&
entry
->
next
;
add_object_array
(
obj
,
path_name
(
path
,
name
),
p
);
}
static
void
mark_blob_uninteresting
(
struct
blob
*
blob
)
...
...
@@ -117,9 +112,9 @@ void mark_parents_uninteresting(struct commit *commit)
}
}
static
void
add_pending_object
(
struct
rev_info
*
revs
,
struct
object
*
obj
,
const
char
*
name
)
void
add_pending_object
(
struct
rev_info
*
revs
,
struct
object
*
obj
,
const
char
*
name
)
{
add_object
(
obj
,
&
revs
->
pending_objects
,
NULL
,
name
);
add_object
_array
(
obj
,
name
,
&
revs
->
pending
);
}
static
struct
object
*
get_reference
(
struct
rev_info
*
revs
,
const
char
*
name
,
const
unsigned
char
*
sha1
,
unsigned
int
flags
)
...
...
@@ -836,7 +831,7 @@ int setup_revisions(int argc, const char **argv, struct rev_info *revs, const ch
object
=
get_reference
(
revs
,
arg
,
sha1
,
flags
^
local_flags
);
add_pending_object
(
revs
,
object
,
arg
);
}
if
(
def
&&
!
revs
->
pending
_objects
)
{
if
(
def
&&
!
revs
->
pending
.
nr
)
{
unsigned
char
sha1
[
20
];
struct
object
*
object
;
if
(
get_sha1
(
def
,
sha1
))
...
...
@@ -868,11 +863,13 @@ int setup_revisions(int argc, const char **argv, struct rev_info *revs, const ch
void
prepare_revision_walk
(
struct
rev_info
*
revs
)
{
struct
object_list
*
list
;
int
nr
=
revs
->
pending
.
nr
;
struct
object_array_entry
*
list
=
revs
->
pending
.
objects
;
list
=
revs
->
pending_objects
;
revs
->
pending_objects
=
NULL
;
while
(
list
)
{
revs
->
pending
.
nr
=
0
;
revs
->
pending
.
alloc
=
0
;
revs
->
pending
.
objects
=
NULL
;
while
(
--
nr
>=
0
)
{
struct
commit
*
commit
=
handle_commit
(
revs
,
list
->
item
,
list
->
name
);
if
(
commit
)
{
if
(
!
(
commit
->
object
.
flags
&
SEEN
))
{
...
...
@@ -880,7 +877,7 @@ void prepare_revision_walk(struct rev_info *revs)
insert_by_date
(
commit
,
&
revs
->
commits
);
}
}
list
=
list
->
next
;
list
++
;
}
if
(
revs
->
no_walk
)
...
...
revision.h
浏览文件 @
f97ccded
...
...
@@ -18,7 +18,7 @@ typedef void (prune_fn_t)(struct rev_info *revs, struct commit *commit);
struct
rev_info
{
/* Starting list */
struct
commit_list
*
commits
;
struct
object_
list
*
pending_objects
;
struct
object_
array
pending
;
/* Basic information */
const
char
*
prefix
;
...
...
@@ -99,9 +99,11 @@ struct name_path {
const
char
*
elem
;
};
extern
struct
object_list
**
add_object
(
struct
object
*
obj
,
struct
object_list
**
p
,
struct
name_path
*
path
,
const
char
*
name
);
extern
void
add_object
(
struct
object
*
obj
,
struct
object_array
*
p
,
struct
name_path
*
path
,
const
char
*
name
);
extern
void
add_pending_object
(
struct
rev_info
*
revs
,
struct
object
*
obj
,
const
char
*
name
);
#endif
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录