Edgewall Software
Modify

Opened 7 years ago

Closed 7 years ago

Last modified 7 years ago

#10851 closed defect (fixed)

Mercurial 2.3.1 seems to be broken with trac 1.0

Reported by: anonymous Owned by: Christian Boos
Priority: high Milestone: plugin - mercurial
Component: plugin/mercurial Version: 1.0
Severity: normal Keywords:
Cc: Branch:
Release Notes:

Added compatibility with Mercurial 2.3 (hg:1ac628cd7113)

API Changes:

Description

I used mercurial all the time with trac 0.12 and it worked.

I updated from trac 0.12 to trac 1.0 the last days.

Unfortunately I didnt realise the exact moment when the repository browser did stop to work.

In the trac log I see:

2012-09-12 15:31:46,782 Trac[loader] ERROR: Skipping "trac.mimeview.rst = trac.mimeview.rst [rest]": 
Traceback (most recent call last):
  File "d:\Programme\python27\lib\site-packages\trac-1.0-py2.7.egg\trac\loader.py", line 68, in _load_eggs
    entry.load(require=True)
  File "d:\Programme\python27\lib\site-packages\distribute-0.6.28-py2.7.egg\pkg_resources.py", line 2017, in load
    entry = __import__(self.module_name, globals(),globals(), ['__name__'])
  File "d:\Programme\python27\lib\site-packages\mercurial\demandimport.py", line 114, in _demandimport
    mod = _origimport(name, globals, locals)
  File "d:\Programme\python27\lib\site-packages\trac-1.0-py2.7.egg\trac\mimeview\rst.py", line 157, in <module>
    rst.directives.register_directive('trac', trac_directive)
  File "d:\Programme\python27\lib\site-packages\mercurial\demandimport.py", line 87, in __getattribute__
    return getattr(self._module, attr)
AttributeError: 'module' object has no attribute 'directives'

My platform:

  • windows 7 64 bit
  • python 2.7.3 (32 bit)

I reinstalled the following packages in exact that order:

  1. 'distribute-0.6.28.tar.gz'
  2. 'Babel-0.9.6.zip'
  3. 'docutils-0.9.1.tar.gz'
  4. 'Genshi-0.6.zip'
  5. 'Jinja2-2.6.tar.gz'
  6. 'Pygments-1.5.tar.gz'
  7. 'Sphinx-1.1.3.tar.gz'
  8. 'pyreadline-1.7.1.zip'
  9. 'ipython-0.13.zip'
  10. 'mercurial-2.3.1.tar.gz
  11. 'Trac-1.0.zip'

I use the plugins:

  • TracAccountManager-0.4dev-py2.7.egg
  • TracWysiwyg-0.12.0.3-py2.7.egg
  • TracMercurial-1.0.0.1dev-py2.7.egg

But the error remains.

If I try to sync my hg repo called util in trac-admin I get the following error:

Trac [U:\trac]> repository sync util
TracError: Unsupported version control system "hg": No module named repo
Trac [U:\trac]>

Any hints?

Attachments (0)

Change History (21)

comment:1 by Christian Boos, 7 years ago

I suppose there are several issues here… Possibly a problem with Mercurial 2.3.1 itself, but the immediate problems seems to be that Mercurial's demandimport is still active while it shouldn't and that docutils 0.9.1 also has a few issues.

Thanks for the detailed report, I should be able to reproduce the issue.

comment:2 by Christian Boos, 7 years ago

Weird. I couldn't reproduce, with the following:

  • distribute-0.6.25 (vs .28)
  • docutils-0.9.1
  • mercurial-2.3.1

However, if I comment out the demandimport.disable() line in tracext/hg/backend.py, then I get the same error:

9840 Trac[cblaptop-trac:_log_error() in c:\Trac\repos\trunk\trac\loader.py:59] ERROR: Skipping "trac.mimeview.rst = trac.mimeview.rst [rest]": 
Traceback (most recent call last):
  File "c:\Trac\repos\trunk\trac\loader.py", line 68, in _load_eggs
    entry.load(require=True)
  File "C:\Dev\Python272\lib\site-packages\pkg_resources.py", line 1989, in load
    entry = __import__(self.module_name, globals(),globals(), ['__name__'])
  File "c:\workspace\src\hg\mpm-hg\mercurial\demandimport.py", line 114, in _demandimport
    mod = _origimport(name, globals, locals)
  File "c:\Trac\repos\trunk\trac\mimeview\rst.py", line 157, in <module>
    rst.directives.register_directive('trac', trac_directive)
  File "c:\workspace\src\hg\mpm-hg\mercurial\demandimport.py", line 87, in __getattribute__
    return getattr(self._module, attr)
