#!/usr/bin/python

import sys
import os
import optparse

def walkrepos(path, filter):
    '''yield every hg repository under path, recursively.'''
    def errhandler(err):
        if err.filename == path:
            raise err

    for root, dirs, files in os.walk(path, onerror=errhandler):
        for d in dirs:
            if d == filter():
                yield root
                dirs[:] = []
                break

def walkrepos_flat(path, filter):
    """yield every hg repository in the current directory"""
    if filter(path):
        yield path
    for i in os.listdir(path):
        dir = os.path.join(path, i)
        if filter(dir):
            yield dir


if __name__ == "__main__":
    def repofilter(dir, x):
        if dir == None: return x
        else:           return os.path.isdir(os.path.join(dir, x))
    repo_types = {'hg':      lambda dir=None: repofilter(dir, '.hg'),
                  'git':     lambda dir=None: repofilter(dir, '.git'),
                  'bzr':     lambda dir=None: repofilter(dir, '.bzr'),
                  'darcs':   lambda dir=None: repofilter(dir, '.darcs')}

    usage = "usage: %prog [options] <dir1> <dir2> ...\n\n" +\
            "%prog is a program to scan for repositories of different vcs in\nthe given directories.\n\n" +\
            "TYPE: " + ", ".join(sorted(repo_types.keys()))
    parser = optparse.OptionParser(usage)
    parser.add_option("-r", "--recursive", action="store_true", dest="recursive", default=False,
            help="Search the given directories recursive for mercurial repositories")
    parser.add_option("-t", "--type", dest="type", default="hg", help="Type of repository (default=%default)")
    (opts, args) = parser.parse_args()

    walkfunc = walkrepos_flat
    if opts.recursive:
        walkfunc = walkrepos
    if len(args) == 0:
        args.append(".")

    printfunc = lambda x: sys.stdout.write(x + '\n')
    for i in args:
        filter(printfunc, walkfunc(i, repo_types[opts.type]))

