Skip to content

Commit

Permalink
Fix list of default licenses (#1490)
Browse files Browse the repository at this point in the history
* Remove duplication in error message output

* Early detect bad license among choices

* Fix bad license

* Fix error deduplication

* New test for default licenses
  • Loading branch information
mosteo authored Nov 6, 2023
1 parent 7bb1d57 commit d1c1fbf
Show file tree
Hide file tree
Showing 9 changed files with 114 additions and 23 deletions.
2 changes: 1 addition & 1 deletion .github/workflows/ci-toolchain.yml
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@ jobs:
python-version: '3.x'

- name: Install e3
run: pip install --upgrade e3-testsuite
run: pip install --upgrade -r testsuite/requirements.txt

- name: Run testsuite
run: cd testsuite; ./run.py -E
Expand Down
19 changes: 11 additions & 8 deletions src/alire/alire-errors.adb
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
with Ada.Containers.Indefinite_Doubly_Linked_Lists;
with Ada.Containers.Indefinite_Ordered_Maps;

package body Alire.Errors is
Expand Down Expand Up @@ -166,18 +165,15 @@ package body Alire.Errors is
-- ERROR STACKING --
--------------------

package String_Lists is
new Ada.Containers.Indefinite_Doubly_Linked_Lists (String);

Error_Stack : String_Lists.List;
Error_Stack : AAA.Strings.Vector;

----------
-- Open --
----------

function Open (Text : String) return Scope is
begin
Error_Stack.Append (Text);
Open (Text);
return (Ada.Finalization.Limited_Controlled with null record);
end Open;

Expand Down Expand Up @@ -219,8 +215,15 @@ package body Alire.Errors is
Msg : UString;
use UStrings;
begin
for Item of Error_Stack loop
Append (Msg, Item & ASCII.LF);
-- Remove duplicates that may have creeped in when generating the final
-- stack:

for I in Error_Stack.First_Index .. Error_Stack.Last_Index loop
if I = Error_Stack.First_Index
or else Error_Stack (I) /= Error_Stack (I - 1)
then
Append (Msg, Error_Stack (I) & ASCII.LF);
end if;
end loop;

return +Msg & Text;
Expand Down
13 changes: 5 additions & 8 deletions src/alire/alire-properties-licenses.adb
Original file line number Diff line number Diff line change
Expand Up @@ -66,10 +66,11 @@ package body Alire.Properties.Licenses is
if not SPDX.Valid (SPDX_Exp) then
if Legacy = Licensing.Unknown then
raise Checked_Error
with Errors.Set
("Invalid license expression '" & From &
"': " & SPDX.Error (SPDX_Exp) &
" . SPDX expression expected (https://spdx.org/licenses/)");
with Errors.New_Wrapper
("Invalid license expression '" & From)
.Wrap (SPDX.Error (SPDX_Exp))
.Wrap ("SPDX expression expected (https://spdx.org/licenses/)")
.Set;
else
Trace.Warning ("Deprecated license identifier '" & From &
"'. Please replace with an SPDX expression " &
Expand Down Expand Up @@ -121,10 +122,6 @@ package body Alire.Properties.Licenses is
end if;

return Props;
exception
when E : Checked_Error => -- May happen on unknown non-custom license.
From.Checked_Error (Errors.Get (E));
-- Re-raise with full context of From.
end From_TOML;

end Alire.Properties.Licenses;
13 changes: 9 additions & 4 deletions src/alr/alr-commands-init.adb
Original file line number Diff line number Diff line change
Expand Up @@ -433,11 +433,12 @@ package body Alr.Commands.Init is
.Append ("Apache-2.0")
.Append ("BSD-3-Clause")
.Append ("LGPL-3.0-or-later")
.Append ("GPL-3.0-or-later WITH GPL-3.0-with-GCC-exception")
.Append ("GPL-3.0-or-later WITH GCC-exception-3.1")
.Append ("GPL-3.0-or-later")
.Append (License_Other);

Answer : Natural;
Answer : Natural := 0;
function Chosen return String is (License_Vect (Answer));
begin
Answer := CLIC.User_Input.Query_Multi
(Question => "Select a software " & Emph ("license") &
Expand All @@ -456,7 +457,11 @@ package body Alr.Commands.Init is
Default => "",
Validation => License_Validation'Access));
else
Info.Licenses := To_Unbounded_String (License_Vect (Answer));
if not License_Validation (Chosen) then
raise Program_Error with
"Invalid license among choices: " & Chosen;
end if;
Info.Licenses := To_Unbounded_String (Chosen);
end if;
end Query_License;

Expand Down Expand Up @@ -598,7 +603,7 @@ package body Alr.Commands.Init is

Info.Website := To_Unbounded_String
(CLIC.User_Input.Query_String
(Question => "Enter a opional " & Emph ("Website URL") &
(Question => "Enter an optional " & Emph ("Website URL") &
" for the crate:",
Default => "",
Validation => null));
Expand Down
5 changes: 4 additions & 1 deletion testsuite/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,10 @@ RUN apt-get update && apt-get install -y \
sudo \
util-linux # for `unshare`

RUN pip3 install e3-testsuite
# Use parent testsuite python packages here too, as they are potential imports
# of the drivers and helpers that may be needed in the wrapped test.
COPY ./testsuite/requirements.txt /testsuite/requirements.txt
RUN pip3 install -r /testsuite/requirements.txt

WORKDIR /testsuite
USER user
49 changes: 48 additions & 1 deletion testsuite/drivers/alr.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,15 @@

import os
import os.path
import platform
import pexpect
import re
from shutil import copytree
import sys

from e3.fs import mkdir
from e3.os.process import Run, quote_arg
from e3.testsuite.driver.classic import ProcessResult
from shutil import copytree

TESTSUITE_ROOT = os.path.dirname(os.path.dirname(
os.path.abspath(__file__)))
Expand Down Expand Up @@ -127,6 +130,50 @@ def run_alr(*args, **kwargs):
return ProcessResult(p.status, p.out.replace('\r\n', '\n'))


def run_alr_interactive(args: [str], output: [str], input: [str], timeout=5) -> str:
"""
NON-WINDOWS-ONLY
Run "alr" with the given arguments, feeding it the given input. No other
arguments like -q or -d are added (except --no-color).
:param args: List of arguments to pass to "alr".
:param output: List of strings expected to be output by the subprocess.
:param input: List of strings to feed to the subprocess's standard input.
:param timeout: Timeout in seconds for the subprocess to complete.
"""
# Check whether on Windows to fail early (revisit if pexpect is updated?)
if platform.system() == "Windows":
print('SKIP: pexpect unavailable on Windows')
sys.exit(0)

# Run interactively using pexpect (run with input fails as it is not
# detected as tty and input is closed prematurely)
args.insert(0, "--no-color")
child = pexpect.spawn('alr', args=args, timeout=timeout)

try:
# Alternate between expected output and given input
for out, inp in zip(output, input):
child.expect(out)
child.sendline(inp)

# Wait for the process to finish
child.expect(pexpect.EOF) # Match all output before ending
child.wait()
child.close()
except pexpect.exceptions.TIMEOUT:
raise RuntimeError(f"pexpect timeout with alr output:\n"
f"{child.before.decode('utf-8')}")

# Assert proper output code
assert child.exitstatus == 0, \
f"Unexpected exit status: {child.exitstatus}\n" + \
f"Output: {child.before.decode('utf-8')}"

# Return command output with CRLF replaced by LF (as does run_alr)
return child.before.decode('utf-8').replace('\r\n', '\n')


def fixtures_path(*args):
"""
Return a path under the testsuite `fixtures` directory.
Expand Down
1 change: 1 addition & 0 deletions testsuite/requirements.txt
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
docker
e3-testsuite
pexpect
33 changes: 33 additions & 0 deletions testsuite/tests/init/default-licenses/test.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
"""
Check that offered default licenses are all valid
"""

import os
import shutil

from drivers.alr import run_alr, run_alr_interactive

# iterate over values 1..8
for i in range(1, 9):

# Run interactively
run_alr_interactive(['init', '--bin', 'xxx'],
output=['> ' for _ in range(7)],
input=['', # Description
'', # Full user name
'', # Github login
'', # Email
f'{i}', # License
'', # Tags
''], # Website
timeout=3)

# Check that it can be shown, which will load the manifest
os.chdir("xxx")
p = run_alr("show")

# Prepare for next iteration
os.chdir("..")
shutil.rmtree("xxx")

print('SUCCESS')
2 changes: 2 additions & 0 deletions testsuite/tests/init/default-licenses/test.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
driver: python-script
indexes: {}

0 comments on commit d1c1fbf

Please sign in to comment.