[PATCH] add pserver support to convert_repo
Csaba Henk
csaba-ml at creo.hu
Mon Jan 8 14:34:06 CST 2007
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
# HG changeset patch
# User csaba.henk at creo.hu
# Node ID d80b326a1b1efc6758a1265c0b3a47fb866ad560
# Parent 20da40cc1c7331d759a8fd068d0769dc6af0b33d
add pserver support to convert_repo
diff -r 20da40cc1c73 -r d80b326a1b1e contrib/convert-repo
- --- a/contrib/convert-repo Fri Dec 29 20:04:31 2006 -0600
+++ b/contrib/convert-repo Mon Jan 08 20:47:19 2007 +0100
@@ -23,7 +23,7 @@
# on each commit copied, so convert-repo can be interrupted and can
# be run repeatedly to copy new commits.
- -import sys, os, zlib, sha, time, re, locale
+import sys, os, zlib, sha, time, re, locale, socket
os.environ["HGENCODING"] = "utf-8"
from mercurial import hg, ui, util, fancyopts
@@ -138,38 +138,73 @@ class convert_cvs:
def _connect(self):
root = self.cvsroot
- - local = False
+ conntype = None
user, host = None, None
cmd = ['cvs', 'server']
status("connecting to %s\n" % root)
- - # only non-pserver for now
- - if root.startswith(":pserver"):
- - abort("can't handle pserver mode yet: %s\n" % root)
- -
- - if root.startswith(":local:"):
- - local = True
+ if root.startswith(":pserver:"):
+ root = root[9:]
+ m = re.match(r'(?:(.*?)(?::(.*?))?@)?([^:\/]*)(?::(\d*))?(.*)', root)
+ if m:
+ conntype = "pserver"
+ user, passw, serv, port, root = m.groups()
+ if not user:
+ user = "anonymous"
+ rr = ":pserver:" + user + "@" + serv + ":" + root
+ if port:
+ rr2, port = "-", int(port)
+ else:
+ rr2, port = rr, 2401
+ rr += str(port)
+
+ if not passw:
+ passw = "A"
+ pf = open(os.path.join(os.environ["HOME"], ".cvspass"))
+ for l in pf:
+ # :pserver:cvs at mea.tmt.tele.fi:/cvsroot/zmailer Ah<Z
+ m = re.match(r'(/\d+\s+/)?(.*)', l)
+ l = m.group(2)
+ w, p = l.split(' ', 1)
+ if w in [rr, rr2]:
+ passw = p
+ break
+ pf.close()
+
+ sck = socket.socket()
+ sck.connect((serv, port))
+ sck.send("\n".join(["BEGIN AUTH REQUEST", root, user, passw, "END AUTH REQUEST", ""]))
+ if sck.recv(128) != "I LOVE YOU\n":
+ raise NoRepo("CVS pserver authentication failed")
+
+ self.writep = self.readp = sck.makefile('r+')
+
+ if not conntype and root.startswith(":local:"):
+ conntype = "local"
root = root[7:]
- - else:
+
+ if not conntype:
# :ext:user at host/home/user/path/to/cvsroot
if root.startswith(":ext:"):
root = root[5:]
m = re.match(r'(?:([^@:/]+)@)?([^:/]+):?(.*)', root)
if not m:
- - local = True
+ conntype = "local"
else:
- - local = False
+ conntype = "rsh"
user, host, root = m.group(1), m.group(2), m.group(3)
- - if not local:
- - rsh = os.environ.get("CVS_RSH" or "rsh")
- - if user:
- - cmd = [rsh, '-l', user, host] + cmd
- - else:
- - cmd = [rsh, host] + cmd
- -
- - self.writep, self.readp = os.popen2(cmd)
+ if conntype != "pserver":
+ if conntype == "rsh":
+ rsh = os.environ.get("CVS_RSH" or "rsh")
+ if user:
+ cmd = [rsh, '-l', user, host] + cmd
+ else:
+ cmd = [rsh, host] + cmd
+
+ self.writep, self.readp = os.popen2(cmd)
+
self.realroot = root
self.writep.write("Root %s\n" % root)
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.2 (FreeBSD)
iD8DBQFFoqoo6tF8nOdLsHQRAgk/AJ9y3vBHpU+nqPoXZg5CZHidAopnPACg0LKA
6oD433deUvM3cvemuPxKtNk=
=If+v
-----END PGP SIGNATURE-----
More information about the Mercurial-devel
mailing list