contrib/convert-repo
changeset 4047 705d0792dbf2
parent 4006 67982d3ee76c
child 4062 516f883e3d79
equal deleted inserted replaced
4046:7fd68d2667fe 4047:705d0792dbf2
    21 #
    21 #
    22 # If the file doesn't exist, it's automatically created.  It's updated
    22 # If the file doesn't exist, it's automatically created.  It's updated
    23 # on each commit copied, so convert-repo can be interrupted and can
    23 # on each commit copied, so convert-repo can be interrupted and can
    24 # be run repeatedly to copy new commits.
    24 # be run repeatedly to copy new commits.
    25 
    25 
    26 import sys, os, zlib, sha, time, re, locale
    26 import sys, os, zlib, sha, time, re, locale, socket
    27 os.environ["HGENCODING"] = "utf-8"
    27 os.environ["HGENCODING"] = "utf-8"
    28 from mercurial import hg, ui, util, fancyopts
    28 from mercurial import hg, ui, util, fancyopts
    29 
    29 
    30 class Abort(Exception): pass
    30 class Abort(Exception): pass
    31 class NoRepo(Exception): pass
    31 class NoRepo(Exception): pass
   136         finally:
   136         finally:
   137             os.chdir(d)
   137             os.chdir(d)
   138 
   138 
   139     def _connect(self):
   139     def _connect(self):
   140         root = self.cvsroot
   140         root = self.cvsroot
   141         local = False
   141         conntype = None
   142         user, host = None, None
   142         user, host = None, None
   143         cmd = ['cvs', 'server']
   143         cmd = ['cvs', 'server']
   144 
   144 
   145         status("connecting to %s\n" % root)
   145         status("connecting to %s\n" % root)
   146 
   146 
   147         # only non-pserver for now
   147         if root.startswith(":pserver:"):
   148         if root.startswith(":pserver"):
   148             root = root[9:]
   149             abort("can't handle pserver mode yet: %s\n" % root)
   149             m = re.match(r'(?:(.*?)(?::(.*?))?@)?([^:\/]*)(?::(\d*))?(.*)', root)
   150 
   150             if m:
   151         if root.startswith(":local:"):
   151                 conntype = "pserver"
   152             local = True
   152                 user, passw, serv, port, root = m.groups()
       
   153                 if not user:
       
   154                     user = "anonymous"
       
   155                 rr = ":pserver:" + user + "@" + serv + ":" +  root
       
   156                 if port:
       
   157                     rr2, port = "-", int(port)
       
   158                 else:
       
   159                     rr2, port = rr, 2401
       
   160                 rr += str(port)
       
   161 
       
   162                 if not passw:
       
   163                     passw = "A"
       
   164                     pf = open(os.path.join(os.environ["HOME"], ".cvspass"))
       
   165                     for l in pf:
       
   166                         # :pserver:cvs@mea.tmt.tele.fi:/cvsroot/zmailer Ah<Z
       
   167                         m = re.match(r'(/\d+\s+/)?(.*)', l)
       
   168                         l = m.group(2)
       
   169                         w, p = l.split(' ', 1)
       
   170                         if w in [rr, rr2]:
       
   171                             passw = p
       
   172                             break
       
   173                     pf.close()
       
   174 
       
   175                 sck = socket.socket()
       
   176                 sck.connect((serv, port))
       
   177                 sck.send("\n".join(["BEGIN AUTH REQUEST", root, user, passw, "END AUTH REQUEST", ""]))
       
   178                 if sck.recv(128) != "I LOVE YOU\n":
       
   179                     raise NoRepo("CVS pserver authentication failed")
       
   180 
       
   181                 self.writep = self.readp = sck.makefile('r+')
       
   182 
       
   183         if not conntype and root.startswith(":local:"):
       
   184             conntype = "local"
   153             root = root[7:]
   185             root = root[7:]
   154         else:
   186 
       
   187         if not conntype:
   155             # :ext:user@host/home/user/path/to/cvsroot
   188             # :ext:user@host/home/user/path/to/cvsroot
   156             if root.startswith(":ext:"):
   189             if root.startswith(":ext:"):
   157                 root = root[5:]
   190                 root = root[5:]
   158             m = re.match(r'(?:([^@:/]+)@)?([^:/]+):?(.*)', root)
   191             m = re.match(r'(?:([^@:/]+)@)?([^:/]+):?(.*)', root)
   159             if not m:
   192             if not m:
   160                 local = True
   193                 conntype = "local"
   161             else:
   194             else:
   162                 local = False
   195                 conntype = "rsh"
   163                 user, host, root = m.group(1), m.group(2), m.group(3)
   196                 user, host, root = m.group(1), m.group(2), m.group(3)
   164 
   197 
   165         if not local:
   198         if conntype != "pserver":
   166             rsh = os.environ.get("CVS_RSH" or "rsh")
   199             if conntype == "rsh": 
   167             if user:
   200                 rsh = os.environ.get("CVS_RSH" or "rsh")
   168                 cmd = [rsh, '-l', user, host] + cmd
   201                 if user:
   169             else:
   202                     cmd = [rsh, '-l', user, host] + cmd
   170                 cmd = [rsh, host] + cmd
   203                 else:
   171 
   204                     cmd = [rsh, host] + cmd
   172         self.writep, self.readp = os.popen2(cmd)
   205 
       
   206             self.writep, self.readp = os.popen2(cmd)
       
   207 
   173         self.realroot = root
   208         self.realroot = root
   174 
   209 
   175         self.writep.write("Root %s\n" % root)
   210         self.writep.write("Root %s\n" % root)
   176         self.writep.write("Valid-responses ok error Valid-requests Mode"
   211         self.writep.write("Valid-responses ok error Valid-requests Mode"
   177                           " M Mbinary E Checked-in Created Updated"
   212                           " M Mbinary E Checked-in Created Updated"