FazBrowse GitHub Viewer
|
Trending
|
URL:
|
Home
Tools:
[Download Repo ZIP]
[View Raw Code]
[Original HTTPS Page]
pretend-git/connected.c at master · submitgit/pretend-git · GitHub
submitgit
/
pretend-git
Public
forked from
git/git
Notifications
You must be signed in to change notification settings
Fork
2
Star
0
Code
Pull requests
3
Actions
Projects
Security and quality
0
Insights
Additional navigation options
Code
Pull requests
Actions
Projects
Security and quality
Insights
Expand file tree
Breadcrumbs
pretend-git
/
connected.c
Copy path
More file actions
More file actions
Latest commit
History
History
History
119 lines (107 loc) · 3.22 KB
Breadcrumbs
pretend-git
/
connected.c
Copy path
File metadata and controls
119 lines (107 loc) · 3.22 KB
Raw
Copy raw file
Download raw file
Open symbols panel
Edit and raw actions
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
#include
"cache.h"
#include
"run-command.h"
#include
"sigchain.h"
#include
"connected.h"
#include
"transport.h"
int
check_everything_connected
(
sha1_iterate_fn
fn
,
int
quiet
,
void
*
cb_data
)
{
return
check_everything_connected_with_transport
(
fn
,
quiet
,
cb_data
,
NULL
);
}
/*
* If we feed all the commits we want to verify to this command
*
* $ git rev-list --objects --stdin --not --all
*
* and if it does not error out, that means everything reachable from
* these commits locally exists and is connected to our existing refs.
* Note that this does _not_ validate the individual objects.
*
* Returns 0 if everything is connected, non-zero otherwise.
*/
static
int
check_everything_connected_real
(
sha1_iterate_fn
fn
,
int
quiet
,
void
*
cb_data
,
struct
transport
*
transport
,
const
char
*
shallow_file
)
{
struct
child_process
rev_list
=
CHILD_PROCESS_INIT
;
const
char
*
argv
[
9
];
char
commit
[
41
];
unsigned
char
sha1
[
20
];
int
err
=
0
,
ac
=
0
;
struct
packed_git
*
new_pack
=
NULL
;
size_t
base_len
;
if
(
fn
(
cb_data
,
sha1
))
return
err
;
if
(
transport
&&
transport
->
smart_options
&&
transport
->
smart_options
->
self_contained_and_connected
&&
transport
->
pack_lockfile
&&
strip_suffix
(
transport
->
pack_lockfile
,
".keep"
,
&
base_len
)) {
struct
strbuf
idx_file
=
STRBUF_INIT
;
strbuf_add
(
&
idx_file
,
transport
->
pack_lockfile
,
base_len
);
strbuf_addstr
(
&
idx_file
,
".idx"
);
new_pack
=
add_packed_git
(
idx_file
.
buf
,
idx_file
.
len
,
1
);
strbuf_release
(
&
idx_file
);
}
if
(
shallow_file
) {
argv
[
ac
++
]
=
"--shallow-file"
;
argv
[
ac
++
]
=
shallow_file
;
}
argv
[
ac
++
]
=
"rev-list"
;
argv
[
ac
++
]
=
"--objects"
;
argv
[
ac
++
]
=
"--stdin"
;
argv
[
ac
++
]
=
"--not"
;
argv
[
ac
++
]
=
"--all"
;
if
(
quiet
)
argv
[
ac
++
]
=
"--quiet"
;
argv
[
ac
]
=
NULL
;
rev_list
.
argv
=
argv
;
rev_list
.
git_cmd
=
1
;
rev_list
.
in
=
-1
;
rev_list
.
no_stdout
=
1
;
rev_list
.
no_stderr
=
quiet
;
if
(
start_command
(
&
rev_list
))
return
error
(
_
(
"Could not run 'git rev-list'"
));
sigchain_push
(
SIGPIPE
,
SIG_IGN
);
commit
[
40
]
=
'\n'
;
do
{
/*
* If index-pack already checked that:
* - there are no dangling pointers in the new pack
* - the pack is self contained
* Then if the updated ref is in the new pack, then we
* are sure the ref is good and not sending it to
* rev-list for verification.
*/
if
(
new_pack
&&
find_pack_entry_one
(
sha1
,
new_pack
))
continue
;
memcpy
(
commit
,
sha1_to_hex
(
sha1
),
40
);
if
(
write_in_full
(
rev_list
.
in
,
commit
,
41
)
<
0
) {
if
(
errno
!=
EPIPE
&&
errno
!=
EINVAL
)
error
(
_
(
"failed write to rev-list: %s"
),
strerror
(
errno
));
err
=
-1
;
break
;
}
}
while
(!
fn
(
cb_data
,
sha1
));
if
(
close
(
rev_list
.
in
)) {
error
(
_
(
"failed to close rev-list's stdin: %s"
),
strerror
(
errno
));
err
=
-1
;
}
sigchain_pop
(
SIGPIPE
);
return
finish_command
(
&
rev_list
)
||
err
;
}
int
check_everything_connected_with_transport
(
sha1_iterate_fn
fn
,
int
quiet
,
void
*
cb_data
,
struct
transport
*
transport
)
{
return
check_everything_connected_real
(
fn
,
quiet
,
cb_data
,
transport
,
NULL
);
}
int
check_shallow_connected
(
sha1_iterate_fn
fn
,
int
quiet
,
void
*
cb_data
,
const
char
*
shallow_file
)
{
return
check_everything_connected_real
(
fn
,
quiet
,
cb_data
,
NULL
,
shallow_file
);
}
Back
|
FazBrowse Home
|
New Git URL