libexpr: Deprecate URL literals

Closes #437.

Change-Id: I9f67fc965bb4a7e7fd849e5067ac1cb3bab064cd
This commit is contained in:
piegames 2024-07-13 07:55:17 +02:00
parent 49d61b2e4b
commit 278fddc317
10 changed files with 44 additions and 17 deletions

View file

@ -0,0 +1,12 @@
---
synopsis: Deprecated URL literals
issues: [fj#437]
cls: [1736, 1735, 1744]
category: Breaking Changes
credits: [piegames, horrors]
---
URL literals have long been obsolete and discouraged of use, and now they are officially deprecated.
This means that all URLs must be properly put within quotes like all other strings.
To ease migration, they can still be enabled with `--extra-deprecated-features url-literals` for now.

View file

@ -77,12 +77,6 @@
}
```
Finally, as a convenience, *URIs* as defined in appendix B of
[RFC 2396](http://www.ietf.org/rfc/rfc2396.txt) can be written *as
is*, without quotes. For instance, the string
`"http://example.org/foo.tar.bz2"` can also be written as
`http://example.org/foo.tar.bz2`.
- <a id="type-number" href="#type-number">Number</a>
Numbers, which can be *integers* (like `123`) or *floating point*

View file

@ -656,10 +656,10 @@ template<> struct BuildAST<grammar::expr::path> : p::maybe_nothing {};
template<> struct BuildAST<grammar::expr::uri> {
static void apply(const auto & in, ExprState & s, State & ps) {
bool noURLLiterals = ps.featureSettings.isEnabled(Xp::NoUrlLiterals);
if (noURLLiterals)
bool URLLiterals = ps.featureSettings.isEnabled(Dep::UrlLiterals);
if (!URLLiterals)
throw ParseError({
.msg = HintFmt("URL literals are disabled"),
.msg = HintFmt("URL literals are deprecated, allow using them with --extra-deprecated-features=url-literals"),
.pos = ps.positions[ps.at(in)]
});
s.pushExpr<ExprString>(ps.at(in), in.string());

View file

@ -488,7 +488,13 @@ struct FeatureSettings : Config {
Setting<std::set<DeprecatedFeature>> deprecatedFeatures{
this, {}, "deprecated-features",
R"(
Deprecated features that are allowed. (Currently there are none.)
Deprecated features that are allowed.
Example:
```
deprecated-features = url-literals
```
The following deprecated feature features can be re-activated:

View file

@ -24,9 +24,16 @@ struct DeprecatedFeatureDetails
* feature, we either have no issue at all if few features are not added
* at the end of the list, or a proper merge conflict if they are.
*/
constexpr size_t numDepFeatures = 0;
constexpr size_t numDepFeatures = 1 + static_cast<size_t>(Dep::UrlLiterals);
constexpr std::array<DeprecatedFeatureDetails, numDepFeatures> depFeatureDetails = {{
{
.tag = Dep::UrlLiterals,
.name = "url-literals",
.description = R"(
Allow unquoted URLs as part of the Nix language syntax.
)",
},
}};
static_assert(

View file

@ -18,6 +18,7 @@ namespace nix {
*/
enum struct DeprecatedFeature
{
UrlLiterals
};
/**

View file

@ -53,8 +53,13 @@ done
for i in lang/parse-okay-*.nix; do
echo "parsing $i (should succeed)";
i=$(basename "$i" .nix)
# Hard-code that these two files are allowed to use url literals (because they test them)
if [[ "$i" == "parse-okay-url" || "$i" == "parse-okay-regression-20041027" ]]
then
extraArgs="--extra-deprecated-features url-literals"
fi
if
expect 0 nix-instantiate --parse - < "lang/$i.nix" \
expect 0 nix-instantiate --parse ${extraArgs-} - < "lang/$i.nix" \
1> "lang/$i.out" \
2> "lang/$i.err"
then

View file

@ -1,3 +1,4 @@
# This test needs to be run with --extra-deprecated-features url-literals
{stdenv, fetchurl /* pkgconfig, libX11 */ }:
stdenv.mkDerivation {

View file

@ -1,3 +1,4 @@
# This test needs to be run with --extra-deprecated-features url-literals
[ x:x
https://svn.cs.uu.nl:12443/repos/trace/trunk
http://www2.mplayerhq.hu/MPlayer/releases/fonts/font-arial-iso-8859-1.tar.bz2

View file

@ -87,15 +87,15 @@ namespace nix {
}
TEST_F(TrivialExpressionTest, urlLiteral) {
auto v = eval("https://nixos.org");
FeatureSettings mockFeatureSettings;
mockFeatureSettings.set("deprecated-features", "url-literals");
auto v = eval("https://nixos.org", true, mockFeatureSettings);
ASSERT_THAT(v, IsStringEq("https://nixos.org"));
}
TEST_F(TrivialExpressionTest, noUrlLiteral) {
ExperimentalFeatureSettings mockXpSettings;
mockXpSettings.set("experimental-features", "no-url-literals");
ASSERT_THROW(eval("https://nixos.org", true, mockXpSettings), Error);
ASSERT_THROW(eval("https://nixos.org"), Error);
}
TEST_F(TrivialExpressionTest, withFound) {