Re: [RFC/PATCH] worktree: replace checkout --to with worktree new

2015-07-02 Thread Duy Nguyen
On Thu, Jul 2, 2015 at 7:41 PM, Duy Nguyen pclo...@gmail.com wrote:
 merge_working_tree:
 tree = parse_tree_indirect(old-commit 
 !opts-new_worktree_mode ?
 old-commit-object.sha1 :
 EMPTY_TREE_SHA1_BIN);

 I think it's to make sure empty sha-1 is used with --to. If
 old-commit-object.sha1 is used and it's something, a real two way
 merge may happen probably with not-so-fun consequences. If it's empty
 sha1, the effect is like reset --hard, silent and reliable..

 switch_branches:
 if (!opts-quiet  !old.path  old.commit 
 new-commit != old.commit  !opts-new_worktree_mode)
 orphaned_commit_warning(old.commit, new-commit);

 to suppress misleading warning if old.commit happens to be something.

Actually you may be right about not reverting these. We prepare the
new worktree with a valid HEAD, that would make old valid and may
trigger things if git checkout is used to populate the worktree. To
suppress those things, we need new_worktree_mode or something
similar.

Unless we want to borrow fancy checkout options for git worktree
add, we probably should just export checkout() function from clone.c
and use it instead of git checkout. Much more lightweight and
simpler (it's one-way merge). Then we can revert checkout.c to the
version before --to.
-- 
Duy
--
To unsubscribe from this list: send the line unsubscribe git in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [RFC/PATCH] worktree: replace checkout --to with worktree new

2015-07-02 Thread Duy Nguyen
On Thu, Jul 2, 2015 at 9:52 AM, Eric Sunshine sunsh...@sunshineco.com wrote:
 On Wed, Jul 1, 2015 at 9:07 PM, Duy Nguyen pclo...@gmail.com wrote:
 On Thu, Jul 2, 2015 at 12:13 AM, Eric Sunshine sunsh...@sunshineco.com 
 wrote:
I noticed GIT_CHECKOUT_NEW_WORKTREE environment variabl that does
not seem to be documented.  Is this something we still need?
The log message of 529fef20 (checkout: support checking out into
a new working directory, 2014-11-30) does not tell us much.

 Yes, it's still used for the same purpose as before the conversion: as
 a private signal to the sub git-checkout invocation that it's
 operating on a new worktree. When defined, it sets the
 'new_worktree_mode' flag in checkout.c, and there are still a few bits
 of code which apparently need to know about it. It would be nice to
 eliminate this special knowledge from checkout.c, however, I'm not yet
 familiar enough with the checkout code to determine if doing so is
 viable.

 I think it can go away. When --to is used, I have to re-execute git
 checkout command again after creating the new worktree. I could
 process the command line arguments from the first execution, delete
 --to, then use the remaining options to run checkout the second
 time. But I chose to pass the entire command line to the second
 execution. The env is used to let the second run know it should ignore
 --to (or we get infinite recursion). With git worktree add this
 recursion disappears and this env var has no reason to exist.

 The recursion protection is indeed no longer needed and gets removed
 by the worktree add patch. However, there are still a few bits of
 code which want to know that the checkout is happening in a new
 worktree. I haven't examined them closely yet to diagnose if this
 specialized knowledge can be eliminated. Perhaps you can weight in. In
 particular:

 checkout_paths:
 if (opts-new_worktree)
 die(_('%s' cannot be used with updating paths), --to);

This one is easy, as --to is gone, no reason to report anything about --to

 merge_working_tree:
 tree = parse_tree_indirect(old-commit 
 !opts-new_worktree_mode ?
 old-commit-object.sha1 :
 EMPTY_TREE_SHA1_BIN);

I think it's to make sure empty sha-1 is used with --to. If
old-commit-object.sha1 is used and it's something, a real two way
merge may happen probably with not-so-fun consequences. If it's empty
sha1, the effect is like reset --hard, silent and reliable..

 switch_branches:
 if (!opts-quiet  !old.path  old.commit 
 new-commit != old.commit  !opts-new_worktree_mode)
 orphaned_commit_warning(old.commit, new-commit);

to suppress misleading warning if old.commit happens to be something.
-- 
Duy
--
To unsubscribe from this list: send the line unsubscribe git in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [RFC/PATCH] worktree: replace checkout --to with worktree new

2015-07-02 Thread Eric Sunshine
On Thu, Jul 2, 2015 at 8:50 AM, Duy Nguyen pclo...@gmail.com wrote:
 On Thu, Jul 2, 2015 at 7:41 PM, Duy Nguyen pclo...@gmail.com wrote:
 merge_working_tree:
 tree = parse_tree_indirect(old-commit 
 !opts-new_worktree_mode ?
 old-commit-object.sha1 :
 EMPTY_TREE_SHA1_BIN);

 I think it's to make sure empty sha-1 is used with --to. If
 old-commit-object.sha1 is used and it's something, a real two way
 merge may happen probably with not-so-fun consequences. If it's empty
 sha1, the effect is like reset --hard, silent and reliable..

 switch_branches:
 if (!opts-quiet  !old.path  old.commit 
 new-commit != old.commit  !opts-new_worktree_mode)
 orphaned_commit_warning(old.commit, new-commit);

 to suppress misleading warning if old.commit happens to be something.

 Actually you may be right about not reverting these. We prepare the
 new worktree with a valid HEAD, that would make old valid and may
 trigger things if git checkout is used to populate the worktree. To
 suppress those things, we need new_worktree_mode or something
 similar.

Indeed. Since this is merely a private implementation detail, we don't
necessarily have to resolve the issue fully for the checkout --to to
worktree add conversion. It can be dealt with in a follow-on patch.

 Unless we want to borrow fancy checkout options for git worktree
 add, we probably should just export checkout() function from clone.c
 and use it instead of git checkout. Much more lightweight and
 simpler (it's one-way merge). Then we can revert checkout.c to the
 version before --to.

Interesting idea, but doesn't this lose the ability to create a new
branch (worktree add foo -b bar) and other useful options like
--track?
--
To unsubscribe from this list: send the line unsubscribe git in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [RFC/PATCH] worktree: replace checkout --to with worktree new

2015-07-02 Thread Eric Sunshine
On Thu, Jul 2, 2015 at 8:41 AM, Duy Nguyen pclo...@gmail.com wrote:
 On Thu, Jul 2, 2015 at 9:52 AM, Eric Sunshine sunsh...@sunshineco.com wrote:
 The recursion protection is indeed no longer needed and gets removed
 by the worktree add patch. However, there are still a few bits of
 code which want to know that the checkout is happening in a new
 worktree. I haven't examined them closely yet to diagnose if this
 specialized knowledge can be eliminated. Perhaps you can weight in. In
 particular:

 checkout_paths:
 if (opts-new_worktree)
 die(_('%s' cannot be used with updating paths), --to);

 This one is easy, as --to is gone, no reason to report anything about --to

In the worktree add patch, I kept this one (with s/--to/worktree
add/) assuming that your intention was that a new worktree should
never start with a partial checkout due to specifying paths. Looking
at it more closely, I'm still not convinced that it can be removed.
Given:

git worktree new path branch -- file

it creates path and checks out file (and only file) into path,
however, the resulting worktree is not on any branch. The latter, I
think is because switch_branches() doesn't get called in this case;
instead, it's just at whatever HEAD was faked up to appease
is_git_directory().
--
To unsubscribe from this list: send the line unsubscribe git in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [RFC/PATCH] worktree: replace checkout --to with worktree new

2015-07-02 Thread Eric Sunshine
On Thu, Jul 2, 2015 at 3:00 PM, Eric Sunshine sunsh...@sunshineco.com wrote:
 On Thu, Jul 2, 2015 at 2:45 PM, Eric Sunshine sunsh...@sunshineco.com wrote:
 There's another instance: 3473ad0 (checkout: don't require a work tree
 when checking out into a new one, 2014-11-30) added this:

 if (!new_worktree)
 setup_work_tree();

 which the worktree add patch changed to:

 setup_work_tree();

 which doesn't hurt (since setup_work_tree() protects itself against
 multiple invocations) but isn't semantically clean. If I understand
 correctly, I think a better approach would be to move the
 setup_work_tree() call to worktree.c just before it invokes
 git-checkout, and revert 3473ad0 entirely (including this bit):

 - { checkout, cmd_checkout, RUN_SETUP | NEED_WORK_TREE },
 +{ checkout, cmd_checkout, RUN_SETUP },

 so that git-checkout once again requires a worktree.

 I mis-stated that a bit. The bit about multiple invocations isn't
 relevant. The point is that I think that 3473ad0 can simply be
 reverted as long as worktree.c calls setup_work_tree() before invoking
 git-checkout.