AttributeError: 'module' object has no attribute 'directives'

So the real problem on your side is that demandimport stays enabled… Are you loading anything else using Mercurial?

in reply to:  2 comment:3 by anonymous, 7 years ago

Replying to cboos:

So the real problem on your side is that demandimport stays enabled… Are you loading anything else using Mercurial?

Hmm i do not know how thisdemandimport works, however I have TortoiseHg 2.5 with Mercurial 2.3.1 - x64 Windows http://bitbucket.org/tortoisehg/files/downloads/tortoisehg-2.5.0-hg-2.3.1-x64.msi

installed too (while my d:\Programme\python27\lib\site-packages\mercurial is installed from source and since my python is 32 bit → this one is 32 bit too).

The where comand lists the hg's found:

D:\>where hg
D:\Programme\TortoiseHg\hg.exe
d:\Programme\Python27\Scripts\hg
d:\Programme\Python27\Scripts\hg.bat

But I just renamed my D:\Programme\TortoiseHg to D:\Programme\TortoiseHg.hidden

The where comand lists now the hg's found:

D:\>where hg
d:\Programme\Python27\Scripts\hg
d:\Programme\Python27\Scripts\hg.bat

but the problem remains

comment:4 by anonymous, 7 years ago

Just another question: Howto download the actual mercurial plugin from the TracMercurial page.

I realized that I can download the Trac project as zip but not the mercurial plugin. Due to the internet settings in my company I cannot use:

hg clone http://hg.edgewall.org/mercurial-plugin

… it doesnt work.

So my question: could you provide a link to a zip download? (I got the actual 1.0.0.1 trac mercurial plugin by browsing through the sources and download every file manually)

Thanks

in reply to:  4 ; comment:5 by Remy Blank, 7 years ago

Replying to anonymous:

I realized that I can download the Trac project as zip but not the mercurial plugin.

Good point, that was an omission. I have now enabled zip downloads for plugins.

in reply to:  5 ; comment:6 by anonymous, 7 years ago

Replying to rblank:

Replying to anonymous:

I realized that I can download the Trac project as zip but not the mercurial plugin.

Good point, that was an omission. I have now enabled zip downloads for plugins.

Hmmm unfortunately it doesnt work for the actual 1.0.0.1 version, if you look in TracMercurial at the line:

1.0.0.1 	mercurial-plugin@28d2535d682f (1.0 branch)

Does it not work with mercurial (or git) repositorys?

comment:7 by clinton@…, 7 years ago

Actually, I've found that there's some kind of compatibility issue between Mercurial 2.3.1 and TracMercurial at even version 0.12.0.29. I am using Trac 0.12.3.

I get the Unsupported version control system "hg": No module named repo error any place in the Trac application where integration with a Mercurial repository would take place, like the source browser, or the integrated changeset viewer.

Downgrading Mercurial to 2.2.3 fixed the problem.

in reply to:  6 ; comment:8 by Remy Blank, 7 years ago

Replying to anonymous:

Hmmm unfortunately it doesnt work for the actual 1.0.0.1 version, if you look in TracMercurial at the line:

Oh, right, it's now developed in a separate repository. I had missed that. Enabled zip download for that, too.

comment:9 by Christian Boos, 7 years ago

Keywords: needinfo added

To the original poster: if you built and installed Mercurial yourself, then you could patch it that way:

  • mercurial/demandimport.py

    diff -r 4b25077ae7ee mercurial/demandimport.py
    a b  
    148148
    149149def enable():
    150150    "enable global demand-loading of modules"
     151    import traceback
     152    traceback.print_stack()
    151153    __builtin__.__import__ = _demandimport
    152154
    153155def disable():
    154156    "disable global demand-loading of modules"
     157    import traceback
     158    traceback.print_stack()
    155159    __builtin__.__import__ = _origimport

