summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/spack/spack/ci.py42
1 files changed, 33 insertions, 9 deletions
diff --git a/lib/spack/spack/ci.py b/lib/spack/spack/ci.py
index b48f6d44d2..c981329910 100644
--- a/lib/spack/spack/ci.py
+++ b/lib/spack/spack/ci.py
@@ -526,6 +526,28 @@ def get_change_revisions():
return None, None
+def get_stack_changed(env_path, rev1='HEAD^', rev2='HEAD'):
+ """Given an environment manifest path and two revisions to compare, return
+ whether or not the stack was changed. Returns True if the environment
+ manifest changed between the provided revisions (or additionally if the
+ `.gitlab-ci.yml` file itself changed). Returns False otherwise."""
+ git = exe.which("git")
+ if git:
+ with fs.working_dir(spack.paths.prefix):
+ git_log = git("diff", "--name-only", rev1, rev2,
+ output=str, error=os.devnull,
+ fail_on_error=False).strip()
+ lines = [] if not git_log else re.split(r'\s+', git_log)
+
+ for path in lines:
+ if '.gitlab-ci.yml' in path or path in env_path:
+ tty.debug('env represented by {0} changed'.format(
+ env_path))
+ tty.debug('touched file: {0}'.format(path))
+ return True
+ return False
+
+
def compute_affected_packages(rev1='HEAD^', rev2='HEAD'):
"""Determine which packages were added, removed or changed
between rev1 and rev2, and return the names as a set"""
@@ -607,15 +629,17 @@ def generate_gitlab_ci_yaml(env, print_summary, output_file,
rev1, rev2 = get_change_revisions()
tty.debug('Got following revisions: rev1={0}, rev2={1}'.format(rev1, rev2))
if rev1 and rev2:
- prune_untouched_packages = True
- affected_pkgs = compute_affected_packages(rev1, rev2)
- tty.debug('affected pkgs:')
- for p in affected_pkgs:
- tty.debug(' {0}'.format(p))
- affected_specs = get_spec_filter_list(env, affected_pkgs)
- tty.debug('all affected specs:')
- for s in affected_specs:
- tty.debug(' {0}'.format(s.name))
+ # If the stack file itself did not change, proceed with pruning
+ if not get_stack_changed(env.manifest_path, rev1, rev2):
+ prune_untouched_packages = True
+ affected_pkgs = compute_affected_packages(rev1, rev2)
+ tty.debug('affected pkgs:')
+ for p in affected_pkgs:
+ tty.debug(' {0}'.format(p))
+ affected_specs = get_spec_filter_list(env, affected_pkgs)
+ tty.debug('all affected specs:')
+ for s in affected_specs:
+ tty.debug(' {0}'.format(s.name))
generate_job_name = os.environ.get('CI_JOB_NAME', None)
parent_pipeline_id = os.environ.get('CI_PIPELINE_ID', None)