Please ignore my idiocy. Of course worktree.c can't call
setup_work_tree() on behalf of the sub git-checkout invocation.
Reverting 3473ad0 is the correct thing to do with the introduction of
worktree add since it removes the special case of having to be able
to run git-checkout without a worktree.
--
To unsubscribe from this list: send the line unsubscribe git in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [RFC/PATCH] worktree: replace checkout --to with worktree new

2015-07-02 Thread Eric Sunshine
On Wed, Jul 1, 2015 at 10:52 PM, Eric Sunshine sunsh...@sunshineco.com wrote:
 However, there are still a few bits of
 code which want to know that the checkout is happening in a new
 worktree. I haven't examined them closely yet to diagnose if this
 specialized knowledge can be eliminated. Perhaps you can weight in. In
 particular:

 checkout_paths:
 if (opts-new_worktree)
 die(_('%s' cannot be used with updating paths), --to);

 merge_working_tree:
 tree = parse_tree_indirect(old-commit 
 !opts-new_worktree_mode ?
 old-commit-object.sha1 :
 EMPTY_TREE_SHA1_BIN);

 switch_branches:
 if (!opts-quiet  !old.path  old.commit 
 new-commit != old.commit  !opts-new_worktree_mode)
 orphaned_commit_warning(old.commit, new-commit);

There's another instance: 3473ad0 (checkout: don't require a work tree
when checking out into a new one, 2014-11-30) added this:

if (!new_worktree)
setup_work_tree();

which the worktree add patch changed to:

setup_work_tree();

which doesn't hurt (since setup_work_tree() protects itself against
multiple invocations) but isn't semantically clean. If I understand
correctly, I think a better approach would be to move the
setup_work_tree() call to worktree.c just before it invokes
git-checkout, and revert 3473ad0 entirely (including this bit):

- { checkout, cmd_checkout, RUN_SETUP | NEED_WORK_TREE },
+{ checkout, cmd_checkout, RUN_SETUP },

so that git-checkout once again requires a worktree.
--
To unsubscribe from this list: send the line unsubscribe git in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [RFC/PATCH] worktree: replace checkout --to with worktree new

2015-07-02 Thread Eric Sunshine
On Thu, Jul 2, 2015 at 2:45 PM, Eric Sunshine sunsh...@sunshineco.com wrote:
 There's another instance: 3473ad0 (checkout: don't require a work tree
 when checking out into a new one, 2014-11-30) added this:

 if (!new_worktree)
 setup_work_tree();

 which the worktree add patch changed to:

 setup_work_tree();

 which doesn't hurt (since setup_work_tree() protects itself against
 multiple invocations) but isn't semantically clean. If I understand
 correctly, I think a better approach would be to move the
 setup_work_tree() call to worktree.c just before it invokes
 git-checkout, and revert 3473ad0 entirely (including this bit):

 - { checkout, cmd_checkout, RUN_SETUP | NEED_WORK_TREE },
 +{ checkout, cmd_checkout, RUN_SETUP },

 so that git-checkout once again requires a worktree.