in order to find out what activates/deactivates demandimport.

comment:10 by anonymous, 7 years ago

Hi,

I changed the demandimport.py file like this:

print "Import of module mercurial/demandimport.py ------------------------"
...
...
def enable():
    "enable global demand-loading of modules"
    import traceback
    print " enable called -----------------"
    traceback.print_stack()
    __builtin__.__import__ = _demandimport

def disable():
    "disable global demand-loading of modules"
    import traceback
    print " disable called -----------------"
    traceback.print_stack()
    __builtin__.__import__ = _origimport

here is the new output catched from the console window:

10:03:38 Trac[loader] DEBUG: Loading acct_mgr.svnserve from u:\trac\tooling\plugins\tracaccountmanager-0.4dev-py2.7.egg
10:03:38 Trac[loader] DEBUG: Loading acct_mgr.web_ui from u:\trac\tooling\plugins\tracaccountmanager-0.4dev-py2.7.egg
10:03:38 Trac[loader] DEBUG: Loading hg from u:\trac\tooling\plugins\tracmercurial-1.0.0.1dev-py2.7.egg
Import of module mercurial/demandimport.py ------------------------
 enable called -----------------
  File "d:\Programme\python27\lib\threading.py", line 524, in __bootstrap
    self.__bootstrap_inner()
  File "d:\Programme\python27\lib\threading.py", line 551, in __bootstrap_inner
    self.run()
  File "d:\Programme\python27\lib\threading.py", line 504, in run
    self.__target(*self.__args, **self.__kwargs)
  File "d:\Programme\python27\lib\SocketServer.py", line 582, in process_request_thread
    self.finish_request(request, client_address)
  File "d:\Programme\python27\lib\SocketServer.py", line 323, in finish_request
    self.RequestHandlerClass(request, client_address, self)
  File "d:\Programme\python27\lib\SocketServer.py", line 638, in __init__
    self.handle()
  File "d:\Programme\python27\lib\BaseHTTPServer.py", line 340, in handle
    self.handle_one_request()
  File "d:\Programme\python27\lib\site-packages\trac-1.0-py2.7.egg\trac\web\wsgi.py", line 191, in handle_one_request
    gateway.run(self.server.application)
  File "d:\Programme\python27\lib\site-packages\trac-1.0-py2.7.egg\trac\web\wsgi.py", line 91, in run
    response = application(self.environ, self._start_response)
  File "d:\Programme\python27\lib\site-packages\trac-1.0-py2.7.egg\trac\web\standalone.py", line 59, in __call__
    return self.application(environ, start_response)
  File "d:\Programme\python27\lib\site-packages\trac-1.0-py2.7.egg\trac\web\standalone.py", line 91, in __call__
    return self.application(environ, start_response)
  File "d:\Programme\python27\lib\site-packages\trac-1.0-py2.7.egg\trac\web\main.py", line 438, in dispatch_request
    env = open_environment(env_path, use_cache=not run_once)
  File "d:\Programme\python27\lib\site-packages\trac-1.0-py2.7.egg\trac\env.py", line 830, in open_environment
    env = env_cache.setdefault(env_path, open_environment(env_path))
  File "d:\Programme\python27\lib\site-packages\trac-1.0-py2.7.egg\trac\env.py", line 834, in open_environment
    env = Environment(env_path)
  File "d:\Programme\python27\lib\site-packages\trac-1.0-py2.7.egg\trac\core.py", line 124, in __call__
    self.__init__(*args, **kwargs)
  File "d:\Programme\python27\lib\site-packages\trac-1.0-py2.7.egg\trac\env.py", line 284, in __init__
    self.setup_config()
  File "d:\Programme\python27\lib\site-packages\trac-1.0-py2.7.egg\trac\env.py", line 599, in setup_config
    load_components(self, plugins_dir and (plugins_dir,))
  File "d:\Programme\python27\lib\site-packages\trac-1.0-py2.7.egg\trac\loader.py", line 114, in load_components
    loadfunc(env, search_path, auto_enable=plugins_dir)
  File "d:\Programme\python27\lib\site-packages\trac-1.0-py2.7.egg\trac\loader.py", line 68, in _load_eggs
    entry.load(require=True)
  File "d:\Programme\python27\lib\site-packages\distribute-0.6.28-py2.7.egg\pkg_resources.py", line 2017, in load
    entry = __import__(self.module_name, globals(),globals(), ['__name__'])
  File "build\bdist.win32\egg\tracext\hg\backend.py", line 64, in <module>
    demandimport.enable();
  File "d:\Programme\python27\lib\site-packages\mercurial\demandimport.py", line 153, in enable
    traceback.print_stack()
