diff options
Diffstat (limited to 'git-p4.py')
| -rwxr-xr-x | git-p4.py | 59 | 
1 files changed, 40 insertions, 19 deletions
| @@ -134,13 +134,11 @@ def read_pipe(c, ignore_error=False):          sys.stderr.write('Reading pipe: %s\n' % str(c))      expand = isinstance(c,basestring) -    p = subprocess.Popen(c, stdout=subprocess.PIPE, shell=expand) -    pipe = p.stdout -    val = pipe.read() -    if p.wait() and not ignore_error: -        die('Command failed: %s' % str(c)) - -    return val +    p = subprocess.Popen(c, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=expand) +    (out, err) = p.communicate() +    if p.returncode != 0 and not ignore_error: +        die('Command failed: %s\nError: %s' % (str(c), err)) +    return out  def p4_read_pipe(c, ignore_error=False):      real_cmd = p4_build_cmd(c) @@ -1950,10 +1948,14 @@ class View(object):              if "unmap" in res:                  # it will list all of them, but only one not unmap-ped                  continue +            if gitConfigBool("core.ignorecase"): +                res['depotFile'] = res['depotFile'].lower()              self.client_spec_path_cache[res['depotFile']] = self.convert_client_path(res["clientFile"])          # not found files or unmap files set to ""          for depotFile in fileArgs: +            if gitConfigBool("core.ignorecase"): +                depotFile = depotFile.lower()              if depotFile not in self.client_spec_path_cache:                  self.client_spec_path_cache[depotFile] = "" @@ -1962,6 +1964,9 @@ class View(object):             depot file should live.  Returns "" if the file should             not be mapped in the client.""" +        if gitConfigBool("core.ignorecase"): +            depot_path = depot_path.lower() +          if depot_path in self.client_spec_path_cache:              return self.client_spec_path_cache[depot_path] @@ -2186,10 +2191,17 @@ class P4Sync(Command, P4UserMap):              # them back too.  This is not needed to the cygwin windows version,              # just the native "NT" type.              # -            text = p4_read_pipe(['print', '-q', '-o', '-', "%s@%s" % (file['depotFile'], file['change']) ]) -            if p4_version_string().find("/NT") >= 0: -                text = text.replace("\r\n", "\n") -            contents = [ text ] +            try: +                text = p4_read_pipe(['print', '-q', '-o', '-', '%s@%s' % (file['depotFile'], file['change'])]) +            except Exception as e: +                if 'Translation of file content failed' in str(e): +                    type_base = 'binary' +                else: +                    raise e +            else: +                if p4_version_string().find('/NT') >= 0: +                    text = text.replace('\r\n', '\n') +                contents = [ text ]          if type_base == "apple":              # Apple filetype files will be streamed as a concatenation of @@ -2322,8 +2334,11 @@ class P4Sync(Command, P4UserMap):          else:              return "%s <a@b>" % userid -    # Stream a p4 tag      def streamTag(self, gitStream, labelName, labelDetails, commit, epoch): +        """ Stream a p4 tag. +        commit is either a git commit, or a fast-import mark, ":<p4commit>" +        """ +          if verbose:              print "writing tag %s for commit %s" % (labelName, commit)          gitStream.write("tag %s\n" % labelName) @@ -2374,7 +2389,7 @@ class P4Sync(Command, P4UserMap):              self.clientSpecDirs.update_client_spec_path_cache(files)          self.gitStream.write("commit %s\n" % branch) -#        gitStream.write("mark :%s\n" % details["change"]) +        self.gitStream.write("mark :%s\n" % details["change"])          self.committedChanges.add(int(details["change"]))          committer = ""          if author not in self.users: @@ -2493,13 +2508,19 @@ class P4Sync(Command, P4UserMap):              if change.has_key('change'):                  # find the corresponding git commit; take the oldest commit                  changelist = int(change['change']) -                gitCommit = read_pipe(["git", "rev-list", "--max-count=1", -                     "--reverse", ":/\[git-p4:.*change = %d\]" % changelist]) -                if len(gitCommit) == 0: -                    print "could not find git commit for changelist %d" % changelist -                else: -                    gitCommit = gitCommit.strip() +                if changelist in self.committedChanges: +                    gitCommit = ":%d" % changelist       # use a fast-import mark                      commitFound = True +                else: +                    gitCommit = read_pipe(["git", "rev-list", "--max-count=1", +                        "--reverse", ":/\[git-p4:.*change = %d\]" % changelist], ignore_error=True) +                    if len(gitCommit) == 0: +                        print "importing label %s: could not find git commit for changelist %d" % (name, changelist) +                    else: +                        commitFound = True +                        gitCommit = gitCommit.strip() + +                if commitFound:                      # Convert from p4 time format                      try:                          tmwhen = time.strptime(labelDetails['Update'], "%Y/%m/%d %H:%M:%S") | 