I mis-stated that a bit. The bit about multiple invocations isn't
relevant. The point is that I think that 3473ad0 can simply be
reverted as long as worktree.c calls setup_work_tree() before invoking
git-checkout.
--
To unsubscribe from this list: send the line unsubscribe git in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [RFC/PATCH] worktree: replace checkout --to with worktree new

2015-07-02 Thread Duy Nguyen
On Fri, Jul 3, 2015 at 12:06 AM, Eric Sunshine sunsh...@sunshineco.com wrote:
 Unless we want to borrow fancy checkout options for git worktree
 add, we probably should just export checkout() function from clone.c
 and use it instead of git checkout. Much more lightweight and
 simpler (it's one-way merge). Then we can revert checkout.c to the
 version before --to.

 Interesting idea, but doesn't this lose the ability to create a new
 branch (worktree add foo -b bar) and other useful options like
 --track?

Those are what I call fancy checkout options. I think we could start
simple with clone.c:checkout.c() and maybe libify switch_branches()
later on to gain --detach and stuff. There's another thing I missed,
when the new worktree is set up, HEAD contains a dummy value. It's
expected that the second checkout will update it with proper value (a
ref, detached HEAD). So if you avoid running git chckout in
worktree add and use clone.c:checkout(), you have to re-do something
similar.
-- 
Duy
--
To unsubscribe from this list: send the line unsubscribe git in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [RFC/PATCH] worktree: replace checkout --to with worktree new

2015-07-01 Thread Junio C Hamano
Eric Sunshine sunsh...@sunshineco.com writes:

 On Wed, Jul 1, 2015 at 1:13 PM, Eric Sunshine sunsh...@sunshineco.com wrote:
 On Wed, Jul 1, 2015 at 12:53 PM, Junio C Hamano gits...@pobox.com wrote:
  * Duy seems to think worktree add is coming, too, so here is a
trivial tweak of your patch from the last month, with test
adjustments to 7410 I sent earlier squashed in.

 Thanks. I was planning on re-rolling to use the new name (add rather
 than new) and to squash in the t7410 fix. Plus, I think the changes
 I had to make to prepare_linked_checkout() in order to move it to
 worktree.c should become separate preparatory patches so that the
 actual relocation can become pure code movement (as much as possible).

 Also, I was planning on including Duy's patch in the re-roll since it
 missed a s/prune --worktrees/worktree prune/ in
 Documentation/git-checkout.txt.

 Hmm, I see that Duy's patch is already in 'next'. Would it be better
 if I fixed the 's/prune --worktrees/worktree prune/' git-checkout.txt
 oversight via an incremental patch rather than including a corrected
 version of his patch with my re-roll?

I may have mistaken what you said; I thought you were planning an
incremental for the existing part, with a more complete reroll of
worktree add than what I sent today, as separate patches.

Thanks.

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


Re: [RFC/PATCH] worktree: replace checkout --to with worktree new

2015-07-01 Thread Junio C Hamano
From: Eric Sunshine sunsh...@sunshineco.com

The command git checkout --to path is something of an anachronism,
encompassing functionality somewhere between checkout and clone.
The introduction of the git-worktree command, however, provides a proper
and intuitive place to house such functionality. Consequently,
re-implement git checkout --to as git worktree add.

As a side-effect, linked worktree creation becomes much more
discoverable with its own dedicated command, whereas `--to` was easily
overlooked amid the plethora of options recognized by git-checkout.

Signed-off-by: Eric Sunshine sunsh...@sunshineco.com
Signed-off-by: Junio C Hamano gits...@pobox.com
---

 * Duy seems to think worktree add is coming, too, so here is a
   trivial tweak of your patch from the last month, with test
   adjustments to 7410 I sent earlier squashed in.

   I noticed GIT_CHECKOUT_NEW_WORKTREE environment variabl that does
   not seem to be documented.  Is this something we still need?

   The log message of 529fef20 (checkout: support checking out into
   a new working directory, 2014-11-30) does not tell us much.

 Documentation/git-checkout.txt|  72 -
 Documentation/git-worktree.txt|  79 ++-
 builtin/checkout.c| 152 +---
 builtin/worktree.c| 157 ++
 t/t2025-checkout-to.sh| 137 -
 t/t2025-worktree-add.sh   | 137 +
 t/t2026-prune-linked-checkouts.sh |   2 +-
 t/t7410-submodule-checkout-to.sh  |   4 +-
 8 files changed, 377 insertions(+), 363 deletions(-)
 delete mode 100755 t/t2025-checkout-to.sh
 create mode 100755 t/t2025-worktree-add.sh

diff --git a/Documentation/git-checkout.txt b/Documentation/git-checkout.txt
index 72def5b..efe6a02 100644
--- a/Documentation/git-checkout.txt
+++ b/Documentation/git-checkout.txt
@@ -225,13 +225,6 @@ This means that you can use `git checkout -p` to 
selectively discard
 edits from your current working tree. See the ``Interactive Mode''
 section of linkgit:git-add[1] to learn how to operate the `--patch` mode.
 
---to=path::
-   Check out a branch in a separate working directory at
-   `path`. A new working directory is linked to the current
-   repository, sharing everything except working directory
-   specific files such as HEAD, index... See MULTIPLE WORKING
-   TREES section for more information.
-
 --ignore-other-worktrees::
`git checkout` refuses when the wanted ref is already checked
out by another worktree. This option makes it check the ref
@@ -401,71 +394,6 @@ $ git reflog -2 HEAD # or
 $ git log -g -2 HEAD
 
 
-MULTIPLE WORKING TREES
---
-
-A git repository can support multiple working trees, allowing you to check
-out more than one branch at a time.  With `git checkout --to` a new working
-tree is associated with the repository.  This new working tree is called a
-linked working tree as opposed to the main working tree prepared by git
-init or git clone.  A repository has one main working tree (if it's not a
-bare repository) and zero or more linked working trees.
-
-Each linked working tree has a private sub-directory in the repository's
-$GIT_DIR/worktrees directory.  The private sub-directory's name is usually
-the base name of the linked working tree's path, possibly appended with a
-number to make it unique.  For example, when `$GIT_DIR=/path/main/.git` the
-command `git checkout --to /path/other/test-next next` creates the linked
-working tree in `/path/other/test-next` and also creates a
-`$GIT_DIR/worktrees/test-next` directory (or `$GIT_DIR/worktrees/test-next1`
-if `test-next` is already taken).
-
-Within a linked working tree, $GIT_DIR is set to point to this private
-directory (e.g. `/path/main/.git/worktrees/test-next` in the example) and
-$GIT_COMMON_DIR is set to point back to the main working tree's $GIT_DIR
-(e.g. `/path/main/.git`). These settings are made in a `.git` file located at
-the top directory of the linked working tree.
-
-Path resolution via `git rev-parse --git-path` uses either
-$GIT_DIR or $GIT_COMMON_DIR depending on the path. For example, in the
-linked working tree `git rev-parse --git-path HEAD` returns
-`/path/main/.git/worktrees/test-next/HEAD` (not
-`/path/other/test-next/.git/HEAD` or `/path/main/.git/HEAD`) while `git
-rev-parse --git-path refs/heads/master` uses
-$GIT_COMMON_DIR and returns `/path/main/.git/refs/heads/master`,
-since refs are shared across all working trees.
-
-See linkgit:gitrepository-layout[5] for more information. The rule of
-thumb is do not make any assumption about whether a path belongs to
-$GIT_DIR or $GIT_COMMON_DIR when you need to directly access something
-inside $GIT_DIR. Use `git rev-parse --git-path` to get the final path.
-
-When you are done with a linked working tree you can simply delete it.
-The working 

Re: [RFC/PATCH] worktree: replace checkout --to with worktree new

2015-07-01 Thread Eric Sunshine
On Wed, Jul 1, 2015 at 1:13 PM, Eric Sunshine sunsh...@sunshineco.com wrote:
 On Wed, Jul 1, 2015 at 12:53 PM, Junio C Hamano gits...@pobox.com wrote:
  * Duy seems to think worktree add is coming, too, so here is a
trivial tweak of your patch from the last month, with test
adjustments to 7410 I sent earlier squashed in.

 Thanks. I was planning on re-rolling to use the new name (add rather
 than new) and to squash in the t7410 fix. Plus, I think the changes
 I had to make to prepare_linked_checkout() in order to move it to
 worktree.c should become separate preparatory patches so that the
 actual relocation can become pure code movement (as much as possible).

 Also, I was planning on including Duy's patch in the re-roll since it
 missed a s/prune --worktrees/worktree prune/ in
 Documentation/git-checkout.txt.

Hmm, I see that Duy's patch is already in 'next'. Would it be better
if I fixed the 's/prune --worktrees/worktree prune/' git-checkout.txt
oversight via an incremental patch rather than including a corrected
version of his patch with my re-roll?
--
To unsubscribe from this list: send the line unsubscribe git in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [RFC/PATCH] worktree: replace checkout --to with worktree new

2015-07-01 Thread Duy Nguyen
On Tue, Jun 30, 2015 at 11:33 PM, Junio C Hamano gits...@pobox.com wrote:
 Duy Nguyen pclo...@gmail.com writes:

 I think this is like git checkout -b vs git branch. We pack so
 many things in 'checkout' that it's a source of both convenience and
 confusion. I never use git branch to create a new branch and if I
 had a way to tell checkout to move away and delete previous branch,
 I would probably stop using git branch -d/-D too. --to is another
 -b in this sense.

 I didn't know checkout --to included create a worktree elsewhere
 and chdir there; if that and chdir there is not something you are
 doing, then I do not think checkout -b vs branch analogy applies.

Heh.. I do want that chdir (even for git-init and git-clone). We
can't issue cd command back to the parent shell, but we can spawn a
new shell with new cwd. But because the target dir is usually at the
end of the command line (except for --to) and cd !$ is not much to
type, it never bothers me enough to do something more. I think this is
another reason I prefer git worktree add to have the target dir at
the end.
-- 
Duy
--
To unsubscribe from this list: send the line unsubscribe git in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [RFC/PATCH] worktree: replace checkout --to with worktree new

2015-07-01 Thread Eric Sunshine
On Wed, Jul 1, 2015 at 9:07 PM, Duy Nguyen pclo...@gmail.com wrote:
 On Thu, Jul 2, 2015 at 12:13 AM, Eric Sunshine sunsh...@sunshineco.com 
 wrote:
I noticed GIT_CHECKOUT_NEW_WORKTREE environment variabl that does
not seem to be documented.  Is this something we still need?
The log message of 529fef20 (checkout: support checking out into
a new working directory, 2014-11-30) does not tell us much.

 Yes, it's still used for the same purpose as before the conversion: as
 a private signal to the sub git-checkout invocation that it's
 operating on a new worktree. When defined, it sets the
 'new_worktree_mode' flag in checkout.c, and there are still a few bits
 of code which apparently need to know about it. It would be nice to
 eliminate this special knowledge from checkout.c, however, I'm not yet
 familiar enough with the checkout code to determine if doing so is
 viable.

 I think it can go away. When --to is used, I have to re-execute git
 checkout command again after creating the new worktree. I could
 process the command line arguments from the first execution, delete
 --to, then use the remaining options to run checkout the second
 time. But I chose to pass the entire command line to the second
 execution. The env is used to let the second run know it should ignore
 --to (or we get infinite recursion). With git worktree add this
 recursion disappears and this env var has no reason to exist.

The recursion protection is indeed no longer needed and gets removed
by the worktree add patch. However, there are still a few bits of
code which want to know that the checkout is happening in a new
worktree. I haven't examined them closely yet to diagnose if this
specialized knowledge can be eliminated. Perhaps you can weight in. In
particular:

checkout_paths:
if (opts-new_worktree)
die(_('%s' cannot be used with updating paths), --to);

merge_working_tree:
tree = parse_tree_indirect(old-commit 
!opts-new_worktree_mode ?
old-commit-object.sha1 :
EMPTY_TREE_SHA1_BIN);

switch_branches:
if (!opts-quiet  !old.path  old.commit 
new-commit != old.commit  !opts-new_worktree_mode)
orphaned_commit_warning(old.commit, new-commit);
--
To unsubscribe from this list: send the line unsubscribe git in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [RFC/PATCH] worktree: replace checkout --to with worktree new

2015-07-01 Thread Eric Sunshine
On Tue, Jun 30, 2015 at 6:02 PM, Eric Sunshine sunsh...@sunshineco.com wrote:
 On Tue, Jun 30, 2015 at 5:23 AM, Duy Nguyen pclo...@gmail.com wrote:
 On Tue, Jun 30, 2015 at 11:56 AM, Eric Sunshine sunsh...@sunshineco.com 
 wrote:
 The command git checkout --to path is something of an anachronism,
 encompassing functionality somewhere between checkout and clone.
 The introduction of the git-worktree command, however, provides a proper
 and intuitive place to house such functionality. Consequently,
 re-implement git checkout --to as git worktree new.

 git worktree new definitely makes sense (maybe stick with verbs like
 create, I'm not sure if we have some convention in existing
 commands), but should we remove git checkout --to? I could do git
 co -b foo --to bar for example.

 You can still do that with git worktree new bar -b foo, which is
 effectively the same as git checkout --to bar -b foo (with
 s/checkout/worktree/ and s/--to/new/ applied), though perhaps you
 don't find it as obvious or natural.

I had never understood why you chose to plug the linked-worktree
functionality into git-checkout via --to, but this usage pattern
(creating a new branch and checking it out into a new worktree as one
operation) goes a long way toward explaining why you consider
git-checkout a proper home for linked-worktree creation. I don't think
that justification was ever mentioned when the series was being
presented (or, if it was, I must have missed it). Now it makes much
more sense, and I can better appreciate your desire to keep git
checkout --to as an alias for git worktree add. Thanks for
explaining it.

(Having said that, replacing git checkout --to with git worktree
add still seems a preferable first step, while keeping open the door
to re-add git checkout --to later if we become convinced that it's
worthwhile.)
--
To unsubscribe from this list: send the line unsubscribe git in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [RFC/PATCH] worktree: replace checkout --to with worktree new

2015-07-01 Thread Duy Nguyen
On Thu, Jul 2, 2015 at 12:13 AM, Eric Sunshine sunsh...@sunshineco.com wrote:
I noticed GIT_CHECKOUT_NEW_WORKTREE environment variabl that does
not seem to be documented.  Is this something we still need?
The log message of 529fef20 (checkout: support checking out into
a new working directory, 2014-11-30) does not tell us much.

 Yes, it's still used for the same purpose as before the conversion: as
 a private signal to the sub git-checkout invocation that it's
 operating on a new worktree. When defined, it sets the
 'new_worktree_mode' flag in checkout.c, and there are still a few bits
 of code which apparently need to know about it. It would be nice to
 eliminate this special knowledge from checkout.c, however, I'm not yet
 familiar enough with the checkout code to determine if doing so is
 viable.

I think it can go away. When --to is used, I have to re-execute git
checkout command again after creating the new worktree. I could
process the command line arguments from the first execution, delete
--to, then use the remaining options to run checkout the second
time. But I chose to pass the entire command line to the second
execution. The env is used to let the second run know it should ignore
--to (or we get infinite recursion). With git worktree add this
recursion disappears and this env var has no reason to exist.
-- 
Duy
--
To unsubscribe from this list: send the line unsubscribe git in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [RFC/PATCH] worktree: replace checkout --to with worktree new

2015-06-30 Thread Mikael Magnusson
On Wed, Jul 1, 2015 at 12:27 AM, Junio C Hamano gits...@pobox.com wrote:
 Eric Sunshine sunsh...@sunshineco.com writes:

 On Tue, Jun 30, 2015 at 12:56 AM, Eric Sunshine sunsh...@sunshineco.com 
 wrote
 Speaking of git worktree new --force, should we revisit git
 checkout --ignore-other-worktrees before it gets set in stone? In
 particular, I'm wondering if it makes sense to overload git-checkout's
 existing --force option to encompass the functionality of
 --ignore-other-worktrees as well. I don't think there would be any
 semantic conflict by overloading --force, and I do think that --force
 is more discoverable and more intuitive.

 git checkout -f is to throw-away local changes, which is a very
 sensible thing to do and I can see why that would be useful, but
 does --ignore-other-worktrees have the same kind of common-ness?

 It primarily is a safety measure, and if the user wants to jump
 around freely to different commits in multiple worktrees, a more
 sensible thing to do so without getting the nono, you have that
 branch checked out elsewhere is to detach HEADs in the non-primary
 worktrees that may want to have the same commit checked out as the
 current branch of the primary worktree.

 I would mildly object to make --ignore-other-worktrees more
 discoverable and moderately object to make that feature more
 accessible by overloading it into --force.  I personally would not
 mind if we removed --ignore-other-worktrees, but that might be
 going too far ;-)