10:03:38 Trac[loader] DEBUG: Loading trac.about from d:\programme\python27\lib\site-packages\trac-1.0-py2.7.egg
10:03:38 Trac[loader] DEBUG: Loading trac.admin.console from d:\programme\python27\lib\site-packages\trac-1.0-py2.7.egg
10:03:38 Trac[loader] DEBUG: Loading trac.admin.web_ui from d:\programme\python27\lib\site-packages\trac-1.0-py2.7.egg
10:03:38 Trac[loader] DEBUG: Loading trac.attachment from d:\programme\python27\lib\site-packages\trac-1.0-py2.7.egg
10:03:39 Trac[loader] DEBUG: Loading trac.db.mysql from d:\programme\python27\lib\site-packages\trac-1.0-py2.7.egg
10:03:39 Trac[loader] DEBUG: Loading trac.db.postgres from d:\programme\python27\lib\site-packages\trac-1.0-py2.7.egg
10:03:39 Trac[loader] DEBUG: Loading trac.db.sqlite from d:\programme\python27\lib\site-packages\trac-1.0-py2.7.egg
10:03:39 Trac[loader] DEBUG: Loading trac.mimeview.patch from d:\programme\python27\lib\site-packages\trac-1.0-py2.7.egg
10:03:39 Trac[loader] DEBUG: Loading trac.mimeview.pygments from d:\programme\python27\lib\site-packages\trac-1.0-py2.7.egg
10:03:39 Trac[loader] DEBUG: Loading trac.mimeview.rst from d:\programme\python27\lib\site-packages\trac-1.0-py2.7.egg
10:03:39 Trac[loader] ERROR: Skipping "trac.mimeview.rst = trac.mimeview.rst [rest]":
Traceback (most recent call last):
  File "d:\Programme\python27\lib\site-packages\trac-1.0-py2.7.egg\trac\loader.py", line 68, in _load_eggs
    entry.load(require=True)
  File "d:\Programme\python27\lib\site-packages\distribute-0.6.28-py2.7.egg\pkg_resources.py", line 2017, in load
    entry = __import__(self.module_name, globals(),globals(), ['__name__'])
  File "d:\Programme\python27\lib\site-packages\mercurial\demandimport.py", line 114, in _demandimport
    mod = _origimport(name, globals, locals)
  File "d:\Programme\python27\lib\site-packages\trac-1.0-py2.7.egg\trac\mimeview\rst.py", line 157, in <module>
    rst.directives.register_directive('trac', trac_directive)
  File "d:\Programme\python27\lib\site-packages\mercurial\demandimport.py", line 87, in __getattribute__
    return getattr(self._module, attr)
AttributeError: 'module' object has no attribute 'directives'
10:03:39 Trac[loader] DEBUG: Loading trac.mimeview.txtl from d:\programme\python27\lib\site-packages\trac-1.0-py2.7.egg
10:03:39 Trac[loader] DEBUG: Skipping "trac.mimeview.txtl = trac.mimeview.txtl [textile]": ("DistributionNotFound: textile>=2.0" not found)

comment:11 by dirkjan@…, 7 years ago

I also had problems with Mercurial 2.3.1, but I did get a useful error message from the commit_updater hook. I guess it might be a different problem, but who knows when demandimport is involved. Here's the error message I saw:

remote: TracError: Unsupported version control system "hg": No module named repo
remote: trac-admin failed with return code 2 for environment:
remote:   /var/trac/kdp
remote: warning: changegroup hook failed

And here's what I did to fix it:

