Skip to contentSkip to conversation

git-remote-hg : Enable use of, $GIT_DIR/hg/origin/clone/.hg/hgrc

PATCH In review Daniel Liew 2 participants 10 messages Jun 15, 2016

lore
Share & tools
lore
#0 lore raw

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
author
#1 lore raw

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.

---
 contrib/remote-helpers/git-remote-hg | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
contrib/remote-helpers/git-remote-hg +1 -2
index eb89ef6..451842a 100755
@@ -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

#2 lore raw
In reply to Daniel Liew
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
---
 contrib/remote-helpers/git-remote-hg | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
contrib/remote-helpers/git-remote-hg +0 -0
index eb89ef6..451842a 100755

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
author
#3 lore raw
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
---
 contrib/remote-helpers/git-remote-hg | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
contrib/remote-helpers/git-remote-hg +0 -0
index eb89ef6..451842a 100755
@@ -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 -1
         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.

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.

#4 lore raw
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 = 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.
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
author
#5 lore raw
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.

#6 lore raw
Quoted 5 lines · Delcypher
Quoted 1 line

What version of Mercurial are you using?

$ hg --version

Mercurial Distributed SCM (version 2.9.2)

Same as me. And which version of git-remote-hg are you using?

Signature · 1 line
Felipe Contreras
author
#7 lore raw
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.

[1] https://boogie.codeplex.com/SourceControl/latest

#8 lore raw
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 = 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``

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