1extern crate url;
2
3use std::error::Error;
4use url::Url;
5use std::process::{Command, Stdio, Child};
6
7pub fn run(items: &[String], username: &str, password: &str) -> Result<Child, Box<Error>> {
8 match Command::new("git")
9 .args(
10 items
11 .iter()
12 .map(|input| filter_schema(&input, &username, &password))
13 .collect::<Vec<_>>(),
14 )
15 .stderr(Stdio::null())
16 .spawn() {
17 Ok(t) => Ok(t),
18 Err(err) => Err(Box::new(err)),
19 }
20}
21
22pub fn filter_schema(input: &str, username: &str, password: &str) -> String {
23 if input.starts_with("https://") || input.starts_with("http://") {
24 adjust(input, username, password).unwrap()
25 } else {
26 input.to_owned()
27 }
28}
29
30pub fn adjust(schema_url: &str, username: &str, password: &str) -> Result<String, Box<Error>> {
31 let mut parsed = Url::parse(schema_url)?;
32 parsed.set_username(username).expect(
33 "failed to set username",
34 );
35 parsed.set_password(Some(password)).expect(
36 "failed to set password",
37 );
38 Ok(parsed.as_str().to_owned())
39}
40
41#[cfg(test)]
42mod test {
43 use super::*;
44
45 #[test]
46 fn adjust_both() {
47 let https_url = "https://example.com/foo";
48 let username = "username";
49 let password = "password";
50 let expected = "https://username:password@example.com/foo";
51 assert_eq!(adjust(https_url, username, password).unwrap(), expected);
52 }
53}