comparison mercurial/sshrepo.py @ 3379:8770b4870e22

portability fix for test-ssh The __del__ method of sshrepo reads the stderr of the remote process until EOF and prints it. If an exception is raised, this method ends up being called: - on Linux: after the "abort: ..." message is printed - on OS X: before the "abort: ..." message is printed This patch explicitly flushes the stderr of the remote process before raising a RepoError.
author Alexis S. L. Carvalho <alexis@cecm.usp.br>
date Thu, 12 Oct 2006 20:45:25 -0300
parents 7ae37d99d47e
children 0b450267cf47
comparison
equal deleted inserted replaced
3376:1106e00e6847 3379:8770b4870e22
16 self._url = path 16 self._url = path
17 self.ui = ui 17 self.ui = ui
18 18
19 m = re.match(r'ssh://(([^@]+)@)?([^:/]+)(:(\d+))?(/(.*))?', path) 19 m = re.match(r'ssh://(([^@]+)@)?([^:/]+)(:(\d+))?(/(.*))?', path)
20 if not m: 20 if not m:
21 raise hg.RepoError(_("couldn't parse location %s") % path) 21 self.repoerror(_("couldn't parse location %s") % path)
22 22
23 self.user = m.group(2) 23 self.user = m.group(2)
24 self.host = m.group(3) 24 self.host = m.group(3)
25 self.port = m.group(5) 25 self.port = m.group(5)
26 self.path = m.group(7) or "." 26 self.path = m.group(7) or "."
36 cmd = cmd % (sshcmd, args, remotecmd, self.path) 36 cmd = cmd % (sshcmd, args, remotecmd, self.path)
37 37
38 ui.note('running %s\n' % cmd) 38 ui.note('running %s\n' % cmd)
39 res = os.system(cmd) 39 res = os.system(cmd)
40 if res != 0: 40 if res != 0:
41 raise hg.RepoError(_("could not create remote repo")) 41 self.repoerror(_("could not create remote repo"))
42 42
43 self.validate_repo(ui, sshcmd, args, remotecmd) 43 self.validate_repo(ui, sshcmd, args, remotecmd)
44 44
45 def url(self): 45 def url(self):
46 return self._url 46 return self._url
68 if l: 68 if l:
69 ui.debug(_("remote: "), l) 69 ui.debug(_("remote: "), l)
70 lines.append(l) 70 lines.append(l)
71 max_noise -= 1 71 max_noise -= 1
72 else: 72 else:
73 raise hg.RepoError(_("no suitable response from remote hg")) 73 self.repoerror(_("no suitable response from remote hg"))
74 74
75 self.capabilities = () 75 self.capabilities = ()
76 lines.reverse() 76 lines.reverse()
77 for l in lines: 77 for l in lines:
78 if l.startswith("capabilities:"): 78 if l.startswith("capabilities:"):
85 if size == 0: break 85 if size == 0: break
86 l = self.pipee.readline() 86 l = self.pipee.readline()
87 if not l: break 87 if not l: break
88 self.ui.status(_("remote: "), l) 88 self.ui.status(_("remote: "), l)
89 89
90 def repoerror(self, msg):
91 self.cleanup()
92 raise hg.RepoError(msg)
93
90 def cleanup(self): 94 def cleanup(self):
91 try: 95 try:
92 self.pipeo.close() 96 self.pipeo.close()
93 self.pipei.close() 97 self.pipei.close()
94 # read the error descriptor until EOF 98 # read the error descriptor until EOF
115 l = r.readline() 119 l = r.readline()
116 self.readerr() 120 self.readerr()
117 try: 121 try:
118 l = int(l) 122 l = int(l)
119 except: 123 except:
120 raise hg.RepoError(_("unexpected response '%s'") % l) 124 self.repoerror(_("unexpected response '%s'") % l)
121 return r.read(l) 125 return r.read(l)
122 126
123 def lock(self): 127 def lock(self):
124 self.call("lock") 128 self.call("lock")
125 return remotelock(self) 129 return remotelock(self)
130 def heads(self): 134 def heads(self):
131 d = self.call("heads") 135 d = self.call("heads")
132 try: 136 try:
133 return map(bin, d[:-1].split(" ")) 137 return map(bin, d[:-1].split(" "))
134 except: 138 except:
135 raise hg.RepoError(_("unexpected response '%s'") % (d[:400] + "...")) 139 self.repoerror(_("unexpected response '%s'") % (d[:400] + "..."))
136 140
137 def branches(self, nodes): 141 def branches(self, nodes):
138 n = " ".join(map(hex, nodes)) 142 n = " ".join(map(hex, nodes))
139 d = self.call("branches", nodes=n) 143 d = self.call("branches", nodes=n)
140 try: 144 try:
141 br = [ tuple(map(bin, b.split(" "))) for b in d.splitlines() ] 145 br = [ tuple(map(bin, b.split(" "))) for b in d.splitlines() ]
142 return br 146 return br
143 except: 147 except:
144 raise hg.RepoError(_("unexpected response '%s'") % (d[:400] + "...")) 148 self.repoerror(_("unexpected response '%s'") % (d[:400] + "..."))
145 149
146 def between(self, pairs): 150 def between(self, pairs):
147 n = "\n".join(["-".join(map(hex, p)) for p in pairs]) 151 n = "\n".join(["-".join(map(hex, p)) for p in pairs])
148 d = self.call("between", pairs=n) 152 d = self.call("between", pairs=n)
149 try: 153 try:
150 p = [ l and map(bin, l.split(" ")) or [] for l in d.splitlines() ] 154 p = [ l and map(bin, l.split(" ")) or [] for l in d.splitlines() ]
151 return p 155 return p
152 except: 156 except:
153 raise hg.RepoError(_("unexpected response '%s'") % (d[:400] + "...")) 157 self.repoerror(_("unexpected response '%s'") % (d[:400] + "..."))
154 158
155 def changegroup(self, nodes, kind): 159 def changegroup(self, nodes, kind):
156 n = " ".join(map(hex, nodes)) 160 n = " ".join(map(hex, nodes))
157 return self.do_cmd("changegroup", roots=n) 161 return self.do_cmd("changegroup", roots=n)
158 162
159 def unbundle(self, cg, heads, source): 163 def unbundle(self, cg, heads, source):
160 d = self.call("unbundle", heads=' '.join(map(hex, heads))) 164 d = self.call("unbundle", heads=' '.join(map(hex, heads)))
161 if d: 165 if d:
162 raise hg.RepoError(_("push refused: %s") % d) 166 self.repoerror(_("push refused: %s") % d)
163 167
164 while 1: 168 while 1:
165 d = cg.read(4096) 169 d = cg.read(4096)
166 if not d: break 170 if not d: break
167 self.pipeo.write(str(len(d)) + '\n') 171 self.pipeo.write(str(len(d)) + '\n')
183 return int(r) 187 return int(r)
184 188
185 def addchangegroup(self, cg, source, url): 189 def addchangegroup(self, cg, source, url):
186 d = self.call("addchangegroup") 190 d = self.call("addchangegroup")
187 if d: 191 if d:
188 raise hg.RepoError(_("push refused: %s") % d) 192 self.repoerror(_("push refused: %s") % d)
189 while 1: 193 while 1:
190 d = cg.read(4096) 194 d = cg.read(4096)
191 if not d: break 195 if not d: break
192 self.pipeo.write(d) 196 self.pipeo.write(d)
193 self.readerr() 197 self.readerr()