From: Jonathan Nieder <jrnieder@gmail.com>
To: Ramkumar Ramachandra <artagnon@gmail.com>
Cc: git@vger.kernel.org, "Shawn O. Pearce" <spearce@spearce.org>,
Sverre Rabbelier <srabbelier@gmail.com>,
David Barr <david.barr@cordelta.com>, Sam Vilain <sam@vilain.net>
Subject: [PATCH 2/3] Teach fast-import to print the id of each imported commit
Date: Sat, 4 Sep 2010 22:29:58 -0500 [thread overview]
Message-ID: <20100905032957.GC2344@burratino> (raw)
In-Reply-To: <20100905031528.GA2344@burratino>
For the svn importer, it would be useful to build a map from
subversion revision numbers to git commits as the import takes place.
This is particularly relevant because the subversion api sometimes
represents as "copy this directory from this revision", and the
importer needs to be able to access the corresponding trees. So
(optionally) print each commit id when the corresponding object is
written.
Unfortunately when each commit object is written, it is not yet
accessible to the caller until a checkpoint has finished. A later
patch will teach fast-import to directly pass on the relevant data on
request, using the same channel.
Cc: Shawn O. Pearce <spearce@spearce.org>
Cc: Sverre Rabbelier <srabbelier@gmail.com>
Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
---
I am not happy with the interface:
. the name --report-fd is a bit silly. Maybe next round will
have a better one.
. some frontends may want to use "cat" without the commit id noise
. it is easy to trigger SIGPIPE by ignoring the last couple of
commit ids
. communication needs to be serialized. What will happen if a commit
gets finished while a "cat" command is being fulfilled?
Documentation/git-fast-import.txt | 13 +++++++++++
fast-import.c | 18 +++++++++++++++
t/t9300-fast-import.sh | 42 +++++++++++++++++++++++++++++++++++++
3 files changed, 73 insertions(+), 0 deletions(-)
diff --git a/Documentation/git-fast-import.txt b/Documentation/git-fast-import.txt
index 966ba4f..e217635 100644
--- a/Documentation/git-fast-import.txt
+++ b/Documentation/git-fast-import.txt
@@ -92,6 +92,18 @@ OPTIONS
--(no-)-relative-marks= with the --(import|export)-marks=
options.
+--report-fd=<fd>::
+ Print the 40-character object name for each commit to
+ the specified file descriptor before writing it to the
+ pack. This information may be useful if the importer
+ needs to maintain a map from revisions in the source
+ repository to commit ids in the target repository
+ during the import.
++
+The described objects are not necessarily accessible
+using standard git plumbing tools until a little while
+after the next checkpoint.
+
--export-pack-edges=<file>::
After creating a packfile, print a line of data to
<file> listing the filename of the packfile and the last
@@ -896,6 +908,7 @@ The following features are currently supported:
* date-format
* import-marks
* export-marks
+* report-fd
* relative-marks
* no-relative-marks
* force
diff --git a/fast-import.c b/fast-import.c
index 2317b0f..ef0cee7 100644
--- a/fast-import.c
+++ b/fast-import.c
@@ -361,6 +361,9 @@ static uintmax_t next_mark;
static struct strbuf new_data = STRBUF_INIT;
static int seen_data_command;
+/* Where to report commits */
+static int report_fd = -1;
+
static void parse_argv(void);
static void write_branch_report(FILE *rpt, struct branch *b)
@@ -2571,6 +2574,11 @@ static void parse_new_commit(void)
if (!store_object(OBJ_COMMIT, &new_data, NULL, b->sha1, next_mark))
b->pack_id = pack_id;
+ if (report_fd != -1) {
+ char *buf = sha1_to_hex(b->sha1);
+ buf[40] = '\n';
+ write_or_die(report_fd, buf, 41);
+ }
b->last_commit = object_count_by_type[OBJ_COMMIT];
}
@@ -2755,6 +2763,14 @@ static void option_export_marks(const char *marks)
safe_create_leading_directories_const(export_marks_file);
}
+static void option_report_fd(const char *fd)
+{
+ unsigned long n = strtoul(fd, NULL, 0);
+ if (n > (unsigned long) INT_MAX)
+ die("--report-fd cannot exceed %d", INT_MAX);
+ report_fd = (int) n;
+}
+
static void option_export_pack_edges(const char *edges)
{
if (pack_edges)
@@ -2808,6 +2824,8 @@ static int parse_one_feature(const char *feature, int from_stream)
option_import_marks(feature + 13, from_stream);
} else if (!prefixcmp(feature, "export-marks=")) {
option_export_marks(feature + 13);
+ } else if (!prefixcmp(feature, "report-fd=")) {
+ option_report_fd(feature + strlen("report-fd="));
} else if (!prefixcmp(feature, "relative-marks")) {
relative_marks_paths = 1;
} else if (!prefixcmp(feature, "no-relative-marks")) {
diff --git a/t/t9300-fast-import.sh b/t/t9300-fast-import.sh
index 5c274e7..610e7a5 100755
--- a/t/t9300-fast-import.sh
+++ b/t/t9300-fast-import.sh
@@ -1663,6 +1663,48 @@ test_expect_success 'R: feature no-relative-marks is honoured' '
test_cmp marks.out non-relative.out
'
+test_expect_success 'have pipes?' '
+ test_when_finished "rm -f frob" &&
+ if mkfifo frob
+ then
+ test_set_prereq PIPE
+ fi
+'
+
+test_expect_success PIPE 'R: feature report-fd is honoured' '
+ mkfifo commits &&
+ test_when_finished "rm -f commits" &&
+ cat >frontend <<-\FRONTEND_END &&
+ #!/bin/sh
+ cat <<EOF &&
+ feature report-fd=3
+ commit refs/heads/printed
+ committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
+ data <<COMMIT
+ to be printed
+ COMMIT
+
+ from refs/heads/master
+ D file3
+
+ EOF
+
+ read cid <&3 &&
+ echo "$cid" >received
+ EOF
+ FRONTEND_END
+ chmod +x frontend &&
+ (
+ {
+ sh frontend 3<commits ||
+ exit
+ } |
+ git fast-import 3>commits
+ ) &&
+ git rev-parse --verify printed >real &&
+ test_cmp real received
+'
+
test_expect_success 'R: quiet option results in no stats being output' '
>empty &&
cat >input <<-\EOF &&
--
1.7.2.3
next prev parent reply other threads:[~2010-09-05 3:32 UTC|newest]
Thread overview: 75+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-07-01 3:18 [PATCH/RFC] Teach fast-import to import subtrees named by tree id Jonathan Nieder
2010-07-01 5:48 ` [WIP/PATCH] Teach fast-import to print the id of each imported commit Jonathan Nieder
2010-07-02 3:16 ` Sverre Rabbelier
2010-07-02 3:41 ` Jonathan Nieder
2010-07-02 4:29 ` Sverre Rabbelier
2010-07-02 5:12 ` Jonathan Nieder
2010-07-02 14:55 ` Sverre Rabbelier
2010-07-02 15:40 ` Jonathan Nieder
2010-07-02 15:48 ` Sverre Rabbelier
2010-07-04 0:02 ` Sam Vilain
2010-07-04 0:35 ` Jonathan Nieder
2010-07-04 3:44 ` Sam Vilain
2010-07-04 7:22 ` Jonathan Nieder
2010-08-17 17:02 ` Ramkumar Ramachandra
2010-09-05 3:15 ` [RFC/PATCH 0/3] fast-import: give importers access to the object store Jonathan Nieder
2010-09-05 3:22 ` [PATCH 1/3] t9300 (fast-import): style tweaks Jonathan Nieder
2010-09-24 6:59 ` [PATCH/RFC 00/24] " Jonathan Nieder
2010-09-24 7:04 ` [PATCH 01/24] t9300 (fast-import): avoid exiting early on failure Jonathan Nieder
2010-09-24 7:05 ` [PATCH 02/24] t9300 (fast-import): avoid hard-coded object names Jonathan Nieder
2010-09-24 7:09 ` [PATCH 03/24] t9300 (fast-import): guard "export large marks" test setup Jonathan Nieder
2010-09-24 9:38 ` Ramkumar Ramachandra
2010-09-24 10:56 ` Raja R Harinath
2010-09-24 10:34 ` Ramkumar Ramachandra
2010-09-24 11:01 ` Raja R Harinath
2010-09-24 7:11 ` [PATCH 04/24] t9300 (fast-import): check exit status from upstream of pipes Jonathan Nieder
2010-09-24 7:11 ` [PATCH 05/24] t9300 (fast-import): check exit status from command substitutions Jonathan Nieder
2010-09-24 7:12 ` [PATCH 06/24] t9300 (fast-import): use test_cmp in place of test $(foo) = $(bar) Jonathan Nieder
2010-09-24 7:13 ` [PATCH 07/24] t9300 (fast-import): use tabs to indent Jonathan Nieder
2010-09-24 8:54 ` Ramkumar Ramachandra
2010-09-24 9:21 ` Jonathan Nieder
2010-09-24 7:16 ` [PATCH 08/24] t9300 (fast-import), series A: re-indent Jonathan Nieder
2010-09-24 7:22 ` Sverre Rabbelier
2010-09-24 7:35 ` Jonathan Nieder
2010-09-24 7:18 ` [PATCH 09/24] t9300 (fast-import), series B: re-indent Jonathan Nieder
2010-09-24 7:19 ` [PATCH 10/24] t9300 (fast-import), series C: re-indent Jonathan Nieder
2010-09-24 7:19 ` [PATCH 11/24] t9300 (fast-import), series D: re-indent Jonathan Nieder
2010-09-24 7:21 ` [PATCH 12/24] t9300 (fast-import), series E: re-indent Jonathan Nieder
2010-09-24 7:22 ` [PATCH 13/24] t9300 (fast-import), series F: re-indent Jonathan Nieder
2010-09-24 7:22 ` [PATCH 14/24] t9300 (fast-import), series H: re-indent Jonathan Nieder
2010-09-24 7:23 ` [PATCH 15/24] t9300 (fast-import), series I: re-indent Jonathan Nieder
2010-09-24 7:24 ` [PATCH 16/24] t9300 (fast-import), series J: re-indent Jonathan Nieder
2010-09-24 7:25 ` [PATCH 17/24] t9300 (fast-import), series K: re-indent Jonathan Nieder
2010-09-24 7:25 ` [PATCH 18/24] t9300 (fast-import), series L: re-indent Jonathan Nieder
2010-09-24 7:26 ` [PATCH 19/24] t9300 (fast-import), series M: re-indent Jonathan Nieder
2010-09-24 7:26 ` [PATCH 20/24] t9300 (fast-import), series N: re-indent Jonathan Nieder
2010-09-24 7:27 ` [PATCH 21/24] t9300 (fast-import), series O: re-indent Jonathan Nieder
2010-09-24 7:27 ` [PATCH 22/24] t9300 (fast-import), series P: re-indent Jonathan Nieder
2010-09-24 7:28 ` [PATCH 23/24] t9300 (fast-import), series Q: re-indent Jonathan Nieder
2010-09-24 7:30 ` [PATCH 24/24] t9300 (fast-import), series R: re-indent Jonathan Nieder
2010-09-25 5:19 ` svn-fe status Jonathan Nieder
2010-09-25 10:25 ` Sverre Rabbelier
2010-09-27 2:54 ` Jonathan Nieder
2010-09-27 9:15 ` Sverre Rabbelier
2010-09-05 3:29 ` Jonathan Nieder [this message]
2010-09-05 3:41 ` [PATCH 3/3] fast-import: Let importers retrieve the objects being written Jonathan Nieder
2010-09-05 6:08 ` [RFC/PATCH 0/3] fast-import: give importers access to the object store Ramkumar Ramachandra
2010-09-05 6:28 ` Sverre Rabbelier
2010-09-05 8:47 ` Ramkumar Ramachandra
2010-09-05 16:20 ` Sverre Rabbelier
2010-09-05 17:31 ` Jonathan Nieder
2010-09-08 3:13 ` [PATCH 4/3] fast-import: typofix Jonathan Nieder
2010-09-08 3:17 ` [PATCH 5/3] fast-import: allow cat command with empty path Jonathan Nieder
2010-09-08 3:27 ` [PATCH 6/3] fast-import: Allow cat requests at arbitrary points in stream Jonathan Nieder
2010-09-08 3:38 ` Sverre Rabbelier
2010-09-08 3:57 ` Jonathan Nieder
2010-09-08 10:16 ` Ramkumar Ramachandra
2010-09-16 0:14 ` [RFC/PATCH 0/3] fast-import: give importers access to the object store Sam Vilain
2010-09-17 23:24 ` Sverre Rabbelier
2010-09-24 19:43 ` Jonathan Nieder
2010-09-24 23:44 ` Sverre Rabbelier
2010-09-25 0:01 ` Jonathan Nieder
2010-09-25 0:17 ` Sverre Rabbelier
2010-07-02 3:20 ` [PATCH/RFC] Teach fast-import to import subtrees named by tree id Sverre Rabbelier
2010-07-02 4:42 ` Jonathan Nieder
2010-07-02 12:44 ` Ramkumar Ramachandra
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=20100905032957.GC2344@burratino \
--to=jrnieder@gmail.com \
--cc=artagnon@gmail.com \
--cc=david.barr@cordelta.com \
--cc=git@vger.kernel.org \
--cc=sam@vilain.net \
--cc=spearce@spearce.org \
--cc=srabbelier@gmail.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.
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 NNTP newsgroup(s).