summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichał Górny <gentoo@mgorny.alt.pl>2010-07-11 11:50:02 +0200
committerZac Medico <zmedico@gentoo.org>2010-07-11 11:25:56 -0700
commit49e3e6196c243ba1995ec1000b51ccee768493a4 (patch)
treea2bca3f06dcf9a7a28dd6afcd352a93179e2041b
parenteca826bd3aa70697955ebcd035cf939efd7ab8db (diff)
downloadportage-49e3e6196c243ba1995ec1000b51ccee768493a4.tar.gz
portage-49e3e6196c243ba1995ec1000b51ccee768493a4.tar.bz2
portage-49e3e6196c243ba1995ec1000b51ccee768493a4.zip
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.
-rwxr-xr-xbin/repoman19
-rw-r--r--pym/repoman/utilities.py44
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