From d82c576ba900004538e32984494fd48edd6339af Mon Sep 17 00:00:00 2001 From: Alejandro R Mosteo Date: Tue, 1 Sep 2020 18:54:08 +0200 Subject: [PATCH] Move out a possible upstream-provided manifest (#487) When doing `alr get` we want to use the index-provided manifest for reproducibility. So, an eventual upstream manifest provided with the sources is renamed with an extra ".upstream" coda. --- src/alire/alire-workspace.adb | 31 ++++++++++++++++--- .../my_index/crates/crate/.emptydir | 0 .../my_index/crates/crate/alire.lock | 6 ++++ .../my_index/crates/crate/alire.toml | 11 +++++++ .../my_index/crates/crate/crate.gpr | 22 +++++++++++++ .../my_index/crates/crate/src/crate.adb | 4 +++ .../my_index/index/cr/crate/crate-1.0.0.toml | 9 ++++++ .../my_index/index/index.toml | 1 + .../tests/get/backup-user-manifest/test.py | 22 +++++++++++++ .../tests/get/backup-user-manifest/test.yaml | 4 +++ 10 files changed, 105 insertions(+), 5 deletions(-) create mode 100644 testsuite/tests/get/backup-user-manifest/my_index/crates/crate/.emptydir create mode 100644 testsuite/tests/get/backup-user-manifest/my_index/crates/crate/alire.lock create mode 100644 testsuite/tests/get/backup-user-manifest/my_index/crates/crate/alire.toml create mode 100644 testsuite/tests/get/backup-user-manifest/my_index/crates/crate/crate.gpr create mode 100644 testsuite/tests/get/backup-user-manifest/my_index/crates/crate/src/crate.adb create mode 100644 testsuite/tests/get/backup-user-manifest/my_index/index/cr/crate/crate-1.0.0.toml create mode 100644 testsuite/tests/get/backup-user-manifest/my_index/index/index.toml create mode 100644 testsuite/tests/get/backup-user-manifest/test.py create mode 100644 testsuite/tests/get/backup-user-manifest/test.yaml diff --git a/src/alire/alire-workspace.adb b/src/alire/alire-workspace.adb index 2c71e2bf..3da02fd8 100644 --- a/src/alire/alire-workspace.adb +++ b/src/alire/alire-workspace.adb @@ -189,6 +189,7 @@ package body Alire.Workspace is Generate_Files : Boolean := True; Perform_Actions : Boolean := True) is + use Directories; Was_There : Boolean with Unreferenced; begin Alire.Workspace.Deploy_Release @@ -198,10 +199,30 @@ package body Alire.Workspace is Was_There => Was_There, Perform_Actions => Perform_Actions); + -- Backup a potentially packaged manifest, so our authoritative manifest + -- from the index is always used. + + declare + Working_Dir : Guard (Enter (Release.Unique_Folder)) + with Unreferenced; + begin + if GNAT.OS_Lib.Is_Regular_File (Roots.Crate_File_Name) then + Trace.Debug ("Backing up bundled manifest file as *.upstream"); + declare + Upstream_File : constant String := + Roots.Crate_File_Name & ".upstream"; + begin + Alire.Directories.Backup_If_Existing (Upstream_File); + Ada.Directories.Rename (Old_Name => Roots.Crate_File_Name, + New_Name => Upstream_File); + end; + end if; + end; + -- And generate its working files, if they do not exist + if Generate_Files then declare - use Directories; Working_Dir : Guard (Enter (Release.Unique_Folder)) with Unreferenced; Root : constant Alire.Roots.Root := @@ -225,10 +246,10 @@ package body Alire.Workspace is -- will be replaced with the complete solution. Lockfiles.Write - ((Solution => (if Release.Dependencies (Env).Is_Empty - then Alire.Solutions.Empty_Valid_Solution - else Alire.Solutions.Empty_Invalid_Solution)), - Filename => Root.Lock_File); + ((Solution => (if Release.Dependencies (Env).Is_Empty + then Alire.Solutions.Empty_Valid_Solution + else Alire.Solutions.Empty_Invalid_Solution)), + Filename => Root.Lock_File); end; end if; end Deploy_Root; diff --git a/testsuite/tests/get/backup-user-manifest/my_index/crates/crate/.emptydir b/testsuite/tests/get/backup-user-manifest/my_index/crates/crate/.emptydir new file mode 100644 index 00000000..e69de29b diff --git a/testsuite/tests/get/backup-user-manifest/my_index/crates/crate/alire.lock b/testsuite/tests/get/backup-user-manifest/my_index/crates/crate/alire.lock new file mode 100644 index 00000000..fd320eee --- /dev/null +++ b/testsuite/tests/get/backup-user-manifest/my_index/crates/crate/alire.lock @@ -0,0 +1,6 @@ +# THIS IS A MACHINE-GENERATED FILE. DO NOT EDIT MANUALLY. + +[solution] +[solution.context] +solved = true + diff --git a/testsuite/tests/get/backup-user-manifest/my_index/crates/crate/alire.toml b/testsuite/tests/get/backup-user-manifest/my_index/crates/crate/alire.toml new file mode 100644 index 00000000..8623a194 --- /dev/null +++ b/testsuite/tests/get/backup-user-manifest/my_index/crates/crate/alire.toml @@ -0,0 +1,11 @@ +description = "Shiny new project" +maintainers = ["your@email.here"] +maintainers-logins = ["github-username"] +metadata-version = "0.2.0" +name = "crate" +version = "1.0.0" + +# We check the following property is absent after `alr get` completes in the +# regular manifest, but present in the *.upstream backup + +badproperty = "a malicious property that is not in the index metadata" diff --git a/testsuite/tests/get/backup-user-manifest/my_index/crates/crate/crate.gpr b/testsuite/tests/get/backup-user-manifest/my_index/crates/crate/crate.gpr new file mode 100644 index 00000000..48ba9327 --- /dev/null +++ b/testsuite/tests/get/backup-user-manifest/my_index/crates/crate/crate.gpr @@ -0,0 +1,22 @@ +project Crate is + + for Source_Dirs use ("src"); + for Object_Dir use "obj"; + for Exec_Dir use "bin"; + for Main use ("crate.adb"); + + package Builder is + for Switches ("ada") use ("-j0", "-g"); + end Builder; + + package Compiler is + for Switches ("ada") use + ("-gnatVa", "-gnatwa", "-g", "-O2", + "-gnata", "-gnato", "-fstack-check"); + end Compiler; + + package Binder is + for Switches ("ada") use ("-Es"); + end Binder; + +end Crate; diff --git a/testsuite/tests/get/backup-user-manifest/my_index/crates/crate/src/crate.adb b/testsuite/tests/get/backup-user-manifest/my_index/crates/crate/src/crate.adb new file mode 100644 index 00000000..27b9f460 --- /dev/null +++ b/testsuite/tests/get/backup-user-manifest/my_index/crates/crate/src/crate.adb @@ -0,0 +1,4 @@ +procedure Crate is +begin + null; +end Crate; diff --git a/testsuite/tests/get/backup-user-manifest/my_index/index/cr/crate/crate-1.0.0.toml b/testsuite/tests/get/backup-user-manifest/my_index/index/cr/crate/crate-1.0.0.toml new file mode 100644 index 00000000..97fb716e --- /dev/null +++ b/testsuite/tests/get/backup-user-manifest/my_index/index/cr/crate/crate-1.0.0.toml @@ -0,0 +1,9 @@ +description = "Sample crate" +name = "crate" +version = "1.0.0" +licenses = [] +maintainers = ["any@bo.dy"] +maintainers-logins = ["someone"] + +[origin] +url = "file:../../../crates/crate" diff --git a/testsuite/tests/get/backup-user-manifest/my_index/index/index.toml b/testsuite/tests/get/backup-user-manifest/my_index/index/index.toml new file mode 100644 index 00000000..7c969026 --- /dev/null +++ b/testsuite/tests/get/backup-user-manifest/my_index/index/index.toml @@ -0,0 +1 @@ +version = "0.2" diff --git a/testsuite/tests/get/backup-user-manifest/test.py b/testsuite/tests/get/backup-user-manifest/test.py new file mode 100644 index 00000000..321a4644 --- /dev/null +++ b/testsuite/tests/get/backup-user-manifest/test.py @@ -0,0 +1,22 @@ +""" +Check that an upstream manifest is backed up and not used upon `alr get` +""" + +from drivers.alr import run_alr +from drivers.helpers import content_of +from os import chdir, path + +# Retrieve a crate that bundles a manifest file +run_alr('get', 'crate') +chdir('crate_1.0.0_filesystem') + +# Verify that the manifest has been properly renamed +assert path.isfile('alire.toml.upstream'), "Expected backup file missing" + +# Verify that contents are as expected in the generated and backed up manifests +assert "badproperty" not in content_of("alire.toml"), \ + "Unexpected contents present in manifest file" +assert "badproperty" in content_of("alire.toml.upstream"), \ + "Unexpected contents missing in upstream manifest file" + +print('SUCCESS') diff --git a/testsuite/tests/get/backup-user-manifest/test.yaml b/testsuite/tests/get/backup-user-manifest/test.yaml new file mode 100644 index 00000000..0a859639 --- /dev/null +++ b/testsuite/tests/get/backup-user-manifest/test.yaml @@ -0,0 +1,4 @@ +driver: python-script +indexes: + my_index: + in_fixtures: false -- 2.39.5