summaryrefslogtreecommitdiff
path: root/contrib
diff options
context:
space:
mode:
Diffstat (limited to 'contrib')
-rw-r--r--contrib/fast-import/p4-fast-export.py89
1 files changed, 31 insertions, 58 deletions
diff --git a/contrib/fast-import/p4-fast-export.py b/contrib/fast-import/p4-fast-export.py
index d3e65f0f39..45d5157961 100644
--- a/contrib/fast-import/p4-fast-export.py
+++ b/contrib/fast-import/p4-fast-export.py
@@ -57,47 +57,8 @@ def p4Cmd(cmd):
result.update(entry)
return result;
-def describe(change):
- describeOutput = p4Cmd("describe %s" % change)
-
- author = describeOutput["user"]
- epoch = describeOutput["time"]
-
- log = describeOutput["desc"]
-
- changed = []
- removed = []
-
- i = 0
- while describeOutput.has_key("depotFile%s" % i):
- path = describeOutput["depotFile%s" % i]
- rev = describeOutput["rev%s" % i]
- action = describeOutput["action%s" % i]
- path = path + "#" + rev
-
- if action == "delete":
- removed.append(path)
- else:
- changed.append(path)
-
- i = i + 1
-
- return author, log, epoch, changed, removed
-
-def p4Stat(path):
- output = os.popen("p4 fstat -Ol \"%s\"" % path).readlines()
- fileSize = 0
- mode = 644
- for line in output:
- if line.startswith("... headType x"):
- mode = 755
- elif line.startswith("... fileSize "):
- fileSize = long(line[12:])
- return mode, fileSize
-
-def stripRevision(path):
- hashPos = path.rindex("#")
- return path[:hashPos]
+def p4FileSize(path):
+ return int(p4Cmd("fstat -Ol \"%s\"" % path)["fileSize"])
def getUserMap():
users = {}
@@ -127,38 +88,50 @@ gitOutput, gitStream, gitError = popen2.popen3("git-fast-import")
cnt = 1
for change in changes:
- [ author, log, epoch, changedFiles, removedFiles ] = describe(change)
+ description = p4Cmd("describe %s" % change)
+
sys.stdout.write("\rimporting revision %s (%s%%)" % (change, cnt * 100 / len(changes)))
cnt = cnt + 1
+ epoch = description["time"]
+ author = description["user"]
+
gitStream.write("commit refs/heads/master\n")
if author in users:
gitStream.write("committer %s %s %s\n" % (users[author], epoch, tz))
else:
gitStream.write("committer %s <a@b> %s %s\n" % (author, epoch, tz))
gitStream.write("data <<EOT\n")
- gitStream.write(log)
+ gitStream.write(description["desc"])
gitStream.write("EOT\n\n")
- for f in changedFiles:
- if not f.startswith(prefix):
- sys.stderr.write("\nchanged files: ignoring path %s outside of %s in change %s\n" % (f, prefix, change))
+ fnum = 0
+ while description.has_key("depotFile%s" % fnum):
+ path = description["depotFile%s" % fnum]
+ if not path.startswith(prefix):
+ print "\nchanged files: ignoring path %s outside of %s in change %s" % (path, prefix, change)
+ fnum = fnum + 1
continue
- relpath = f[len(prefix):]
- [mode, fileSize] = p4Stat(f)
+ rev = description["rev%s" % fnum]
+ depotPath = path + "#" + rev
+ relPath = path[len(prefix):]
+ action = description["action%s" % fnum]
- gitStream.write("M %s inline %s\n" % (mode, stripRevision(relpath)))
- gitStream.write("data %s\n" % fileSize)
- gitStream.write(os.popen("p4 print -q \"%s\"" % f).read())
- gitStream.write("\n")
+ if action == "delete":
+ gitStream.write("D %s\n" % relPath)
+ else:
+ fileSize = p4FileSize(depotPath)
+ mode = 644
+ if description["type%s" % fnum].startswith("x"):
+ mode = 755
- for f in removedFiles:
- if not f.startswith(prefix):
- sys.stderr.write("\ndeleted files: ignoring path %s outside of %s in change %s\n" % (f, prefix, change))
- continue
- relpath = f[len(prefix):]
- gitStream.write("D %s\n" % stripRevision(relpath))
+ gitStream.write("M %s inline %s\n" % (mode, relPath))
+ gitStream.write("data %s\n" % fileSize)
+ gitStream.write(os.popen("p4 print -q \"%s\"" % depotPath).read())
+ gitStream.write("\n")
+
+ fnum = fnum + 1
gitStream.write("\n")