Re: [PATCH v2 13/23] worktree: introduce add command

2015-07-06 Thread Duy Nguyen
On Sat, Jul 4, 2015 at 3:54 PM, Eric Sunshine sunsh...@sunshineco.com wrote:
 On Fri, Jul 3, 2015 at 10:53 PM, Duy Nguyen pclo...@gmail.com wrote:
 On Sat, Jul 4, 2015 at 7:17 AM, Eric Sunshine sunsh...@sunshineco.com 
 wrote:
  COMMANDS
  
 +add path branch::
 +
 +Check out `branch` into a separate working directory, `path`, creating
 +`path` if necessary. The new working directory is linked to the current
 +repository, sharing everything except working directory specific files
 +such as HEAD, index, etc. If `path` already exists, it must be empty.

 Side note, must be empty is an implementation limitation. I think
 the two-way merge employed by git-checkout can deal with dirty path
 and only perform the checkout if there is no data loss. But we can
 leave this for later.

 Perhaps we should omit the bit about an existing but empty directory
 for now? Like this:

 Create `path` and checkout `branch` into it. The new working
 directory is linked to the current repository, sharing everything
 except working directory specific files such as HEAD, index, etc.

I think either way is ok.
-- 
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: [PATCH v2 13/23] worktree: introduce add command

2015-07-05 Thread Eric Sunshine
On Fri, Jul 3, 2015 at 10:53 PM, Duy Nguyen pclo...@gmail.com wrote:
 On Sat, Jul 4, 2015 at 7:17 AM, Eric Sunshine sunsh...@sunshineco.com wrote:
  COMMANDS
  
 +add path branch::
 +
 +Check out `branch` into a separate working directory, `path`, creating
 +`path` if necessary. The new working directory is linked to the current
 +repository, sharing everything except working directory specific files
 +such as HEAD, index, etc. If `path` already exists, it must be empty.

 Side note, must be empty is an implementation limitation. I think
 the two-way merge employed by git-checkout can deal with dirty path
 and only perform the checkout if there is no data loss. But we can
 leave this for later.

Perhaps we should omit the bit about an existing but empty directory
for now? Like this:

Create `path` and checkout `branch` into it. The new working
directory is linked to the current repository, sharing everything
except working directory specific files such as HEAD, index, etc.
--
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: [PATCH v2 13/23] worktree: introduce add command

2015-07-03 Thread Duy Nguyen
On Sat, Jul 4, 2015 at 7:17 AM, Eric Sunshine sunsh...@sunshineco.com wrote:
  COMMANDS
  
 +add path branch::
 +
 +Check out `branch` into a separate working directory, `path`, creating
 +`path` if necessary. The new working directory is linked to the current
 +repository, sharing everything except working directory specific files
 +such as HEAD, index, etc. If `path` already exists, it must be empty.

Side note, must be empty is an implementation limitation. I think
the two-way merge employed by git-checkout can deal with dirty path
and only perform the checkout if there is no data loss. But we can
leave this for later.
-- 
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


[PATCH v2 13/23] worktree: introduce add command

2015-07-03 Thread Eric Sunshine
The plan is to relocate git checkout --to functionality to git
worktree add. As a first step, introduce a bare-bones git-worktree
add command along with documentation. At this stage, git worktree
add merely invokes git checkout --to behind the scenes, but an
upcoming patch will move the actual functionality
(checkout.c:prepare_linked_checkout() and its helpers) to worktree.c.

Signed-off-by: Eric Sunshine sunsh...@sunshineco.com
---
 Documentation/git-worktree.txt | 21 +++--
 builtin/worktree.c | 32 
 2 files changed, 43 insertions(+), 10 deletions(-)

diff --git a/Documentation/git-worktree.txt b/Documentation/git-worktree.txt
index 028bbd9..59191f9 100644
--- a/Documentation/git-worktree.txt
+++ b/Documentation/git-worktree.txt
@@ -9,13 +9,13 @@ git-worktree - Manage multiple worktrees
 SYNOPSIS
 
 [verse]
