path: root/archive.c
diff options
authorRené Scharfe <>2009-03-08 18:21:53 (GMT)
committerJunio C Hamano <>2009-03-08 20:37:21 (GMT)
commit52e7787609d18af76a8c1befb0a06123fb7ce89e (patch)
tree676f1744408510fe58212ae8b6b4ac2b7d3312b4 /archive.c
parent49b6180252000e37ec47ccb4156240ed625949ed (diff)
archive: use parseopt for local-only options
Replace the hand-rolled parsers that find and remove --remote and --exec by a parseopt parser that also handles --output. All three options only have a meaning if no remote server is used or on the local side. They must be rejected by upload-archive and should not be sent to the server by archive. We can't use a single parser for both remote and local side because the remote end possibly understands a different set of options than the local side. A local parser would then wrongly accuse options valid on the other side as being incorrect. This patch implements a very forgiving parser that understands only the three options mentioned above. All others are passed to the normal, complete parser in archive.c (running either locally in archive, or remotely in upload-archive). This normal parser definition contains dummy entries for the three options, in order for them to appear in the help screen. The parseopt parser allows multiple occurrences of --remote and --exec unlike the previous one; the one specified last wins. This looseness is acceptable, I think. Signed-off-by: Rene Scharfe <> Signed-off-by: Junio C Hamano <>
Diffstat (limited to 'archive.c')
1 files changed, 2 insertions, 16 deletions
diff --git a/archive.c b/archive.c
index c6aea83..96b62d4 100644
--- a/archive.c
+++ b/archive.c
@@ -239,19 +239,6 @@ static void parse_treeish_arg(const char **argv,
ar_args->time = archive_time;
-static void create_output_file(const char *output_file)
- int output_fd = open(output_file, O_CREAT | O_WRONLY | O_TRUNC, 0666);
- if (output_fd < 0)
- die("could not create archive file: %s ", output_file);
- if (output_fd != 1) {
- if (dup2(output_fd, 1) < 0)
- die("could not redirect output");
- else
- close(output_fd);
- }
#define OPT__COMPR(s, v, h, p) \
{ OPTION_SET_INT, (s), NULL, (v), NULL, (h), \
@@ -306,13 +293,12 @@ static int parse_archive_args(int argc, const char **argv,
die("Unexpected option --remote");
if (exec)
die("Option --exec can only be used together with --remote");
+ if (output)
+ die("Unexpected option --output");
if (!base)
base = "";
- if (output)
- create_output_file(output);
if (list) {
for (i = 0; i < ARRAY_SIZE(archivers); i++)
printf("%s\n", archivers[i].name);