##// END OF EJS Templates
outgoing: pay attention to `default:pushurl` for bookmarks and subrepos...
outgoing: pay attention to `default:pushurl` for bookmarks and subrepos The problem here was that `default:pushurl` and `default` get translated to a single entry in `ui.paths` named 'default', with an attribute for 'pushloc', 'loc', and 'rawloc'. ui.expandpath() then always takes the `rawloc` attribute. Maybe the ui.expandpath() API is busted and should be removed? Or maybe getpath() should return a copy that adds an attribute reflecting the URL of the path chosen? I thought that I could remove the code in hg._outgoing() and pass the location resolved in commands.py as `dest`, but unfortunately that code is needed there to resolve #branch type URLs. Maybe that should be pulled up to commands.py, because I can't see any reasonable behavior for a subrepo path that's constructed out of that type of URL. The push command already resolves this early, so that works properly. But it looks like bundle, histedit, largefiles, patchbomb, and summary use a similar pattern, so they are likely similarly affected.

File last commit:

r38121:666d90ac default
r38188:dfb888aa default
Show More
hg-ssh
97 lines | 3.2 KiB | text/plain | TextLexer
Thomas Arendsen Hein
Added hg-ssh - a wrapper for ssh access to a limited set of mercurial repos...
r1537 #!/usr/bin/env python
#
Thomas Arendsen Hein
Adjust contrib/hg-ssh for moved dispatch() function.
r5191 # Copyright 2005-2007 by Intevation GmbH <intevation@intevation.de>
Martin Geisler
add blank line after copyright notices and after header
r8228 #
Thomas Arendsen Hein
Added hg-ssh - a wrapper for ssh access to a limited set of mercurial repos...
r1537 # Author(s):
# Thomas Arendsen Hein <thomas@intevation.de>
#
Martin Geisler
updated license to be explicit about GPL version 2
r8225 # This software may be used and distributed according to the terms of the
Matt Mackall
Update license to GPLv2+
r10263 # GNU General Public License version 2 or any later version.
Thomas Arendsen Hein
Added hg-ssh - a wrapper for ssh access to a limited set of mercurial repos...
r1537
"""
hg-ssh - a wrapper for ssh access to a limited set of mercurial repos
To be used in ~/.ssh/authorized_keys with the "command" option, see sshd(8):
command="hg-ssh path/to/repo1 /path/to/repo2 ~/repo3 ~user/repo4" ssh-dss ...
(probably together with these other useful options:
no-port-forwarding,no-X11-forwarding,no-agent-forwarding)
Andreas Freimuth
hg-ssh: fix duplicate word in docstring
r13996 This allows pull/push over ssh from/to the repositories given as arguments.
Thomas Arendsen Hein
Added hg-ssh - a wrapper for ssh access to a limited set of mercurial repos...
r1537
If all your repositories are subdirectories of a common directory, you can
allow shorter paths with:
command="cd path/to/my/repositories && hg-ssh repo1 subdir/repo2"
Thomas Arendsen Hein
Added hint to hg-ssh that you can use shell pattern matching.
r1640
You can use pattern matching of your normal shell, e.g.:
command="cd repos && hg-ssh user/thomas/* projects/{mercurial,foo}"
David Schleimer
hg-ssh: read-only flag...
r16836
You can also add a --read-only flag to allow read-only access to a key, e.g.:
command="hg-ssh --read-only repos/*"
Thomas Arendsen Hein
Added hg-ssh - a wrapper for ssh access to a limited set of mercurial repos...
r1537 """
Augie Fackler
contrib: update hg-ssh to conform with import style checks
r33892 from __future__ import absolute_import
import os
import shlex
import sys
Thomas Arendsen Hein
Added hg-ssh - a wrapper for ssh access to a limited set of mercurial repos...
r1537
Thomas Arendsen Hein
Enable demandimport only in scripts, not in importable modules (issue605)...
r5197 # enable importing on demand to reduce startup time
Augie Fackler
contrib: update hg-ssh to conform with import style checks
r33892 import hgdemandimport ; hgdemandimport.enable()
Thomas Arendsen Hein
Enable demandimport only in scripts, not in importable modules (issue605)...
r5197
Augie Fackler
contrib: update hg-ssh to conform with import style checks
r33892 from mercurial import (
dispatch,
Pulkit Goyal
py3: use pycompat.fsencode to convert path to bytes...
r38121 pycompat,
Augie Fackler
contrib: update hg-ssh to conform with import style checks
r33892 ui as uimod,
)
Thomas Arendsen Hein
Added hg-ssh - a wrapper for ssh access to a limited set of mercurial repos...
r1537
David Schleimer
hg-ssh: refactor to have main() method...
r16779 def main():
Yuya Nishihara
sshserver: do setbinary() by caller (API)...
r37963 # Prevent insertion/deletion of CRs
dispatch.initstdio()
David Schleimer
hg-ssh: refactor to have main() method...
r16779 cwd = os.getcwd()
David Schleimer
hg-ssh: read-only flag...
r16836 readonly = False
args = sys.argv[1:]
while len(args):
if args[0] == '--read-only':
readonly = True
args.pop(0)
else:
break
David Schleimer
hg-ssh: refactor to have main() method...
r16779 allowed_paths = [os.path.normpath(os.path.join(cwd,
os.path.expanduser(path)))
David Schleimer
hg-ssh: read-only flag...
r16836 for path in args]
David Schleimer
hg-ssh: refactor to have main() method...
r16779 orig_cmd = os.getenv('SSH_ORIGINAL_COMMAND', '?')
try:
cmdargv = shlex.split(orig_cmd)
FUJIWARA Katsunori
misc: use modern exception syntax...
r28047 except ValueError as e:
David Schleimer
hg-ssh: refactor to have main() method...
r16779 sys.stderr.write('Illegal command "%s": %s\n' % (orig_cmd, e))
sys.exit(255)
Thomas Arendsen Hein
Added hg-ssh - a wrapper for ssh access to a limited set of mercurial repos...
r1537
David Schleimer
hg-ssh: refactor to have main() method...
r16779 if cmdargv[:2] == ['hg', '-R'] and cmdargv[3:] == ['serve', '--stdio']:
path = cmdargv[2]
repo = os.path.normpath(os.path.join(cwd, os.path.expanduser(path)))
if repo in allowed_paths:
Pulkit Goyal
py3: use pycompat.fsencode to convert path to bytes...
r38121 cmd = [b'-R', pycompat.fsencode(repo), b'serve', b'--stdio']
Augie Fackler
dispatch: protect against malicious 'hg serve --stdio' invocations (sec)...
r32050 req = dispatch.request(cmd)
David Schleimer
hg-ssh: read-only flag...
r16836 if readonly:
Augie Fackler
dispatch: protect against malicious 'hg serve --stdio' invocations (sec)...
r32050 if not req.ui:
req.ui = uimod.ui.load()
Pulkit Goyal
py3: add b'' prefixes in contrib/hg-ssh...
r38119 req.ui.setconfig(b'hooks', b'pretxnopen.hg-ssh',
b'python:__main__.rejectpush', b'hg-ssh')
req.ui.setconfig(b'hooks', b'prepushkey.hg-ssh',
b'python:__main__.rejectpush', b'hg-ssh')
Augie Fackler
dispatch: protect against malicious 'hg serve --stdio' invocations (sec)...
r32050 dispatch.dispatch(req)
David Schleimer
hg-ssh: refactor to have main() method...
r16779 else:
sys.stderr.write('Illegal repository "%s"\n' % repo)
sys.exit(255)
Thomas Arendsen Hein
Added hg-ssh - a wrapper for ssh access to a limited set of mercurial repos...
r1537 else:
David Schleimer
hg-ssh: refactor to have main() method...
r16779 sys.stderr.write('Illegal command "%s"\n' % orig_cmd)
Mads Kiilerich
hg-ssh: exit with 255 instead of -1 on error...
r16607 sys.exit(255)
Thomas Arendsen Hein
Added hg-ssh - a wrapper for ssh access to a limited set of mercurial repos...
r1537
David Schleimer
hg-ssh: read-only flag...
r16836 def rejectpush(ui, **kwargs):
Pulkit Goyal
py3: add b'' prefixes in contrib/hg-ssh...
r38119 ui.warn((b"Permission denied\n"))
David Schleimer
hg-ssh: read-only flag...
r16836 # mercurial hooks use unix process conventions for hook return values
# so a truthy return means failure
return True
David Schleimer
hg-ssh: refactor to have main() method...
r16779 if __name__ == '__main__':
main()