+'git worktree add' path branch
 'git worktree prune' [-n] [-v] [--expire expire]
 
 DESCRIPTION
 ---
 
-Manage multiple worktrees attached to the same repository. These are
-created by the command `git checkout --to`.
+Manage multiple worktrees attached to the same repository.
 
 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
@@ -45,6 +45,13 @@ pruning should be suppressed. See section DETAILS for more 
information.
 
 COMMANDS
 
+add path branch::
+
+Check out `branch` into a separate working directory, `path`, creating
+`path` if necessary. The new working directory is linked to the current
+repository, sharing everything except working directory specific files
+such as HEAD, index, etc. If `path` already exists, it must be empty.
+
 prune::
 
 Prune working tree information in $GIT_DIR/worktrees.
@@ -118,7 +125,7 @@ refactoring session.
 
 
 $ git branch emergency-fix master
-$ git checkout --to ../temp emergency-fix
+$ git worktree add ../temp emergency-fix
 $ pushd ../temp
 # ... hack hack hack ...
 $ git commit -a -m 'emergency fix for boss'
@@ -133,20 +140,14 @@ Multiple checkout support for submodules is incomplete. 
It is NOT
 recommended to make multiple checkouts of a superproject.
 
 git-worktree could provide more automation for tasks currently
-performed manually or via other commands, such as:
+performed manually, such as:
 
-- `add` to create a new linked worktree
 - `remove` to remove a linked worktree and its administrative files (and
   warn if the worktree is dirty)
 - `mv` to move or rename a worktree and update its administrative files
 - `lock` to prevent automatic pruning of administrative files (for instance,
   for a worktree on a portable device)
 
-SEE ALSO
-
-
-linkgit:git-checkout[1]
-
 GIT
 ---
 Part of the linkgit:git[1] suite
diff --git a/builtin/worktree.c b/builtin/worktree.c
index 2a729c6..b82861e 100644
--- a/builtin/worktree.c
+++ b/builtin/worktree.c
@@ -2,8 +2,11 @@
 #include builtin.h
 #include dir.h
 #include parse-options.h
+#include argv-array.h
+#include run-command.h
 
 static const char * const worktree_usage[] = {
+   N_(git worktree add path branch),
N_(git worktree prune [options]),
NULL
 };
@@ -119,6 +122,33 @@ static int prune(int ac, const char **av, const char 
*prefix)
return 0;
 }
 
+
+static int add(int ac, const char **av, const char *prefix)
+{
+   struct child_process c;
+   const char *path, *branch;
+   struct argv_array cmd = ARGV_ARRAY_INIT;
+   struct option options[] = {
+   OPT_END()
+   };
+
+   ac = parse_options(ac, av, prefix, options, worktree_usage, 0);
+   if (ac != 2)
+   usage_with_options(worktree_usage, options);
+
+   path = prefix ? prefix_filename(prefix, strlen(prefix), av[0]) : av[0];
+   branch = av[1];
+
+   argv_array_push(cmd, checkout);
+   argv_array_pushl(cmd, --to, path, NULL);
+   argv_array_push(cmd, branch);
+
+   memset(c, 0, sizeof(c));
+   c.git_cmd = 1;
+   c.argv = cmd.argv;
+   return run_command(c);
+}
+
 int cmd_worktree(int ac, const char **av, const char *prefix)
 {
struct option options[] = {
@@ -127,6 +157,8 @@ int cmd_worktree(int ac, const char **av, const char 
*prefix)
 
if (ac  2)
usage_with_options(worktree_usage, options);
+   if (!strcmp(av[1], add))
+   return add(ac - 1, av + 1, prefix);
if (!strcmp(av[1], prune))
return prune(ac - 1, av + 1, prefix);
usage_with_options(worktree_usage, options);
-- 
2.5.0.rc1.197.g417e668

--
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