From: "René Scharfe" <rene.scharfe@lsrfire.ath.cx>
To: Junio C Hamano <gitster@pobox.com>
Cc: Jakub Narebski <jnareb@gmail.com>,
Wincent Colaiuta <win@wincent.com>,
Brendan Miller <catphive@catphive.net>,
git@vger.kernel.org
Subject: Re: obnoxious CLI complaints
Date: Fri, 11 Sep 2009 00:19:05 +0200 [thread overview]
Message-ID: <4AA97B59.9030903@lsrfire.ath.cx> (raw)
In-Reply-To: <7vbpliaaxo.fsf@alter.siamese.dyndns.org>
Junio C Hamano schrieb:
> Jakub Narebski <jnareb@gmail.com> writes:
>
>> First, it would be consistent with how ordinary archivers such as tar
>> or zip are used, where you have to specify list of files to archive
>> (in our case this list is HEAD). Second, I'd rather not accidentally
>> dump binary to terminal: "git archive [HEAD]" dumps archive to standard
>> output.
>
> So does "cat". I do not agree with your second point.
>
> While I somewhat see the similarity argument, your first point, I am not
> sure if it is relevant. It is not like "tar or zip allows us to say what
> files to archive, but git-archive doesn't and it always archives HEAD";
> you are saying "they require us to specify, so should we".
>
> But I do not see a strong reason not to default to HEAD. The case that
> would make difference would be to differentiate among
>
> $ git archive HEAD TAIL
> $ git archive HEAD -- TAIL
> $ git archive -- HEAD TAIL
>
> i.e. what if you happen to have a tracked content called HEAD. I didn't
> check the current command line parser in git-archive understands the "--"
> convention for that, but it is not a rocket science to add it if it
> doesn't.
Currently it doesn't. An attempt to implement it is below (tests and
documentation update missing).
I wonder if we want to make treeless calls to archive the worktree (or the
index) instead of HEAD, similar to git grep, though. Not that I remember
someone requesting such a thing, but I'm already slightly surprised about
archive being used to tar up HEAD in any case -- I imagined it would mostly
be used to make releases of tagged versions.
---
archive.c | 34 ++++++++++++++++++++++++----------
1 files changed, 24 insertions(+), 10 deletions(-)
diff --git a/archive.c b/archive.c
index 0bca9ca..04fa6a5 100644
--- a/archive.c
+++ b/archive.c
@@ -214,18 +214,32 @@ static void parse_pathspec_arg(const char **pathspec,
ar_args->pathspec = get_pathspec(ar_args->base, pathspec);
}
-static void parse_treeish_arg(const char **argv,
- struct archiver_args *ar_args, const char *prefix)
+static int parse_treeish_arg(int argc, const char **argv,
+ struct archiver_args *ar_args, const char *prefix)
{
- const char *name = argv[0];
+ const char *name = "HEAD";
const unsigned char *commit_sha1;
time_t archive_time;
struct tree *tree;
const struct commit *commit;
unsigned char sha1[20];
+ if (argc > 0) {
+ int consume = 1;
+
+ if (strcmp(argv[0], "--")) {
+ name = argv[0];
+ if (argc > 1 && !strcmp(argv[1], "--"))
+ consume++;
+ }
+
+ argc -= consume;
+ memmove(argv, argv + consume, argc * sizeof(*argv));
+ argv[argc] = NULL;
+ }
+
if (get_sha1(name, sha1))
- die("Not a valid object name");
+ die("Not a valid object name: %s", name);
commit = lookup_commit_reference_gently(sha1, 1);
if (commit) {
@@ -256,6 +270,8 @@ static void parse_treeish_arg(const char **argv,
ar_args->commit_sha1 = commit_sha1;
ar_args->commit = commit;
ar_args->time = archive_time;
+
+ return argc;
}
#define OPT__COMPR(s, v, h, p) \
@@ -309,7 +325,8 @@ static int parse_archive_args(int argc, const char **argv,
OPT_END()
};
- argc = parse_options(argc, argv, NULL, opts, archive_usage, 0);
+ argc = parse_options(argc, argv, NULL, opts, archive_usage,
+ PARSE_OPT_KEEP_DASHDASH);
if (remote)
die("Unexpected option --remote");
@@ -327,9 +344,6 @@ static int parse_archive_args(int argc, const char **argv,
exit(0);
}
- /* We need at least one parameter -- tree-ish */
- if (argc < 1)
- usage_with_options(archive_usage, opts);
*ar = lookup_archiver(format);
if (!*ar)
die("Unknown archive format '%s'", format);
@@ -361,8 +375,8 @@ int write_archive(int argc, const char **argv, const char *prefix,
if (setup_prefix && prefix == NULL)
prefix = setup_git_directory();
- parse_treeish_arg(argv, &args, prefix);
- parse_pathspec_arg(argv + 1, &args);
+ argc = parse_treeish_arg(argc, argv, &args, prefix);
+ parse_pathspec_arg(argv, &args);
git_config(git_default_config, NULL);
--
1.6.5.rc0
next prev parent reply other threads:[~2009-09-10 22:19 UTC|newest]
Thread overview: 46+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-09-09 21:27 obnoxious CLI complaints Brendan Miller
2009-09-09 21:54 ` Jakub Narebski
2009-09-09 22:06 ` Wincent Colaiuta
2009-09-10 16:50 ` Jakub Narebski
2009-09-10 18:53 ` Junio C Hamano
2009-09-10 22:19 ` René Scharfe [this message]
2009-09-11 3:15 ` Björn Steinbrink
2009-09-10 19:46 ` John Tapsell
2009-09-10 20:17 ` Sverre Rabbelier
2009-09-10 20:23 ` Jakub Narebski
2009-09-10 22:04 ` John Tapsell
2009-09-10 22:49 ` Junio C Hamano
2009-09-10 23:19 ` demerphq
2009-09-11 0:37 ` Junio C Hamano
2009-09-11 0:18 ` John Tapsell
2009-09-11 0:25 ` Junio C Hamano
2009-09-10 0:09 ` Brendan Miller
2009-09-10 1:25 ` Todd Zullinger
2009-09-10 9:16 ` Jakub Narebski
2009-09-10 18:18 ` Eric Schaefer
2009-09-10 18:52 ` Sverre Rabbelier
2009-09-10 22:19 ` René Scharfe
2009-09-11 14:47 ` Linus Torvalds
2009-09-11 22:01 ` René Scharfe
2009-09-11 22:16 ` Linus Torvalds
2009-09-12 10:31 ` Dmitry Potapov
2009-09-12 18:32 ` John Tapsell
2009-09-12 21:44 ` Dmitry Potapov
2009-09-12 22:21 ` John Tapsell
2009-09-12 22:35 ` A Large Angry SCM
2009-09-12 22:43 ` Dmitry Potapov
2009-09-12 23:08 ` John Tapsell
2009-09-13 2:47 ` Junio C Hamano
2009-09-13 17:36 ` [PATCH 1/2] git-archive: add '-o' as a alias for '--output' Dmitry Potapov
2009-09-13 17:36 ` [PATCH 2/2] teach git-archive to auto detect the output format Dmitry Potapov
2009-09-13 18:52 ` Junio C Hamano
2009-09-13 20:17 ` [PATCH v2 " Dmitry Potapov
2009-09-13 21:27 ` Junio C Hamano
2009-09-13 18:34 ` [PATCH 1/2] git-archive: add '-o' as a alias for '--output' Junio C Hamano
2009-09-13 20:13 ` [PATCH v2 " Dmitry Potapov
2009-09-17 0:48 ` obnoxious CLI complaints Brendan Miller
2009-09-17 1:27 ` Junio C Hamano
2009-09-09 21:58 ` Sverre Rabbelier
2009-09-09 22:58 ` Pierre Habouzit
2009-09-10 1:32 ` Björn Steinbrink
2009-09-10 18:54 ` Matthieu Moy
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: http://vger.kernel.org/majordomo-info.html
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4AA97B59.9030903@lsrfire.ath.cx \
--to=rene.scharfe@lsrfire.ath.cx \
--cc=catphive@catphive.net \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=jnareb@gmail.com \
--cc=win@wincent.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://80x24.org/mirrors/git.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).