Edgewall Software
Modify

Opened 14 years ago

Closed 14 years ago

#3012 closed defect (fixed)

r3118 exception in browser

Reported by: Alec Thomas Owned by: Christian Boos
Priority: high Milestone: 0.10
Component: version control/browser Version: devel
Severity: major Keywords: unicode browser config
Cc: Branch:
Release Notes:
API Changes:
Internal Changes:

Description

The unicodification of configuration entries in r3118 seems to break the browser:

Traceback (most recent call last):
  File "/home/athomas/projects/trac/devel/trac/web/main.py", line 300, in dispatch_request
    dispatcher.dispatch(req)
  File "/home/athomas/projects/trac/devel/trac/web/main.py", line 176, in dispatch
    resp = chosen_handler.process_request(req)
  File "/home/athomas/projects/trac/devel/trac/versioncontrol/web_ui/browser.py", line 97, in process_request
    repos = self.env.get_repository(req.authname)
  File "/home/athomas/projects/trac/devel/trac/env.py", line 161, in get_repository
    authname)
  File "/home/athomas/projects/trac/devel/trac/versioncontrol/api.py", line 61, in get_repository
    return self._connector.get_repository(repos_type, repos_dir, authname)
  File "/home/athomas/projects/trac/devel/trac/versioncontrol/svn_fs.py", line 247, in get_repository
    repos = SubversionRepository(dir, authz, self.log)
  File "/home/athomas/projects/trac/devel/trac/versioncontrol/svn_fs.py", line 268, in __init__
    self.path = repos.svn_repos_find_root_path(path, self.pool())
TypeError: argument number 1: a 'char *' is expected, 'unicode(/home/athomas/projects/trac/env/svn)' is received

Attachments (0)

Change History (10)

comment:1 by Alec Thomas, 14 years ago

Keywords: unicode browser config added

comment:2 by Christian Boos, 14 years ago

Status: newassigned

Oops, but it's strange that I don't have a problem with this…

Can you try this fix:

  • svn_fs.py

     
    265283       
    266284        # Remove any trailing slash or else subversion might abort
    267285        path = os.path.normpath(path).replace('\\', '/')
    268         self.path = repos.svn_repos_find_root_path(path, self.pool())
     286        self.path = repos.svn_repos_find_root_path(_to_svn(path), self.pool())
    269287        if self.path is None:
    270288            raise TracError("%s does not appear to be a Subversion repository." \
    271289                            % path)

comment:3 by Alec Thomas, 14 years ago

Now I don't get a traceback, but I get:

/home/athomas/projects/trac/env/svn does not appear to be a Subversion repository.

And yeah, it is strange that you don't see this.

comment:4 by Christian Boos, 14 years ago

Weird, for me (on Windows, so far) it works for 1.2.3 (Python 2.3.5) and 1.3.0 (Python 2.4.2), whether I use a unicode string or not, for this call…

But this function (repos.svn_repos_find_root_path) is known to be a sensitive one, e.g. if you have a trailing slash there, then the application aborts.

Would you mind, er… hardcoding the value in svn_fs.py:

  • first using '/home/athomas/projects/trac/env/svn'
  • then using u'/home/athomas/projects/trac/env/svn'
  • lastly using _to_svn(u'/home/athomas/projects/trac/env/svn')

Thanks!

comment:5 by Alec Thomas, 14 years ago

Sure thing.

  1. Worked.
  2. Produced the original error.
  3. Produced the does not appear to be a Subversion repository error.

I'm running Python 2.4.2 and SVN 1.2.3.

comment:6 by Christian Boos, 14 years ago

Well, now all it takes is to understand the difference between 1. and 3. :)

Maybe adding a print type(x), repr(x) with x alternatively 1. and 3. will tell?

Ah, wait, maybe it's a weird gc related issue. Also try to do path = _to_svn(path) before calling repos.svn_repos_find_root_path(path, pool()).

As a side note, for me it also works on Linux w/ Python 2.4.2 and SVN 1.3.0.

comment:7 by Alec Thomas, 14 years ago

Aha!!

  1. <type 'str'> '/home/athomas/projects/trac/env/svn'
  2. <type 'str'> 'home/athomas/projects/trac/env/svn'

Looks like _to_svn() is being a little too aggressive in its stripping of slashes. The following patch seems to fix the problem:

Index: trac/versioncontrol/svn_fs.py
===================================================================
--- trac/versioncontrol/svn_fs.py       (revision 3121)
+++ trac/versioncontrol/svn_fs.py       (working copy)
@@ -101,7 +101,7 @@
     """Expect a list of `unicode` path components.
     Returns an UTF-8 encoded string suitable for the Subversion python bindings.
     """
-    return '/'.join([path.strip('/') for path in args]).encode('utf-8')
+    return '/' + '/'.join([path.strip('/') for path in args]).encode('utf-8')
     
 def _from_svn(path):
     """Expect an UTF-8 encoded string and transform it to an `unicode` object"""
@@ -265,7 +265,7 @@
         
         # Remove any trailing slash or else subversion might abort
         path = os.path.normpath(path).replace('\\', '/')
-        self.path = repos.svn_repos_find_root_path(path, self.pool())
+        self.path = repos.svn_repos_find_root_path(_to_svn(path), self.pool())
         if self.path is None:
             raise TracError("%s does not appear to be a Subversion repository." \
                             % path)

It's not clear to me whether the same fix should be applied to _normalize_path(), which also strips slashes.

And with that, I've officially doubled my knowledge of the versioncontrol layer :)

comment:8 by Christian Boos, 14 years ago

Actually that path is the only path that is a filesystem path, so its processing should be a little special (e.g. the volume letters on windows).

I think r3123 should fix this, but let me know.

comment:9 by Alec Thomas, 14 years ago

Yep, works well for me.

comment:10 by Alec Thomas, 14 years ago

Resolution: fixed
Status: assignedclosed

No issues since this rev.

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 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.