pythonwise / whichscm

#!/usr/bin/env python
'''Find under which SCM directory is'''

__author__ = "Miki Tebeka <>"

from os import sep
from os.path import join, isdir, abspath
from itertools import ifilter, imap

def updirs(path):
    parts = path.split(sep)
    if not parts[0]:
        parts[0] = sep # FIXME: Windows
    while parts:
        yield join(*parts)

def scmdirs(path, scms):
    for scmext in scms:
        yield join(path, scmext)

def scm(dirname):
    return dirname[-3:].lower()

def scms(path, scms):
    return imap(scm, ifilter(isdir, scmdirs(path, scms)))

def whichscm(path):
    path = abspath(path)

    for scm in scms(path, (".svn", "CVS")):
        return scm

    scmdirs = (".bzr", ".hg", ".git")
    for dirname in updirs(path):
        for scm in scms(dirname, (".bzr", ".hg", ".git")):
            return scm

def main(argv=None):
    if argv is None:
        import sys
        argv = sys.argv

    from optparse import OptionParser

    parser = OptionParser("usage: %prog [DIRNAME]")

    opts, args = parser.parse_args(argv[1:])
    if len(args) not in (0, 1):
        parser.error("wrong number of arguments") # Will exit

    dirname = args[0] if args else "."
    if not isdir(dirname):
        raise SystemExit("error: %s is not a directory" % dirname)

    scm = whichscm(dirname)
    if not scm:
        raise SystemExit("error: can't find scm for %s" % dirname)

    print scm

if __name__ == "__main__":
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.