summaryrefslogtreecommitdiff
path: root/tools/minicargo/manifest.cpp
diff options
context:
space:
mode:
authorJohn Hodge <tpg@mutabah.net>2017-08-24 11:13:08 +0800
committerJohn Hodge <tpg@mutabah.net>2017-08-24 11:13:08 +0800
commit1b8e3f06112449dbd60d784c69f7f41d7b24666c (patch)
treee2477e317b0a32e88166e247960f08f42cd0f403 /tools/minicargo/manifest.cpp
parent84d683422f497fb10c4f3c88fe788c0405c40d68 (diff)
downloadmrust-1b8e3f06112449dbd60d784c69f7f41d7b24666c.tar.gz
minicargo manifest - Version parsing/checking, extra keys
Diffstat (limited to 'tools/minicargo/manifest.cpp')
-rw-r--r--tools/minicargo/manifest.cpp125
1 files changed, 117 insertions, 8 deletions
diff --git a/tools/minicargo/manifest.cpp b/tools/minicargo/manifest.cpp
index 4e7ec305..f817fb91 100644
--- a/tools/minicargo/manifest.cpp
+++ b/tools/minicargo/manifest.cpp
@@ -35,12 +35,7 @@ PackageManifest PackageManifest::load_from_toml(const ::std::string& path)
{
assert(key_val.path.size() > 1);
const auto& key = key_val.path[1];
- if(key == "authors")
- {
- // TODO: Use the `authors` key
- // - Ignore ofr now.
- }
- else if( key == "name" )
+ if( key == "name" )
{
if(rv.m_name != "" )
{
@@ -72,6 +67,18 @@ PackageManifest PackageManifest::load_from_toml(const ::std::string& path)
throw ::std::runtime_error("Build script path cannot be empty");
}
}
+ else if( key == "authors"
+ || key == "description"
+ || key == "homepage"
+ || key == "documentation"
+ || key == "repository"
+ || key == "readme"
+ || key == "categories"
+ || key == "license"
+ )
+ {
+ // Informational only, ignore
+ }
else
{
// Unknown value in `package`
@@ -207,6 +214,10 @@ PackageManifest PackageManifest::load_from_toml(const ::std::string& path)
{
// TODO: Features
}
+ // crates.io metadata
+ else if( section == "badges" )
+ {
+ }
else
{
// Unknown manifest section
@@ -396,6 +407,9 @@ void PackageRef::load_manifest(Repository& repo, const ::helpers::path& base_pat
{
DEBUG("Load dependency " << this->name() << " from repo");
m_manifest = repo.find(this->name(), this->get_version());
+ if( !m_manifest ) {
+ throw ::std::runtime_error(::format("Unable to load manifest for ", this->name(), ":", this->get_version()));
+ }
}
}
else
@@ -403,6 +417,7 @@ void PackageRef::load_manifest(Repository& repo, const ::helpers::path& base_pat
DEBUG("Load dependency " << m_name << " from path " << m_path);
// Search for a copy of this already loaded
m_manifest = repo.from_path(base_path / ::helpers::path(m_path) / "Cargo.toml");
+ assert(m_manifest);
}
m_manifest->load_dependencies(repo);
@@ -424,11 +439,105 @@ PackageVersion PackageVersion::from_string(const ::std::string& s)
PackageVersionSpec PackageVersionSpec::from_string(const ::std::string& s)
{
+ struct H {
+ static unsigned parse_i(const ::std::string& istr, size_t& pos) {
+ char* out_ptr = nullptr;
+ long rv = ::std::strtol(istr.c_str() + pos, &out_ptr, 10);
+ if( out_ptr == istr.c_str() + pos )
+ throw ::std::invalid_argument(istr.c_str() + pos);
+ pos = out_ptr - istr.c_str();
+ return rv;
+ }
+ };
PackageVersionSpec rv;
- throw "";
+ size_t pos = 0;
+ do
+ {
+ while( pos < s.size() && isblank(s[pos]) )
+ pos ++;
+ if(pos == s.size())
+ break ;
+ auto ty = PackageVersionSpec::Bound::Type::Compatible;
+ switch(s[pos])
+ {
+ case '^':
+ // Default, compatible
+ pos ++;
+ break;
+ case '=':
+ ty = PackageVersionSpec::Bound::Type::Equal;
+ pos ++;
+ break;
+ case '>':
+ ty = PackageVersionSpec::Bound::Type::Greater;
+ pos ++;
+ break;
+ case '<':
+ ty = PackageVersionSpec::Bound::Type::Greater;
+ pos ++;
+ break;
+ default:
+ break;
+ }
+ while( pos < s.size() && isblank(s[pos]) )
+ pos ++;
+ if( pos == s.size() )
+ throw ::std::runtime_error("Bad version string");
+
+ PackageVersion v;
+ v.major = H::parse_i(s, pos);
+ if( s[pos] != '.' )
+ throw ::std::runtime_error("Bad version string");
+ pos ++;
+ v.minor = H::parse_i(s, pos);
+ if(s[pos] == '.')
+ {
+ pos ++;
+ v.patch = H::parse_i(s, pos);
+ }
+ else
+ {
+ v.patch = 0;
+ }
+
+ rv.m_bounds.push_back(PackageVersionSpec::Bound { ty, v });
+
+ while( pos < s.size() && isblank(s[pos]) )
+ pos ++;
+ if(pos == s.size())
+ break ;
+ } while(pos < s.size() && s[pos++] == ',');
+ if( pos != s.size() )
+ throw ::std::runtime_error(::format( "Bad version string, pos=", pos ));
return rv;
}
bool PackageVersionSpec::accepts(const PackageVersion& v) const
{
- throw "";
+ for(const auto& b : m_bounds)
+ {
+ switch(b.ty)
+ {
+ case Bound::Type::Compatible:
+ // To be compatible, it has to be higher?
+ // - TODO: Isn't a patch version compatible?
+ if( !(v > b.ver) )
+ return false;
+ if( !(v < b.ver.next_breaking()) )
+ return false;
+ break;
+ case Bound::Type::Greater:
+ if( !(v > b.ver) )
+ return false;
+ break;
+ case Bound::Type::Equal:
+ if( v < b.ver || v > b.ver )
+ return false;
+ break;
+ case Bound::Type::Less:
+ if( !(v < b.ver) )
+ return false;
+ break;
+ }
+ }
+ return true;
}