From: Ramkumar Ramachandra <artagnon@gmail.com>
To: David Barr <david.barr@cordelta.com>
Cc: Git Mailing List <git@vger.kernel.org>,
Jonathan Nieder <jrnieder@gmail.com>,
Sverre Rabbelier <srabbelier@gmail.com>,
Johannes Sixt <j.sixt@viscovery.net>
Subject: Re: [PATCH] fast-import: Allow filemodify to set the root
Date: Fri, 8 Oct 2010 13:45:13 +0530 [thread overview]
Message-ID: <20101008081509.GA2845@kytes> (raw)
In-Reply-To: <1286448906-1424-1-git-send-email-david.barr@cordelta.com>
Hi David,
I'm sorry I didn't get the time to look at this earlier- just looked
at it now.
David Barr writes:
> Most git commands do their writing to the object db via the index and
> loose objects. When you just have a pile of trees you want to convert
> into commits, this is wasteful; for performance-critical operations
> like filter-branch --subdirectory-filter, one might want a sort of
> hash-object --batch-to-pack to write a pack directly.
>
> Fortunately we have fast-import (which is one of the only git commands
> that will write to a pack directly) but there is not an advertised way
> to tell fast-import to use a given tree for its commits. So in
> current git, one has the unpleasant choice of writing loose objects
> without parsing the trees or writing straight to pack but having to
> parse trees to do it.
>
> This patch changes that, by allowing
>
> M 040000 <tree id> ""
It can be a <dataref> in general: either a SHA1 or a tree mark.
> as a filemodify line in a commit to reset to a particular tree without
> any need to unpack it. For example,
>
> M 040000 4b825dc642cb6eb9a060e54bf8d69288fbee4904 ""
>
> is a synonym for the deleteall command.
>
> Commit-message-by: Jonathan Nieder <jrnieder@gmail.com>
> Signed-off-by: David Barr <david.barr@cordelta.com>
> ---
> fast-import.c | 9 +++++++++
> 1 files changed, 9 insertions(+), 0 deletions(-)
I applied and tried it out- it works as expected. Here's a patch for
the documentation and a test. You might want to put the test in a
separate patch (in preparation for Jonathan's t9300 cleanup series).
@Jonathan: What happened to your series cleaning up t9300?
Tested-by: Ramkumar Ramachandra <artagnon@gmail.com>
Signed-off-by: Ramkumar Ramachandra <artagnon@gmail.com>
-- 8< --
diff --git a/Documentation/git-fast-import.txt b/Documentation/git-fast-import.txt
index 966ba4f..90a4666 100644
--- a/Documentation/git-fast-import.txt
+++ b/Documentation/git-fast-import.txt
@@ -524,6 +524,9 @@ start with double quote (`"`).
If an `LF` or double quote must be encoded into `<path>` shell-style
quoting should be used, e.g. `"path/with\n and \" in it"`.
+Additionally, in `040000` mode, `<path>` may also be an empty string
+(`""`) to specify the root of the tree.
+
The value of `<path>` must be in canonical form. That is it must not:
* contain an empty directory component (e.g. `foo//bar` is invalid),
diff --git a/t/t9300-fast-import.sh b/t/t9300-fast-import.sh
index 7c05920..3c0cf05 100755
--- a/t/t9300-fast-import.sh
+++ b/t/t9300-fast-import.sh
@@ -875,6 +875,27 @@ test_expect_success \
compare_diff_raw expect actual'
test_expect_success \
+ 'N: copy root directory by tree hash' \
+ 'cat >expect <<-\EOF &&
+ :100755 000000 f1fb5da718392694d0076d677d6d0e364c79b0bc 0000000000000000000000000000000000000000 D file3/newf
+ :100644 000000 7123f7f44e39be127c5eb701e5968176ee9d78b1 0000000000000000000000000000000000000000 D file3/oldf
+ EOF
+ root=$(git rev-parse refs/heads/branch^0^{tree}) &&
+ cat >input <<-INPUT_END &&
+ commit refs/heads/N6
+ committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
+ data <<COMMIT
+ copy root directory by tree hash
+ COMMIT
+
+ from refs/heads/branch^0
+ M 040000 $root ""
+ INPUT_END
+ git fast-import <input &&
+ git diff-tree -C --find-copies-harder -r N4 N6 >actual &&
+ compare_diff_raw expect actual'
+
+test_expect_success \
'N: modify copied tree' \
'cat >expect <<-\EOF &&
:100644 100644 fcf778cda181eaa1cbc9e9ce3a2e15ee9f9fe791 fcf778cda181eaa1cbc9e9ce3a2e15ee9f9fe791 C100 newdir/interesting file3/file5
> diff --git a/fast-import.c b/fast-import.c
> index 2317b0f..8f68a89 100644
> --- a/fast-import.c
> +++ b/fast-import.c
> @@ -1454,6 +1454,15 @@ static int tree_content_set(
> n = slash1 - p;
> else
> n = strlen(p);
> + if (!slash1 && !n) {
> + if (!S_ISDIR(mode))
> + die("Root cannot be a non-directory");
> + hashcpy(root->versions[1].sha1, sha1);
> + if (root->tree)
> + release_tree_content_recursive(root->tree);
> + root->tree = subtree;
Should there be a hashclr(root->versions[1].sha1) here? I saw it in
the other branches.
Looks good otherwise. I'm surprised fast-import didn't already have
this functionality.
-- Ram
next prev parent reply other threads:[~2010-10-08 8:16 UTC|newest]
Thread overview: 31+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-10-07 10:55 [PATCH] fast-import: Allow filemodify to set the root David Barr
2010-10-07 13:58 ` Sverre Rabbelier
2010-10-07 20:28 ` Jonathan Nieder
2010-10-07 20:35 ` Sverre Rabbelier
2010-10-07 23:45 ` David Barr
2010-10-07 23:46 ` David Barr
2010-10-07 23:55 ` Sverre Rabbelier
2010-10-08 6:50 ` Johannes Sixt
2010-10-08 7:05 ` Jonathan Nieder
2010-10-08 7:23 ` Johannes Sixt
2010-10-08 8:00 ` Jonathan Nieder
2010-10-08 8:15 ` Ramkumar Ramachandra [this message]
2010-10-08 8:33 ` Gabriel Filion
2010-10-08 8:58 ` David Michael Barr
2010-10-08 16:34 ` Sverre Rabbelier
2010-10-08 17:09 ` Jonathan Nieder
2010-10-09 22:11 ` David Michael Barr
2010-10-09 22:12 ` Sverre Rabbelier
2010-10-10 3:30 ` David Barr
2010-10-11 6:34 ` Jonathan Nieder
2010-10-18 1:00 ` [PATCH 0/2] " Jonathan Nieder
2010-10-18 1:03 ` [PATCH 1/2] fast-import: filemodify after M 040000 <tree> "" crashes Jonathan Nieder
2010-10-18 1:13 ` Sverre Rabbelier
2010-10-18 1:44 ` Jonathan Nieder
2010-10-20 20:25 ` [PATCH] fast-import: do not clear notes in do_change_note_fanout() Jonathan Nieder
2010-10-18 1:08 ` [PATCH 2/2] fast-import: tighten M 040000 syntax Jonathan Nieder
2011-01-16 2:22 ` [PATCH] Documentation/fast-import: put explanation of M 040000 <dataref> "" in context Jonathan Nieder
2011-01-18 15:04 ` Junio C Hamano
2011-01-18 21:16 ` Jonathan Nieder
2011-01-18 21:43 ` Junio C Hamano
2011-01-18 22:02 ` Jonathan Nieder
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=20101008081509.GA2845@kytes \
--to=artagnon@gmail.com \
--cc=david.barr@cordelta.com \
--cc=git@vger.kernel.org \
--cc=j.sixt@viscovery.net \
--cc=jrnieder@gmail.com \
--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.
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).