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" |