This probably falls under not common, but one of my uses for git
new-workdir is to check out the current branch in another directory,
rebase it to upstream, delete that worktree, and then git reset --hard
in the original checkout. The result is a rebased branch that touches
a minimum of source files so the rebuild is faster. (In some projects
I have a lot of local commits that get rebased, but maybe upstream
only touched a single .c file).

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


Re: [RFC/PATCH] worktree: replace checkout --to with worktree new

2015-06-30 Thread Junio C Hamano
Eric Sunshine sunsh...@sunshineco.com writes:

 * t2025-checkout-to.sh became t2025-worktree-new.sh. I'm not sure if the
   test number still makes sense or if it should be changed, however, it
   resides alongside its t2026-prune-linked-checkouts.sh counterpart.

You'd need to adjust t7410 as well, perhaps like so:

diff --git a/t/t7410-submodule-checkout-to.sh b/t/t7410-submodule-checkout-to.sh
index 8f30aed..d037e51 100755
--- a/t/t7410-submodule-checkout-to.sh
+++ b/t/t7410-submodule-checkout-to.sh
@@ -33,7 +33,7 @@ rev1_hash_sub=$(git --git-dir=origin/sub/.git show 
--pretty=format:%h -q HEAD~1
 test_expect_success 'checkout main' \
 'mkdir default_checkout 
 (cd clone/main 
-   git checkout --to $base_path/default_checkout/main $rev1_hash_main)'
+   git worktree new $base_path/default_checkout/main $rev1_hash_main)'
 
 test_expect_failure 'can see submodule diffs just after checkout' \
 '(cd default_checkout/main  git diff --submodule master^! | grep 
