@matheusbsbs / matheus-bagliano / commits / 34533004b2
Fork 0

archive: remove args member from struct archiver

Pass struct archiver and struct archiver_args explicitly to parse_archive_args and remove the latter from the former. This allows us to get rid of struct archiver_desc and simplifies the code a bit. Signed-off-by: Rene Scharfe <rene.scharfe@lsrfire.ath.cx> Signed-off-by: Junio C Hamano <gitster@pobox.com>

René Scharfe committed Jul 15, 2008 at 09:49 UTC 34533004b27df4f34e18d9e26832fcc956a39fca
3 files changed +28 -39
archive.h
+1 -4
@@ -21,14 +21,11 @@ typedef void *(*parse_extra_args_fn_t)(int argc, const char **argv);
21
22 struct archiver {
23 const char *name;
24 - struct archiver_args args;
24 write_archive_fn_t write_archive;
25 parse_extra_args_fn_t parse_extra;
26 };
27
29 -extern int parse_archive_args(int argc,
30 - const char **argv,
31 - struct archiver *ar);
28 +extern int parse_archive_args(int argc, const char **argv, const struct archiver **ar, struct archiver_args *args);
29
30 extern void parse_treeish_arg(const char **treeish,
31 struct archiver_args *ar_args,
builtin-archive.c
+21 -30
@@ -15,12 +15,7 @@
15 static const char archive_usage[] = \
16 "git-archive --format=<fmt> [--prefix=<prefix>/] [--verbose] [<extra>] <tree-ish> [path...]";
17
18 -static struct archiver_desc
19 -{
20 - const char *name;
21 - write_archive_fn_t write_archive;
22 - parse_extra_args_fn_t parse_extra;
23 -} archivers[] = {
18 +const struct archiver archivers[] = {
19 { "tar", write_tar_archive, NULL },
20 { "zip", write_zip_archive, parse_extra_zip_args },
21 };
@@ -79,21 +74,15 @@ static int run_remote_archiver(const char *remote, int argc,
74 return !!rv;
75 }
76
82 -static int init_archiver(const char *name, struct archiver *ar)
77 +static const struct archiver *lookup_archiver(const char *name)
78 {
84 - int rv = -1, i;
79 + int i;
80
81 for (i = 0; i < ARRAY_SIZE(archivers); i++) {
87 - if (!strcmp(name, archivers[i].name)) {
88 - memset(ar, 0, sizeof(*ar));
89 - ar->name = archivers[i].name;
90 - ar->write_archive = archivers[i].write_archive;
91 - ar->parse_extra = archivers[i].parse_extra;
92 - rv = 0;
93 - break;
94 - }
82 + if (!strcmp(name, archivers[i].name))
83 + return &archivers[i];
84 }
96 - return rv;
85 + return NULL;
86 }
87
88 void parse_pathspec_arg(const char **pathspec, struct archiver_args *ar_args)
@@ -145,7 +134,8 @@ void parse_treeish_arg(const char **argv, struct archiver_args *ar_args,
134 ar_args->time = archive_time;
135 }
136
148 -int parse_archive_args(int argc, const char **argv, struct archiver *ar)
137 +int parse_archive_args(int argc, const char **argv, const struct archiver **ar,
138 + struct archiver_args *args)
139 {
140 const char *extra_argv[MAX_EXTRA_ARGS];
141 int extra_argc = 0;
@@ -190,17 +180,18 @@ int parse_archive_args(int argc, const char **argv, struct archiver *ar)
180 /* We need at least one parameter -- tree-ish */
181 if (argc - 1 < i)
182 usage(archive_usage);
193 - if (init_archiver(format, ar) < 0)
183 + *ar = lookup_archiver(format);
184 + if (!*ar)
185 die("Unknown archive format '%s'", format);
186
187 if (extra_argc) {
197 - if (!ar->parse_extra)
188 + if (!(*ar)->parse_extra)
189 die("'%s' format does not handle %s",
199 - ar->name, extra_argv[0]);
200 - ar->args.extra = ar->parse_extra(extra_argc, extra_argv);
190 + (*ar)->name, extra_argv[0]);
191 + args->extra = (*ar)->parse_extra(extra_argc, extra_argv);
192 }
202 - ar->args.verbose = verbose;
203 - ar->args.base = base;
193 + args->verbose = verbose;
194 + args->base = base;
195
196 return i;
197 }
@@ -238,7 +229,8 @@ static const char *extract_remote_arg(int *ac, const char **av)
229
230 int cmd_archive(int argc, const char **argv, const char *prefix)
231 {
241 - struct archiver ar;
232 + const struct archiver *ar = NULL;
233 + struct archiver_args args;
234 int tree_idx;
235 const char *remote = NULL;
236
@@ -248,14 +240,13 @@ int cmd_archive(int argc, const char **argv, const char *prefix)
240
241 setvbuf(stderr, NULL, _IOLBF, BUFSIZ);
242
251 - memset(&ar, 0, sizeof(ar));
252 - tree_idx = parse_archive_args(argc, argv, &ar);
243 + tree_idx = parse_archive_args(argc, argv, &ar, &args);
244 if (prefix == NULL)
245 prefix = setup_git_directory();
246
247 argv += tree_idx;
257 - parse_treeish_arg(argv, &ar.args, prefix);
258 - parse_pathspec_arg(argv + 1, &ar.args);
248 + parse_treeish_arg(argv, &args, prefix);
249 + parse_pathspec_arg(argv + 1, &args);
250
260 - return ar.write_archive(&ar.args);
251 + return ar->write_archive(&args);
252 }
builtin-upload-archive.c
+6 -5
@@ -19,7 +19,8 @@ static const char lostchild[] =
19
20 static int run_upload_archive(int argc, const char **argv, const char *prefix)
21 {
22 - struct archiver ar;
22 + const struct archiver *ar;
23 + struct archiver_args args;
24 const char *sent_argv[MAX_ARGS];
25 const char *arg_cmd = "argument ";
26 char *p, buf[4096];
@@ -65,12 +66,12 @@ static int run_upload_archive(int argc, const char **argv, const char *prefix)
66 sent_argv[sent_argc] = NULL;
67
68 /* parse all options sent by the client */
68 - treeish_idx = parse_archive_args(sent_argc, sent_argv, &ar);
69 + treeish_idx = parse_archive_args(sent_argc, sent_argv, &ar, &args);
70
70 - parse_treeish_arg(sent_argv + treeish_idx, &ar.args, prefix);
71 - parse_pathspec_arg(sent_argv + treeish_idx + 1, &ar.args);
71 + parse_treeish_arg(sent_argv + treeish_idx, &args, prefix);
72 + parse_pathspec_arg(sent_argv + treeish_idx + 1, &args);
73
73 - return ar.write_archive(&ar.args);
74 + return ar->write_archive(&args);
75 }
76
77 static void error_clnt(const char *fmt, ...)