From 49e3e6196c243ba1995ec1000b51ccee768493a4 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Micha=C5=82=20G=C3=B3rny?= Date: Sun, 11 Jul 2010 11:50:02 +0200 Subject: [PATCH] Rewrite VCS detection code in repoman. Move the real code into repoman.utilities. Support any repository depth for distributed SCMs -- i.e. Sunrise through git-svn. Bail out if more than one control version directory is found at the same depth. --- bin/repoman | 19 ++++++++--------- pym/repoman/utilities.py | 44 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 52 insertions(+), 11 deletions(-) diff --git a/bin/repoman b/bin/repoman index 324ad2ea2..8ded3475d 100755 --- a/bin/repoman +++ b/bin/repoman @@ -476,17 +476,14 @@ if portdir is None: myreporoot = os.path.basename(portdir_overlay) myreporoot += mydir[len(portdir_overlay):] -vcs = None -if os.path.isdir("CVS"): - vcs = "cvs" -if os.path.isdir(".svn"): - vcs = "svn" -elif os.path.isdir(os.path.join(portdir_overlay, ".git")): - vcs = "git" -elif os.path.isdir(os.path.join(portdir_overlay, ".bzr")): - vcs = "bzr" -elif os.path.isdir(os.path.join(portdir_overlay, ".hg")): - vcs = "hg" +vcses = utilities.FindVCS() +if len(vcses) > 1: + print(red('*** Ambiguous workdir -- more than one VCS found at the same depth: %s.' % ', '.join(vcses))) + sys.exit(1) +elif vcses: + vcs = vcses[0] +else: + vcs = None # Note: We don't use ChangeLogs in distributed SCMs. # It will be generated on server side from scm log, diff --git a/pym/repoman/utilities.py b/pym/repoman/utilities.py index 305080411..a07b4a436 100644 --- a/pym/repoman/utilities.py +++ b/pym/repoman/utilities.py @@ -433,3 +433,47 @@ def FindPortdir(settings): portdir += '/' return [normalize_path(x) for x in (portdir, portdir_overlay, location)] + +def FindVCS(): + """ Try to figure out in what VCS' working tree we are. """ + + outvcs = [] + + def seek(depth = None): + """ Seek for distributed VCSes. """ + retvcs = [] + pathprep = '' + + while depth is None or depth > 0: + if os.path.isdir(os.path.join(pathprep, '.git')): + retvcs.append('git') + if os.path.isdir(os.path.join(pathprep, '.bzr')): + retvcs.append('bzr') + if os.path.isdir(os.path.join(pathprep, '.hg')): + retvcs.append('hg') + + if retvcs: + break + pathprep = os.path.join(pathprep, '..') + if os.path.realpath(pathprep).strip('/') == '': + break + if depth is not None: + depth = depth - 1 + + return retvcs + + # Level zero VCS-es. + if os.path.isdir('CVS'): + outvcs.append('cvs') + if os.path.isdir('.svn'): + outvcs.append('svn') + + # If we already found one of 'level zeros', just take a quick look + # at the current directory. Otherwise, seek parents till we get + # something or reach root. + if outvcs: + outvcs.extend(seek(1)) + else: + outvcs = seek() + + return outvcs -- 2.26.2