file1 updated)'
@@ -41,7 +41,7 @@ test_expect_failure 'can see submodule diffs just after 
checkout' \
 test_expect_success 'checkout main and initialize independed clones' \
 'mkdir fully_cloned_submodule 
 (cd clone/main 
-   git checkout --to $base_path/fully_cloned_submodule/main 
$rev1_hash_main) 
+   git worktree new $base_path/fully_cloned_submodule/main 
$rev1_hash_main) 
 (cd fully_cloned_submodule/main  git submodule update)'
 
 test_expect_success 'can see submodule diffs after independed cloning' \
--
To unsubscribe from this list: send the line unsubscribe git in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [RFC/PATCH] worktree: replace checkout --to with worktree new

2015-06-30 Thread Junio C Hamano
Duy Nguyen pclo...@gmail.com writes:

 I think this is like git checkout -b vs git branch. We pack so
 many things in 'checkout' that it's a source of both convenience and
 confusion. I never use git branch to create a new branch and if I
 had a way to tell checkout to move away and delete previous branch,
 I would probably stop using git branch -d/-D too. --to is another
 -b in this sense.

I didn't know checkout --to included create a worktree elsewhere
and chdir there; if that and chdir there is not something you are
doing, then I do not think checkout -b vs branch analogy applies.

 git worktree new definitely makes sense (maybe stick with verbs like
 create, I'm not sure if we have some convention in existing
 commands), but should we remove git checkout --to?

