From ea5e370aa9203f999dd8bcd4a9cd29452f1c9181 Mon Sep 17 00:00:00 2001 From: "Shawn O. Pearce" Date: Mon, 12 Feb 2007 04:08:43 -0500 Subject: [PATCH] fast-import: Support reusing 'from' and brown paper bag fix reset. It was suggested on the mailing list that being able to use `from` in any commit to reset the current branch is useful in some types of importers, such as a darcs importer. We originally did not permit resetting an existing branch with a new `from` command during a `commit` command, but this restriction was only to help debug the hacked up cvs2svn that Jon Smirl was developing in parallel with git-fast-import. It is probably more of a problem to disallow it than to allow it. So now we permit a `from` during any `commit`. While making the changes required to permit multiple `from` commands on the same branch, I discovered we no longer needed the last_commit field to be set to 0 during a reset, so that was removed. (Reset was originally setting the field to 0 to signal cmd_from() that it was OK to execute on the branch.) While poking around in this section of fast-import I also realized the `reset` command was not working as intended if the corresponding `from` command was omitted (as allowed by the BNF grammar and the code). If `from` was omitted we cleared out the tree but we left the tree SHA-1 and parent commit SHA-1 intact. This is not what the user intended in this case. Instead they would be trying to reset the branch to have no parent and to have no tree, making the branch look new-born during the next commit. We now clear these SHA-1 values during `reset`, ensuring the branch looks new-born if `from` does not get supplied. New test cases for these were also added. Signed-off-by: Shawn O. Pearce --- Documentation/git-fast-import.txt | 21 ++++++----- fast-import.c | 10 ++++-- t/t9300-fast-import.sh | 60 +++++++++++++++++++++++++++++++ 3 files changed, 77 insertions(+), 14 deletions(-) diff --git a/Documentation/git-fast-import.txt b/Documentation/git-fast-import.txt index 939ec4652..445f6b854 100644 --- a/Documentation/git-fast-import.txt +++ b/Documentation/git-fast-import.txt @@ -349,17 +349,16 @@ their syntax. `from` ^^^^^^ -Only valid for the first commit made on this branch by this -fast-import process. The `from` command is used to specify the commit -to initialize this branch from. This revision will be the first -ancestor of the new commit. - -Omitting the `from` command in the first commit of a new branch will -cause fast-import to create that commit with no ancestor. This tends to be -desired only for the initial commit of a project. Omitting the -`from` command on existing branches is required, as the current -commit on that branch is automatically assumed to be the first -ancestor of the new commit. +The `from` command is used to specify the commit to initialize +this branch from. This revision will be the first ancestor of the +new commit. + +Omitting the `from` command in the first commit of a new branch +will cause fast-import to create that commit with no ancestor. This +tends to be desired only for the initial commit of a project. +Omitting the `from` command on existing branches is usually desired, +as the current commit on that branch is automatically assumed to +be the first ancestor of the new commit. As `LF` is not valid in a Git refname or SHA-1 expression, no quoting or escaping syntax is supported within ``. diff --git a/fast-import.c b/fast-import.c index f9cfc7263..fd3b11757 100644 --- a/fast-import.c +++ b/fast-import.c @@ -1667,8 +1667,10 @@ static void cmd_from(struct branch *b) if (strncmp("from ", command_buf.buf, 5)) return; - if (b->last_commit) - die("Can't reinitailize branch %s", b->name); + if (b->branch_tree.tree) { + release_tree_content_recursive(b->branch_tree.tree); + b->branch_tree.tree = NULL; + } from = strchr(command_buf.buf, ' ') + 1; s = lookup_branch(from); @@ -1936,7 +1938,9 @@ static void cmd_reset_branch(void) sp = strchr(command_buf.buf, ' ') + 1; b = lookup_branch(sp); if (b) { - b->last_commit = 0; + hashclr(b->sha1); + hashclr(b->branch_tree.versions[0].sha1); + hashclr(b->branch_tree.versions[1].sha1); if (b->branch_tree.tree) { release_tree_content_recursive(b->branch_tree.tree); b->branch_tree.tree = NULL; diff --git a/t/t9300-fast-import.sh b/t/t9300-fast-import.sh index 8d2821129..970d68365 100755 --- a/t/t9300-fast-import.sh +++ b/t/t9300-fast-import.sh @@ -433,4 +433,64 @@ test_expect_success \ 'sed -e s/pack-.*pack/pack-.pack/ edges.list >actual && diff -u expect actual' +### +### series J +### + +cat >input < $GIT_COMMITTER_DATE +data < $GIT_COMMITTER_DATE +data <input < $GIT_COMMITTER_DATE +data < $GIT_COMMITTER_DATE +data <