git-remote-hg : Enable use of, $GIT_DIR/hg/origin/clone/.hg/hgrc
PATCH 1/1 git-remote-hg : Enable use of, $GIT_DIR/hg/origin/clone/.hg/hgrc
git-remote-hg : Enable use of, $GIT_DIR/hg/origin/clone/.hg/hgrc
Use the hgrc configuration file in the internal mercurial repository in addition to the other system wide hgrc files. This is done by using the 'ui' object from the 'repository' object which will have loaded the repository hgrc file if it exists.
Prior to this patch the mercurial repository's hgrc file was ignored which I consider to be a bug.
--- contrib/remote-helpers/git-remote-hg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
(quoted diff) +0 -0
b/contrib/remote-helpers/git-remote-hg
index eb89ef6..451842a 100755
contrib/remote-helpers/git-remote-hg +1 -1
@@ -421,7 +421,7 @@ def get_repo(url, alias): repo = hg.repository(myui, local_path) try: - peer = hg.peer(myui, {}, url) + peer = hg.peer(repo._unfilteredrepo.ui, {}, url) except: die('Repository error') repo.pull(peer, heads=None, force=True)
Signature · 1 line
1.9.0
ping.
Quoted 33 lines · Daniel Liew
git-remote-hg : Enable use of, $GIT_DIR/hg/origin/clone/.hg/hgrc
Use the hgrc configuration file in the internal mercurial repository in addition to the other system wide hgrc files. This is done by using the 'ui' object from the 'repository' object which will have loaded the repository hgrc file if it exists.
Prior to this patch the mercurial repository's hgrc file was ignored which I consider to be a bug.
Signed-off-by Dan Liew <[email protected]>--- contrib/remote-helpers/git-remote-hg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)contrib/remote-helpers/git-remote-hg +1
-2@@ -421,7 +421,7 @@ def get_repo(url, alias): repo = hg.repository(myui, local_path) try: - peer = hg.peer(myui, {}, url) + peer = hg.peer(repo._unfilteredrepo.ui, {}, url) except: die('Repository error') repo.pull(peer, heads=None, force=True) --1.9.0
Quoted 6 lines · Daniel Liew
git-remote-hg : Enable use of, $GIT_DIR/hg/origin/clone/.hg/hgrc
Use the hgrc configuration file in the internal mercurial repository in addition to the other system wide hgrc files. This is done by using the 'ui' object from the 'repository' object which will have loaded the repository hgrc file if it exists.
What is the problem you are trying to solve? Is there a way to test that this code is working correctly?
Quoted 2 lines
Prior to this patch the mercurial repository's hgrc file was ignored which I consider to be a bug.
It might be, although the internal repository is not supposed to be used by the user.
Quoted 11 lines
Signed-off-by Dan Liew <[email protected]>--- contrib/remote-helpers/git-remote-hg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)contrib/remote-helpers/git-remote-hg +0
-0
contrib/remote-helpers/git-remote-hg def get_repo(url, alias): · line 424
Quoted 5 lines
contrib/remote-helpers/git-remote-hg +1
-1@@ -421,7 +421,7 @@ def get_repo(url, alias): repo = hg.repository(myui, local_path) try: - peer = hg.peer(myui, {}, url) + peer = hg.peer(repo._unfilteredrepo.ui, {}, url)
Why not repo.unfiltered.ui? Or just repo.ui.
Cheers.
Signature · 1 line
Felipe Contreras
Quoted 1 line
What is the problem you are trying to solve?
The problem I was trying to solve is I wanted my authentication details to be in a hgrc local to the repository.
The problem is git-remote-hg will parse ``.git/hg/origin/clone/.hg/hgrc`` but will ignore any settings in it (this seems a little silly).
You can see that git-remote-hg parses this by placing invalid syntax in the file.
Quoted 2 lines
Is there a way to test that this
code is working correctly?
The effects are much more obvious if you use a mercurial repository that uses https and then you try to push to it with authentication details in ``.git/hg/origin/clone/.hg/hgrc``. For example
[auth]
cc.prefix = hg.codeplex.com
cc.username = USERNAME
cc.password = PASSWORD
cc.schemes = https
pushing will fail because the authorisation details get completely ignored and you will get an exception raised with a stack trace like this...
Traceback (most recent call last):
File "/home/dsl11/dev/git-remote-hg/git-remote-hg", line 1254, in <module>
sys.exit(main(sys.argv))
File "/home/dsl11/dev/git-remote-hg/git-remote-hg", line 1238, in main
do_export(parser)
File "/home/dsl11/dev/git-remote-hg/git-remote-hg", line 1119, in do_export
if not push(parser.repo, peer, parsed_refs, p_revs):
File "/home/dsl11/dev/git-remote-hg/git-remote-hg", line 1007, in push
ret = push_unsafe(repo, remote, parsed_refs, p_revs)
File "/home/dsl11/dev/git-remote-hg/git-remote-hg", line 990, in push_unsafe
return remote.unbundle(cg, remoteheads, 'push')
File "/usr/lib/python2.7/site-packages/mercurial/wireproto.py", line
308, in unbundle
ret, output = self._callpush("unbundle", cg, heads=heads)
File "/usr/lib/python2.7/site-packages/mercurial/httppeer.py", line
201, in _callpush
r = self._call(cmd, data=fp, headers=headers, **args)
File "/usr/lib/python2.7/site-packages/mercurial/httppeer.py", line
171, in _call
fp = self._callstream(cmd, **args)
File "/usr/lib/python2.7/site-packages/mercurial/httppeer.py", line
118, in _callstream
resp = self.urlopener.open(req)
File "/usr/lib/python2.7/urllib2.py", line 410, in open
response = meth(req, response)
File "/usr/lib/python2.7/urllib2.py", line 523, in http_response
'http', request, response, code, msg, hdrs)
File "/usr/lib/python2.7/urllib2.py", line 442, in error
result = self._call_chain(*args)
File "/usr/lib/python2.7/urllib2.py", line 382, in _call_chain
result = func(*args)
File "/usr/lib/python2.7/urllib2.py", line 897, in http_error_401
url, req, headers)
File "/usr/lib/python2.7/site-packages/mercurial/url.py", line 436,
in http_error_auth_reqed
self, auth_header, host, req, headers)
File "/usr/lib/python2.7/urllib2.py", line 872, in http_error_auth_reqed
response = self.retry_http_basic_auth(host, req, realm)
File "/usr/lib/python2.7/urllib2.py", line 878, in retry_http_basic_auth
user, pw = self.passwd.find_user_password(realm, host)
File "/usr/lib/python2.7/site-packages/mercurial/url.py", line 36,
in find_user_password
raise util.Abort(_('http authorization required'))
mercurial.error.Abort: http authorization required
However, if you don't have a repository to hand you could also do the following to observe the settings in the repository's hgrc being respected
1. Clone a repository
$ git clone hg::https://hg.codeplex.com/boogie
2. Add setting to ``.git/hg/origin/clone/.hg/hgrc``
[ui]
quiet = True
3. With the current of git-remote-hg, when you do a pull you see
$ git pull searching for changes no changes found Already up-to-date.
You can see that "quiet" is **not** being respected. If use my patch to git-remote-hg and run again you see
$ git pull Already up-to-date.
which shows "quiet" being respected.
Quoted 18 lines
Quoted 2 lines
Prior to this patch the mercurial repository's hgrc file was ignored which I consider to be a bug.
It might be, although the internal repository is not supposed to be used by the user.
Quoted 12 lines
Signed-off-by Dan Liew <[email protected]>--- contrib/remote-helpers/git-remote-hg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)contrib/remote-helpers/git-remote-hg +0
-0@@ -421,7 +421,7 @@ def get_repo(url, alias):
Quoted 6 lines
contrib/remote-helpers/git-remote-hg def get_repo(url, alias): · line 424
Quoted 4 lines
contrib/remote-helpers/git-remote-hg +1
-1repo = hg.repository(myui, local_path) try: - peer = hg.peer(myui, {}, url) + peer = hg.peer(repo._unfilteredrepo.ui, {}, url)Why not repo.unfiltered.ui? Or just repo.ui.
using repo.unfiltered.ui makes git-remote-hg return "ERROR: Repository error"
Using "repo.ui" works correctly. I simply did not know that was there because I was debugging using PyDev in Eclipse and I could only find a ui object in repo.unfiltered.ui. PyDev does not show "repo.ui" but it clearly works so using repo.ui is probably better than repo._unfilteredrepo.ui
Thanks,
Dan Liew.
Quoted 92 lines · Delcypher
Quoted 1 line
What is the problem you are trying to solve?
The problem I was trying to solve is I wanted my authentication details to be in a hgrc local to the repository.
The problem is git-remote-hg will parse ``.git/hg/origin/clone/.hg/hgrc`` but will ignore any settings in it (this seems a little silly).
You can see that git-remote-hg parses this by placing invalid syntax in the file.Quoted 2 lines
Is there a way to test that this
code is working correctly?The effects are much more obvious if you use a mercurial repository that uses https and then you try to push to it with authentication details in ``.git/hg/origin/clone/.hg/hgrc``. For example
[auth]
cc.prefix = hg.codeplex.com
cc.username = USERNAME
cc.password = PASSWORD
cc.schemes = httpspushing will fail because the authorisation details get completely ignored and you will get an exception raised with a stack trace like this...
Traceback (most recent call last):
File "/home/dsl11/dev/git-remote-hg/git-remote-hg", line 1254, in <module>
sys.exit(main(sys.argv))
File "/home/dsl11/dev/git-remote-hg/git-remote-hg", line 1238, in main
do_export(parser)
File "/home/dsl11/dev/git-remote-hg/git-remote-hg", line 1119, indo_export
if notpush(parser.repo, peer, parsed_refs, p_revs):
File "/home/dsl11/dev/git-remote-hg/git-remote-hg", line 1007, in push
ret =push_unsafe(repo, remote, parsed_refs, p_revs)
File "/home/dsl11/dev/git-remote-hg/git-remote-hg", line 990, inpush_unsafe
returnremote.unbundle(cg, remoteheads, 'push')
File "/usr/lib/python2.7/site-packages/mercurial/wireproto.py", line
308, in unbundle
ret, output =self._callpush("unbundle", cg, heads=heads)
File "/usr/lib/python2.7/site-packages/mercurial/httppeer.py", line
201, in_callpush
r =self._call(cmd, data=fp, headers=headers, **args)
File "/usr/lib/python2.7/site-packages/mercurial/httppeer.py", line
171, in_call
fp =self._callstream(cmd, **args)
File "/usr/lib/python2.7/site-packages/mercurial/httppeer.py", line
118, in_callstream
resp =self.urlopener.open(req)
File "/usr/lib/python2.7/urllib2.py", line 410, in open
response =meth(req, response)
File "/usr/lib/python2.7/urllib2.py", line 523, inhttp_response
'http', request, response, code, msg, hdrs)
File "/usr/lib/python2.7/urllib2.py", line 442, in error
result =self._call_chain(*args)
File "/usr/lib/python2.7/urllib2.py", line 382, in_call_chain
result =func(*args)
File "/usr/lib/python2.7/urllib2.py", line 897, inhttp_error_401
url, req, headers)
File "/usr/lib/python2.7/site-packages/mercurial/url.py", line 436,
inhttp_error_auth_reqed
self,auth_header, host, req, headers)
File "/usr/lib/python2.7/urllib2.py", line 872, inhttp_error_auth_reqed
response =self.retry_http_basic_auth(host, req, realm)
File "/usr/lib/python2.7/urllib2.py", line 878, inretry_http_basic_auth
user, pw =self.passwd.find_user_password(realm, host)
File "/usr/lib/python2.7/site-packages/mercurial/url.py", line 36,
infind_user_password
raiseutil.Abort(_('http authorization required'))
mercurial.error.Abort: http authorization requiredHowever, if you don't have a repository to hand you could also do the following to observe the settings in the repository's hgrc being respected
1. Clone a repository
$ git clone hg::https://hg.codeplex.com/boogie2. Add setting to ``.git/hg/origin/clone/.hg/hgrc``
[ui]
quiet = True3. With the current of git-remote-hg, when you do a pull you see
$ git pull searching for changes no changes found Already up-to-date.
Quoted 8 lines
You can see that "quiet" is **not** being respected. If use my patch to git-remote-hg and run again you see
$ git pull Already up-to-date.which shows "quiet" being respected.
This is what I get:
% git pull /tmp/boogie[master] nysa
searching for changes
no changes found
Already up-to-date.
% cat > .git/hg/origin/clone/.hg/hgrc <<EOF
[ui]
quiet = True
EOF
% git pull /tmp/boogie[master] nysa
Already up-to-date.
So clearly there is something different on my side.
What version of Mercurial are you using?
Signature · 1 line
Felipe Contreras
Quoted 1 line
What version of Mercurial are you using?
$ hg --version
Mercurial Distributed SCM (version 2.9.2)
(see http://mercurial.selenic.com for more information)
Copyright (C) 2005-2014 Matt Mackall and others
This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Quoted 5 lines · Delcypher
Quoted 1 line
What version of Mercurial are you using?
$ hg --versionMercurial Distributed SCM (version 2.9.2)
Same as me. And which version of git-remote-hg are you using?
Signature · 1 line
Felipe Contreras
Quoted 1 line
Same as me. And which version of git-remote-hg are you using?
I'm using the version that ships with git 1.9.2
I've taken a look and it seems I made a mistake, sorry. It seems that
[ui]
quiet = True
is being respected when placed in ``.git/hg/origin/clone/.hg/hgrc``
with the un patched version of git-remote-hg.
But it is still the case that authentication details are being ignored when present in ``.git/hg/origin/clone/.hg/hgrc``
i.e. something like the following is ignored.
[auth]
cc.prefix = hg.codeplex.com
cc.username = USERNAME
# Eurgh fixme this shouldn't live here.
cc.password = PWD
cc.schemes = https
and pushing fails. An easy way of duplicating this is forking a project on codeplex (e.g. [1]), cloning that respository, making a trivial commit and then trying to push that commit to your fork.
When I try this pushing fails because the authentication details are being ignored in ``.git/hg/origin/clone/.hg/hgrc``. Applying my patch (or your improved version using repo.ui instead of repo._unfilteredrepo.ui) fixes this for me.
Quoted 16 lines · Delcypher
Quoted 1 line
Same as me. And which version of git-remote-hg are you using?
I'm using the version that ships with git 1.9.2
I've taken a look and it seems I made a mistake, sorry. It seems that
[ui]
quiet = Trueis being respected when placed in ``.git/hg/origin/clone/.hg/hgrc``
with the un patched version of git-remote-hg.
But it is still the case that authentication details are being ignored when present in ``.git/hg/origin/clone/.hg/hgrc``
Quoted 8 lines
i.e. something like the following is ignored.
[auth]
cc.prefix = hg.codeplex.com
cc.username = USERNAME
# Eurgh fixme this shouldn't live here.
cc.password = PWD
cc.schemes = https
I see now, I've taken the patch with repo.ui and applied on my repo:
https://github.com/felipec/git/commit/ee17fe1cf80d5196be382ebbbcb1a24c05e61658
If Junio wants to take that he can add my s-o-b.
Cheers.
Signature · 1 line
Felipe Contreras
Quoted 3 lines
I see now, I've taken the patch with repo.ui and applied on my repo:
https://github.com/felipec/git/commit/ee17fe1cf80d5196be382ebbbcb1a24c05e61658
Thanks.
It might be helpful to catch the exception raised if https authentication details are missing so that a more user friendly error message can be presented. I considered doing this but I wasn't entirely sure how to correctly do any necessary clean up.