I'm in favor of removing --to before it escapes the lab.

I am ambivalent about new, but that is only because I know about
the 'new-workdir' in contrib/.  If I pretend to be a naive end user,
I'd think a verb subcommand would be more in line with the rest of
the system than new.

I however do not think create is a good verb.

Wouldn't git worktree $the-command-in-question be a management
command that adds a new worktree to the existing collection, like
remote add, notes add, etc. do?  Perhaps git worktree list and
git worktree remove $that_one would be in its future?

That suggests add may be a better choice for worktree.

The only subcommand that I can think of offhand that says create
is bundle; after generates a new bundle, its presence is not known
to the repository the bundle was created out of, so not using add
but calling the operation create is fine for bundle.
--
To unsubscribe from this list: send the line unsubscribe git in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [RFC/PATCH] worktree: replace checkout --to with worktree new

2015-06-30 Thread Duy Nguyen
On Tue, Jun 30, 2015 at 11:56 AM, Eric Sunshine sunsh...@sunshineco.com wrote:
 The command git checkout --to path is something of an anachronism,
 encompassing functionality somewhere between checkout and clone.
 The introduction of the git-worktree command, however, provides a proper
 and intuitive place to house such functionality. Consequently,
 re-implement git checkout --to as git worktree new.

 As a side-effect, linked worktree creation becomes much more
 discoverable with its own dedicated command, whereas `--to` was easily
 overlooked amid the plethora of options recognized by git-checkout.

 Signed-off-by: Eric Sunshine sunsh...@sunshineco.com
 ---

 I've long felt that Duy's linked-worktree functionality was a bit oddly
 named as git checkout --to, but, since I could never come up with a
 better name, I never made mention of it. However, with Duy's
 introduction of the git-worktree command[1], we now have a much more
 appropriate and discoverable place to house the git checkout --to
 functionality, and upon seeing his patch, I was ready to reply with the
 suggestion to relocate git checkout --to to git worktree new,
 however, Junio beat me to it[2].

Didn't know you guys were so eager to move this code around :D Jokes
aside, it's good that it's raised now before --to is set in stone.

I think this is like git checkout -b vs git branch. We pack so
many things in 'checkout' that it's a source of both convenience and
confusion. I never use git branch to create a new branch and if I
had a way to tell checkout to move away and delete previous branch,
I would probably stop using git branch -d/-D too. --to is another
-b in this sense.

