diff --git a/lib/hex/package.ex b/lib/hex/package.ex index d112cb01..6565458e 100644 --- a/lib/hex/package.ex +++ b/lib/hex/package.ex @@ -44,7 +44,9 @@ defmodule Hex.Package do can include wildcards. Defaults to `#{inspect(default_files())}`. * `:exclude_patterns` - List of patterns matching files and directories to exclude from the package. - * `:licenses` - List of licenses used by the package. + * `:licenses` - List of licenses used by the package. Use SPDX license + identifiers or `LicenseRef-` for custom licenses included in + the package. * `:links` - Map of links relevant to the package. * `:build_tools` - List of build tools that can build the package. Hex will try to automatically detect the build tools based on the files in the diff --git a/src/mix_hex_licenses.erl b/src/mix_hex_licenses.erl index 192f9091..def4ada5 100644 --- a/src/mix_hex_licenses.erl +++ b/src/mix_hex_licenses.erl @@ -1,4 +1,4 @@ -%% Vendored from hex_core v0.15.0 (90f9f59), do not edit manually +%% Vendored from hex_core v0.15.0 (4ff8378), do not edit manually %% @doc %% Hex Licenses. @@ -667,4 +667,30 @@ valid(<<"xlock">>) -> true; valid(<<"xpp">>) -> true; valid(<<"xzoom">>) -> true; valid(<<"zlib-acknowledgement">>) -> true; +valid(<<"LicenseRef-", IdString/binary>>) -> valid_license_ref_idstring(IdString); valid(_) -> false. + +valid_license_ref_idstring(<<>>) -> + false; +valid_license_ref_idstring(IdString) -> + valid_license_ref_idstring(IdString, true). + +valid_license_ref_idstring(<<>>, Valid) -> + Valid; +valid_license_ref_idstring(_, false) -> + false; +valid_license_ref_idstring(<>, true) -> + valid_license_ref_idstring(Rest, valid_license_ref_char(Char)). + +valid_license_ref_char(Char) when Char >= $A, Char =< $Z -> + true; +valid_license_ref_char(Char) when Char >= $a, Char =< $z -> + true; +valid_license_ref_char(Char) when Char >= $0, Char =< $9 -> + true; +valid_license_ref_char($-) -> + true; +valid_license_ref_char($.) -> + true; +valid_license_ref_char(_) -> + false. diff --git a/test/mix/tasks/hex.build_test.exs b/test/mix/tasks/hex.build_test.exs index 5c3a13c9..119beb58 100644 --- a/test/mix/tasks/hex.build_test.exs +++ b/test/mix/tasks/hex.build_test.exs @@ -13,6 +13,14 @@ defmodule Mix.Tasks.Hex.BuildTest do :mix_hex_erl_tar.extract({:binary, files[~c"contents.tar.gz"]}, [:compressed, cwd: path]) end + test "vendored licenses accept custom LicenseRef identifiers" do + assert :mix_hex_licenses.valid("LicenseRef-Journey") + assert :mix_hex_licenses.valid("LicenseRef-acme.1-2") + refute :mix_hex_licenses.valid("LicenseRef-") + refute :mix_hex_licenses.valid("LicenseRef-Journey License") + refute :mix_hex_licenses.valid("LicenseRef-Journey_License") + end + test "create" do Process.put(:hex_test_app_name, :build_app_name) Mix.Project.push(ReleaseSimple.MixProject) @@ -66,6 +74,22 @@ defmodule Mix.Tasks.Hex.BuildTest do purge([ReleaseInvalidLicenses.MixProject]) end + test "create with custom LicenseRef license" do + Process.put(:hex_test_app_name, :release_license_ref) + Mix.Project.push(ReleaseLicenseRef.MixProject) + + in_tmp(fn -> + Hex.State.put(:cache_home, tmp_path()) + File.write!("myfile.txt", "hello") + File.write!("LICENSE", "Journey License") + Mix.Tasks.Hex.Build.run([]) + + assert package_created?("release_license_ref-0.0.1") + end) + after + purge([ReleaseLicenseRef.MixProject]) + end + test "create private package with invalid licenses" do Process.put(:hex_test_app_name, :release_repo_invalid_licenses) Mix.Project.push(ReleaseRepoInvalidLicenses.MixProject) diff --git a/test/support/release_samples.ex b/test/support/release_samples.ex index 68e43f7e..94df2f4a 100644 --- a/test/support/release_samples.ex +++ b/test/support/release_samples.ex @@ -337,6 +337,21 @@ defmodule ReleaseInvalidLicenses.MixProject do end end +defmodule ReleaseLicenseRef.MixProject do + def project do + [ + app: :release_license_ref, + description: "Package with a custom license reference", + version: "0.0.1", + package: [ + licenses: ["LicenseRef-Journey"], + files: ["myfile.txt", "LICENSE"], + links: %{"a" => "http://a"} + ] + ] + end +end + defmodule ReleaseAppFalseDep.MixProject do def project do [