git.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Benjamin C Meyer <bmeyer@rim.com>
To: git@vger.kernel.org
Cc: simon.hausmann@nokia.com, Benjamin C Meyer <bmeyer@rim.com>
Subject: [PATCH] Improve git-p4 to be able to submit patches back to perforce when the git repository is made up of multiple perforce directories.
Date: Tue, 16 Mar 2010 15:23:43 -0400	[thread overview]
Message-ID: <1268767423-7431-1-git-send-email-bmeyer@rim.com> (raw)

git-p4 lets you sync several perforce directories into the one git repository,
but when you would do a git perforce submit it was hardcoded to apply
the patches to whatever was the first directory in the list that
the repository was synced from which would usually fail.  When
multiple perforce directories are now present git-p4 will apply them
to the common root directory where the patches can successfully be applied.

For example if you synced these two directories from perforce in git

//depot/foo/bar,//depot/test

git-p4 will now lookup that the client paths are:

~/p4/foo/bar,~/p4/test

and then set self.clientPath to the root of all of the client paths
(~/p4) permitting the patches from git to be cleanly applied for all
of the directories.

Signed-off-by: Benjamin C Meyer <bmeyer@rim.com>
---
 contrib/fast-import/git-p4 |   40 +++++++++++++++++++++++++++++-----------
 1 files changed, 29 insertions(+), 11 deletions(-)

diff --git a/contrib/fast-import/git-p4 b/contrib/fast-import/git-p4
index c1ea643..b4b509c 100755
--- a/contrib/fast-import/git-p4
+++ b/contrib/fast-import/git-p4
@@ -766,6 +766,21 @@ class P4Submit(Command):
                    + "Please review/edit and then use p4 submit -i < %s to submit directly!"
                    % (fileName, fileName))
 
+    def findCommonPath(self, settings):
+        dirs = []
+        for path in settings:
+            localDir = p4Where(path)
+            if len(localDir) > 0:
+                dirs.append(localDir)
+        localDir = dirs[0];
+        maxMatch = len(localDir) - 1
+        for dir in dirs:
+            if maxMatch > len(dir) - 1:
+                maxMatch = len(dir) - 1
+            while dir[maxMatch] != localDir[maxMatch]:
+                maxMatch = maxMatch - 1;
+        return localDir[0:maxMatch]
+
     def run(self, args):
         if len(args) == 0:
             self.master = currentGitBranch()
@@ -781,23 +796,26 @@ class P4Submit(Command):
             die("%s is not in git-p4.allowSubmit" % self.master)
 
         [upstream, settings] = findUpstreamBranchPoint()
-        self.depotPath = settings['depot-paths'][0]
+        if (len(settings['depot-paths']) > 0):
+            self.depotPath = ""
+            self.clientPath = self.findCommonPath(settings['depot-paths'])
+        else:
+            self.depotPath = settings['depot-paths'][0]
+            if len(self.depotPath) == 0:
+                print "Internal error: cannot locate perforce depot path from existing branches"
+                sys.exit(128)
+            self.clientPath = p4Where(self.depotPath)
+
+        if len(self.clientPath) == 0:
+            print "Error: Cannot locate perforce checkout of %s in client view" % self.depotPath
+            sys.exit(128)
+
         if len(self.origin) == 0:
             self.origin = upstream
 
         if self.verbose:
             print "Origin branch is " + self.origin
 
-        if len(self.depotPath) == 0:
-            print "Internal error: cannot locate perforce depot path from existing branches"
-            sys.exit(128)
-
-        self.clientPath = p4Where(self.depotPath)
-
-        if len(self.clientPath) == 0:
-            print "Error: Cannot locate perforce checkout of %s in client view" % self.depotPath
-            sys.exit(128)
-
         print "Perforce checkout for depot path %s located at %s" % (self.depotPath, self.clientPath)
         self.oldWorkingDirectory = os.getcwd()
 
-- 
1.6.3.3

                 reply	other threads:[~2010-03-16 19:23 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1268767423-7431-1-git-send-email-bmeyer@rim.com \
    --to=bmeyer@rim.com \
    --cc=git@vger.kernel.org \
    --cc=simon.hausmann@nokia.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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 NNTP newsgroup(s).