mercurial/sshrepo.py
changeset 7637 1d54e2f6c0b7
parent 7622 4dd7b28003d2
child 7641 d2f753830f80
equal deleted inserted replaced
7636:e3f8c6d6b72e 7637:1d54e2f6c0b7
     5 # This software may be used and distributed according to the terms
     5 # This software may be used and distributed according to the terms
     6 # of the GNU General Public License, incorporated herein by reference.
     6 # of the GNU General Public License, incorporated herein by reference.
     7 
     7 
     8 from node import bin, hex
     8 from node import bin, hex
     9 from i18n import _
     9 from i18n import _
    10 import repo, os, re, util
    10 import repo, os, re, util, error
    11 
    11 
    12 class remotelock(object):
    12 class remotelock(object):
    13     def __init__(self, repo):
    13     def __init__(self, repo):
    14         self.repo = repo
    14         self.repo = repo
    15     def release(self):
    15     def release(self):
    24         self._url = path
    24         self._url = path
    25         self.ui = ui
    25         self.ui = ui
    26 
    26 
    27         m = re.match(r'^ssh://(([^@]+)@)?([^:/]+)(:(\d+))?(/(.*))?$', path)
    27         m = re.match(r'^ssh://(([^@]+)@)?([^:/]+)(:(\d+))?(/(.*))?$', path)
    28         if not m:
    28         if not m:
    29             self.raise_(repo.RepoError(_("couldn't parse location %s") % path))
    29             self.raise_(error.RepoError(_("couldn't parse location %s") % path))
    30 
    30 
    31         self.user = m.group(2)
    31         self.user = m.group(2)
    32         self.host = m.group(3)
    32         self.host = m.group(3)
    33         self.port = m.group(5)
    33         self.port = m.group(5)
    34         self.path = m.group(7) or "."
    34         self.path = m.group(7) or "."
    43             cmd = cmd % (sshcmd, args, remotecmd, self.path)
    43             cmd = cmd % (sshcmd, args, remotecmd, self.path)
    44 
    44 
    45             ui.note(_('running %s\n') % cmd)
    45             ui.note(_('running %s\n') % cmd)
    46             res = util.system(cmd)
    46             res = util.system(cmd)
    47             if res != 0:
    47             if res != 0:
    48                 self.raise_(repo.RepoError(_("could not create remote repo")))
    48                 self.raise_(error.RepoError(_("could not create remote repo")))
    49 
    49 
    50         self.validate_repo(ui, sshcmd, args, remotecmd)
    50         self.validate_repo(ui, sshcmd, args, remotecmd)
    51 
    51 
    52     def url(self):
    52     def url(self):
    53         return self._url
    53         return self._url
    76             if l:
    76             if l:
    77                 ui.debug(_("remote: "), l)
    77                 ui.debug(_("remote: "), l)
    78             lines.append(l)
    78             lines.append(l)
    79             max_noise -= 1
    79             max_noise -= 1
    80         else:
    80         else:
    81             self.raise_(repo.RepoError(_("no suitable response from remote hg")))
    81             self.raise_(error.RepoError(_("no suitable response from remote hg")))
    82 
    82 
    83         self.capabilities = util.set()
    83         self.capabilities = util.set()
    84         lines.reverse()
    84         lines.reverse()
    85         for l in lines:
    85         for l in lines:
    86             if l.startswith("capabilities:"):
    86             if l.startswith("capabilities:"):
   155         d = self.call("lookup", key=key)
   155         d = self.call("lookup", key=key)
   156         success, data = d[:-1].split(" ", 1)
   156         success, data = d[:-1].split(" ", 1)
   157         if int(success):
   157         if int(success):
   158             return bin(data)
   158             return bin(data)
   159         else:
   159         else:
   160             self.raise_(repo.RepoError(data))
   160             self.raise_(error.RepoError(data))
   161 
   161 
   162     def heads(self):
   162     def heads(self):
   163         d = self.call("heads")
   163         d = self.call("heads")
   164         try:
   164         try:
   165             return map(bin, d[:-1].split(" "))
   165             return map(bin, d[:-1].split(" "))
   196 
   196 
   197     def unbundle(self, cg, heads, source):
   197     def unbundle(self, cg, heads, source):
   198         d = self.call("unbundle", heads=' '.join(map(hex, heads)))
   198         d = self.call("unbundle", heads=' '.join(map(hex, heads)))
   199         if d:
   199         if d:
   200             # remote may send "unsynced changes"
   200             # remote may send "unsynced changes"
   201             self.raise_(repo.RepoError(_("push refused: %s") % d))
   201             self.raise_(error.RepoError(_("push refused: %s") % d))
   202 
   202 
   203         while 1:
   203         while 1:
   204             d = cg.read(4096)
   204             d = cg.read(4096)
   205             if not d:
   205             if not d:
   206                 break
   206                 break
   209         self._send("", flush=True)
   209         self._send("", flush=True)
   210 
   210 
   211         r = self._recv()
   211         r = self._recv()
   212         if r:
   212         if r:
   213             # remote may send "unsynced changes"
   213             # remote may send "unsynced changes"
   214             self.raise_(repo.RepoError(_("push failed: %s") % r))
   214             self.raise_(error.RepoError(_("push failed: %s") % r))
   215 
   215 
   216         r = self._recv()
   216         r = self._recv()
   217         try:
   217         try:
   218             return int(r)
   218             return int(r)
   219         except:
   219         except:
   220             self.raise_(util.UnexpectedOutput(_("unexpected response:"), r))
   220             self.raise_(util.UnexpectedOutput(_("unexpected response:"), r))
   221 
   221 
   222     def addchangegroup(self, cg, source, url):
   222     def addchangegroup(self, cg, source, url):
   223         d = self.call("addchangegroup")
   223         d = self.call("addchangegroup")
   224         if d:
   224         if d:
   225             self.raise_(repo.RepoError(_("push refused: %s") % d))
   225             self.raise_(error.RepoError(_("push refused: %s") % d))
   226         while 1:
   226         while 1:
   227             d = cg.read(4096)
   227             d = cg.read(4096)
   228             if not d:
   228             if not d:
   229                 break
   229                 break
   230             self.pipeo.write(d)
   230             self.pipeo.write(d)