mercurial/sshrepo.py
changeset 5176 664a1c312972
parent 3891 6b4127c7d52a
child 5196 86e95b93559a
equal deleted inserted replaced
5175:012dbf88b9b2 5176:664a1c312972
     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 *
     8 from node import *
     9 from remoterepo import *
     9 from remoterepo import *
    10 from i18n import _
    10 from i18n import _
    11 import hg, os, re, stat, util
    11 import repo, os, re, stat, util
    12 
    12 
    13 class sshrepository(remoterepository):
    13 class sshrepository(remoterepository):
    14     def __init__(self, ui, path, create=0):
    14     def __init__(self, ui, path, create=0):
    15         self._url = path
    15         self._url = path
    16         self.ui = ui
    16         self.ui = ui
    17 
    17 
    18         m = re.match(r'^ssh://(([^@]+)@)?([^:/]+)(:(\d+))?(/(.*))?$', path)
    18         m = re.match(r'^ssh://(([^@]+)@)?([^:/]+)(:(\d+))?(/(.*))?$', path)
    19         if not m:
    19         if not m:
    20             self.raise_(hg.RepoError(_("couldn't parse location %s") % path))
    20             self.raise_(repo.RepoError(_("couldn't parse location %s") % path))
    21 
    21 
    22         self.user = m.group(2)
    22         self.user = m.group(2)
    23         self.host = m.group(3)
    23         self.host = m.group(3)
    24         self.port = m.group(5)
    24         self.port = m.group(5)
    25         self.path = m.group(7) or "."
    25         self.path = m.group(7) or "."
    35             cmd = cmd % (sshcmd, args, remotecmd, self.path)
    35             cmd = cmd % (sshcmd, args, remotecmd, self.path)
    36 
    36 
    37             ui.note('running %s\n' % cmd)
    37             ui.note('running %s\n' % cmd)
    38             res = os.system(cmd)
    38             res = os.system(cmd)
    39             if res != 0:
    39             if res != 0:
    40                 self.raise_(hg.RepoError(_("could not create remote repo")))
    40                 self.raise_(repo.RepoError(_("could not create remote repo")))
    41 
    41 
    42         self.validate_repo(ui, sshcmd, args, remotecmd)
    42         self.validate_repo(ui, sshcmd, args, remotecmd)
    43 
    43 
    44     def url(self):
    44     def url(self):
    45         return self._url
    45         return self._url
    67             if l:
    67             if l:
    68                 ui.debug(_("remote: "), l)
    68                 ui.debug(_("remote: "), l)
    69             lines.append(l)
    69             lines.append(l)
    70             max_noise -= 1
    70             max_noise -= 1
    71         else:
    71         else:
    72             self.raise_(hg.RepoError(_("no suitable response from remote hg")))
    72             self.raise_(repo.RepoError(_("no suitable response from remote hg")))
    73 
    73 
    74         self.capabilities = ()
    74         self.capabilities = ()
    75         lines.reverse()
    75         lines.reverse()
    76         for l in lines:
    76         for l in lines:
    77             if l.startswith("capabilities:"):
    77             if l.startswith("capabilities:"):
   134         d = self.call("lookup", key=key)
   134         d = self.call("lookup", key=key)
   135         success, data = d[:-1].split(" ", 1)
   135         success, data = d[:-1].split(" ", 1)
   136         if int(success):
   136         if int(success):
   137             return bin(data)
   137             return bin(data)
   138         else:
   138         else:
   139             self.raise_(hg.RepoError(data))
   139             self.raise_(repo.RepoError(data))
   140 
   140 
   141     def heads(self):
   141     def heads(self):
   142         d = self.call("heads")
   142         d = self.call("heads")
   143         try:
   143         try:
   144             return map(bin, d[:-1].split(" "))
   144             return map(bin, d[:-1].split(" "))
   173         return self.do_cmd("changegroupsubset", bases=bases, heads=heads)
   173         return self.do_cmd("changegroupsubset", bases=bases, heads=heads)
   174 
   174 
   175     def unbundle(self, cg, heads, source):
   175     def unbundle(self, cg, heads, source):
   176         d = self.call("unbundle", heads=' '.join(map(hex, heads)))
   176         d = self.call("unbundle", heads=' '.join(map(hex, heads)))
   177         if d:
   177         if d:
   178             self.raise_(hg.RepoError(_("push refused: %s") % d))
   178             self.raise_(repo.RepoError(_("push refused: %s") % d))
   179 
   179 
   180         while 1:
   180         while 1:
   181             d = cg.read(4096)
   181             d = cg.read(4096)
   182             if not d: break
   182             if not d: break
   183             self.pipeo.write(str(len(d)) + '\n')
   183             self.pipeo.write(str(len(d)) + '\n')
   199         return int(r)
   199         return int(r)
   200 
   200 
   201     def addchangegroup(self, cg, source, url):
   201     def addchangegroup(self, cg, source, url):
   202         d = self.call("addchangegroup")
   202         d = self.call("addchangegroup")
   203         if d:
   203         if d:
   204             self.raise_(hg.RepoError(_("push refused: %s") % d))
   204             self.raise_(repo.RepoError(_("push refused: %s") % d))
   205         while 1:
   205         while 1:
   206             d = cg.read(4096)
   206             d = cg.read(4096)
   207             if not d: break
   207             if not d: break
   208             self.pipeo.write(d)
   208             self.pipeo.write(d)
   209             self.readerr()
   209             self.readerr()