git_httpsable/
lib.rs

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}