21
21
* subordinate commands when necessary. We also "intern" the arg for
22
22
* the convenience of the current command.
23
23
*/
24
- int parse_list_objects_filter (struct list_objects_filter_options * filter_options ,
25
- const char * arg )
24
+ static int gently_parse_list_objects_filter (
25
+ struct list_objects_filter_options * filter_options ,
26
+ const char * arg ,
27
+ struct strbuf * errbuf )
26
28
{
27
29
const char * v0 ;
28
30
29
- if (filter_options -> choice )
30
- die (_ ("multiple object filter types cannot be combined" ));
31
+ if (filter_options -> choice ) {
32
+ if (errbuf ) {
33
+ strbuf_init (errbuf , 0 );
34
+ strbuf_addstr (
35
+ errbuf ,
36
+ _ ("multiple filter-specs cannot be combined" ));
37
+ }
38
+ return 1 ;
39
+ }
31
40
32
41
filter_options -> filter_spec = strdup (arg );
33
42
34
43
if (!strcmp (arg , "blob:none" )) {
35
44
filter_options -> choice = LOFC_BLOB_NONE ;
36
45
return 0 ;
37
- }
38
46
39
- if (skip_prefix (arg , "blob:limit=" , & v0 )) {
40
- if (!git_parse_ulong (v0 , & filter_options -> blob_limit_value ))
41
- die (_ ("invalid filter-spec expression '%s'" ), arg );
42
- filter_options -> choice = LOFC_BLOB_LIMIT ;
43
- return 0 ;
44
- }
47
+ } else if (skip_prefix (arg , "blob:limit=" , & v0 )) {
48
+ if (git_parse_ulong (v0 , & filter_options -> blob_limit_value )) {
49
+ filter_options -> choice = LOFC_BLOB_LIMIT ;
50
+ return 0 ;
51
+ }
45
52
46
- if (skip_prefix (arg , "sparse:oid=" , & v0 )) {
53
+ } else if (skip_prefix (arg , "sparse:oid=" , & v0 )) {
47
54
struct object_context oc ;
48
55
struct object_id sparse_oid ;
49
56
@@ -57,15 +64,27 @@ int parse_list_objects_filter(struct list_objects_filter_options *filter_options
57
64
filter_options -> sparse_oid_value = oiddup (& sparse_oid );
58
65
filter_options -> choice = LOFC_SPARSE_OID ;
59
66
return 0 ;
60
- }
61
67
62
- if (skip_prefix (arg , "sparse:path=" , & v0 )) {
68
+ } else if (skip_prefix (arg , "sparse:path=" , & v0 )) {
63
69
filter_options -> choice = LOFC_SPARSE_PATH ;
64
70
filter_options -> sparse_path_value = strdup (v0 );
65
71
return 0 ;
66
72
}
67
73
68
- die (_ ("invalid filter-spec expression '%s'" ), arg );
74
+ if (errbuf ) {
75
+ strbuf_init (errbuf , 0 );
76
+ strbuf_addf (errbuf , "invalid filter-spec '%s'" , arg );
77
+ }
78
+ memset (filter_options , 0 , sizeof (* filter_options ));
79
+ return 1 ;
80
+ }
81
+
82
+ int parse_list_objects_filter (struct list_objects_filter_options * filter_options ,
83
+ const char * arg )
84
+ {
85
+ struct strbuf buf = STRBUF_INIT ;
86
+ if (gently_parse_list_objects_filter (filter_options , arg , & buf ))
87
+ die ("%s" , buf .buf );
69
88
return 0 ;
70
89
}
71
90
@@ -90,3 +109,44 @@ void list_objects_filter_release(
90
109
free (filter_options -> sparse_path_value );
91
110
memset (filter_options , 0 , sizeof (* filter_options ));
92
111
}
112
+
113
+ void partial_clone_register (
114
+ const char * remote ,
115
+ const struct list_objects_filter_options * filter_options )
116
+ {
117
+ /*
118
+ * Record the name of the partial clone remote in the
119
+ * config and in the global variable -- the latter is
120
+ * used throughout to indicate that partial clone is
121
+ * enabled and to expect missing objects.
122
+ */
123
+ if (repository_format_partial_clone &&
124
+ * repository_format_partial_clone &&
125
+ strcmp (remote , repository_format_partial_clone ))
126
+ die (_ ("cannot change partial clone promisor remote" ));
127
+
128
+ git_config_set ("core.repositoryformatversion" , "1" );
129
+ git_config_set ("extensions.partialclone" , remote );
130
+
131
+ repository_format_partial_clone = xstrdup (remote );
132
+
133
+ /*
134
+ * Record the initial filter-spec in the config as
135
+ * the default for subsequent fetches from this remote.
136
+ */
137
+ core_partial_clone_filter_default =
138
+ xstrdup (filter_options -> filter_spec );
139
+ git_config_set ("core.partialclonefilter" ,
140
+ core_partial_clone_filter_default );
141
+ }
142
+
143
+ void partial_clone_get_default_filter_spec (
144
+ struct list_objects_filter_options * filter_options )
145
+ {
146
+ /*
147
+ * Parse default value, but silently ignore it if it is invalid.
148
+ */
149
+ gently_parse_list_objects_filter (filter_options ,
150
+ core_partial_clone_filter_default ,
151
+ NULL );
152
+ }
0 commit comments