Skip to content

Commit 210ac6b

Browse files
z0w0graydon
authored andcommitted
---
yaml --- r: 44510 b: refs/heads/master c: 226b61b h: refs/heads/master v: v3
1 parent d0960a6 commit 210ac6b

File tree

6 files changed

+447
-11
lines changed

6 files changed

+447
-11
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
---
2-
refs/heads/master: 71d34a8872491f37011aa14c866a95165fc45f99
2+
refs/heads/master: 226b61ba5f30e0ecb0799626a010161f3ce0b72d
33
refs/heads/snap-stage1: e33de59e47c5076a89eadeb38f4934f58a3618a6
44
refs/heads/snap-stage3: a6d9689399d091c3265f00434a69c551a61c28dc
55
refs/heads/try: ef355f6332f83371e4acf04fc4eb940ab41d78d3

trunk/src/libcore/core.rc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,7 @@ pub mod reflect;
169169
pub mod condition;
170170
pub mod logging;
171171
pub mod util;
172+
pub mod semver;
172173

173174

174175
/* Reexported core operators */

trunk/src/libcore/semver.rs

Lines changed: 227 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,227 @@
1+
// Copyright 2012 The Rust Project Developers. See the COPYRIGHT
2+
// file at the top-level directory of this distribution and at
3+
// http://rust-lang.org/COPYRIGHT.
4+
//
5+
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
6+
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
7+
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
8+
// option. This file may not be copied, modified, or distributed
9+
// except according to those terms.
10+
11+
//! Semver parsing and logic
12+
13+
use io;
14+
use io::{ReaderUtil};
15+
use option::{Option, Some, None};
16+
use uint;
17+
use str;
18+
use to_str::ToStr;
19+
use char;
20+
21+
pub struct Version {
22+
major: uint,
23+
minor: uint,
24+
patch: uint,
25+
tag: Option<~str>,
26+
}
27+
28+
impl Version: ToStr {
29+
#[inline(always)]
30+
pure fn to_str() -> ~str {
31+
let suffix = match copy self.tag {
32+
Some(tag) => ~"-" + tag,
33+
None => ~""
34+
};
35+
36+
fmt!("%u.%u.%u%s", self.major, self.minor, self.patch, suffix)
37+
}
38+
}
39+
40+
fn read_whitespace(rdr: io::Reader, ch: char) -> char {
41+
let mut nch = ch;
42+
43+
while char::is_whitespace(nch) {
44+
nch = rdr.read_char();
45+
}
46+
47+
nch
48+
}
49+
50+
fn parse_reader(rdr: io::Reader) -> Option<(Version, char)> {
51+
fn read_digits(rdr: io::Reader, ch: char) -> Option<(uint, char)> {
52+
let mut buf = ~"";
53+
let mut nch = ch;
54+
55+
while nch != -1 as char {
56+
match nch {
57+
'0' .. '9' => buf += str::from_char(nch),
58+
_ => break
59+
}
60+
61+
nch = rdr.read_char();
62+
}
63+
64+
do uint::from_str(buf).chain_ref |&i| {
65+
Some((i, nch))
66+
}
67+
}
68+
69+
fn read_tag(rdr: io::Reader) -> Option<(~str, char)> {
70+
let mut ch = rdr.read_char();
71+
let mut buf = ~"";
72+
73+
while ch != -1 as char {
74+
match ch {
75+
'0' .. '9' | 'A' .. 'Z' | 'a' .. 'z' | '-' => {
76+
buf += str::from_char(ch);
77+
}
78+
_ => break
79+
}
80+
81+
ch = rdr.read_char();
82+
}
83+
84+
if buf == ~"" { return None; }
85+
else { Some((buf, ch)) }
86+
}
87+
88+
let ch = read_whitespace(rdr, rdr.read_char());
89+
let (major, ch) = match read_digits(rdr, ch) {
90+
None => return None,
91+
Some(item) => item
92+
};
93+
94+
if ch != '.' { return None; }
95+
96+
let (minor, ch) = match read_digits(rdr, rdr.read_char()) {
97+
None => return None,
98+
Some(item) => item
99+
};
100+
101+
if ch != '.' { return None; }
102+
103+
let (patch, ch) = match read_digits(rdr, rdr.read_char()) {
104+
None => return None,
105+
Some(item) => item
106+
};
107+
let (tag, ch) = if ch == '-' {
108+
match read_tag(rdr) {
109+
None => return None,
110+
Some((tag, ch)) => (Some(tag), ch)
111+
}
112+
} else {
113+
(None, ch)
114+
};
115+
116+
Some((Version { major: major, minor: minor, patch: patch, tag: tag },
117+
ch))
118+
}
119+
120+
pub fn parse(s: ~str) -> Option<Version> {
121+
do io::with_str_reader(s) |rdr| {
122+
do parse_reader(rdr).chain_ref |&item| {
123+
let (version, ch) = item;
124+
125+
if read_whitespace(rdr, ch) != -1 as char {
126+
None
127+
} else {
128+
Some(version)
129+
}
130+
}
131+
}
132+
}
133+
134+
#[test]
135+
fn test_parse() {
136+
assert parse("") == None;
137+
assert parse(" ") == None;
138+
assert parse("1") == None;
139+
assert parse("1.2") == None;
140+
assert parse("1.2") == None;
141+
assert parse("1") == None;
142+
assert parse("1.2") == None;
143+
assert parse("1.2.3-") == None;
144+
assert parse("a.b.c") == None;
145+
assert parse("1.2.3 abc") == None;
146+
147+
assert parse("1.2.3") == Some({
148+
major: 1u,
149+
minor: 2u,
150+
patch: 3u,
151+
tag: None,
152+
});
153+
assert parse(" 1.2.3 ") == Some({
154+
major: 1u,
155+
minor: 2u,
156+
patch: 3u,
157+
tag: None,
158+
});
159+
assert parse("1.2.3-alpha1") == Some({
160+
major: 1u,
161+
minor: 2u,
162+
patch: 3u,
163+
tag: Some("alpha1")
164+
});
165+
assert parse(" 1.2.3-alpha1 ") == Some({
166+
major: 1u,
167+
minor: 2u,
168+
patch: 3u,
169+
tag: Some("alpha1")
170+
});
171+
}
172+
173+
#[test]
174+
fn test_eq() {
175+
assert parse("1.2.3") == parse("1.2.3");
176+
assert parse("1.2.3-alpha1") == parse("1.2.3-alpha1");
177+
}
178+
179+
#[test]
180+
fn test_ne() {
181+
assert parse("0.0.0") != parse("0.0.1");
182+
assert parse("0.0.0") != parse("0.1.0");
183+
assert parse("0.0.0") != parse("1.0.0");
184+
assert parse("1.2.3-alpha") != parse("1.2.3-beta");
185+
}
186+
187+
#[test]
188+
fn test_lt() {
189+
assert parse("0.0.0") < parse("1.2.3-alpha2");
190+
assert parse("1.0.0") < parse("1.2.3-alpha2");
191+
assert parse("1.2.0") < parse("1.2.3-alpha2");
192+
assert parse("1.2.3") < parse("1.2.3-alpha2");
193+
assert parse("1.2.3-alpha1") < parse("1.2.3-alpha2");
194+
195+
assert !(parse("1.2.3-alpha2") < parse("1.2.3-alpha2"));
196+
}
197+
198+
#[test]
199+
fn test_le() {
200+
assert parse("0.0.0") <= parse("1.2.3-alpha2");
201+
assert parse("1.0.0") <= parse("1.2.3-alpha2");
202+
assert parse("1.2.0") <= parse("1.2.3-alpha2");
203+
assert parse("1.2.3") <= parse("1.2.3-alpha2");
204+
assert parse("1.2.3-alpha1") <= parse("1.2.3-alpha2");
205+
assert parse("1.2.3-alpha2") <= parse("1.2.3-alpha2");
206+
}
207+
208+
#[test]
209+
fn test_gt() {
210+
assert parse("1.2.3-alpha2") > parse("0.0.0");
211+
assert parse("1.2.3-alpha2") > parse("1.0.0");
212+
assert parse("1.2.3-alpha2") > parse("1.2.0");
213+
assert parse("1.2.3-alpha2") > parse("1.2.3");
214+
assert parse("1.2.3-alpha2") > parse("1.2.3-alpha1");
215+
216+
assert !(parse("1.2.3-alpha2") > parse("1.2.3-alpha2"));
217+
}
218+
219+
#[test]
220+
fn test_ge() {
221+
assert parse("1.2.3-alpha2") >= parse("0.0.0");
222+
assert parse("1.2.3-alpha2") >= parse("1.0.0");
223+
assert parse("1.2.3-alpha2") >= parse("1.2.0");
224+
assert parse("1.2.3-alpha2") >= parse("1.2.3");
225+
assert parse("1.2.3-alpha2") >= parse("1.2.3-alpha1");
226+
assert parse("1.2.3-alpha2") >= parse("1.2.3-alpha2");
227+
}

trunk/src/librustpkg/api.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ pub struct Crate {
99
pub impl Crate {
1010
fn flag(flag: ~str) -> Crate {
1111
Crate {
12-
flags: vec::append(self.flags, flag),
12+
flags: vec::append(copy self.flags, ~[flag]),
1313
.. copy self
1414
}
1515
}
@@ -18,3 +18,7 @@ pub impl Crate {
1818
pub fn build(_targets: ~[Crate]) {
1919
// TODO: magic
2020
}
21+
22+
pub mod util {
23+
24+
}

0 commit comments

Comments
 (0)