##// END OF EJS Templates
Add MOTD display to hgweb and hgwebdir....
Add MOTD display to hgweb and hgwebdir. The hgweb "footer" template now has space for an optional message of the day (MOTD). This is used in two contexts: 1) On the hgwebdir index page 2) On various pages of each individual repo For both cases, the MOTD is read out of an entry named "motd" in the [web] section of a config file -- the only difference is which file is used. For #1, you need to add the section to hgweb.config; for #2, you need to add to the repo's .hgrc file. I suggest something like this: [web] motd = <p>To download these repositories, <a href="http://www.selenic.com/mercurial">get Mercurial</a> and then type something like:</p><p><pre>hg clone http://gs3080.sp.cs.cmu.edu/hg.cgi/cpmpy&lt;/pre&gt;&lt;/p&gt;You can also click the Download links to get an archive of the latest revision. An online sample is available here: http://gs3080.sp.cs.cmu.edu/hg.cgi

File last commit:

r2046:d14497cb default
r2148:c72e618c default
Show More
sshrepo.py
155 lines | 4.5 KiB | text/x-python | PythonLexer
mpm@selenic.com
sshrepo: adjust file comment
r1096 # sshrepo.py - ssh repository proxy class for mercurial
mpm@selenic.com
Break apart hg.py...
r1089 #
# Copyright 2005 Matt Mackall <mpm@selenic.com>
#
# This software may be used and distributed according to the terms
# of the GNU General Public License, incorporated herein by reference.
mpm@selenic.com
Fix sshrepo imports
r1103 from node import *
from remoterepo import *
Benoit Boissinot
i18n first part: make '_' available for files who need it
r1400 from i18n import gettext as _
Bryan O'Sullivan
Fix lots of exception-related problems....
r1251 from demandload import *
zbynek@alex.kolej.mff.cuni.cz
Replacing select.select() with os.fstat() which works also on windows.
r1357 demandload(globals(), "hg os re stat")
mpm@selenic.com
Break apart hg.py...
r1089
class sshrepository(remoterepository):
def __init__(self, ui, path):
self.url = path
self.ui = ui
m = re.match(r'ssh://(([^@]+)@)?([^:/]+)(:(\d+))?(/(.*))?', path)
if not m:
Benoit Boissinot
i18n part2: use '_' for all strings who are part of the user interface
r1402 raise hg.RepoError(_("couldn't parse destination %s") % path)
mpm@selenic.com
Break apart hg.py...
r1089
self.user = m.group(2)
self.host = m.group(3)
self.port = m.group(5)
self.path = m.group(7) or "."
args = self.user and ("%s@%s" % (self.user, self.host)) or self.host
args = self.port and ("%s -p %s") % (args, self.port) or args
sshcmd = self.ui.config("ui", "ssh", "ssh")
remotecmd = self.ui.config("ui", "remotecmd", "hg")
Bryan O'Sullivan
Give ssh a better chance of working on Windows....
r1330 cmd = '%s %s "%s -R %s serve --stdio"'
mpm@selenic.com
Break apart hg.py...
r1089 cmd = cmd % (sshcmd, args, remotecmd, self.path)
Bryan O'Sullivan
Help debugability: print ssh command being used when --verbose.
r1332 ui.note('running %s\n' % cmd)
Bryan O'Sullivan
Give ssh a better chance of working on Windows....
r1330 self.pipeo, self.pipei, self.pipee = os.popen3(cmd, 'b')
mpm@selenic.com
Break apart hg.py...
r1089
Matt Mackall
ssh: skip noise generated by remote shell...
r2028 # skip any noise generated by remote shell
r = self.do_cmd("between", pairs=("%s-%s" % ("0"*40, "0"*40)))
l1 = ""
Thomas Arendsen Hein
Don't enter an endless loop if remote hg doesn't answer, show remote noise....
r2040 l2 = "dummy"
Thomas Arendsen Hein
Show remote ssh noise only with --debug and increase the limit to 500 lines....
r2046 max_noise = 500
Thomas Arendsen Hein
Don't enter an endless loop if remote hg doesn't answer, show remote noise....
r2040 while l2 and max_noise:
Matt Mackall
ssh: skip noise generated by remote shell...
r2028 l2 = r.readline()
self.readerr()
if l1 == "1\n" and l2 == "\n":
break
Thomas Arendsen Hein
Don't enter an endless loop if remote hg doesn't answer, show remote noise....
r2040 if l1:
Thomas Arendsen Hein
Show remote ssh noise only with --debug and increase the limit to 500 lines....
r2046 ui.debug(_("remote: "), l1)
Matt Mackall
ssh: skip noise generated by remote shell...
r2028 l1 = l2
Thomas Arendsen Hein
Don't enter an endless loop if remote hg doesn't answer, show remote noise....
r2040 max_noise -= 1
else:
if l1:
Thomas Arendsen Hein
Show remote ssh noise only with --debug and increase the limit to 500 lines....
r2046 ui.debug(_("remote: "), l1)
Thomas Arendsen Hein
Don't enter an endless loop if remote hg doesn't answer, show remote noise....
r2040 raise hg.RepoError(_("no response from remote hg"))
Matt Mackall
ssh: skip noise generated by remote shell...
r2028
mpm@selenic.com
Break apart hg.py...
r1089 def readerr(self):
while 1:
zbynek@alex.kolej.mff.cuni.cz
Replacing select.select() with os.fstat() which works also on windows.
r1357 size = os.fstat(self.pipee.fileno())[stat.ST_SIZE]
if size == 0: break
mpm@selenic.com
Break apart hg.py...
r1089 l = self.pipee.readline()
if not l: break
Benoit Boissinot
i18n part2: use '_' for all strings who are part of the user interface
r1402 self.ui.status(_("remote: "), l)
mpm@selenic.com
Break apart hg.py...
r1089
def __del__(self):
try:
self.pipeo.close()
self.pipei.close()
Matt Mackall
Partially revert ssh change so we read all of remote ssh stream
r1358 # read the error descriptor until EOF
for l in self.pipee:
Benoit Boissinot
i18n part2: use '_' for all strings who are part of the user interface
r1402 self.ui.status(_("remote: "), l)
mpm@selenic.com
Break apart hg.py...
r1089 self.pipee.close()
except:
pass
def dev(self):
return -1
def do_cmd(self, cmd, **args):
Benoit Boissinot
i18n part2: use '_' for all strings who are part of the user interface
r1402 self.ui.debug(_("sending %s command\n") % cmd)
mpm@selenic.com
Break apart hg.py...
r1089 self.pipeo.write("%s\n" % cmd)
for k, v in args.items():
self.pipeo.write("%s %d\n" % (k, len(v)))
self.pipeo.write(v)
self.pipeo.flush()
return self.pipei
def call(self, cmd, **args):
r = self.do_cmd(cmd, **args)
l = r.readline()
self.readerr()
try:
l = int(l)
except:
Benoit Boissinot
i18n part2: use '_' for all strings who are part of the user interface
r1402 raise hg.RepoError(_("unexpected response '%s'") % l)
mpm@selenic.com
Break apart hg.py...
r1089 return r.read(l)
def lock(self):
self.call("lock")
return remotelock(self)
def unlock(self):
self.call("unlock")
def heads(self):
d = self.call("heads")
try:
return map(bin, d[:-1].split(" "))
except:
Benoit Boissinot
i18n part2: use '_' for all strings who are part of the user interface
r1402 raise hg.RepoError(_("unexpected response '%s'") % (d[:400] + "..."))
mpm@selenic.com
Break apart hg.py...
r1089
def branches(self, nodes):
n = " ".join(map(hex, nodes))
d = self.call("branches", nodes=n)
try:
br = [ tuple(map(bin, b.split(" "))) for b in d.splitlines() ]
return br
except:
Benoit Boissinot
i18n part2: use '_' for all strings who are part of the user interface
r1402 raise hg.RepoError(_("unexpected response '%s'") % (d[:400] + "..."))
mpm@selenic.com
Break apart hg.py...
r1089
def between(self, pairs):
n = "\n".join(["-".join(map(hex, p)) for p in pairs])
d = self.call("between", pairs=n)
try:
p = [ l and map(bin, l.split(" ")) or [] for l in d.splitlines() ]
return p
except:
Benoit Boissinot
i18n part2: use '_' for all strings who are part of the user interface
r1402 raise hg.RepoError(_("unexpected response '%s'") % (d[:400] + "..."))
mpm@selenic.com
Break apart hg.py...
r1089
Vadim Gelfer
add preoutgoing and outgoing hooks....
r1736 def changegroup(self, nodes, kind):
mpm@selenic.com
Break apart hg.py...
r1089 n = " ".join(map(hex, nodes))
f = self.do_cmd("changegroup", roots=n)
return self.pipei
def addchangegroup(self, cg):
d = self.call("addchangegroup")
if d:
Benoit Boissinot
i18n part2: use '_' for all strings who are part of the user interface
r1402 raise hg.RepoError(_("push refused: %s"), d)
mpm@selenic.com
Break apart hg.py...
r1089
while 1:
d = cg.read(4096)
if not d: break
self.pipeo.write(d)
self.readerr()
self.pipeo.flush()
self.readerr()
l = int(self.pipei.readline())
Vadim Gelfer
add merge command. means same thing as "update -m"....
r2019 r = self.pipei.read(l)
if not r:
return 1
return int(r)