summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn Hodge <tpg@ucc.asn.au>2019-01-27 11:33:20 +0800
committerJohn Hodge <tpg@ucc.asn.au>2019-01-27 11:33:20 +0800
commit28b71bb7098339085a85d6e4eb4813b4eee4b73d (patch)
treef5eaa6fd9fd6703027e063b98064121f9b3c571b
parent098e210150f071d5cb7d8761f79dd3e8046bc829 (diff)
downloadmrust-28b71bb7098339085a85d6e4eb4813b4eee4b73d.tar.gz
Minicargo - Tweaks for building cargo
-rw-r--r--tools/minicargo/cfg.cpp7
-rw-r--r--tools/minicargo/manifest.cpp17
-rw-r--r--tools/minicargo/manifest.h12
3 files changed, 33 insertions, 3 deletions
diff --git a/tools/minicargo/cfg.cpp b/tools/minicargo/cfg.cpp
index e8c732d8..85bff327 100644
--- a/tools/minicargo/cfg.cpp
+++ b/tools/minicargo/cfg.cpp
@@ -215,6 +215,13 @@ bool CfgChecker::check_cfg(CfgParseLexer& p) const
rv &= check_cfg(p);
} while(p.consume_if(','));
}
+ else if( name == "any" ) {
+ rv = false;
+ do
+ {
+ rv |= check_cfg(p);
+ } while(p.consume_if(','));
+ }
else {
TODO("Unknown fragment in cfg - " << name.to_string());
}
diff --git a/tools/minicargo/manifest.cpp b/tools/minicargo/manifest.cpp
index 79db0e35..8f49c538 100644
--- a/tools/minicargo/manifest.cpp
+++ b/tools/minicargo/manifest.cpp
@@ -865,6 +865,10 @@ PackageVersionSpec PackageVersionSpec::from_string(const ::std::string& s)
// Default, compatible
pos ++;
break;
+ case '~':
+ ty = PackageVersionSpec::Bound::Type::MinorCompatible;
+ pos ++;
+ break;
case '=':
ty = PackageVersionSpec::Bound::Type::Equal;
pos ++;
@@ -921,6 +925,9 @@ PackageVersionSpec PackageVersionSpec::from_string(const ::std::string& s)
}
else
{
+ // NOTE: This changes the behaviour of ~ rules to be bounded on the major version instead
+ if( ty == PackageVersionSpec::Bound::Type::MinorCompatible )
+ ty = PackageVersionSpec::Bound::Type::Compatible;
v.minor = 0;
v.patch = 0;
}
@@ -943,13 +950,19 @@ bool PackageVersionSpec::accepts(const PackageVersion& v) const
switch(b.ty)
{
case Bound::Type::Compatible:
- // To be compatible, it has to be higher?
- // - TODO: Isn't a patch version compatible?
+ // ^ rules are >= specified, and < next major/breaking
if( !(v >= b.ver) )
return false;
if( !(v < b.ver.next_breaking()) )
return false;
break;
+ case Bound::Type::MinorCompatible:
+ // ~ rules are >= specified, and < next minor
+ if( !(v >= b.ver) )
+ return false;
+ if( !(v < b.ver.next_minor()) )
+ return false;
+ break;
case Bound::Type::GreaterEqual:
if( !(v >= b.ver) )
return false;
diff --git a/tools/minicargo/manifest.h b/tools/minicargo/manifest.h
index 4bb8b843..be19a7b1 100644
--- a/tools/minicargo/manifest.h
+++ b/tools/minicargo/manifest.h
@@ -26,6 +26,14 @@ struct PackageVersion
static PackageVersion from_string(const ::std::string& s);
+ PackageVersion next_minor() const {
+ if(major == 0) {
+ return PackageVersion { 0, minor, patch+1 };
+ }
+ else {
+ return PackageVersion { major, minor+1, 0 };
+ }
+ }
PackageVersion next_breaking() const {
if(major == 0) {
return PackageVersion { 0, minor + 1, 0 };
@@ -87,7 +95,8 @@ struct PackageVersionSpec
{
enum class Type
{
- Compatible,
+ Compatible, // "^" - Allows anything up to the next major version
+ MinorCompatible, // "~X.Y" - Allows anything up to the next minor version
Greater,
GreaterEqual,
Equal,
@@ -116,6 +125,7 @@ struct PackageVersionSpec
switch(b.ty)
{
case Bound::Type::Compatible: os << "^"; break;
+ case Bound::Type::MinorCompatible: os << "~"; break;
case Bound::Type::Greater: os << ">"; break;
case Bound::Type::GreaterEqual: os << ">="; break;
case Bound::Type::Equal: os << "="; break;