Re: [PATCH] git checkout: create unparented branch by --orphan

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi,

2010/3/20 Junio C Hamano <gitster@xxxxxxxxx>:
> Erick Mattos <erick.mattos@xxxxxxxxx> writes:
>
>> Complete rewrite of --orphan functionality to fit it in the new design goals
>> set by Junio.  Now --orphan is not anymore an option of -b.  It is an
>> alternative to it.
>
> You are giving me too much credit.  I just made a suggestion, you had the
> choice to agree to or disagree with it, and I am hoping that you made the
> final decision to rewrite the patch to match what I suggested not because
> you wanted a "commit count" in the project with any form of a change, but
> because you thought the suggested approach made much more sense than the
> earlier iterations.  And in that case, the final decision to submit the
> patch in this form was due to _you_.  Don't give me undue credit---I was
> just helping from the sideline.

If I was going to look for a commit count I would do spelling/grammar
corrections. :-)

This is the second feature I am trying to add to git.  Both changes of
mine are features I use my own.  On my compiled and customized version
of git.  I thought they were good and tried to share following the
best free software spirit (I have been always feeling guilty of just
using free software).  I am not a new developer trying to be known.  I
am not even "new"...  :-)

Anyway I think you will not hear of me anymore after we finish this
work.  I think I did enough for this project and I really don't feel
myself fitted to the task.

I realized your last critic was indeed good and that it worthed the changes.

But I have to confess that I am a little impatient to end this
development cycle though.  So trying not to argue was a change of
behavior. ;-)

>> Junio:  I ask you to reconsider only the giving of the "short-and-sweet" -o
>> from beginning because of the new design.
>
> No.  I don't want our hand to be tied with something that is clearly a
> corner case feature from the beginning.  It wouldn't be too late to add
> one later, after it proves something people do every day (or even every
> hour).

If it is because of its importance I think it will never deserve the upgrade.

But I was arguing because I imagine checkout will never need the 21
remaining letters and that it was good for cosmetic and similarity (to
his brother -b) reasons.

