mercurial/sshrepo.py
changeset 11590 0b15aee0a306
parent 11589 e8d22fe2ddab
child 11591 0d9cb3f3b0a1
equal deleted inserted replaced
11589:e8d22fe2ddab 11590:0b15aee0a306
    25         self._url = path
    25         self._url = path
    26         self.ui = ui
    26         self.ui = ui
    27 
    27 
    28         m = re.match(r'^ssh://(([^@]+)@)?([^:/]+)(:(\d+))?(/(.*))?$', path)
    28         m = re.match(r'^ssh://(([^@]+)@)?([^:/]+)(:(\d+))?(/(.*))?$', path)
    29         if not m:
    29         if not m:
    30             self.abort(error.RepoError(_("couldn't parse location %s") % path))
    30             self._abort(error.RepoError(_("couldn't parse location %s") % path))
    31 
    31 
    32         self.user = m.group(2)
    32         self.user = m.group(2)
    33         self.host = m.group(3)
    33         self.host = m.group(3)
    34         self.port = m.group(5)
    34         self.port = m.group(5)
    35         self.path = m.group(7) or "."
    35         self.path = m.group(7) or "."
    44             cmd = cmd % (sshcmd, args, remotecmd, self.path)
    44             cmd = cmd % (sshcmd, args, remotecmd, self.path)
    45 
    45 
    46             ui.note(_('running %s\n') % cmd)
    46             ui.note(_('running %s\n') % cmd)
    47             res = util.system(cmd)
    47             res = util.system(cmd)
    48             if res != 0:
    48             if res != 0:
    49                 self.abort(error.RepoError(_("could not create remote repo")))
    49                 self._abort(error.RepoError(_("could not create remote repo")))
    50 
    50 
    51         self.validate_repo(ui, sshcmd, args, remotecmd)
    51         self.validate_repo(ui, sshcmd, args, remotecmd)
    52 
    52 
    53     def url(self):
    53     def url(self):
    54         return self._url
    54         return self._url
    77             if l:
    77             if l:
    78                 ui.debug("remote: ", l)
    78                 ui.debug("remote: ", l)
    79             lines.append(l)
    79             lines.append(l)
    80             max_noise -= 1
    80             max_noise -= 1
    81         else:
    81         else:
    82             self.abort(error.RepoError(_("no suitable response from remote hg")))
    82             self._abort(error.RepoError(_("no suitable response from remote hg")))
    83 
    83 
    84         self.capabilities = set()
    84         self.capabilities = set()
    85         for l in reversed(lines):
    85         for l in reversed(lines):
    86             if l.startswith("capabilities:"):
    86             if l.startswith("capabilities:"):
    87                 self.capabilities.update(l[:-1].split(":")[1].split())
    87                 self.capabilities.update(l[:-1].split(":")[1].split())
    94                 break
    94                 break
    95             l = self.pipee.readline()
    95             l = self.pipee.readline()
    96             if not l:
    96             if not l:
    97                 break
    97                 break
    98             self.ui.status(_("remote: "), l)
    98             self.ui.status(_("remote: "), l)
    99 
       
   100     def abort(self, exception):
       
   101         self.cleanup()
       
   102         raise exception
       
   103 
    99 
   104     def _abort(self, exception):
   100     def _abort(self, exception):
   105         self.cleanup()
   101         self.cleanup()
   106         raise exception
   102         raise exception
   107 
   103 
   136         l = self.pipei.readline()
   132         l = self.pipei.readline()
   137         self.readerr()
   133         self.readerr()
   138         try:
   134         try:
   139             l = int(l)
   135             l = int(l)
   140         except:
   136         except:
   141             self.abort(error.ResponseError(_("unexpected response:"), l))
   137             self._abort(error.ResponseError(_("unexpected response:"), l))
   142         return self.pipei.read(l)
   138         return self.pipei.read(l)
   143 
   139 
   144     def _send(self, data, flush=False):
   140     def _send(self, data, flush=False):
   145         self.pipeo.write("%d\n" % len(data))
   141         self.pipeo.write("%d\n" % len(data))
   146         if data:
   142         if data:
   172         remote server as a bundle. Return an integer indicating the
   168         remote server as a bundle. Return an integer indicating the
   173         result of the push (see localrepository.addchangegroup()).'''
   169         result of the push (see localrepository.addchangegroup()).'''
   174         d = self._call("unbundle", heads=' '.join(map(hex, heads)))
   170         d = self._call("unbundle", heads=' '.join(map(hex, heads)))
   175         if d:
   171         if d:
   176             # remote may send "unsynced changes"
   172             # remote may send "unsynced changes"
   177             self.abort(error.RepoError(_("push refused: %s") % d))
   173             self._abort(error.RepoError(_("push refused: %s") % d))
   178 
   174 
   179         while 1:
   175         while 1:
   180             d = cg.read(4096)
   176             d = cg.read(4096)
   181             if not d:
   177             if not d:
   182                 break
   178                 break
   185         self._send("", flush=True)
   181         self._send("", flush=True)
   186 
   182 
   187         r = self._recv()
   183         r = self._recv()
   188         if r:
   184         if r:
   189             # remote may send "unsynced changes"
   185             # remote may send "unsynced changes"
   190             self.abort(error.RepoError(_("push failed: %s") % r))
   186             self._abort(error.RepoError(_("push failed: %s") % r))
   191 
   187 
   192         r = self._recv()
   188         r = self._recv()
   193         try:
   189         try:
   194             return int(r)
   190             return int(r)
   195         except:
   191         except:
   196             self.abort(error.ResponseError(_("unexpected response:"), r))
   192             self._abort(error.ResponseError(_("unexpected response:"), r))
   197 
   193 
   198     def addchangegroup(self, cg, source, url):
   194     def addchangegroup(self, cg, source, url):
   199         '''Send a changegroup to the remote server.  Return an integer
   195         '''Send a changegroup to the remote server.  Return an integer
   200         similar to unbundle(). DEPRECATED, since it requires locking the
   196         similar to unbundle(). DEPRECATED, since it requires locking the
   201         remote.'''
   197         remote.'''
   202         d = self._call("addchangegroup")
   198         d = self._call("addchangegroup")
   203         if d:
   199         if d:
   204             self.abort(error.RepoError(_("push refused: %s") % d))
   200             self._abort(error.RepoError(_("push refused: %s") % d))
   205         while 1:
   201         while 1:
   206             d = cg.read(4096)
   202             d = cg.read(4096)
   207             if not d:
   203             if not d:
   208                 break
   204                 break
   209             self.pipeo.write(d)
   205             self.pipeo.write(d)
   216         if not r:
   212         if not r:
   217             return 1
   213             return 1
   218         try:
   214         try:
   219             return int(r)
   215             return int(r)
   220         except:
   216         except:
   221             self.abort(error.ResponseError(_("unexpected response:"), r))
   217             self._abort(error.ResponseError(_("unexpected response:"), r))
   222 
   218 
   223 instance = sshrepository
   219 instance = sshrepository