git@vger.kernel.org mailing list mirror (one of many)
 help / color / mirror / code / Atom feed
* [PATCHv3] git-p4 worktree support
@ 2016-12-13 21:51 Luke Diamand
  2016-12-13 21:51 ` [PATCHv3] git-p4: support git worktrees Luke Diamand
  0 siblings, 1 reply; 3+ messages in thread
From: Luke Diamand @ 2016-12-13 21:51 UTC (permalink / raw)
  To: git
  Cc: viniciusalexandre, Lars Schneider, Duy Nguyen, Junio C Hamano,
	Luke Diamand

Support for git-p4 worktrees.

Adds test cases for using git from a worktree, and
specifying the git directory either with the --git-dir
command-line option, or with $ENV{GIT_DIR}.

Luke Diamand (1):
  git-p4: support git worktrees

 git-p4.py                 | 17 +++++++++++++----
 t/t9800-git-p4-basic.sh   | 20 ++++++++++++++++++++
 t/t9806-git-p4-options.sh | 32 ++++++++++++++++++++++++++++++++
 3 files changed, 65 insertions(+), 4 deletions(-)

-- 
2.8.2.703.g78b384c.dirty


^ permalink raw reply	[flat|nested] 3+ messages in thread

* [PATCHv3] git-p4: support git worktrees
  2016-12-13 21:51 [PATCHv3] git-p4 worktree support Luke Diamand
@ 2016-12-13 21:51 ` Luke Diamand
  2016-12-14  0:08   ` Junio C Hamano
  0 siblings, 1 reply; 3+ messages in thread
From: Luke Diamand @ 2016-12-13 21:51 UTC (permalink / raw)
  To: git
  Cc: viniciusalexandre, Lars Schneider, Duy Nguyen, Junio C Hamano,
	Luke Diamand

git-p4 would attempt to find the git directory using
its own specific code, which did not know about git
worktrees.

Rework it to use "git rev-parse --git-dir" instead.

Add test cases for worktree usage and specifying
git directory via --git-dir and $GIT_DIR.

Signed-off-by: Luke Diamand <luke@diamand.org>
---
 git-p4.py                 | 17 +++++++++++++----
 t/t9800-git-p4-basic.sh   | 20 ++++++++++++++++++++
 t/t9806-git-p4-options.sh | 32 ++++++++++++++++++++++++++++++++
 3 files changed, 65 insertions(+), 4 deletions(-)

diff --git a/git-p4.py b/git-p4.py
index fd5ca52..6a1f65f 100755
--- a/git-p4.py
+++ b/git-p4.py
@@ -85,6 +85,16 @@ def p4_build_cmd(cmd):
         real_cmd += cmd
     return real_cmd
 
+def git_dir(path):
+    """ Return TRUE if the given path is a git directory (/path/to/dir/.git).
+        This won't automatically add ".git" to a directory.
+    """
+    d = read_pipe(["git", "--git-dir", path, "rev-parse", "--git-dir"], True).strip()
+    if not d or len(d) == 0:
+        return None
+    else:
+        return d
+
 def chdir(path, is_client_path=False):
     """Do chdir to the given path, and set the PWD environment
        variable for use by P4.  It does not look at getcwd() output.
@@ -563,10 +573,7 @@ def currentGitBranch():
         return read_pipe(["git", "name-rev", "HEAD"]).split(" ")[1].strip()
 
 def isValidGitDir(path):
-    if (os.path.exists(path + "/HEAD")
-        and os.path.exists(path + "/refs") and os.path.exists(path + "/objects")):
-        return True;
-    return False
+    return git_dir(path) != None
 
 def parseRevision(ref):
     return read_pipe("git rev-parse %s" % ref).strip()
@@ -3682,6 +3689,7 @@ def main():
         if cmd.gitdir == None:
             cmd.gitdir = os.path.abspath(".git")
             if not isValidGitDir(cmd.gitdir):
+                # "rev-parse --git-dir" without arguments will try $PWD/.git
                 cmd.gitdir = read_pipe("git rev-parse --git-dir").strip()
                 if os.path.exists(cmd.gitdir):
                     cdup = read_pipe("git rev-parse --show-cdup").strip()
@@ -3694,6 +3702,7 @@ def main():
             else:
                 die("fatal: cannot locate git repository at %s" % cmd.gitdir)
 
+        # so git commands invoked from the P4 workspace will succeed
         os.environ["GIT_DIR"] = cmd.gitdir
 
     if not cmd.run(args):
diff --git a/t/t9800-git-p4-basic.sh b/t/t9800-git-p4-basic.sh
index 0730f18..093e9bd 100755
--- a/t/t9800-git-p4-basic.sh
+++ b/t/t9800-git-p4-basic.sh
@@ -257,6 +257,26 @@ test_expect_success 'submit from detached head' '
 	)
 '
 
+test_expect_success 'submit from worktree' '
+	test_when_finished cleanup_git &&
+	git p4 clone --dest="$git" //depot &&
+	(
+		cd "$git" &&
+		git worktree add ../worktree-test
+	) &&
+	(
+		cd "$git/../worktree-test" &&
+		test_commit "worktree-commit" &&
+		git config git-p4.skipSubmitEdit true &&
+		git p4 submit
+	) &&
+	(
+		cd "$cli" &&
+		p4 sync &&
+		test_path_is_file worktree-commit.t
+	)
+'
+
 test_expect_success 'kill p4d' '
 	kill_p4d
 '
diff --git a/t/t9806-git-p4-options.sh b/t/t9806-git-p4-options.sh
index 254d428..1ab76c4 100755
--- a/t/t9806-git-p4-options.sh
+++ b/t/t9806-git-p4-options.sh
@@ -269,6 +269,38 @@ test_expect_success 'submit works with two branches' '
 	)
 '
 
+test_expect_success 'use --git-dir option and GIT_DIR' '
+	test_when_finished cleanup_git &&
+	git p4 clone //depot --destination="$git" &&
+	(
+		cd "$git" &&
+		git config git-p4.skipSubmitEdit true &&
+		test_commit first-change &&
+		git p4 submit --git-dir "$git"
+	) &&
+	(
+		cd "$cli" &&
+		p4 sync &&
+		test_path_is_file first-change.t &&
+		echo "cli_file" >cli_file.t &&
+		p4 add cli_file.t &&
+		p4 submit -d "cli change"
+	) &&
+	(git --git-dir "$git" p4 sync) &&
+	(cd "$git" && git checkout -q p4/master) &&
+	test_path_is_file "$git"/cli_file.t &&
+	(
+		cd "$cli" &&
+		echo "cli_file2" >cli_file2.t &&
+		p4 add cli_file2.t  &&
+		p4 submit -d "cli change2"
+	) &&
+	(GIT_DIR="$git" git p4 sync) &&
+	(cd "$git" && git checkout -q p4/master) &&
+	test_path_is_file "$git"/cli_file2.t
+'
+
+
 test_expect_success 'kill p4d' '
 	kill_p4d
 '
-- 
2.8.2.703.g78b384c.dirty


^ permalink raw reply related	[flat|nested] 3+ messages in thread

* Re: [PATCHv3] git-p4: support git worktrees
  2016-12-13 21:51 ` [PATCHv3] git-p4: support git worktrees Luke Diamand
