# HG changeset patch # User Marcin Kuzminski # Date 1292985572 -3600 # Node ID bc9a73adc216416cb6150da95bb575136fc68db0 # Parent 92bc5ddbda0697e13a5df635550b967b7391806f Added recursive scanning for repositories in directory diff -r 92bc5ddbda06 -r bc9a73adc216 rhodecode/lib/utils.py --- a/rhodecode/lib/utils.py Wed Dec 22 01:53:56 2010 +0100 +++ b/rhodecode/lib/utils.py Wed Dec 22 03:39:32 2010 +0100 @@ -110,31 +110,38 @@ log.error(traceback.format_exc()) sa.rollback() -def get_repos(path, recursive=False, initial=False): +def get_repos(path, recursive=False): """ Scans given path for repos and return (name,(type,path)) tuple - :param prefix: - :param path: - :param recursive: - :param initial: + :param path: path to scann for repositories + :param recursive: recursive search and return names with subdirs in front """ from vcs.utils.helpers import get_scm from vcs.exceptions import VCSError - try: - scm = get_scm(path) - except: - pass - else: - raise Exception('The given path %s should not be a repository got %s', - path, scm) + if path.endswith('/'): + #add ending slash for better results + path = path[:-1] - for dirpath in os.listdir(path): - try: - yield dirpath, get_scm(os.path.join(path, dirpath)) - except VCSError: - pass + def _get_repos(p): + for dirpath in os.listdir(p): + if os.path.isfile(os.path.join(p, dirpath)): + continue + cur_path = os.path.join(p, dirpath) + try: + scm_info = get_scm(cur_path) + yield scm_info[1].split(path)[-1].lstrip('/'), scm_info + except VCSError: + if not recursive: + continue + #check if this dir containts other repos for recursive scan + rec_path = os.path.join(p, dirpath) + if os.path.isdir(rec_path): + for inner_scm in _get_repos(rec_path): + yield inner_scm + + return _get_repos(path) def check_repo_fast(repo_name, base_path): """ diff -r 92bc5ddbda06 -r bc9a73adc216 rhodecode/model/scm.py --- a/rhodecode/model/scm.py Wed Dec 22 01:53:56 2010 +0100 +++ b/rhodecode/model/scm.py Wed Dec 22 03:39:32 2010 +0100 @@ -41,7 +41,7 @@ from rhodecode import BACKENDS from rhodecode.lib import helpers as h from rhodecode.lib.auth import HasRepoPermissionAny -from rhodecode.lib.utils import get_repos, make_ui, action_logger +from rhodecode.lib.utils import get_repos as get_filesystem_repos, make_ui, action_logger from rhodecode.model import BaseModel from rhodecode.model.user import UserModel @@ -90,7 +90,7 @@ baseui = make_ui('db') repos_list = {} - for name, path in get_repos(repos_path): + for name, path in get_filesystem_repos(repos_path, recursive=True): try: if repos_list.has_key(name): raise RepositoryError('Duplicate repository name %s '