git worktree new definitely makes sense (maybe stick with verbs like
create, I'm not sure if we have some convention in existing
commands), but should we remove git checkout --to? I could do git
co -b foo --to bar for example. Maybe --to is not used that often
that git worktree new would feel less convenient as a replacement.
If we are not sure about --to (I'm not), I think we just remove it
now because we can always add it back later.

 diff --git a/Documentation/git-worktree.txt b/Documentation/git-worktree.txt
 index 41103e5..8f13281 100644
 --- a/Documentation/git-worktree.txt
 +++ b/Documentation/git-worktree.txt
 @@ -9,16 +9,85 @@ git-worktree - Manage multiple worktrees
  SYNOPSIS
  
  [verse]
 +'git worktree new' [-f] path [checkout-options] branch

Should we follow clone syntax and put the path (as destination)
after branch (source)? Maybe not, because in the clone case,
explicit destination is optional, not like this.. Or.. maybe branch
could be optional in this case. 'git worktree new' without a branch
will create a new branch, named closely after the destination.
Existing branch can be specified via an option..
-- 
Duy
--
To unsubscribe from this list: send the line unsubscribe git in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [RFC/PATCH] worktree: replace checkout --to with worktree new

2015-06-30 Thread Eric Sunshine
On Tue, Jun 30, 2015 at 12:56 AM, Eric Sunshine sunsh...@sunshineco.com wrote:
 The command git checkout --to path is something of an anachronism,
 encompassing functionality somewhere between checkout and clone.
 The introduction of the git-worktree command, however, provides a proper
 and intuitive place to house such functionality. Consequently,
 re-implement git checkout --to as git worktree new.
 [...]
 Signed-off-by: Eric Sunshine sunsh...@sunshineco.com
 ---
 This is primarily a code and documentation relocation patch, with minor
 new code added to builtin/worktree.c. Specifically:

 * builtin/worktree.c:new() is new. It recognizes a --force option (git
   worktree new --force path branch) which allows a branch to be
   checked out in a new worktree even if already checked out in some
   other worktree (thus, mirroring the functionality of git checkout
   --ignore-other-worktrees).

Speaking of git worktree new --force, should we revisit git
checkout --ignore-other-worktrees before it gets set in stone? In
particular, I'm wondering if it makes sense to overload git-checkout's
existing --force option to encompass the functionality of
--ignore-other-worktrees as well. I don't think there would be any
semantic conflict by overloading --force, and I do think that --force
is more discoverable and more intuitive.
--
To unsubscribe from this list: send the line unsubscribe git in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [RFC/PATCH] worktree: replace checkout --to with worktree new

2015-06-30 Thread Junio C Hamano
Eric Sunshine sunsh...@sunshineco.com writes:

 On Tue, Jun 30, 2015 at 12:56 AM, Eric Sunshine sunsh...@sunshineco.com 
 wrote
 Speaking of git worktree new --force, should we revisit git
 checkout --ignore-other-worktrees before it gets set in stone? In
 particular, I'm wondering if it makes sense to overload git-checkout's
 existing --force option to encompass the functionality of
 --ignore-other-worktrees as well. I don't think there would be any
 semantic conflict by overloading --force, and I do think that --force
 is more discoverable and more intuitive.

git checkout -f is to throw-away local changes, which is a very
sensible thing to do and I can see why that would be useful, but
does --ignore-other-worktrees have the same kind of common-ness?

It primarily is a safety measure, and if the user wants to jump
around freely to different commits in multiple worktrees, a more
sensible thing to do so without getting the nono, you have that
branch checked out elsewhere is to detach HEADs in the non-primary
worktrees that may want to have the same commit checked out as the
current branch of the primary worktree.

I would mildly object to make --ignore-other-worktrees more
discoverable and moderately object to make that feature more
accessible by overloading it into --force.  I personally would not
mind if we removed --ignore-other-worktrees, but that might be
going too far ;-)
--
To unsubscribe from this list: send the line unsubscribe git in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [RFC/PATCH] worktree: replace checkout --to with worktree new

2015-06-30 Thread Eric Sunshine
On Tue, Jun 30, 2015 at 5:23 AM, Duy Nguyen pclo...@gmail.com wrote:
 On Tue, Jun 30, 2015 at 11:56 AM, Eric Sunshine sunsh...@sunshineco.com 
 wrote:
 The command git checkout --to path is something of an anachronism,
 encompassing functionality somewhere between checkout and clone.
 The introduction of the git-worktree command, however, provides a proper
 and intuitive place to house such functionality. Consequently,
 re-implement git checkout --to as git worktree new.

 I think this is like git checkout -b vs git branch. We pack so
 many things in 'checkout' that it's a source of both convenience and
 confusion. I never use git branch to create a new branch [...]
  --to is another -b in this sense.

I too always use git checkout -b, but, like Junio, I don't think
this is an apt analogy. git checkout -b is shorthand for two
commands git branch and git checkout, whereas git checkout --to
is not.

 git worktree new definitely makes sense (maybe stick with verbs like
 create, I'm not sure if we have some convention in existing
 commands), but should we remove git checkout --to? I could do git
 co -b foo --to bar for example.

