Switched CRLF to LF in repo, and added svn:eol-style native. I might have missed a few files though. Just committing what I have so far.
diff --git a/devtools/antglob.py b/devtools/antglob.py
index bbb6fec..30837b5 100644
--- a/devtools/antglob.py
+++ b/devtools/antglob.py
@@ -55,20 +55,20 @@
 
 _ANT_RE = re.compile( r'(/\*\*/)|(\*\*/)|(/\*\*)|(\*)|(/)|([^\*/]*)' )
 
-def ant_pattern_to_re( ant_pattern ):

-    """Generates a regular expression from the ant pattern.

-    Matching convention:

-    **/a: match 'a', 'dir/a', 'dir1/dir2/a'

-    a/**/b: match 'a/b', 'a/c/b', 'a/d/c/b'

-    *.py: match 'script.py' but not 'a/script.py'

+def ant_pattern_to_re( ant_pattern ):
+    """Generates a regular expression from the ant pattern.
+    Matching convention:
+    **/a: match 'a', 'dir/a', 'dir1/dir2/a'
+    a/**/b: match 'a/b', 'a/c/b', 'a/d/c/b'
+    *.py: match 'script.py' but not 'a/script.py'
     """
     rex = ['^']
     next_pos = 0
-    sep_rex = r'(?:/|%s)' % re.escape( os.path.sep )

-##    print 'Converting', ant_pattern

-    for match in _ANT_RE.finditer( ant_pattern ):

-##        print 'Matched', match.group()

-##        print match.start(0), next_pos

+    sep_rex = r'(?:/|%s)' % re.escape( os.path.sep )
+##    print 'Converting', ant_pattern
+    for match in _ANT_RE.finditer( ant_pattern ):
+##        print 'Matched', match.group()
+##        print match.start(0), next_pos
         if match.start(0) != next_pos:
             raise ValueError( "Invalid ant pattern" )
         if match.group(1): # /**/
@@ -83,14 +83,14 @@
             rex.append( sep_rex )
         else: # somepath
             rex.append( re.escape(match.group(6)) )
-        next_pos = match.end()

+        next_pos = match.end()
     rex.append('$')
     return re.compile( ''.join( rex ) )
-

-def _as_list( l ):

-    if isinstance(l, basestring):

-        return l.split()

-    return l

+
+def _as_list( l ):
+    if isinstance(l, basestring):
+        return l.split()
+    return l
 
 def glob(dir_path,
          includes = '**/*',
@@ -99,8 +99,8 @@
          prune_dirs = prune_dirs,
          max_depth = 25):
     include_filter = [ant_pattern_to_re(p) for p in _as_list(includes)]
-    exclude_filter = [ant_pattern_to_re(p) for p in _as_list(excludes)]

-    prune_dirs = [p.replace('/',os.path.sep) for p in _as_list(prune_dirs)]

+    exclude_filter = [ant_pattern_to_re(p) for p in _as_list(excludes)]
+    prune_dirs = [p.replace('/',os.path.sep) for p in _as_list(prune_dirs)]
     dir_path = dir_path.replace('/',os.path.sep)
     entry_type_filter = entry_type
 
@@ -117,37 +117,37 @@
                 return True
         return False
 
-    def glob_impl( root_dir_path ):

-        child_dirs = [root_dir_path]

-        while child_dirs:

+    def glob_impl( root_dir_path ):
+        child_dirs = [root_dir_path]
+        while child_dirs:
             dir_path = child_dirs.pop()
-            for entry in listdir( dir_path ):

-                full_path = os.path.join( dir_path, entry )

-##                print 'Testing:', full_path,

-                is_dir = os.path.isdir( full_path )

-                if is_dir and not is_pruned_dir( entry ): # explore child directory ?

-##                    print '===> marked for recursion',

-                    child_dirs.append( full_path )

-                included = apply_filter( full_path, include_filter )

-                rejected = apply_filter( full_path, exclude_filter )

-                if not included or rejected: # do not include entry ?

-##                    print '=> not included or rejected'

-                    continue

-                link = os.path.islink( full_path )

-                is_file = os.path.isfile( full_path )

-                if not is_file and not is_dir:

-##                    print '=> unknown entry type'

-                    continue

-                if link:

-                    entry_type = is_file and FILE_LINK or DIR_LINK

-                else:

-                    entry_type = is_file and FILE or DIR

-##                print '=> type: %d' % entry_type, 

-                if (entry_type & entry_type_filter) != 0:

-##                    print ' => KEEP'

-                    yield os.path.join( dir_path, entry )

-##                else:

-##                    print ' => TYPE REJECTED'

+            for entry in listdir( dir_path ):
+                full_path = os.path.join( dir_path, entry )
+##                print 'Testing:', full_path,
+                is_dir = os.path.isdir( full_path )
+                if is_dir and not is_pruned_dir( entry ): # explore child directory ?
+##                    print '===> marked for recursion',
+                    child_dirs.append( full_path )
+                included = apply_filter( full_path, include_filter )
+                rejected = apply_filter( full_path, exclude_filter )
+                if not included or rejected: # do not include entry ?
+##                    print '=> not included or rejected'
+                    continue
+                link = os.path.islink( full_path )
+                is_file = os.path.isfile( full_path )
+                if not is_file and not is_dir:
+##                    print '=> unknown entry type'
+                    continue
+                if link:
+                    entry_type = is_file and FILE_LINK or DIR_LINK
+                else:
+                    entry_type = is_file and FILE or DIR
+##                print '=> type: %d' % entry_type, 
+                if (entry_type & entry_type_filter) != 0:
+##                    print ' => KEEP'
+                    yield os.path.join( dir_path, entry )
+##                else:
+##                    print ' => TYPE REJECTED'
     return list( glob_impl( dir_path ) )
 
 
@@ -155,47 +155,47 @@
     import unittest
 
     class AntPatternToRETest(unittest.TestCase):
-##        def test_conversion( self ):

-##            self.assertEqual( '^somepath$', ant_pattern_to_re( 'somepath' ).pattern )

-

-        def test_matching( self ):

-            test_cases = [ ( 'path',

-                             ['path'],

-                             ['somepath', 'pathsuffix', '/path', '/path'] ),

-                           ( '*.py',

-                             ['source.py', 'source.ext.py', '.py'],

-                             ['path/source.py', '/.py', 'dir.py/z', 'z.pyc', 'z.c'] ),

-                           ( '**/path',

-                             ['path', '/path', '/a/path', 'c:/a/path', '/a/b/path', '//a/path', '/a/path/b/path'],

-                             ['path/', 'a/path/b', 'dir.py/z', 'somepath', 'pathsuffix', 'a/somepath'] ),

-                           ( 'path/**',

-                             ['path/a', 'path/path/a', 'path//'],

-                             ['path', 'somepath/a', 'a/path', 'a/path/a', 'pathsuffix/a'] ),

-                           ( '/**/path',

-                             ['/path', '/a/path', '/a/b/path/path', '/path/path'],

-                             ['path', 'path/', 'a/path', '/pathsuffix', '/somepath'] ),

-                           ( 'a/b',

-                             ['a/b'],

-                             ['somea/b', 'a/bsuffix', 'a/b/c'] ),

-                           ( '**/*.py',

-                             ['script.py', 'src/script.py', 'a/b/script.py', '/a/b/script.py'],

-                             ['script.pyc', 'script.pyo', 'a.py/b'] ),

-                           ( 'src/**/*.py',

-                             ['src/a.py', 'src/dir/a.py'],

-                             ['a/src/a.py', '/src/a.py'] ),

-                           ]

-            for ant_pattern, accepted_matches, rejected_matches in list(test_cases):

-                def local_path( paths ):

-                    return [ p.replace('/',os.path.sep) for p in paths ]

-                test_cases.append( (ant_pattern, local_path(accepted_matches), local_path( rejected_matches )) )

-            for ant_pattern, accepted_matches, rejected_matches in test_cases:

-                rex = ant_pattern_to_re( ant_pattern )

-                print 'ant_pattern:', ant_pattern, ' => ', rex.pattern

-                for accepted_match in accepted_matches:

-                    print 'Accepted?:', accepted_match

-                    self.assert_( rex.match( accepted_match ) is not None )

-                for rejected_match in rejected_matches:

-                    print 'Rejected?:', rejected_match

-                    self.assert_( rex.match( rejected_match ) is None )

+##        def test_conversion( self ):
+##            self.assertEqual( '^somepath$', ant_pattern_to_re( 'somepath' ).pattern )
+
+        def test_matching( self ):
+            test_cases = [ ( 'path',
+                             ['path'],
+                             ['somepath', 'pathsuffix', '/path', '/path'] ),
+                           ( '*.py',
+                             ['source.py', 'source.ext.py', '.py'],
+                             ['path/source.py', '/.py', 'dir.py/z', 'z.pyc', 'z.c'] ),
+                           ( '**/path',
+                             ['path', '/path', '/a/path', 'c:/a/path', '/a/b/path', '//a/path', '/a/path/b/path'],
+                             ['path/', 'a/path/b', 'dir.py/z', 'somepath', 'pathsuffix', 'a/somepath'] ),
+                           ( 'path/**',
+                             ['path/a', 'path/path/a', 'path//'],
+                             ['path', 'somepath/a', 'a/path', 'a/path/a', 'pathsuffix/a'] ),
+                           ( '/**/path',
+                             ['/path', '/a/path', '/a/b/path/path', '/path/path'],
+                             ['path', 'path/', 'a/path', '/pathsuffix', '/somepath'] ),
+                           ( 'a/b',
+                             ['a/b'],
+                             ['somea/b', 'a/bsuffix', 'a/b/c'] ),
+                           ( '**/*.py',
+                             ['script.py', 'src/script.py', 'a/b/script.py', '/a/b/script.py'],
+                             ['script.pyc', 'script.pyo', 'a.py/b'] ),
+                           ( 'src/**/*.py',
+                             ['src/a.py', 'src/dir/a.py'],
+                             ['a/src/a.py', '/src/a.py'] ),
+                           ]
+            for ant_pattern, accepted_matches, rejected_matches in list(test_cases):
+                def local_path( paths ):
+                    return [ p.replace('/',os.path.sep) for p in paths ]
+                test_cases.append( (ant_pattern, local_path(accepted_matches), local_path( rejected_matches )) )
+            for ant_pattern, accepted_matches, rejected_matches in test_cases:
+                rex = ant_pattern_to_re( ant_pattern )
+                print 'ant_pattern:', ant_pattern, ' => ', rex.pattern
+                for accepted_match in accepted_matches:
+                    print 'Accepted?:', accepted_match
+                    self.assert_( rex.match( accepted_match ) is not None )
+                for rejected_match in rejected_matches:
+                    print 'Rejected?:', rejected_match
+                    self.assert_( rex.match( rejected_match ) is None )
 
     unittest.main()