commit cd5b5090a426fefbc38acf7d5839a6a33b55c888
parent 23517d309c46d28de87294734204054c0cd850a1
Author: cfillion <cfillion@users.noreply.github.com>
Date: Sun, 22 May 2016 21:18:45 -0400
version: don't allow leading letters
fix v1.0 being lower than 0 which caused Package#lastVersion(true) to return null
Diffstat:
2 files changed, 33 insertions(+), 21 deletions(-)
diff --git a/src/version.cpp b/src/version.cpp
@@ -58,7 +58,7 @@ void Version::parse(const string &str)
const auto &begin = sregex_iterator(str.begin(), str.end(), pattern);
const sregex_iterator end;
- size_t numeric = 0, alpha = 0;
+ size_t numbers = 0, letters = 0;
vector<Segment> segments;
for(sregex_iterator it = begin; it != end; it++) {
@@ -66,13 +66,16 @@ void Version::parse(const string &str)
const char first = tolower(match[0]);
if(first >= 'a' || first >= 'z') {
+ if(!numbers)
+ throw reapack_error("invalid version name");
+
segments.push_back(match);
- alpha++;
+ letters++;
}
else {
try {
segments.push_back(boost::lexical_cast<Numeric>(match));
- numeric++;
+ numbers++;
}
catch(const boost::bad_lexical_cast &) {
throw reapack_error("version segment overflow");
@@ -80,12 +83,12 @@ void Version::parse(const string &str)
}
}
- if(!numeric)
+ if(!numbers)
throw reapack_error("invalid version name");
m_name = str;
swap(m_segments, segments);
- m_stable = alpha < 1;
+ m_stable = letters < 1;
}
bool Version::tryParse(const string &str)
diff --git a/test/version.cpp b/test/version.cpp
@@ -28,7 +28,7 @@ TEST_CASE("construct null version", M) {
REQUIRE(ver.mainSources().empty());
}
-TEST_CASE("parse version", M) {
+TEST_CASE("parse valid versions", M) {
Version ver;
SECTION("valid") {
@@ -43,14 +43,33 @@ TEST_CASE("parse version", M) {
ver.parse("1.0");
REQUIRE(ver.isStable());
}
+}
- SECTION("invalid") {
- try { ver.parse("hello"); FAIL(); }
- catch(const reapack_error &) {}
+TEST_CASE("parse invalid versions", M) {
+ Version ver;
- REQUIRE(ver.name().empty());
- REQUIRE(ver.size() == 0);
+ try {
+ SECTION("only letters") {
+ ver.parse("hello");
+ FAIL();
+ }
+
+ SECTION("leading letter") {
+ ver.parse("v1.0");
+ FAIL();
+ }
+
+ SECTION("empty") {
+ ver.parse("");
+ FAIL();
+ }
}
+ catch(const reapack_error &e) {
+ REQUIRE(string(e.what()) == "invalid version name");
+ }
+
+ REQUIRE(ver.name().empty());
+ REQUIRE(ver.size() == 0);
}
TEST_CASE("parse version failsafe", M) {
@@ -71,16 +90,6 @@ TEST_CASE("parse version failsafe", M) {
}
}
-TEST_CASE("construct invalid version", M) {
- try {
- Version ver("hello");
- FAIL();
- }
- catch(const reapack_error &e) {
- REQUIRE(string(e.what()) == "invalid version name");
- }
-}
-
TEST_CASE("decimal version", M) {
Version ver("5.05");
REQUIRE(ver == Version("5.5"));