summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/spack/spack/cmd/mirror.py50
-rw-r--r--lib/spack/spack/stage.py6
2 files changed, 44 insertions, 12 deletions
diff --git a/lib/spack/spack/cmd/mirror.py b/lib/spack/spack/cmd/mirror.py
index a2d2e80f5e..946b50350b 100644
--- a/lib/spack/spack/cmd/mirror.py
+++ b/lib/spack/spack/cmd/mirror.py
@@ -60,15 +60,22 @@ def setup_parser(subparser):
'-o', '--one-version-per-spec', action='store_const', const=1, default=0,
help="Only fetch one 'preferred' version per spec, not all known versions.")
+
add_parser = sp.add_parser('add', help=mirror_add.__doc__)
add_parser.add_argument('name', help="Mnemonic name for mirror.")
add_parser.add_argument(
'url', help="URL of mirror directory created by 'spack mirror create'.")
+ add_parser.add_argument('--scope', choices=spack.config.config_scopes,
+ help="Configuration scope to modify.")
remove_parser = sp.add_parser('remove', help=mirror_remove.__doc__)
remove_parser.add_argument('name')
+ remove_parser.add_argument('--scope', choices=spack.config.config_scopes,
+ help="Configuration scope to modify.")
list_parser = sp.add_parser('list', help=mirror_list.__doc__)
+ list_parser.add_argument('--scope', choices=spack.config.config_scopes,
+ help="Configuration scope to read from.")
def mirror_add(args):
@@ -77,31 +84,54 @@ def mirror_add(args):
if url.startswith('/'):
url = 'file://' + url
- mirror_dict = { args.name : url }
- spack.config.update_config('mirrors', { args.name : url }, 'user')
+ mirrors = spack.config.get_config('mirrors', scope=args.scope)
+ if not mirrors:
+ mirrors = []
+
+ for m in mirrors:
+ for name, u in m.items():
+ if name == args.name:
+ tty.die("Mirror with name %s already exists." % name)
+ if u == url:
+ tty.die("Mirror with url %s already exists." % url)
+ # should only be one item per mirror dict.
+
+ mirrors.insert(0, { args.name : url })
+ spack.config.update_config('mirrors', mirrors, scope=args.scope)
def mirror_remove(args):
"""Remove a mirror by name."""
name = args.name
- rmd_something = spack.config.remove_from_config('mirrors', name)
- if not rmd_something:
- tty.die("No such mirror: %s" % name)
+ mirrors = spack.config.get_config('mirrors', scope=args.scope)
+ if not mirrors:
+ mirrors = []
+
+ names = [n for m in mirrors for n,u in m.items()]
+ if not name in names:
+ tty.die("No mirror with name %s" % name)
+
+ old_mirror = mirrors.pop(names.index(name))
+ spack.config.update_config('mirrors', mirrors, scope=args.scope)
+ tty.msg("Removed mirror %s with url %s." % old_mirror.popitem())
def mirror_list(args):
"""Print out available mirrors to the console."""
- sec_names = spack.config.get_config('mirrors')
- if not sec_names:
+ mirrors = spack.config.get_config('mirrors', scope=args.scope)
+ if not mirrors:
tty.msg("No mirrors configured.")
return
- max_len = max(len(s) for s in sec_names)
+ names = [n for m in mirrors for n,u in m.items()]
+ max_len = max(len(n) for n in names)
fmt = "%%-%ds%%s" % (max_len + 4)
- for name, val in sec_names.iteritems():
- print fmt % (name, val)
+ for m in mirrors:
+ for name, url in m.items():
+ print fmt % (name, url)
+ # should only be one item per mirror dict.
def _read_specs_from_file(filename):
diff --git a/lib/spack/spack/stage.py b/lib/spack/spack/stage.py
index 543a3a6223..a9631d4b62 100644
--- a/lib/spack/spack/stage.py
+++ b/lib/spack/spack/stage.py
@@ -26,6 +26,7 @@ import os
import re
import shutil
import tempfile
+from urlparse import urljoin
import llnl.util.tty as tty
from llnl.util.filesystem import *
@@ -242,8 +243,9 @@ class Stage(object):
# TODO: move mirror logic out of here and clean it up!
if self.mirror_path:
- urls = ["%s/%s" % (u, self.mirror_path)
- for name, u in spack.config.get_config('mirrors')]
+ mirrors = spack.config.get_config('mirrors')
+ mirrors = [(n,u) for m in mirrors for n,u in m.items()]
+ urls = [urljoin(u, self.mirror_path) for name, u in mirrors]
digest = None
if isinstance(self.fetcher, fs.URLFetchStrategy):