mirror of
https://github.com/servo/servo.git
synced 2025-08-06 06:00:15 +01:00
Warning police.
This commit is contained in:
parent
e62637fee2
commit
422bda7379
10 changed files with 83 additions and 78 deletions
|
@ -13,6 +13,7 @@ extern "C" {
|
||||||
fn tc_deletearray(mem: *mut c_void);
|
fn tc_deletearray(mem: *mut c_void);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[allow(experimental)]
|
||||||
pub fn newarray0<T>(nmem: size_t) -> *mut T {
|
pub fn newarray0<T>(nmem: size_t) -> *mut T {
|
||||||
let mem = newarray::<T>(nmem) as *mut T;
|
let mem = newarray::<T>(nmem) as *mut T;
|
||||||
unsafe {
|
unsafe {
|
||||||
|
@ -27,6 +28,7 @@ pub fn newarray<T>(nmem: size_t) -> *mut T {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[allow(experimental)]
|
||||||
pub fn new0<T>(nmem: size_t) -> *mut T {
|
pub fn new0<T>(nmem: size_t) -> *mut T {
|
||||||
let mem = new(nmem * mem::size_of::<T>() as u64) as *mut T;
|
let mem = new(nmem * mem::size_of::<T>() as u64) as *mut T;
|
||||||
unsafe {
|
unsafe {
|
||||||
|
|
|
@ -312,7 +312,7 @@ impl LayoutTask {
|
||||||
opts: &Opts,
|
opts: &Opts,
|
||||||
time_profiler_chan: TimeProfilerChan)
|
time_profiler_chan: TimeProfilerChan)
|
||||||
-> LayoutTask {
|
-> LayoutTask {
|
||||||
let local_image_cache = Arc::new(Mutex::new(LocalImageCache(image_cache_task.clone())));
|
let local_image_cache = Arc::new(Mutex::new(LocalImageCache::new(image_cache_task.clone())));
|
||||||
let screen_size = Size2D(Au(0), Au(0));
|
let screen_size = Size2D(Au(0), Au(0));
|
||||||
let parallel_traversal = if opts.layout_threads != 1 {
|
let parallel_traversal = if opts.layout_threads != 1 {
|
||||||
Some(WorkQueue::new("LayoutWorker", opts.layout_threads, ptr::mut_null()))
|
Some(WorkQueue::new("LayoutWorker", opts.layout_threads, ptr::mut_null()))
|
||||||
|
|
|
@ -31,7 +31,7 @@ use compositing::{CompositorChan, CompositorTask, Constellation};
|
||||||
use servo_msg::constellation_msg::{ConstellationChan, InitLoadUrlMsg};
|
use servo_msg::constellation_msg::{ConstellationChan, InitLoadUrlMsg};
|
||||||
|
|
||||||
#[cfg(not(test))]
|
#[cfg(not(test))]
|
||||||
use servo_net::image_cache_task::{ImageCacheTask, SyncImageCacheTask};
|
use servo_net::image_cache_task::ImageCacheTask;
|
||||||
#[cfg(not(test))]
|
#[cfg(not(test))]
|
||||||
use servo_net::resource_task::ResourceTask;
|
use servo_net::resource_task::ResourceTask;
|
||||||
#[cfg(not(test))]
|
#[cfg(not(test))]
|
||||||
|
@ -111,9 +111,9 @@ pub fn run(opts: opts::Opts) {
|
||||||
// image load or we risk emitting an output file missing the
|
// image load or we risk emitting an output file missing the
|
||||||
// image.
|
// image.
|
||||||
let image_cache_task = if opts.output_file.is_some() {
|
let image_cache_task = if opts.output_file.is_some() {
|
||||||
SyncImageCacheTask(resource_task.clone())
|
ImageCacheTask::new_sync(resource_task.clone())
|
||||||
} else {
|
} else {
|
||||||
ImageCacheTask(resource_task.clone())
|
ImageCacheTask::new(resource_task.clone())
|
||||||
};
|
};
|
||||||
let constellation_chan = Constellation::start(compositor_chan,
|
let constellation_chan = Constellation::start(compositor_chan,
|
||||||
opts,
|
opts,
|
||||||
|
|
|
@ -80,52 +80,53 @@ impl<E, S: Encoder<E>> Encodable<S, E> for ImageCacheTask {
|
||||||
|
|
||||||
type DecoderFactory = fn() -> proc(&[u8]) -> Option<Image>;
|
type DecoderFactory = fn() -> proc(&[u8]) -> Option<Image>;
|
||||||
|
|
||||||
pub fn ImageCacheTask(resource_task: ResourceTask) -> ImageCacheTask {
|
impl ImageCacheTask {
|
||||||
let (chan, port) = channel();
|
pub fn new(resource_task: ResourceTask) -> ImageCacheTask {
|
||||||
let chan_clone = chan.clone();
|
let (chan, port) = channel();
|
||||||
|
let chan_clone = chan.clone();
|
||||||
|
|
||||||
spawn(proc() {
|
spawn(proc() {
|
||||||
let mut cache = ImageCache {
|
let mut cache = ImageCache {
|
||||||
resource_task: resource_task.clone(),
|
resource_task: resource_task.clone(),
|
||||||
port: port,
|
port: port,
|
||||||
chan: chan_clone,
|
chan: chan_clone,
|
||||||
state_map: url_map(),
|
state_map: url_map(),
|
||||||
wait_map: url_map(),
|
wait_map: url_map(),
|
||||||
need_exit: None
|
need_exit: None
|
||||||
};
|
};
|
||||||
cache.run();
|
cache.run();
|
||||||
});
|
});
|
||||||
|
|
||||||
ImageCacheTask {
|
ImageCacheTask {
|
||||||
chan: chan,
|
chan: chan,
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// FIXME: make this priv after visibility rules change
|
|
||||||
pub fn SyncImageCacheTask(resource_task: ResourceTask) -> ImageCacheTask {
|
|
||||||
let (chan, port) = channel();
|
|
||||||
|
|
||||||
spawn(proc() {
|
|
||||||
let inner_cache = ImageCacheTask(resource_task.clone());
|
|
||||||
|
|
||||||
loop {
|
|
||||||
let msg: Msg = port.recv();
|
|
||||||
|
|
||||||
match msg {
|
|
||||||
GetImage(url, response) => {
|
|
||||||
inner_cache.send(WaitForImage(url, response));
|
|
||||||
}
|
|
||||||
Exit(response) => {
|
|
||||||
inner_cache.send(Exit(response));
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
msg => inner_cache.send(msg)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
});
|
}
|
||||||
|
|
||||||
ImageCacheTask {
|
pub fn new_sync(resource_task: ResourceTask) -> ImageCacheTask {
|
||||||
chan: chan,
|
let (chan, port) = channel();
|
||||||
|
|
||||||
|
spawn(proc() {
|
||||||
|
let inner_cache = ImageCacheTask::new(resource_task.clone());
|
||||||
|
|
||||||
|
loop {
|
||||||
|
let msg: Msg = port.recv();
|
||||||
|
|
||||||
|
match msg {
|
||||||
|
GetImage(url, response) => {
|
||||||
|
inner_cache.send(WaitForImage(url, response));
|
||||||
|
}
|
||||||
|
Exit(response) => {
|
||||||
|
inner_cache.send(Exit(response));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
msg => inner_cache.send(msg)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
ImageCacheTask {
|
||||||
|
chan: chan,
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -581,7 +582,7 @@ mod tests {
|
||||||
fn should_exit_on_request() {
|
fn should_exit_on_request() {
|
||||||
let mock_resource_task = mock_resource_task(box DoesNothing);
|
let mock_resource_task = mock_resource_task(box DoesNothing);
|
||||||
|
|
||||||
let image_cache_task = ImageCacheTask(mock_resource_task.clone());
|
let image_cache_task = ImageCacheTask::new(mock_resource_task.clone());
|
||||||
let _url = parse_url("file", None);
|
let _url = parse_url("file", None);
|
||||||
|
|
||||||
image_cache_task.exit();
|
image_cache_task.exit();
|
||||||
|
@ -593,7 +594,7 @@ mod tests {
|
||||||
fn should_fail_if_unprefetched_image_is_requested() {
|
fn should_fail_if_unprefetched_image_is_requested() {
|
||||||
let mock_resource_task = mock_resource_task(box DoesNothing);
|
let mock_resource_task = mock_resource_task(box DoesNothing);
|
||||||
|
|
||||||
let image_cache_task = ImageCacheTask(mock_resource_task.clone());
|
let image_cache_task = ImageCacheTask::new(mock_resource_task.clone());
|
||||||
let url = parse_url("file", None);
|
let url = parse_url("file", None);
|
||||||
|
|
||||||
let (chan, port) = channel();
|
let (chan, port) = channel();
|
||||||
|
@ -607,7 +608,7 @@ mod tests {
|
||||||
|
|
||||||
let mock_resource_task = mock_resource_task(box JustSendOK { url_requested_chan: url_requested_chan});
|
let mock_resource_task = mock_resource_task(box JustSendOK { url_requested_chan: url_requested_chan});
|
||||||
|
|
||||||
let image_cache_task = ImageCacheTask(mock_resource_task.clone());
|
let image_cache_task = ImageCacheTask::new(mock_resource_task.clone());
|
||||||
let url = parse_url("file", None);
|
let url = parse_url("file", None);
|
||||||
|
|
||||||
image_cache_task.send(Prefetch(url));
|
image_cache_task.send(Prefetch(url));
|
||||||
|
@ -622,7 +623,7 @@ mod tests {
|
||||||
|
|
||||||
let mock_resource_task = mock_resource_task(box JustSendOK { url_requested_chan: url_requested_chan});
|
let mock_resource_task = mock_resource_task(box JustSendOK { url_requested_chan: url_requested_chan});
|
||||||
|
|
||||||
let image_cache_task = ImageCacheTask(mock_resource_task.clone());
|
let image_cache_task = ImageCacheTask::new(mock_resource_task.clone());
|
||||||
let url = parse_url("file", None);
|
let url = parse_url("file", None);
|
||||||
|
|
||||||
image_cache_task.send(Prefetch(url.clone()));
|
image_cache_task.send(Prefetch(url.clone()));
|
||||||
|
@ -642,7 +643,7 @@ mod tests {
|
||||||
|
|
||||||
let mock_resource_task = mock_resource_task(box WaitSendTestImage{wait_port: wait_port});
|
let mock_resource_task = mock_resource_task(box WaitSendTestImage{wait_port: wait_port});
|
||||||
|
|
||||||
let image_cache_task = ImageCacheTask(mock_resource_task.clone());
|
let image_cache_task = ImageCacheTask::new(mock_resource_task.clone());
|
||||||
let url = parse_url("file", None);
|
let url = parse_url("file", None);
|
||||||
|
|
||||||
image_cache_task.send(Prefetch(url.clone()));
|
image_cache_task.send(Prefetch(url.clone()));
|
||||||
|
@ -659,7 +660,7 @@ mod tests {
|
||||||
fn should_return_decoded_image_data_if_data_has_arrived() {
|
fn should_return_decoded_image_data_if_data_has_arrived() {
|
||||||
let mock_resource_task = mock_resource_task(box SendTestImage);
|
let mock_resource_task = mock_resource_task(box SendTestImage);
|
||||||
|
|
||||||
let image_cache_task = ImageCacheTask(mock_resource_task.clone());
|
let image_cache_task = ImageCacheTask::new(mock_resource_task.clone());
|
||||||
let url = parse_url("file", None);
|
let url = parse_url("file", None);
|
||||||
|
|
||||||
let join_port = image_cache_task.wait_for_store();
|
let join_port = image_cache_task.wait_for_store();
|
||||||
|
@ -685,7 +686,7 @@ mod tests {
|
||||||
fn should_return_decoded_image_data_for_multiple_requests() {
|
fn should_return_decoded_image_data_for_multiple_requests() {
|
||||||
let mock_resource_task = mock_resource_task(box SendTestImage);
|
let mock_resource_task = mock_resource_task(box SendTestImage);
|
||||||
|
|
||||||
let image_cache_task = ImageCacheTask(mock_resource_task.clone());
|
let image_cache_task = ImageCacheTask::new(mock_resource_task.clone());
|
||||||
let url = parse_url("file", None);
|
let url = parse_url("file", None);
|
||||||
|
|
||||||
let join_port = image_cache_task.wait_for_store();
|
let join_port = image_cache_task.wait_for_store();
|
||||||
|
@ -732,7 +733,7 @@ mod tests {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
let image_cache_task = ImageCacheTask(mock_resource_task.clone());
|
let image_cache_task = ImageCacheTask::new(mock_resource_task.clone());
|
||||||
let url = parse_url("file", None);
|
let url = parse_url("file", None);
|
||||||
|
|
||||||
image_cache_task.send(Prefetch(url.clone()));
|
image_cache_task.send(Prefetch(url.clone()));
|
||||||
|
@ -778,7 +779,7 @@ mod tests {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
let image_cache_task = ImageCacheTask(mock_resource_task.clone());
|
let image_cache_task = ImageCacheTask::new(mock_resource_task.clone());
|
||||||
let url = parse_url("file", None);
|
let url = parse_url("file", None);
|
||||||
|
|
||||||
image_cache_task.send(Prefetch(url.clone()));
|
image_cache_task.send(Prefetch(url.clone()));
|
||||||
|
@ -807,7 +808,7 @@ mod tests {
|
||||||
fn should_return_failed_if_image_bin_cannot_be_fetched() {
|
fn should_return_failed_if_image_bin_cannot_be_fetched() {
|
||||||
let mock_resource_task = mock_resource_task(box SendTestImageErr);
|
let mock_resource_task = mock_resource_task(box SendTestImageErr);
|
||||||
|
|
||||||
let image_cache_task = ImageCacheTask(mock_resource_task.clone());
|
let image_cache_task = ImageCacheTask::new(mock_resource_task.clone());
|
||||||
let url = parse_url("file", None);
|
let url = parse_url("file", None);
|
||||||
|
|
||||||
let join_port = image_cache_task.wait_for_store_prefetched();
|
let join_port = image_cache_task.wait_for_store_prefetched();
|
||||||
|
@ -833,7 +834,7 @@ mod tests {
|
||||||
fn should_return_failed_for_multiple_get_image_requests_if_image_bin_cannot_be_fetched() {
|
fn should_return_failed_for_multiple_get_image_requests_if_image_bin_cannot_be_fetched() {
|
||||||
let mock_resource_task = mock_resource_task(box SendTestImageErr);
|
let mock_resource_task = mock_resource_task(box SendTestImageErr);
|
||||||
|
|
||||||
let image_cache_task = ImageCacheTask(mock_resource_task.clone());
|
let image_cache_task = ImageCacheTask::new(mock_resource_task.clone());
|
||||||
let url = parse_url("file", None);
|
let url = parse_url("file", None);
|
||||||
|
|
||||||
let join_port = image_cache_task.wait_for_store_prefetched();
|
let join_port = image_cache_task.wait_for_store_prefetched();
|
||||||
|
@ -867,7 +868,7 @@ mod tests {
|
||||||
fn should_return_failed_if_image_decode_fails() {
|
fn should_return_failed_if_image_decode_fails() {
|
||||||
let mock_resource_task = mock_resource_task(box SendBogusImage);
|
let mock_resource_task = mock_resource_task(box SendBogusImage);
|
||||||
|
|
||||||
let image_cache_task = ImageCacheTask(mock_resource_task.clone());
|
let image_cache_task = ImageCacheTask::new(mock_resource_task.clone());
|
||||||
let url = parse_url("file", None);
|
let url = parse_url("file", None);
|
||||||
|
|
||||||
let join_port = image_cache_task.wait_for_store();
|
let join_port = image_cache_task.wait_for_store();
|
||||||
|
@ -895,7 +896,7 @@ mod tests {
|
||||||
fn should_return_image_on_wait_if_image_is_already_loaded() {
|
fn should_return_image_on_wait_if_image_is_already_loaded() {
|
||||||
let mock_resource_task = mock_resource_task(box SendTestImage);
|
let mock_resource_task = mock_resource_task(box SendTestImage);
|
||||||
|
|
||||||
let image_cache_task = ImageCacheTask(mock_resource_task.clone());
|
let image_cache_task = ImageCacheTask::new(mock_resource_task.clone());
|
||||||
let url = parse_url("file", None);
|
let url = parse_url("file", None);
|
||||||
|
|
||||||
let join_port = image_cache_task.wait_for_store();
|
let join_port = image_cache_task.wait_for_store();
|
||||||
|
@ -923,7 +924,7 @@ mod tests {
|
||||||
|
|
||||||
let mock_resource_task = mock_resource_task(box WaitSendTestImage {wait_port: wait_port});
|
let mock_resource_task = mock_resource_task(box WaitSendTestImage {wait_port: wait_port});
|
||||||
|
|
||||||
let image_cache_task = ImageCacheTask(mock_resource_task.clone());
|
let image_cache_task = ImageCacheTask::new(mock_resource_task.clone());
|
||||||
let url = parse_url("file", None);
|
let url = parse_url("file", None);
|
||||||
|
|
||||||
image_cache_task.send(Prefetch(url.clone()));
|
image_cache_task.send(Prefetch(url.clone()));
|
||||||
|
@ -949,7 +950,7 @@ mod tests {
|
||||||
|
|
||||||
let mock_resource_task = mock_resource_task(box WaitSendTestImageErr{wait_port: wait_port});
|
let mock_resource_task = mock_resource_task(box WaitSendTestImageErr{wait_port: wait_port});
|
||||||
|
|
||||||
let image_cache_task = ImageCacheTask(mock_resource_task.clone());
|
let image_cache_task = ImageCacheTask::new(mock_resource_task.clone());
|
||||||
let url = parse_url("file", None);
|
let url = parse_url("file", None);
|
||||||
|
|
||||||
image_cache_task.send(Prefetch(url.clone()));
|
image_cache_task.send(Prefetch(url.clone()));
|
||||||
|
@ -973,7 +974,7 @@ mod tests {
|
||||||
fn sync_cache_should_wait_for_images() {
|
fn sync_cache_should_wait_for_images() {
|
||||||
let mock_resource_task = mock_resource_task(box SendTestImage);
|
let mock_resource_task = mock_resource_task(box SendTestImage);
|
||||||
|
|
||||||
let image_cache_task = SyncImageCacheTask(mock_resource_task.clone());
|
let image_cache_task = ImageCacheTask::new_sync(mock_resource_task.clone());
|
||||||
let url = parse_url("file", None);
|
let url = parse_url("file", None);
|
||||||
|
|
||||||
image_cache_task.send(Prefetch(url.clone()));
|
image_cache_task.send(Prefetch(url.clone()));
|
||||||
|
|
|
@ -20,15 +20,6 @@ pub trait ImageResponder {
|
||||||
fn respond(&self) -> proc(ImageResponseMsg):Send;
|
fn respond(&self) -> proc(ImageResponseMsg):Send;
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn LocalImageCache(image_cache_task: ImageCacheTask) -> LocalImageCache {
|
|
||||||
LocalImageCache {
|
|
||||||
image_cache_task: image_cache_task,
|
|
||||||
round_number: 1,
|
|
||||||
on_image_available: None,
|
|
||||||
state_map: url_map()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub struct LocalImageCache {
|
pub struct LocalImageCache {
|
||||||
image_cache_task: ImageCacheTask,
|
image_cache_task: ImageCacheTask,
|
||||||
round_number: uint,
|
round_number: uint,
|
||||||
|
@ -36,6 +27,17 @@ pub struct LocalImageCache {
|
||||||
state_map: UrlMap<ImageState>
|
state_map: UrlMap<ImageState>
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl LocalImageCache {
|
||||||
|
pub fn new(image_cache_task: ImageCacheTask) -> LocalImageCache {
|
||||||
|
LocalImageCache {
|
||||||
|
image_cache_task: image_cache_task,
|
||||||
|
round_number: 1,
|
||||||
|
on_image_available: None,
|
||||||
|
state_map: url_map()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[deriving(Clone)]
|
#[deriving(Clone)]
|
||||||
struct ImageState {
|
struct ImageState {
|
||||||
prefetched: bool,
|
prefetched: bool,
|
||||||
|
|
|
@ -43,7 +43,7 @@ fn parse_css(provenance: StylesheetProvenance) -> Stylesheet {
|
||||||
}
|
}
|
||||||
InlineProvenance(base_url, data) => {
|
InlineProvenance(base_url, data) => {
|
||||||
debug!("cssparse: loading inline stylesheet {:s}", data);
|
debug!("cssparse: loading inline stylesheet {:s}", data);
|
||||||
Stylesheet::from_str(data.as_slice(), base_url, environment_encoding)
|
Stylesheet::from_str(data.as_slice(), base_url)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -53,12 +53,12 @@ impl Stylesheet {
|
||||||
bytes: &[u8], base_url: Url, protocol_encoding_label: Option<&str>,
|
bytes: &[u8], base_url: Url, protocol_encoding_label: Option<&str>,
|
||||||
environment_encoding: Option<EncodingRef>) -> Stylesheet {
|
environment_encoding: Option<EncodingRef>) -> Stylesheet {
|
||||||
// TODO: bytes.as_slice could be bytes.container_as_bytes()
|
// TODO: bytes.as_slice could be bytes.container_as_bytes()
|
||||||
let (string, used_encoding) = decode_stylesheet_bytes(
|
let (string, _) = decode_stylesheet_bytes(
|
||||||
bytes.as_slice(), protocol_encoding_label, environment_encoding);
|
bytes.as_slice(), protocol_encoding_label, environment_encoding);
|
||||||
Stylesheet::from_str(string.as_slice(), base_url, used_encoding)
|
Stylesheet::from_str(string.as_slice(), base_url)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn from_str(css: &str, base_url: Url, encoding: EncodingRef) -> Stylesheet {
|
pub fn from_str(css: &str, base_url: Url) -> Stylesheet {
|
||||||
static STATE_CHARSET: uint = 1;
|
static STATE_CHARSET: uint = 1;
|
||||||
static STATE_IMPORTS: uint = 2;
|
static STATE_IMPORTS: uint = 2;
|
||||||
static STATE_NAMESPACES: uint = 3;
|
static STATE_NAMESPACES: uint = 3;
|
||||||
|
|
|
@ -101,7 +101,7 @@ pub fn from_cmdline_args(args: &[String]) -> Option<Opts> {
|
||||||
let opt_match = match getopts::getopts(args, opts.as_slice()) {
|
let opt_match = match getopts::getopts(args, opts.as_slice()) {
|
||||||
Ok(m) => m,
|
Ok(m) => m,
|
||||||
Err(f) => {
|
Err(f) => {
|
||||||
args_fail(f.to_err_msg().as_slice());
|
args_fail(format!("{}", f).as_slice());
|
||||||
return None;
|
return None;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
|
@ -128,7 +128,7 @@ pub trait SmallVec<T> : SmallVecPrivate<T> {
|
||||||
}
|
}
|
||||||
unsafe {
|
unsafe {
|
||||||
let end: &mut T = mem::transmute(self.end());
|
let end: &mut T = mem::transmute(self.end());
|
||||||
mem::overwrite(end, value);
|
ptr::write(end, value);
|
||||||
let len = self.len();
|
let len = self.len();
|
||||||
self.set_len(len + 1)
|
self.set_len(len + 1)
|
||||||
}
|
}
|
||||||
|
|
|
@ -43,7 +43,7 @@ fn parse_config(args: Vec<String>) -> Config {
|
||||||
let opts = vec!(reqopt("s", "source-dir", "source-dir", "source-dir"));
|
let opts = vec!(reqopt("s", "source-dir", "source-dir", "source-dir"));
|
||||||
let matches = match getopts(args, opts.as_slice()) {
|
let matches = match getopts(args, opts.as_slice()) {
|
||||||
Ok(m) => m,
|
Ok(m) => m,
|
||||||
Err(f) => fail!(f.to_err_msg())
|
Err(f) => fail!(format!("{}", f))
|
||||||
};
|
};
|
||||||
|
|
||||||
Config {
|
Config {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue