Index: setuptools/command/install_egg_info.py
===================================================================
--- setuptools/command/install_egg_info.py	(révision 66305)
+++ setuptools/command/install_egg_info.py	(copie de travail)
@@ -3,6 +3,8 @@
 from distutils import log, dir_util
 import os, shutil, pkg_resources
 
+from sdist import get_filters
+
 class install_egg_info(Command):
     """Install an .egg-info directory for the package"""
 
@@ -48,7 +50,7 @@
             # filter out source-control directories; note that 'src' is always
             # a '/'-separated path, regardless of platform.  'dst' is a
             # platform-specific path.
-            for skip in '.svn/','CVS/':
+            for skip in get_filters():
                 if src.startswith(skip) or '/'+skip in src:
                     return None
             self.outputs.append(dst)
Index: setuptools/command/egg_info.py
===================================================================
--- setuptools/command/egg_info.py	(révision 66305)
+++ setuptools/command/egg_info.py	(copie de travail)
@@ -12,7 +12,7 @@
 from distutils.filelist import FileList
 from pkg_resources import parse_requirements, safe_name, parse_version, \
     safe_version, yield_lines, EntryPoint, iter_entry_points, to_filename
-from sdist import walk_revctrl
+from sdist import walk_revctrl, get_revision, get_filters
 
 class egg_info(Command):
     description = "create a distribution's .egg-info directory"
@@ -20,8 +20,8 @@
     user_options = [
         ('egg-base=', 'e', "directory containing .egg-info directories"
                            " (default: top of the source tree)"),
-        ('tag-svn-revision', 'r',
-            "Add subversion revision ID to version number"),
+        ('tag-revision', 'r',
+            "Add VCS revision ID to version number"),
         ('tag-date', 'd', "Add date stamp (e.g. 20050528) to version number"),
         ('tag-build=', 'b', "Specify explicit tag to add to version number"),
         ('no-svn-revision', 'R',
@@ -29,23 +29,17 @@
         ('no-date', 'D', "Don't include date stamp [default]"),
     ]
 
-    boolean_options = ['tag-date', 'tag-svn-revision']
-    negative_opt = {'no-svn-revision': 'tag-svn-revision',
+    boolean_options = ['tag-date', 'tag-revision']
+    negative_opt = {'no-revision': 'tag-revision',
                     'no-date': 'tag-date'}
 
-
-
-
-
-
-
     def initialize_options(self):
         self.egg_name = None
         self.egg_version = None
         self.egg_base = None
         self.egg_info = None
         self.tag_build = None
-        self.tag_svn_revision = 0
+        self.tag_revision = 0
         self.tag_date = 0
         self.broken_egg_info = False
         self.vtags = None
@@ -59,27 +53,6 @@
             }
         )
 
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
     def finalize_options (self):
         self.egg_name = safe_name(self.distribution.get_name())
         self.vtags = self.tags()
@@ -180,70 +153,12 @@
         version = ''
         if self.tag_build:
             version+=self.tag_build
-        if self.tag_svn_revision and (
-            os.path.exists('.svn') or os.path.exists('PKG-INFO')
-        ):  version += '-r%s' % self.get_svn_revision()
+        if self.tag_revision:
+            version += '-r%s' % get_revision()
         if self.tag_date:
             import time; version += time.strftime("-%Y%m%d")
         return version
 
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-    def get_svn_revision(self):
-        revision = 0
-        urlre = re.compile('url="([^"]+)"')
-        revre = re.compile('committed-rev="(\d+)"')
-
-        for base,dirs,files in os.walk(os.curdir):
-            if '.svn' not in dirs:
-                dirs[:] = []
-                continue    # no sense walking uncontrolled subdirs
-            dirs.remove('.svn')
-            f = open(os.path.join(base,'.svn','entries'))
-            data = f.read()
-            f.close()
-
-            if data.startswith('9') or data.startswith('8'):
-                data = map(str.splitlines,data.split('\n\x0c\n'))
-                del data[0][0]  # get rid of the '8' or '9'
-                dirurl = data[0][3]
-                localrev = max([int(d[9]) for d in data if len(d)>9 and d[9]]+[0])
-            elif data.startswith('<?xml'):
-                dirurl = urlre.search(data).group(1)    # get repository URL
-                localrev = max([int(m.group(1)) for m in revre.finditer(data)]+[0])
-            else:
-                log.warn("unrecognized .svn/entries format; skipping %s", base)
-                dirs[:] = []
-                continue
-            if base==os.curdir:
-                base_url = dirurl+'/'   # save the root url
-            elif not dirurl.startswith(base_url):
-                dirs[:] = []
-                continue    # not part of the same svn tree, skip it
-            revision = max(revision, localrev)
-
-        return str(revision or get_pkg_info_revision())
-
-
-
-
-
-
-
     def find_sources(self):
         """Generate SOURCES.txt manifest file"""
         manifest_filename = os.path.join(self.egg_info,"SOURCES.txt")
@@ -278,13 +193,6 @@
             self.files.append(path)
 
 
-
-
-
-
-
-
-
 class manifest_maker(sdist):
 
     template = "MANIFEST.in"
@@ -344,7 +252,8 @@
         self.filelist.exclude_pattern(None, prefix=build.build_base)
         self.filelist.exclude_pattern(None, prefix=base_dir)
         sep = re.escape(os.sep)
-        self.filelist.exclude_pattern(sep+r'(RCS|CVS|\.svn)'+sep, is_regex=1)
+        for vcs_filter in get_filters():
+            self.filelist.exclude_pattern(sep+vcs_filter+sep, is_regex=1)
 
 
 def write_file (filename, contents):
@@ -355,18 +264,6 @@
     f.write("\n".join(contents))
     f.close()
 
-
-
-
-
-
-
-
-
-
-
-
-
 def write_pkg_info(cmd, basename, filename):
     log.info("writing %s", filename)
     if not cmd.dry_run:
Index: setuptools/command/sdist.py
===================================================================
--- setuptools/command/sdist.py	(révision 66305)
+++ setuptools/command/sdist.py	(copie de travail)
@@ -2,125 +2,60 @@
 from distutils.util import convert_path
 from distutils import log
 import os, re, sys, pkg_resources
+import exceptions
 
 entities = [
     ("&lt;","<"), ("&gt;", ">"), ("&quot;", '"'), ("&apos;", "'"),
     ("&amp;", "&")
 ]
 
-def unescape(data):
-    for old,new in entities:
-        data = data.replace(old,new)
-    return data
+class ReposError(exceptions.Exception):
+    pass
 
-def re_finder(pattern, postproc=None):
-    def find(dirname, filename):
-        f = open(filename,'rU')
-        data = f.read()
-        f.close()
-        for match in pattern.finditer(data):
-            path = match.group(1)
-            if postproc:
-                path = postproc(path)
-            yield joinpath(dirname,path)
-    return find
 
-def joinpath(prefix,suffix):
-    if not prefix:
-        return suffix
-    return os.path.join(prefix,suffix)
+def get_revision(dirname=''):
+    for ep in pkg_resources.iter_entry_points('setuptools.revision_finders'):
+        log.info("ep: %s" % ep)
+        rev = ep.load()(dirname)
+        log.info("rev: %s" % rev)
+        if rev is None:
+            #Not the right ep
+            continue
+        else:
+            return str(rev)
+    #XXX: return -1 ?
+    return "unknown"
 
 
-
-
-
-
-
-
-
-
+def get_filters(dirname=''):
+    filters = []
+    for ep in pkg_resources.iter_entry_points('setuptools.vcs_filters'):
+        for vcs_filter in ep.load()(dirname):
+            filters.append(vcs_filter)
+    return filters
+            
+            
 def walk_revctrl(dirname=''):
-    """Find all files under revision control"""
+    walked = False
     for ep in pkg_resources.iter_entry_points('setuptools.file_finders'):
-        for item in ep.load()(dirname):
-            yield item
+        log.info("ep: %s" % ep)
+        try:
+            for item in ep.load()(dirname):
+                yield item
+            walked = True
+        except ReposError:
+            continue
+    
+    if not walked:
+        _default_revctrl(dirname)
 
+            
 def _default_revctrl(dirname=''):
-    for path, finder in finders:
-        path = joinpath(dirname,path)
-        if os.path.isfile(path):
-            for path in finder(dirname,path):
-                if os.path.isfile(path):
-                    yield path
-                elif os.path.isdir(path):
-                    for item in _default_revctrl(path):
-                        yield item
+    for base,dirs,files in os.walk(os.curdir):
+        for item in files:
+            yield item
 
-def externals_finder(dirname, filename):
-    """Find any 'svn:externals' directories"""
-    found = False
-    f = open(filename,'rb')
-    for line in iter(f.readline, ''):    # can't use direct iter!
-        parts = line.split()
-        if len(parts)==2:
-            kind,length = parts
-            data = f.read(int(length))
-            if kind=='K' and data=='svn:externals':
-                found = True
-            elif kind=='V' and found:
-                f.close()
-                break
-    else:
-        f.close()
-        return
-
-    for line in data.splitlines():
-        parts = line.split()
-        if parts:
-            yield joinpath(dirname, parts[0])
-
-
-entries_pattern = re.compile(r'name="([^"]+)"(?![^>]+deleted="true")', re.I)
-
-def entries_finder(dirname, filename):
-    f = open(filename,'rU')
-    data = f.read()
-    f.close()
-    if data.startswith('9') or data.startswith('8'):    # subversion 1.5/1.4
-        for record in map(str.splitlines, data.split('\n\x0c\n')[1:]):
-            if not record or len(record)>=6 and record[5]=="delete":
-                continue    # skip deleted
-            yield joinpath(dirname, record[0])
-    elif data.startswith('<?xml'):
-        for match in entries_pattern.finditer(data):
-            yield joinpath(dirname,unescape(match.group(1)))
-    else:
-        log.warn("unrecognized .svn/entries format in %s", dirname)
-
-
-finders = [
-    (convert_path('CVS/Entries'),
-        re_finder(re.compile(r"^\w?/([^/]+)/", re.M))),
-    (convert_path('.svn/entries'), entries_finder),
-    (convert_path('.svn/dir-props'), externals_finder),
-    (convert_path('.svn/dir-prop-base'), externals_finder),  # svn 1.4
-]
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+                        
 class sdist(_sdist):
     """Smart sdist that finds anything supported by revision control"""
 
@@ -172,7 +107,6 @@
                 "standard file not found: should have one of " +', '.join(alts)
             )
 
-
     def make_release_tree(self, base_dir, files):
         _sdist.make_release_tree(self, base_dir, files)
 
@@ -184,22 +118,4 @@
             os.unlink(dest)
             self.copy_file('setup.cfg', dest)
 
-        self.get_finalized_command('egg_info').save_version_info(dest)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#
+        self.get_finalized_command('egg_info').save_version_info(dest)
\ No newline at end of file
Index: setup.py
===================================================================
--- setup.py	(révision 66305)
+++ setup.py	(copie de travail)
@@ -7,7 +7,7 @@
 execfile(convert_path('setuptools/command/__init__.py'), d)
 
 SETUP_COMMANDS = d['__all__']
-VERSION = "0.7a1"
+VERSION = "0.7a3"
 
 from setuptools import setup, find_packages
 import sys
@@ -70,10 +70,20 @@
              "easy_install-%s = setuptools.command.easy_install:main"
                 % sys.version[:3]
         ],
-        "setuptools.file_finders":
-            ["svn_cvs = setuptools.command.sdist:_default_revctrl"],
+        "setuptools.file_finders": [
+            "svn_cvs = setuptools.command.vcs_svn:svn_revctrl",
+            "hg = setuptools.command.vcs_hg:hg_revctrl",   
+        ],
+        "setuptools.revision_finders": [
+             "svn = setuptools.command.vcs_svn:get_svn_revision",
+             "hg = setuptools.command.vcs_hg:get_hg_revision",
+        ],
+        "setuptools.vcs_filters": [
+             "svn = setuptools.command.vcs_svn:svn_filters",
+             "cvs = setuptools.command.vcs_svn:cvs_filters",
+             "hg = setuptools.command.vcs_hg:hg_filters",
+        ],
 
-
         "setuptools.installation":
             ['eggsecutable = setuptools.command.easy_install:bootstrap'],
     },
@@ -96,29 +106,4 @@
 
     # uncomment for testing
     # setup_requires = ['setuptools>=0.6a0'],
-)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+)
\ No newline at end of file
Index: setup.cfg
===================================================================
--- setup.cfg	(révision 66305)
+++ setup.cfg	(copie de travail)
@@ -1,6 +1,6 @@
 [egg_info]
 tag_build = dev
-tag_svn_revision = 1
+tag_revision = 1
 
 [aliases]
 release = egg_info -RDb ''