@ 2016-12-14  0:08   ` Junio C Hamano
  0 siblings, 0 replies; 3+ messages in thread
From: Junio C Hamano @ 2016-12-14  0:08 UTC (permalink / raw)
  To: Luke Diamand; +Cc: git, viniciusalexandre, Lars Schneider, Duy Nguyen

Luke Diamand <luke@diamand.org> writes:

> git-p4 would attempt to find the git directory using
> its own specific code, which did not know about git
> worktrees.
>
> Rework it to use "git rev-parse --git-dir" instead.
>
> Add test cases for worktree usage and specifying
> git directory via --git-dir and $GIT_DIR.
>
> Signed-off-by: Luke Diamand <luke@diamand.org>
> ---
>  git-p4.py                 | 17 +++++++++++++----
>  t/t9800-git-p4-basic.sh   | 20 ++++++++++++++++++++
>  t/t9806-git-p4-options.sh | 32 ++++++++++++++++++++++++++++++++
>  3 files changed, 65 insertions(+), 4 deletions(-)
>
> diff --git a/git-p4.py b/git-p4.py
> index fd5ca52..6a1f65f 100755
> --- a/git-p4.py
> +++ b/git-p4.py
> @@ -85,6 +85,16 @@ def p4_build_cmd(cmd):
>          real_cmd += cmd
>      return real_cmd
>  
> +def git_dir(path):
> +    """ Return TRUE if the given path is a git directory (/path/to/dir/.git).
> +        This won't automatically add ".git" to a directory.
> +    """
> +    d = read_pipe(["git", "--git-dir", path, "rev-parse", "--git-dir"], True).strip()
> +    if not d or len(d) == 0:
> +        return None
> +    else:
> +        return d
> +
>  def chdir(path, is_client_path=False):
>      """Do chdir to the given path, and set the PWD environment
>         variable for use by P4.  It does not look at getcwd() output.
> @@ -563,10 +573,7 @@ def currentGitBranch():
>          return read_pipe(["git", "name-rev", "HEAD"]).split(" ")[1].strip()
>  
>  def isValidGitDir(path):
> -    if (os.path.exists(path + "/HEAD")
> -        and os.path.exists(path + "/refs") and os.path.exists(path + "/objects")):
> -        return True;
> -    return False
> +    return git_dir(path) != None
>  
>  def parseRevision(ref):
>      return read_pipe("git rev-parse %s" % ref).strip()
> @@ -3682,6 +3689,7 @@ def main():
>          if cmd.gitdir == None:
>              cmd.gitdir = os.path.abspath(".git")
>              if not isValidGitDir(cmd.gitdir):
> +                # "rev-parse --git-dir" without arguments will try $PWD/.git
>                  cmd.gitdir = read_pipe("git rev-parse --git-dir").strip()
>                  if os.path.exists(cmd.gitdir):
>                      cdup = read_pipe("git rev-parse --show-cdup").strip()
> @@ -3694,6 +3702,7 @@ def main():
>              else:
>                  die("fatal: cannot locate git repository at %s" % cmd.gitdir)
>  
> +        # so git commands invoked from the P4 workspace will succeed
>          os.environ["GIT_DIR"] = cmd.gitdir

The real fix has become surprisingly short and "feels right".

Will queue. Thanks.


^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2016-12-14  0:09 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-12-13 21:51 [PATCHv3] git-p4 worktree support Luke Diamand
2016-12-13 21:51 ` [PATCHv3] git-p4: support git worktrees Luke Diamand
2016-12-14  0:08   ` Junio C Hamano

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