Changed anonymous specs to have name=None instead of empty string
This commit is contained in:
parent
73107d6b0f
commit
222c84d9be
3 changed files with 37 additions and 32 deletions
|
@ -161,7 +161,7 @@ def find(parser, args):
|
|||
# Filter out specs that don't exist.
|
||||
query_specs = spack.cmd.parse_specs(args.query_specs)
|
||||
query_specs, nonexisting = partition_list(
|
||||
query_specs, lambda s: spack.repo.exists(s.name) or s.name == "")
|
||||
query_specs, lambda s: spack.repo.exists(s.name) or not s.name)
|
||||
|
||||
if nonexisting:
|
||||
msg = "No such package%s: " % ('s' if len(nonexisting) > 1 else '')
|
||||
|
|
|
@ -566,7 +566,7 @@ def _add_dependency(self, spec):
|
|||
#
|
||||
@property
|
||||
def fullname(self):
|
||||
return '%s.%s' % (self.namespace, self.name) if self.namespace else self.name
|
||||
return '%s.%s' % (self.namespace, self.name) if self.namespace else (self.name if self.name else '')
|
||||
|
||||
|
||||
@property
|
||||
|
@ -616,7 +616,7 @@ def virtual(self):
|
|||
@staticmethod
|
||||
def is_virtual(name):
|
||||
"""Test if a name is virtual without requiring a Spec."""
|
||||
return name != '' and not spack.repo.exists(name)
|
||||
return (not name is None) and ( not spack.repo.exists(name) )
|
||||
|
||||
|
||||
@property
|
||||
|
@ -1044,7 +1044,7 @@ def concretize(self):
|
|||
with requirements of its pacakges. See flatten() and normalize() for
|
||||
more details on this.
|
||||
"""
|
||||
if self.name == "":
|
||||
if not self.name:
|
||||
raise SpecError("Attempting to concretize anonymous spec")
|
||||
|
||||
if self._concrete:
|
||||
|
@ -1313,7 +1313,7 @@ def normalize(self, force=False):
|
|||
TODO: normalize should probably implement some form of cycle detection,
|
||||
to ensure that the spec is actually a DAG.
|
||||
"""
|
||||
if self.name == "":
|
||||
if not self.name:
|
||||
raise SpecError("Attempting to normalize anonymous spec")
|
||||
|
||||
if self._normal and not force:
|
||||
|
@ -1360,7 +1360,7 @@ def validate_names(self):
|
|||
"""
|
||||
for spec in self.traverse():
|
||||
# Don't get a package for a virtual name.
|
||||
if not spec.virtual and spec.name != '':
|
||||
if (not spec.virtual) and spec.name:
|
||||
spack.repo.get(spec.fullname)
|
||||
|
||||
# validate compiler in addition to the package name.
|
||||
|
@ -1381,7 +1381,7 @@ def constrain(self, other, deps=True):
|
|||
"""
|
||||
other = self._autospec(other)
|
||||
|
||||
if not (self.name == other.name or self.name == "" or other.name == ""):
|
||||
if not (self.name == other.name or (not self.name) or (not other.name) ):
|
||||
raise UnsatisfiableSpecNameError(self.name, other.name)
|
||||
|
||||
if other.namespace is not None:
|
||||
|
@ -1485,7 +1485,7 @@ def _autospec(self, spec_like):
|
|||
|
||||
try:
|
||||
spec = spack.spec.Spec(spec_like)
|
||||
if spec.name == "":
|
||||
if not spec.name:
|
||||
raise SpecError("anonymous package -- this will always be handled")
|
||||
return spec
|
||||
except SpecError:
|
||||
|
@ -1518,7 +1518,7 @@ def satisfies(self, other, deps=True, strict=False):
|
|||
return False
|
||||
|
||||
# Otherwise, first thing we care about is whether the name matches
|
||||
if self.name != other.name and self.name != "" and other.name != "":
|
||||
if self.name != other.name and (not self.name) and (not other.name):
|
||||
return False
|
||||
|
||||
# namespaces either match, or other doesn't require one.
|
||||
|
@ -1540,7 +1540,7 @@ def satisfies(self, other, deps=True, strict=False):
|
|||
return False
|
||||
|
||||
var_strict = strict
|
||||
if self.name == "" or other.name == "":
|
||||
if (not self.name) or (not other.name):
|
||||
var_strict = True
|
||||
if not self.variants.satisfies(other.variants, strict=var_strict):
|
||||
return False
|
||||
|
@ -1559,7 +1559,7 @@ def satisfies(self, other, deps=True, strict=False):
|
|||
# If we need to descend into dependencies, do it, otherwise we're done.
|
||||
if deps:
|
||||
deps_strict = strict
|
||||
if self.name == "" or other.name == "":
|
||||
if not (self.name and other.name):
|
||||
deps_strict=True
|
||||
return self.satisfies_dependencies(other, strict=deps_strict)
|
||||
else:
|
||||
|
@ -1872,7 +1872,8 @@ def write(s, c):
|
|||
fmt += 's'
|
||||
|
||||
if c == '_':
|
||||
out.write(fmt % self.name)
|
||||
if name = self.name if self.name else ''
|
||||
out.write(fmt % name)
|
||||
elif c == '.':
|
||||
out.write(fmt % self.fullname)
|
||||
elif c == '@':
|
||||
|
@ -1923,6 +1924,7 @@ def write(s, c):
|
|||
named_str += c
|
||||
continue;
|
||||
if named_str == 'PACKAGE':
|
||||
name = self.name if self.name else ''
|
||||
write(fmt % self.name, '@')
|
||||
if named_str == 'VERSION':
|
||||
if self.versions and self.versions != _any_version:
|
||||
|
@ -2034,7 +2036,6 @@ def __init__(self):
|
|||
# This is more liberal than identifier_re (see above).
|
||||
# Checked by check_identifier() for better error messages.
|
||||
(r'([\"\'])(?:(?=(\\?))\2.)*?\1',lambda scanner, val: self.token(QT, val)),
|
||||
# (r'([\"\'])([^\1]+?)(\1)',lambda scanner, val: self.token(QT, val)),
|
||||
(r'\w[\w.-]*', lambda scanner, val: self.token(ID, val)),
|
||||
(r'\s+', lambda scanner, val: None)])
|
||||
|
||||
|
@ -2051,12 +2052,12 @@ def do_parse(self):
|
|||
while self.next:
|
||||
# TODO: clean this parsing up a bit
|
||||
if self.previous:
|
||||
specs.append(self.previous.value)
|
||||
specs.append(self.spec(self.previous.value))
|
||||
if self.accept(ID):
|
||||
self.previous = self.token
|
||||
if self.accept(EQ):
|
||||
if not specs:
|
||||
specs.append(self.spec(''))
|
||||
specs.append(self.spec(None))
|
||||
if self.accept(QT):
|
||||
self.token.value = self.token.value[1:-1]
|
||||
else:
|
||||
|
@ -2071,7 +2072,7 @@ def do_parse(self):
|
|||
elif self.accept(DEP):
|
||||
if not specs:
|
||||
self.previous = self.token
|
||||
specs.append(self.spec(''))
|
||||
specs.append(self.spec(None))
|
||||
self.previous = None
|
||||
if self.accept(HASH):
|
||||
specs[-1]._add_dependency(self.spec_by_hash())
|
||||
|
@ -2082,7 +2083,7 @@ def do_parse(self):
|
|||
else:
|
||||
# Attempt to construct an anonymous spec, but check that the first token is valid
|
||||
# TODO: Is this check even necessary, or will it all be Lex errors now?
|
||||
specs.append(self.spec('',True))
|
||||
specs.append(self.spec(None,True))
|
||||
|
||||
except spack.parse.ParseError, e:
|
||||
raise SpecParseError(e)
|
||||
|
@ -2107,14 +2108,7 @@ def spec_by_hash(self):
|
|||
tty.die("%s does not match any installed packages." %self.token.value)
|
||||
|
||||
if len(matches) != 1:
|
||||
tty.error("%s matches multiple installed packages:" %self.token.value)
|
||||
print
|
||||
display_specs(matches, long=True)
|
||||
print
|
||||
print "You can either:"
|
||||
print " a) Use a more specific hash, or"
|
||||
print " b) Specify the package by name."
|
||||
sys.exit(1)
|
||||
raise AmbiguousHashError("Multiple packages specify hash %s." % self.token.value, *matches)
|
||||
|
||||
return matches[0]
|
||||
|
||||
|
@ -2122,12 +2116,15 @@ def spec_by_hash(self):
|
|||
def spec(self, name, check_valid_token = False):
|
||||
"""Parse a spec out of the input. If a spec is supplied, then initialize
|
||||
and return it instead of creating a new one."""
|
||||
spec_namespace, dot, spec_name = name.rpartition('.')
|
||||
if not spec_namespace:
|
||||
spec_namespace = None
|
||||
|
||||
if spec_name != '':
|
||||
if name:
|
||||
spec_namespace, dot, spec_name = name.rpartition('.')
|
||||
if not spec_namespace:
|
||||
spec_namespace = None
|
||||
self.check_identifier(spec_name)
|
||||
else:
|
||||
spec_name = None
|
||||
|
||||
|
||||
|
||||
# This will init the spec without calling __init__.
|
||||
spec = Spec.__new__(Spec)
|
||||
|
@ -2155,6 +2152,8 @@ def spec(self, name, check_valid_token = False):
|
|||
spec.add_dependency(self.spec_by_hash())
|
||||
else:
|
||||
self.expect(ID)
|
||||
if self.accept(EQ):
|
||||
raise SpecParseError(spack.parse.ParseError("","","Expected dependency received anonymous spec"))
|
||||
spec.add_dependency(self.spec(self.token.value))
|
||||
|
||||
while self.next:
|
||||
|
@ -2294,7 +2293,7 @@ def parse_anonymous_spec(spec_like, pkg_name):
|
|||
try:
|
||||
anon_spec = Spec(spec_like)
|
||||
if anon_spec.name != pkg_name:
|
||||
raise SpecParseError(spack.parse.ParseError("","","anon spec created without proper name"))
|
||||
raise SpecParseError(spack.parse.ParseError("","","Expected anonymous spec for package %s but found spec for package %s" % (pkg_name, anon_spec_name) ))
|
||||
except SpecParseError:
|
||||
anon_spec = Spec(pkg_name + ' ' + spec_like)
|
||||
if anon_spec.name != pkg_name: raise ValueError(
|
||||
|
@ -2470,3 +2469,9 @@ def __init__(self, msg, yaml_error):
|
|||
class SpackRecordError(spack.error.SpackError):
|
||||
def __init__(self, msg):
|
||||
super(SpackRecordError, self).__init__(msg)
|
||||
|
||||
class AmbiguousHashError(SpecError):
|
||||
def __init__(self, msg, *specs):
|
||||
super(AmbiguousHashError, self).__init__(msg)
|
||||
for spec in specs:
|
||||
print ' ', spec.format('$.$@$%@+$+$=$#')
|
||||
|
|
|
@ -67,7 +67,7 @@ def update(self, spec):
|
|||
if type(spec) != spack.spec.Spec:
|
||||
spec = spack.spec.Spec(spec)
|
||||
|
||||
if spec.name == "":
|
||||
if not spec.name:
|
||||
# Empty specs do not have a package
|
||||
return
|
||||
|
||||
|
|
Loading…
Reference in a new issue