Also because I am more used to one letter options from previous
operational systems experience (let's forget that! :-) ).

>>  Documentation/git-checkout.txt |   21 +++++++++++++++-
>>  builtin/checkout.c             |   19 +++++++++++++-
>>  t/t2017-checkout-orphan.sh     |   53 ++++++++++++++++++++++++++++++++++++++++
>>  3 files changed, 90 insertions(+), 3 deletions(-)
>>  create mode 100755 t/t2017-checkout-orphan.sh
>>
>> diff --git a/Documentation/git-checkout.txt b/Documentation/git-checkout.txt
>> index 37c1810..18df834 100644
>> --- a/Documentation/git-checkout.txt
>> +++ b/Documentation/git-checkout.txt
>> @@ -20,6 +20,19 @@ When <paths> are not given, this command switches branches by
>>  updating the index, working tree, and HEAD to reflect the specified
>>  branch.
>>
>> +When you use "--orphan", a new unparented branch is created having the
>> +index and the working tree intact.  This allows you to start a new
>> +history that records set of paths similar to that of the start-point
>> +commit, which is useful when you want to keep different branches for
>> +different audiences you are working to like when you have an open source
>> +and commercial versions of a software, for example.
>> +
>> +If you want to start a disconnected history that records set of paths
>> +totally different from the original branch, you may want to first clear
>> +the index and the working tree, by running "git rm -rf ." from the
>> +top-level of the working tree, before preparing your files (by copying
>> +from elsewhere, extracting a tarball, etc.) in the working tree.
>> +
>>  If `-b` is given, a new branch is created and checked out, as if
>>  linkgit:git-branch[1] were called; in this case you can
>>  use the --track or --no-track options, which will be passed to `git
>
> It feels wrong to talk about --orphan before readers learned -b.  Does the
> text flow nicely if we just swap the paragraphs?  Better yet, perhaps we
> shouldn't have any of this in the general description section.  Move this
> and consolidate it with the text in "OPTIONS" section under "--orphan"?

As you wish.

>> @@ -63,6 +76,12 @@ entries; instead, unmerged entries are ignored.
>>       When checking out paths from the index, check out stage #2
>>       ('ours') or #3 ('theirs') for unmerged paths.
>>
>> +--orphan::
>> +     Create a new branch named <new_branch>, unparented to any other
>> +     branch.  The new branch you switch to does not have any commit
>> +     and after the first one it will become the root of a new history
>> +     completely unconnected from all the other branches.
>> +
>>  -b::
>>       Create a new branch named <new_branch> and start it at
>>       <start_point>; see linkgit:git-branch[1] for details.
>
> Likewise.  I think "--orphan" should come after -b/-t/-l (all about the
> normal cases of switching to a different branch either new or existing).

All right.

> Oh, by the way, how does this new option work with -t?  I think the
> combination should be rejected, no?

Yes it should.  And it is.  By --track itself which is directly
connected to -b.  Test done just before --orphan test by someone else.

> I have a suspicion that you are trying "git co-o new old" case where old
> is not the current branch (so that you would want to adjust the index and
> the working tree files to that of "old" while carrying local changes
> forward), _but_ if that is the case that should have been already done
> with the logic in switch_branches() where it calls merge_working_tree(),
> and not here in the call chain.

My fault.  Forget that.  Fast unverified work in a hurry. :-\

>> @@ -677,6 +686,12 @@ int cmd_checkout(int argc, const char **argv, const char *prefix)
>>               opts.new_branch = argv0 + 1;
>>       }
>>
>> +     if (opts.new_orphan_branch) {
>> +             if (opts.new_branch)
>> +                     die("--orphan and -b are mutually exclusive");
>> +             opts.new_branch = opts.new_orphan_branch;
>> +     }
>
> How should this interact with opts.track?  I think (and please correct
> me if you disagree):
>
>  - "git checkout -t --orphan new [old]" should fail; new is rootless and
>   does not track either the current branch or "old";
>
>  - opts.track that came from git_branch_track (default read from config)
>   should not cause a failure, but be silently ignored.

It is just working like you have pictured.

>> diff --git a/t/t2017-checkout-orphan.sh b/t/t2017-checkout-orphan.sh
>> new file mode 100755
>> index 0000000..e6d88b1
>> --- /dev/null
>> +++ b/t/t2017-checkout-orphan.sh
>> @@ -0,0 +1,53 @@
>> +#!/bin/sh
>> +#
>> +# Copyright (c) 2010 Erick Mattos
>> +#
>> +
>> +test_description='git checkout --orphan
>> +
>> +Main Tests for --orphan functionality.'
>> +
>> +. ./test-lib.sh
>> +
>> +TEST_FILE=foo
>> +
>> +test_expect_success 'Setup' '
>> +     echo "Initial" >"$TEST_FILE" &&
>> +     git add "$TEST_FILE" &&
>> +     git commit -m "First Commit"
>> +     test_tick &&
>> +     echo "State 1" >>"$TEST_FILE" &&
>> +     git add "$TEST_FILE" &&
>> +     git commit -m "Second Commit"
>
> No tick before this one?

I will add another then.

>> +'
>> +
>> +test_expect_success '--orphan creates a new orphan branch from HEAD' '
>> +     git checkout --orphan alpha &&
>> +     test_must_fail PAGER= git log >/dev/null 2>/dev/null &&
>> +     test "alpha" = "$(git symbolic-ref HEAD | sed "s,.*/,,")" &&
>
> What is this PAGER= doing here?
>
> I think it is more direct to check that:
>
>  - "rev-parse --verify HEAD" fails; and
>  - "symbolic-ref HEAD" says refs/heads/alpha.
>> +     test_tick &&
>> +     git commit -m "Third Commit" &&
>
> Tricky but correct ;-)

Indeed.  Easier your way though.

>> +     test 0 -eq $(git cat-file -p HEAD | grep "^parent" | wc -l) &&
>
>    test_must_fail git rev-parse --verify HEAD^
>
>> +     git cat-file -p master | grep "^tree" >base &&
>
>    git rev-parse master^{tree} >base
>
>> +     git cat-file -p HEAD | grep "^tree" >actual &&
>> +     test_cmp base actual
>> +'
>
> Or you can just replace the above three lines with:
>
>        git diff-tree --quiet master alpha
>
>> +test_expect_success '--orphan creates a new orphan branch from <start_point>' '
>> ...
>> +'
>
> Similar.
>
>> +test_expect_success '--orphan must be rejected with -b' '
>> +     test_must_fail git checkout --orphan new -b newer
>> +'

All your suggestions are going to be added.

> Ok.  You have the basics covered well; there are a few more things to
> test, I think.
>
> With local changes in the index/working tree without "start commit" (which
> should never fail) and with "start commit" (which should fail if HEAD and
> start commit has differences to the same paths as you have local changes
> to).

It is behaving like that already and that is intrinsically a
switch_branches() logic, not a special --orphan need.  It is not part
of this implementation and It is probably tested elsewhere (you
probably do know where).

> Also you would want to check with -t, --no-t, branch.autosetupmrebe set to
> always in the configuration with -t and without -t from the command line,

The actual implementation is just ignoring track and -t is not even
allowed.  So it is pointless.

> Thanks.
>

I will be sending a new patch version soon.

Regards
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux Kernel Development]     [Gcc Help]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [V4L]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Fedora Users]