extern crate os_info;
use std::path::Path;
use std::process::Command;
struct Args {
arg_remote: Option<String>,
}
pub fn git_init(target_dir: &Path, url: &str) -> super::SROutput {
let mut output = super::SROutput {
status: 0,
wrapped_status: 0,
stdout: Vec::new(),
stderr: Vec::new(),
};
let stdoutput = match Command::new("git")
.args(&["init"])
.current_dir(target_dir)
.output()
{
Ok(out) => out,
Err(e) => {
if let std::io::ErrorKind::NotFound = e.kind() {
output.status = 106;
output
.stderr
.push(format!("ERROR: `git` was not found, please install: {}", e));
return output;
} else {
output.status = 107;
output
.stderr
.push(format!("ERROR: Could not initialize git repository: {}", e));
return output;
}
}
};
output
.stderr
.push(String::from("git repository initialized for project."));
if !output.stderr.is_empty() {
output
.stderr
.push(String::from_utf8_lossy(&stdoutput.stderr).to_string());
}
let stdoutput = match Command::new("git")
.args(&["remote", "add", "origin", url])
.current_dir(target_dir)
.output()
{
Ok(out) => out,
Err(e) => {
output.status = 108;
output.stderr.push(format!(
"ERROR: Unable to set remote URL for project: {}",
e
));
return output;
}
};
output.stdout.push(String::from(
"Done initializing git repository for project.",
));
if !output.stderr.is_empty() {
output
.stderr
.push(String::from_utf8_lossy(&stdoutput.stderr).to_string());
}
output
}
pub fn git_add_and_commit(target_dir: &Path, message: String) -> super::SROutput {
let mut output = super::SROutput {
status: 0,
wrapped_status: 0,
stdout: Vec::new(),
stderr: Vec::new(),
};
let stdoutput = match Command::new("git")
.args(&["add", "."])
.current_dir(target_dir)
.output()
{
Ok(out) => out,
Err(e) => {
output.status = 103;
output
.stderr
.push(format!("ERROR: Unable to stage changes using git: {}", e));
return output;
}
};
output
.stdout
.push(String::from_utf8_lossy(&stdoutput.stdout).to_string());
output
.stdout
.push(String::from("Changes staged using git."));
output
.stderr
.push(String::from_utf8_lossy(&stdoutput.stderr).to_string());
let info = os_info::get();
if info.os_type() == os_info::Type::Windows {
let stdoutput = match Command::new("git")
.args(&["config", "--local", "sendpack.sideband", "false"])
.current_dir(target_dir)
.output()
{
Ok(out) => out,
Err(e) => {
output.status = 109;
output.stderr.push(format!(
"ERROR: Unable to disable sendpack.sideband git option: {}",
e
));
return output;
}
};
output
.stdout
.push(String::from_utf8_lossy(&stdoutput.stdout).to_string());
output
.stderr
.push(String::from_utf8_lossy(&stdoutput.stderr).to_string());
}
let stdoutput = match Command::new("git")
.args(&["commit", "-m", &message])
.current_dir(target_dir)
.output()
{
Ok(out) => out,
Err(e) => {
output.status = 104;
output
.stderr
.push(format!("ERROR: Unable to commit changes using git: {}", e));
return output;
}
};
output
.stdout
.push(String::from_utf8_lossy(&stdoutput.stdout).to_string());
output
.stdout
.push(String::from("Changes committed using git."));
output
.stderr
.push(String::from_utf8_lossy(&stdoutput.stderr).to_string());
let stdoutput = match Command::new("git")
.args(&["push", "origin", "master"])
.current_dir(target_dir)
.output()
{
Ok(out) => out,
Err(e) => {
output.status = 105;
output.stderr.push(format!(
"ERROR: Unable to push changes to remote git repository: {}",
e
));
return output;
}
};
output
.stdout
.push(String::from_utf8_lossy(&stdoutput.stdout).to_string());
output
.stdout
.push(String::from("Changes pushed using git."));
output
.stderr
.push(String::from_utf8_lossy(&stdoutput.stderr).to_string());
output
}
pub fn git_pull(target_dir: &Path) -> super::SROutput {
let mut output = super::SROutput {
status: 0,
wrapped_status: 0,
stdout: Vec::new(),
stderr: Vec::new(),
};
let stdoutput = match Command::new("git")
.args(&["pull", "origin", "master"])
.current_dir(target_dir)
.output()
{
Ok(out) => out,
Err(e) => {
output.status = 100;
output.stderr.push(format!(
"ERROR: Pull from remote repository not successful: {}",
e
));
return output;
}
};
if stdoutput.stdout.is_empty() {
output.status = 101;
output.stderr.push(format!(
"ERROR: Pull failed, may be waiting for username/password or passphrase."
));
}
output
.stdout
.push(String::from_utf8_lossy(&stdoutput.stdout).to_string());
output
.stderr
.push(String::from_utf8_lossy(&stdoutput.stderr).to_string());
if stdoutput.status.code().unwrap() != 0 {
output.wrapped_status = stdoutput.status.code().unwrap();
}
output
}
pub fn git_clone(target_dir: &Path, url: &str) -> super::SROutput {
let mut output = super::SROutput {
status: 0,
wrapped_status: 0,
stdout: Vec::new(),
stderr: Vec::new(),
};
let stdoutput = match Command::new("git")
.args(&["clone", "--recursive", url])
.current_dir(target_dir)
.output()
{
Ok(out) => out,
Err(e) => {
output.status = 102;
output.stderr.push(format!(
"ERROR: Unable to clone component repository: {}",
e
));
return output;
}
};
output
.stdout
.push(String::from_utf8_lossy(&stdoutput.stdout).to_string());
output
.stderr
.push(String::from_utf8_lossy(&stdoutput.stderr).to_string());
if stdoutput.status.code().unwrap() != 0 {
output.wrapped_status = stdoutput.status.code().unwrap();
}
output
}
pub fn git_set_remote_url(target_dir: &Path, url: &str) -> super::SROutput {
let mut output = super::SROutput {
status: 0,
wrapped_status: 0,
stdout: Vec::new(),
stderr: Vec::new(),
};
let stdoutput = match Command::new("git")
.args(&["remote", "set-url", "origin", url])
.current_dir(target_dir)
.output()
{
Ok(out) => out,
Err(e) => {
output.status = 110;
output.stderr.push(format!(
"ERROR: Unable to change the URL on the component repository: {}",
e
));
return output;
}
};
output
.stdout
.push(String::from_utf8_lossy(&stdoutput.stdout).to_string());
output
.stderr
.push(String::from_utf8_lossy(&stdoutput.stderr).to_string());
if stdoutput.status.code().unwrap() != 0 {
output.wrapped_status = stdoutput.status.code().unwrap();
}
output
}