diff options
author | Boris Kolpackov <boris@codesynthesis.com> | 2016-01-26 20:36:15 +0200 |
---|---|---|
committer | Boris Kolpackov <boris@codesynthesis.com> | 2016-01-26 20:36:15 +0200 |
commit | c010ca31dfd32cc6255cfe8242302706a00a42a0 (patch) | |
tree | 9103aa2abbdb75032507c953aed04f2d010e0e2d /bpkg/package | |
parent | 733ed5b60710c64a1851ad92706c52fcf58c19f7 (diff) |
Fix bugs in revision comparison
Diffstat (limited to 'bpkg/package')
-rw-r--r-- | bpkg/package | 131 |
1 files changed, 100 insertions, 31 deletions
diff --git a/bpkg/package b/bpkg/package index 8bd9546..3e8c989 100644 --- a/bpkg/package +++ b/bpkg/package @@ -508,17 +508,15 @@ namespace bpkg { // Since we don't quite know what T1 and T2 are (and where the resulting // expression will run), let's not push our luck with something like - // (revision || x.revision == y.revision). + // (!revision || x.revision == y.revision). // - if (revision) - return x.epoch == y.epoch && - x.canonical_upstream == y.canonical_upstream && - x.canonical_release == y.canonical_release && - x.revision == y.revision; - else - return x.epoch == y.epoch && - x.canonical_upstream == y.canonical_upstream && - x.canonical_release == y.canonical_release; + auto r (x.epoch == y.epoch && + x.canonical_upstream == y.canonical_upstream && + x.canonical_release == y.canonical_release); + + return revision + ? r && x.revision == y.revision + : r; } /* @@ -528,66 +526,137 @@ namespace bpkg inline auto operator== (const T1& x, const T2& y) -> decltype (x.epoch == y.epoch) { - return compare_version_eq (x, y, true); + return compare_version_eq (x, y, true); } */ template <typename T1, typename T2> inline auto + compare_version_ne (const T1& x, const T2& y, bool revision) + -> decltype (x.epoch == y.epoch) + { + auto r (x.epoch != y.epoch || + x.canonical_upstream != y.canonical_upstream || + x.canonical_release != y.canonical_release); + + return revision + ? r || x.revision != y.revision + : r; + } + + template <typename T1, typename T2> + inline auto operator!= (const T1& x, const T2& y) -> decltype (x.epoch != y.epoch) { - return x.epoch != y.epoch || - x.canonical_upstream != y.canonical_upstream || - x.canonical_release != y.canonical_release || - x.revision != y.revision; + return compare_version_ne (x, y, true); } template <typename T1, typename T2> inline auto - operator< (const T1& x, const T2& y) -> decltype (x.epoch < y.epoch) + compare_version_lt (const T1& x, const T2& y, bool revision) + -> decltype (x.epoch == y.epoch) { - return x.epoch < y.epoch || + auto r ( + x.epoch < y.epoch || (x.epoch == y.epoch && x.canonical_upstream < y.canonical_upstream) || (x.epoch == y.epoch && x.canonical_upstream == y.canonical_upstream && - x.canonical_release < y.canonical_release) || + x.canonical_release < y.canonical_release)); + + return revision + ? r || (x.epoch == y.epoch && x.canonical_upstream == y.canonical_upstream && - x.canonical_release == y.canonical_release && x.revision < y.revision); + x.canonical_release == y.canonical_release && x.revision < y.revision) + : r; } template <typename T1, typename T2> inline auto - operator<= (const T1& x, const T2& y) -> decltype (x.epoch <= y.epoch) + operator< (const T1& x, const T2& y) -> decltype (x.epoch < y.epoch) { - return x.epoch < y.epoch || - (x.epoch == y.epoch && x.canonical_upstream < y.canonical_upstream) || + return compare_version_lt (x, y, true); + } + + template <typename T1, typename T2> + inline auto + compare_version_le (const T1& x, const T2& y, bool revision) + -> decltype (x.epoch == y.epoch) + { + auto r ( + x.epoch < y.epoch || + (x.epoch == y.epoch && x.canonical_upstream < y.canonical_upstream)); + + return revision + ? r || (x.epoch == y.epoch && x.canonical_upstream == y.canonical_upstream && x.canonical_release < y.canonical_release) || (x.epoch == y.epoch && x.canonical_upstream == y.canonical_upstream && - x.canonical_release == y.canonical_release && x.revision <= y.revision); + x.canonical_release == y.canonical_release && x.revision <= y.revision) + : r || + (x.epoch == y.epoch && x.canonical_upstream == y.canonical_upstream && + x.canonical_release <= y.canonical_release); } + /* + Currently unused (and probably should stay that way). + template <typename T1, typename T2> inline auto - operator> (const T1& x, const T2& y) -> decltype (x.epoch > y.epoch) + operator<= (const T1& x, const T2& y) -> decltype (x.epoch <= y.epoch) + { + return compare_version_le (x, y, true); + } + */ + + template <typename T1, typename T2> + inline auto + compare_version_gt (const T1& x, const T2& y, bool revision) + -> decltype (x.epoch == y.epoch) { - return x.epoch > y.epoch || + auto r ( + x.epoch > y.epoch || (x.epoch == y.epoch && x.canonical_upstream > y.canonical_upstream) || (x.epoch == y.epoch && x.canonical_upstream == y.canonical_upstream && - x.canonical_release > y.canonical_release) || + x.canonical_release > y.canonical_release)); + + return revision + ? r || (x.epoch == y.epoch && x.canonical_upstream == y.canonical_upstream && - x.canonical_release == y.canonical_release && x.revision > y.revision); + x.canonical_release == y.canonical_release && x.revision > y.revision) + : r; } template <typename T1, typename T2> inline auto - operator>= (const T1& x, const T2& y) -> decltype (x.epoch >= y.epoch) + operator> (const T1& x, const T2& y) -> decltype (x.epoch > y.epoch) { - return x.epoch > y.epoch || - (x.epoch == y.epoch && x.canonical_upstream > y.canonical_upstream) || + return compare_version_gt (x, y, true); + } + + template <typename T1, typename T2> + inline auto + compare_version_ge (const T1& x, const T2& y, bool revision) + -> decltype (x.epoch == y.epoch) + { + auto r ( + x.epoch > y.epoch || + (x.epoch == y.epoch && x.canonical_upstream > y.canonical_upstream)); + + return revision + ? r || (x.epoch == y.epoch && x.canonical_upstream == y.canonical_upstream && x.canonical_release > y.canonical_release) || (x.epoch == y.epoch && x.canonical_upstream == y.canonical_upstream && - x.canonical_release == y.canonical_release && x.revision >= y.revision); + x.canonical_release == y.canonical_release && x.revision >= y.revision) + : r || + (x.epoch == y.epoch && x.canonical_upstream == y.canonical_upstream && + x.canonical_release >= y.canonical_release); + } + + template <typename T1, typename T2> + inline auto + operator>= (const T1& x, const T2& y) -> decltype (x.epoch >= y.epoch) + { + return compare_version_ge (x, y, true); } template <typename T> |