diff --git a/tracext/hg/backend.py b/tracext/hg/backend.py
--- a/tracext/hg/backend.py
+++ b/tracext/hg/backend.py
@@ -86,10 +86,10 @@
         hg_import_error = "Couldn't import symbols: "+','.join(hg_import_error)

     # Mercurial versions >= 1.2 won't have mercurial.repo.RepoError anymore
-    from mercurial.repo import RepoError
+    #from mercurial.repo import RepoError
     from mercurial.revlog import LookupError as HgLookupError
-    if repr(RepoError) == "<unloaded module 'RepoError'>":
-        from mercurial.error import RepoError, LookupError as HgLookupError
+    #if repr(RepoError) == "<unloaded module 'RepoError'>":
+    #    from mercurial.error import RepoError, LookupError as HgLookupError

     # Force local encoding to be non-lossy (#7217)
     os.environ['HGENCODING'] = 'utf-8'

This is against 28d2535d682f. I guessed it might be okay to deprecate hg < 1.2, so I didn't look into doing a more involved fix.

comment:12 by Christian Boos, 7 years ago

Keywords: needinfo removed
Milestone: 1.0.1

Thanks Dirkjan. I think there's indeed a problem with the way we report errors and with that init code in general… and I just spotted a repo.pyc dangling file in my mercurial checkout which might explain a lot ;-)

comment:13 by Christian Boos, 7 years ago

Component: version controlplugin/mercurial

As a side-note, looking up the mercurial/repo.py file in the repository of Mercurial itself is a typical use case for triggering #10719… Also time to do something about that one.

comment:14 by Christian Boos, 7 years ago

Milestone: 1.0.1plugin - mercurial
Resolution: fixed
Status: newclosed

Should be fixed by [45f04cd0ada8/mercurial-plugin] (for 0.12) and [62e59cafa3de/mercurial-plugin] (for 1.0).

comment:15 by Christian Boos, 7 years ago

Owner: set to Christian Boos

comment:16 by Christian Boos, 7 years ago

Release Notes: modified (diff)

in reply to:  8 comment:17 by Christian Boos, 7 years ago

Replying to rblank:

Replying to anonymous:

Hmmm unfortunately it doesnt work for the actual 1.0.0.1 version, if you look in TracMercurial at the line:

Oh, right, it's now developed in a separate repository. I had missed that. Enabled zip download for that, too.

Well, there's still #10709 … until it gets fixed, better not make the link available.

comment:18 by anonymous, 7 years ago

Just downloaded manually file-by-file mercurial-plugin 1.0.0.3 dev

I just want to confirm that IT WORKS now :-)

Great, thanks

in reply to:  18 ; comment:19 by Christian Boos, 7 years ago

Replying to anonymous:

Just downloaded manually file-by-file mercurial-plugin 1.0.0.3 dev

I just want to confirm that IT WORKS now :-)

Well, one of the reasons for why I moved the TracMercurial plugin from the Subversion repository to its own Mercurial repository is that it could spare some people of the pain of having to install Subversion in order to get a Mercurial related plugin!

So why didn't you just hg clone that repository? Lack of visibility of the link?

in reply to:  19 ; comment:20 by anonymous, 7 years ago

Replying to cboos: pain of having to install Subversion in order to get a Mercurial related plugin!

So why didn't you just hg clone that repository? Lack of visibility of the link?

It doesn't work here in my company.

Another thing: every time I edit this ticket, trac thinks its possibly spam, because the dns reverse lookup doesn't work (or something like that) so I have to type this captcha stuff in.

Perhaps it's this the reason why I cannot clone your hg repository as described in TracMercurial like

hg clone https://hg.edgewall.org/trac/mercurial-plugin

I suppose its some firewall or whatever … its a big company ;-)

in reply to:  20 comment:21 by Christian Boos, 7 years ago

Replying to anonymous:

It doesn't work here in my company. […] I suppose its some firewall or whatever … its a big company ;-)

I see ;-) Thanks for the feedback!

Modify Ticket

Change Properties
Set your email in Preferences
Action
as closed The owner will remain Christian Boos.
The resolution will be deleted. Next status will be 'reopened'.
to as closed The owner will be changed from Christian Boos to the specified user.

Add Comment


E-mail address and name can be saved in the Preferences .
 
Note: See TracTickets for help on using tickets.