Merge branch 'pw/p4'
authorJunio C Hamano <gitster@pobox.com>
Sun, 13 Mar 2011 08:10:06 +0000 (00:10 -0800)
committerJunio C Hamano <gitster@pobox.com>
Sun, 13 Mar 2011 08:10:06 +0000 (00:10 -0800)
* pw/p4:
git-p4: test clone @all
git-p4: fix clone @all regression

1  2 
contrib/fast-import/git-p4
index 2df3bb21c4aff3863844a0f679d257efa48e68b5,3c44524cdf0488025be57a0a3db25af1de2fc101..7cb479c5e1b21e4b0de936ced57981e0bf804b0c
@@@ -543,13 -543,13 +543,13 @@@ class P4Submit(Command)
          self.options = [
                  optparse.make_option("--verbose", dest="verbose", action="store_true"),
                  optparse.make_option("--origin", dest="origin"),
 -                optparse.make_option("-M", dest="detectRename", action="store_true"),
 +                optparse.make_option("-M", dest="detectRenames", action="store_true"),
          ]
          self.description = "Submit changes from git to the perforce depot."
          self.usage += " [name of git branch to submit into perforce depot]"
          self.interactive = True
          self.origin = ""
 -        self.detectRename = False
 +        self.detectRenames = False
          self.verbose = False
          self.isWindows = (platform.system() == "Windows")
  
                  continue
  
              if inDescriptionSection:
 -                if line.startswith("Files:"):
 +                if line.startswith("Files:") or line.startswith("Jobs:"):
                      inDescriptionSection = False
                  else:
                      continue
  
      def applyCommit(self, id):
          print "Applying %s" % (read_pipe("git log --max-count=1 --pretty=oneline %s" % id))
 -        diffOpts = ("", "-M")[self.detectRename]
 +
 +        if not self.detectRenames:
 +            # If not explicitly set check the config variable
 +            self.detectRenames = gitConfig("git-p4.detectRenames").lower() == "true"
 +
 +        if self.detectRenames:
 +            diffOpts = "-M"
 +        else:
 +            diffOpts = ""
 +
 +        if gitConfig("git-p4.detectCopies").lower() == "true":
 +            diffOpts += " -C"
 +
 +        if gitConfig("git-p4.detectCopiesHarder").lower() == "true":
 +            diffOpts += " --find-copies-harder"
 +
          diff = read_pipe_lines("git diff-tree -r %s \"%s^\" \"%s\"" % (diffOpts, id, id))
          filesToAdd = set()
          filesToDelete = set()
                  filesToDelete.add(path)
                  if path in filesToAdd:
                      filesToAdd.remove(path)
 +            elif modifier == "C":
 +                src, dest = diff['src'], diff['dst']
 +                p4_system("integrate -Dt \"%s\" \"%s\"" % (src, dest))
 +                if diff['src_sha1'] != diff['dst_sha1']:
 +                    p4_system("edit \"%s\"" % (dest))
 +                if isModeExecChanged(diff['src_mode'], diff['dst_mode']):
 +                    p4_system("edit \"%s\"" % (dest))
 +                    filesToChangeExecBit[dest] = diff['dst_mode']
 +                os.unlink(dest)
 +                editedFiles.add(dest)
              elif modifier == "R":
                  src, dest = diff['src'], diff['dst']
                  p4_system("integrate -Dt \"%s\" \"%s\"" % (src, dest))
 -                p4_system("edit \"%s\"" % (dest))
 +                if diff['src_sha1'] != diff['dst_sha1']:
 +                    p4_system("edit \"%s\"" % (dest))
                  if isModeExecChanged(diff['src_mode'], diff['dst_mode']):
 +                    p4_system("edit \"%s\"" % (dest))
                      filesToChangeExecBit[dest] = diff['dst_mode']
                  os.unlink(dest)
                  editedFiles.add(dest)
@@@ -956,22 -929,6 +956,22 @@@ class P4Sync(Command)
          return files
  
      def stripRepoPath(self, path, prefixes):
 +        if self.useClientSpec:
 +
 +            # if using the client spec, we use the output directory
 +            # specified in the client.  For example, a view
 +            #   //depot/foo/branch/... //client/branch/foo/...
 +            # will end up putting all foo/branch files into
 +            #  branch/foo/
 +            for val in self.clientSpecDirs:
 +                if path.startswith(val[0]):
 +                    # replace the depot path with the client path
 +                    path = path.replace(val[0], val[1][1])
 +                    # now strip out the client (//client/...)
 +                    path = re.sub("^(//[^/]+/)", '', path)
 +                    # the rest is all path
 +                    return path
 +
          if self.keepRepoPath:
              prefixes = [re.sub("^(//[^/]+/).*", r'\1', prefixes[0])]
  
              includeFile = True
              for val in self.clientSpecDirs:
                  if f['path'].startswith(val[0]):
 -                    if val[1] <= 0:
 +                    if val[1][0] <= 0:
                          includeFile = False
                      break
  
          for entry in specList:
              for k,v in entry.iteritems():
                  if k.startswith("View"):
 +
 +                    # p4 has these %%1 to %%9 arguments in specs to
 +                    # reorder paths; which we can't handle (yet :)
 +                    if re.match('%%\d', v) != None:
 +                        print "Sorry, can't handle %%n arguments in client specs"
 +                        sys.exit(1)
 +
                      if v.startswith('"'):
                          start = 1
                      else:
                          start = 0
                      index = v.find("...")
 +
 +                    # save the "client view"; i.e the RHS of the view
 +                    # line that tells the client where to put the
 +                    # files for this view.
 +                    cv = v[index+3:].strip() # +3 to remove previous '...'
 +
 +                    # if the client view doesn't end with a
 +                    # ... wildcard, then we're going to mess up the
 +                    # output directory, so fail gracefully.
 +                    if not cv.endswith('...'):
 +                        print 'Sorry, client view in "%s" needs to end with wildcard' % (k)
 +                        sys.exit(1)
 +                    cv=cv[:-3]
 +
 +                    # now save the view; +index means included, -index
 +                    # means it should be filtered out.
                      v = v[start:index]
                      if v.startswith("-"):
                          v = v[1:]
 -                        temp[v] = -len(v)
 +                        include = -len(v)
                      else:
 -                        temp[v] = len(v)
 +                        include = len(v)
 +
 +                    temp[v] = (include, cv)
 +
          self.clientSpecDirs = temp.items()
 -        self.clientSpecDirs.sort( lambda x, y: abs( y[1] ) - abs( x[1] ) )
 +        self.clientSpecDirs.sort( lambda x, y: abs( y[1][0] ) - abs( x[1][0] ) )
  
      def run(self, args):
          self.depotPaths = []
  
                  changes.sort()
              else:
-                 if not self.p4BranchesInGit:
+                 if not isinstance(self, P4Clone) and not self.p4BranchesInGit:
                      die("No remote p4 branches.  Perhaps you never did \"git p4 clone\" in here.");
                  if self.verbose:
                      print "Getting p4 changes for %s...%s" % (', '.join(self.depotPaths),