Fix performance regression with spack mirror create --all (#32005)

This PR fixes the performance regression reported in #31985 and a few
other issues found while refactoring the spack mirror create command.

Modifications:

* (Primary) Do not require concretization for
  `spack mirror create --all`
* Forbid using --versions-per-spec together with --all
* Fixed a few issues when reading specs from input file (specs were
  not concretized, command would fail when trying to mirror
  dependencies)
* Fix issue with default directory for spack mirror create not being
  canonicalized
* Add more unit tests to poke spack mirror create
* Skip externals also when mirroring environments
* Changed slightly the wording for reporting (it was mentioning
  "Successfully created" even in presence of errors)
* Fix issue with colify (was not called properly during error
  reporting)
This commit is contained in:
Massimiliano Culpo
2022-08-12 01:51:01 +02:00
committed by GitHub
parent a550b8ce30
commit 1913dc2da3
14 changed files with 419 additions and 187 deletions

View File

@@ -13,7 +13,7 @@
import sys
import traceback
from datetime import datetime, timedelta
from typing import List, Tuple
from typing import Any, Callable, Iterable, List, Tuple
import six
from six import string_types
@@ -977,6 +977,31 @@ def enum(**kwargs):
return type("Enum", (object,), kwargs)
def stable_partition(
input_iterable, # type: Iterable
predicate_fn, # type: Callable[[Any], bool]
):
# type: (...) -> Tuple[List[Any], List[Any]]
"""Partition the input iterable according to a custom predicate.
Args:
input_iterable: input iterable to be partitioned.
predicate_fn: predicate function accepting an iterable item
as argument.
Return:
Tuple of the list of elements evaluating to True, and
list of elements evaluating to False.
"""
true_items, false_items = [], []
for item in input_iterable:
if predicate_fn(item):
true_items.append(item)
continue
false_items.append(item)
return true_items, false_items
class TypedMutableSequence(MutableSequence):
"""Base class that behaves like a list, just with a different type.