From: Jonathan Nieder <jrnieder@gmail.com>
To: Mike Hommey <mh@glandium.org>
Cc: git@vger.kernel.org
Subject: Re: Getting a commit sha1 from fast-import in a remote-helper
Date: Mon, 17 Nov 2014 17:40:28 -0800 [thread overview]
Message-ID: <20141118014028.GF4336@google.com> (raw)
In-Reply-To: <20141118003426.GA6528@glandium.org>
Mike Hommey wrote:
> - fast-import's `ls` command documentation about its output format
> mentions that the output may contain commits, so I tried the trick of
> creating a tree with commits, but fast-import then fails with:
> fatal: Not a blob (actually a commit)
> which I totally understand, but then I wonder why the documentation
> mentions it and how one would get a tree containing references to
> commits. I guess the documentation should be fixed.
Odd. Here's what happens when I try:
$ echo "ls $(git rev-parse HEAD)" | git fast-import --quiet
fatal: Missing space after tree-ish: ls a4a226a366ab0a173ed9e5f70f2a95d0d21e54c5
fast-import: dumping crash report to .git/fast_import_crash_14080
$ echo "ls $(git rev-parse HEAD) " | git fast-import --quiet
040000 tree d3d38e7d71cb40ebbaf2798b01837b3de43fd4a1
How did you get that "Not a blob" message?
I think a good fix would be to teach parse_ls a mode with no <path>
parameter. Something like this (untested; needs cleanup and tests):
Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
diff --git i/fast-import.c w/fast-import.c
index d0bd285..a9a46be 100644
--- i/fast-import.c
+++ w/fast-import.c
@@ -278,6 +278,8 @@ struct recent_command {
char *buf;
};
+extern const char *tag_type;
+
/* Configured limits on output */
static unsigned long max_depth = 10;
static off_t max_packsize;
@@ -3047,6 +3049,49 @@ static void parse_ls(const char *p, struct branch *b)
struct tree_entry *root = NULL;
struct tree_entry leaf = {NULL};
+ /* ls SP <tree-ish> */
+ if (*p != '"' && !strchr(p, ' ')) {
+ unsigned char sha1[20];
+ struct object_entry *e;
+ static struct strbuf line = STRBUF_INIT;
+ const char *type;
+
+ if (*p == ':') { /* <mark> */
+ e = find_mark(parse_mark_ref_eol(p));
+ if (!e)
+ die("Unknown mark: %s", command_buf.buf);
+ hashcpy(sha1, e->idx.sha1);
+ } else { /* <sha1> */
+ if (get_sha1_hex(p, sha1))
+ die("Invalid dataref: %s", command_buf.buf);
+ e = find_object(sha1);
+ p += 40;
+ if (*p)
+ die("Garbage after dataref: %s", command_buf.buf);
+ }
+
+ switch (e->type) {
+ case OBJ_COMMIT:
+ type = commit_type;
+ break;
+ case OBJ_TREE:
+ type = tree_type;
+ break;
+ case OBJ_BLOB:
+ type = blob_type;
+ break;
+ case OBJ_TAG:
+ type = tag_type;
+ break;
+ default:
+ die("Not a tree-ish: %s", command_buf.buf);
+ }
+
+ strbuf_reset(&line);
+ strbuf_addf(&line, "%s %s\n", type, sha1_to_hex(sha1));
+ cat_blob_write(line.buf, line.len);
+ }
+
/* ls SP (<tree-ish> SP)? <path> */
if (*p == '"') {
if (!b)
next prev parent reply other threads:[~2014-11-18 1:40 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-11-18 0:34 Getting a commit sha1 from fast-import in a remote-helper Mike Hommey
2014-11-18 1:40 ` Jonathan Nieder [this message]
2014-11-18 2:31 ` Mike Hommey
2014-11-18 2:51 ` Jonathan Nieder
2014-11-18 3:11 ` Mike Hommey
2014-11-19 2:18 ` Mike Hommey
2014-11-19 2:21 ` Jonathan Nieder
2014-11-19 2:27 ` Mike Hommey
2014-11-19 2:36 ` Jonathan Nieder
2014-11-18 2:21 ` Mike Hommey
2014-11-18 2:35 ` Mike Hommey
2014-11-18 3:27 ` Jonathan Nieder
2014-11-18 4:17 ` Mike Hommey
2014-11-18 2:53 ` Jonathan Nieder
2014-11-18 3:14 ` Mike Hommey
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
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20141118014028.GF4336@google.com \
--to=jrnieder@gmail.com \
--cc=git@vger.kernel.org \
--cc=mh@glandium.org \
/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.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.