63 cmd = util.quotecommand(cmd) |
63 cmd = util.quotecommand(cmd) |
64 ui.note(_('running %s\n') % cmd) |
64 ui.note(_('running %s\n') % cmd) |
65 self.pipeo, self.pipei, self.pipee = util.popen3(cmd) |
65 self.pipeo, self.pipei, self.pipee = util.popen3(cmd) |
66 |
66 |
67 # skip any noise generated by remote shell |
67 # skip any noise generated by remote shell |
68 self.do_cmd("hello") |
68 self._callstream("hello") |
69 r = self.do_cmd("between", pairs=("%s-%s" % ("0"*40, "0"*40))) |
69 r = self._callstream("between", pairs=("%s-%s" % ("0"*40, "0"*40))) |
70 lines = ["", "dummy"] |
70 lines = ["", "dummy"] |
71 max_noise = 500 |
71 max_noise = 500 |
72 while lines[-1] and max_noise: |
72 while lines[-1] and max_noise: |
73 l = r.readline() |
73 l = r.readline() |
74 self.readerr() |
74 self.readerr() |
116 except: |
116 except: |
117 pass |
117 pass |
118 |
118 |
119 __del__ = cleanup |
119 __del__ = cleanup |
120 |
120 |
121 def do_cmd(self, cmd, **args): |
121 def _callstream(self, cmd, **args): |
122 self.ui.debug("sending %s command\n" % cmd) |
122 self.ui.debug("sending %s command\n" % cmd) |
123 self.pipeo.write("%s\n" % cmd) |
123 self.pipeo.write("%s\n" % cmd) |
124 for k, v in sorted(args.iteritems()): |
124 for k, v in sorted(args.iteritems()): |
125 self.pipeo.write("%s %d\n" % (k, len(v))) |
125 self.pipeo.write("%s %d\n" % (k, len(v))) |
126 self.pipeo.write(v) |
126 self.pipeo.write(v) |
127 self.pipeo.flush() |
127 self.pipeo.flush() |
128 |
128 |
129 return self.pipei |
129 return self.pipei |
130 |
130 |
131 def call(self, cmd, **args): |
131 def _call(self, cmd, **args): |
132 self.do_cmd(cmd, **args) |
132 self._callstream(cmd, **args) |
133 return self._recv() |
133 return self._recv() |
134 |
|
135 def _call(self, cmd, **args): |
|
136 self.do_cmd(cmd, **args) |
|
137 return self._recv() |
|
138 |
|
139 def _callstream(self, cmd, **args): |
|
140 return self.do_cmd(cmd, **args) |
|
141 |
134 |
142 def _recv(self): |
135 def _recv(self): |
143 l = self.pipei.readline() |
136 l = self.pipei.readline() |
144 self.readerr() |
137 self.readerr() |
145 try: |
138 try: |
155 if flush: |
148 if flush: |
156 self.pipeo.flush() |
149 self.pipeo.flush() |
157 self.readerr() |
150 self.readerr() |
158 |
151 |
159 def lock(self): |
152 def lock(self): |
160 self.call("lock") |
153 self._call("lock") |
161 return remotelock(self) |
154 return remotelock(self) |
162 |
155 |
163 def unlock(self): |
156 def unlock(self): |
164 self.call("unlock") |
157 self._call("unlock") |
165 |
158 |
166 def changegroup(self, nodes, kind): |
159 def changegroup(self, nodes, kind): |
167 n = " ".join(map(hex, nodes)) |
160 n = " ".join(map(hex, nodes)) |
168 return self.do_cmd("changegroup", roots=n) |
161 return self._callstream("changegroup", roots=n) |
169 |
162 |
170 def changegroupsubset(self, bases, heads, kind): |
163 def changegroupsubset(self, bases, heads, kind): |
171 self.requirecap('changegroupsubset', _('look up remote changes')) |
164 self.requirecap('changegroupsubset', _('look up remote changes')) |
172 bases = " ".join(map(hex, bases)) |
165 bases = " ".join(map(hex, bases)) |
173 heads = " ".join(map(hex, heads)) |
166 heads = " ".join(map(hex, heads)) |
174 return self.do_cmd("changegroupsubset", bases=bases, heads=heads) |
167 return self._callstream("changegroupsubset", bases=bases, heads=heads) |
175 |
168 |
176 def unbundle(self, cg, heads, source): |
169 def unbundle(self, cg, heads, source): |
177 '''Send cg (a readable file-like object representing the |
170 '''Send cg (a readable file-like object representing the |
178 changegroup to push, typically a chunkbuffer object) to the |
171 changegroup to push, typically a chunkbuffer object) to the |
179 remote server as a bundle. Return an integer indicating the |
172 remote server as a bundle. Return an integer indicating the |
180 result of the push (see localrepository.addchangegroup()).''' |
173 result of the push (see localrepository.addchangegroup()).''' |
181 d = self.call("unbundle", heads=' '.join(map(hex, heads))) |
174 d = self._call("unbundle", heads=' '.join(map(hex, heads))) |
182 if d: |
175 if d: |
183 # remote may send "unsynced changes" |
176 # remote may send "unsynced changes" |
184 self.abort(error.RepoError(_("push refused: %s") % d)) |
177 self.abort(error.RepoError(_("push refused: %s") % d)) |
185 |
178 |
186 while 1: |
179 while 1: |
204 |
197 |
205 def addchangegroup(self, cg, source, url): |
198 def addchangegroup(self, cg, source, url): |
206 '''Send a changegroup to the remote server. Return an integer |
199 '''Send a changegroup to the remote server. Return an integer |
207 similar to unbundle(). DEPRECATED, since it requires locking the |
200 similar to unbundle(). DEPRECATED, since it requires locking the |
208 remote.''' |
201 remote.''' |
209 d = self.call("addchangegroup") |
202 d = self._call("addchangegroup") |
210 if d: |
203 if d: |
211 self.abort(error.RepoError(_("push refused: %s") % d)) |
204 self.abort(error.RepoError(_("push refused: %s") % d)) |
212 while 1: |
205 while 1: |
213 d = cg.read(4096) |
206 d = cg.read(4096) |
214 if not d: |
207 if not d: |