You can still do that with git worktree new bar -b foo, which is
effectively the same as git checkout --to bar -b foo (with
s/checkout/worktree/ and s/--to/new/ applied), though perhaps you
don't find it as obvious or natural.

 If we are not sure about --to (I'm not), I think we just remove it
 now because we can always add it back later.

I'm not excited about keeping git checkout --to as an alias for git
worktree new, however, removing it now should not harm us since, as
you say, it can be added back later if needed.

  SYNOPSIS
  
 +'git worktree new' [-f] path [checkout-options] branch

 Should we follow clone syntax and put the path (as destination)
 after branch (source)? Maybe not, because in the clone case,
 explicit destination is optional, not like this.. Or.. maybe branch
 could be optional in this case. 'git worktree new' without a branch
 will create a new branch, named closely after the destination.
 Existing branch can be specified via an option..

I'm not wedded to this particular argument order, though it does have
the advantage that it's clear which options belong to worktree new
and which to checkout.

As for making branch optional and auto-vivifying a new branch named
after path, that's something we can consider later (I think).
--
To unsubscribe from this list: send the line unsubscribe git in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [RFC/PATCH] worktree: replace checkout --to with worktree new

2015-06-30 Thread Mark Levedahl

On 06/30/2015 06:11 PM, Eric Sunshine wrote:

On Tue, Jun 30, 2015 at 12:56 AM, Eric Sunshine sunsh...@sunshineco.com wrote:

The command git checkout --to path is something of an anachronism,
encompassing functionality somewhere between checkout and clone.
The introduction of the git-worktree command, however, provides a proper
and intuitive place to house such functionality. Consequently,
re-implement git checkout --to as git worktree new.
[...]
Signed-off-by: Eric Sunshine sunsh...@sunshineco.com
---
This is primarily a code and documentation relocation patch, with minor
new code added to builtin/worktree.c. Specifically:

* builtin/worktree.c:new() is new. It recognizes a --force option (git
   worktree new --force path branch) which allows a branch to be
   checked out in a new worktree even if already checked out in some
   other worktree (thus, mirroring the functionality of git checkout
   --ignore-other-worktrees).


Speaking of git worktree new --force, should we revisit git
checkout --ignore-other-worktrees before it gets set in stone? In
particular, I'm wondering if it makes sense to overload git-checkout's
existing --force option to encompass the functionality of
--ignore-other-worktrees as well. I don't think there would be any
semantic conflict by overloading --force, and I do think that --force
is more discoverable and more intuitive.



I agree with -f subsuming --ignore...:  -f/--force should really mean 
do this if at all possible, not just ignore some checks. Similar to 
rm -f, etc.


Maintaining --ignore-other-worktrees, and making that a configurable 
option (worktree.ignoreothers??) would allow selectively ignoring just 
this one issue, perhaps permanently, but not the others -f already 
overrides. This would make sense if other options were added to ignore 
other subsets of checks that can block a checkout, probably not otherwise.



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


[RFC/PATCH] worktree: replace checkout --to with worktree new

2015-06-29 Thread Eric Sunshine
The command git checkout --to path is something of an anachronism,
encompassing functionality somewhere between checkout and clone.
The introduction of the git-worktree command, however, provides a proper
and intuitive place to house such functionality. Consequently,
re-implement git checkout --to as git worktree new.

As a side-effect, linked worktree creation becomes much more
discoverable with its own dedicated command, whereas `--to` was easily
overlooked amid the plethora of options recognized by git-checkout.

Signed-off-by: Eric Sunshine sunsh...@sunshineco.com
---

I've long felt that Duy's linked-worktree functionality was a bit oddly
named as git checkout --to, but, since I could never come up with a
better name, I never made mention of it. However, with Duy's
introduction of the git-worktree command[1], we now have a much more
appropriate and discoverable place to house the git checkout --to
functionality, and upon seeing his patch, I was ready to reply with the
suggestion to relocate git checkout --to to git worktree new,
however, Junio beat me to it[2]. So, in response, this patch does
exactly that. It applies atop [1].

This is primarily a code and documentation relocation patch, with minor
new code added to builtin/worktree.c. Specifically:

* git-checkout.txt:--to description moved to git-worktree.txt:new.

* git-checkout.txt:MULTIPLE WORKING TREES moved to
  git-worktree.txt:DESCRIPTION, with checkout --to replaced by
  worktree new as necessary. git-worktree.txt could probably use a bit
  of reorganization, but that can be done as a separate patch.

* builtin/checkout.c:remove_junk() and remove_junk_on_signal() moved
  verbatim to builtin/worktree.c.

* builtin/checkout.c:prepare_linked_checkout() moved to
  builtin/worktree.c:new_worktree() nearly verbatim. The following small
  changes were needed (which might possibly be better done as separate
  preparatory patches):

  - The no branch specified check was dropped since git-worktree lacks
the machinery for parsing git-checkout command-line arguments, and
thus simply doesn't know if a branch/ref was provided, or in what
form.  I'm not sure yet how to replace this check.

  - checkout.c:prepare_linked_checkout() (temporarily) fakes up a HEAD
ref with a valid object-id in the new worktree to pacify
is_git_directory(). It does so using the branch/ref from the
command-line which it already resolved. worktree.c, however, doesn't
have access to this information, so I instead added code to resolve
and use HEAD for the fakement.

  - The Enter %s (identifier %s) message is suppressed in checkout.c
if --quiet is specified, however, worktree.c does not have a --quiet
option, so the message is printed unconditionally.

  - argv[] for the sub git-checkout invocation is hand-crafted in
worktree.c rather than merely being re-used from the original git
checkout --to as it was in checkout.c.

* builtin/worktree.c:new() is new. It recognizes a --force option (git
  worktree new --force path branch) which allows a branch to be
  checked out in a new worktree even if already checked out in some
  other worktree (thus, mirroring the functionality of git checkout
  --ignore-other-worktrees).

* t2025-checkout-to.sh became t2025-worktree-new.sh. I'm not sure if the
  test number still makes sense or if it should be changed, however, it
  resides alongside its t2026-prune-linked-checkouts.sh counterpart.

[1]: 
http://git.661346.n2.nabble.com/PATCH-worktree-new-place-for-git-prune-worktrees-tp7634619.html
[2]: 
http://git.661346.n2.nabble.com/PATCH-worktree-new-place-for-git-prune-worktrees-tp7634619p7634638.html


 Documentation/git-checkout.txt|  72 --
 Documentation/git-worktree.txt|  79 ++-
 builtin/checkout.c| 152 +
 builtin/worktree.c| 157 ++
 t/{t2025-checkout-to.sh = t2025-worktree-new.sh} |  44 +++---
 t/t2026-prune-linked-checkouts.sh |   2 +-
 6 files changed, 260 insertions(+), 246 deletions(-)
 rename t/{t2025-checkout-to.sh = t2025-worktree-new.sh} (56%)

diff --git a/Documentation/git-checkout.txt b/Documentation/git-checkout.txt
index d263a56..e19f03a 100644
--- a/Documentation/git-checkout.txt
+++ b/Documentation/git-checkout.txt
@@ -225,13 +225,6 @@ This means that you can use `git checkout -p` to 
selectively discard
 edits from your current working tree. See the ``Interactive Mode''
 section of linkgit:git-add[1] to learn how to operate the `--patch` mode.
 
---to=path::
-   Check out a branch in a separate working directory at
-   `path`. A new working directory is linked to the current
-   repository, sharing everything except working directory
-   specific files such as HEAD, index... See MULTIPLE WORKING
-   TREES section for more information.
-
 --ignore-other-worktrees::
`git checkout`