build.rs/src/dvcs.rs

164 lines
4.6 KiB
Rust
Raw Normal View History

2020-11-25 22:59:39 +00:00
use std::path::{Path, PathBuf};
2020-04-30 23:45:48 +00:00
use std::process::Command;
#[derive(Debug)]
pub enum Backend {
Git,
Mercurial,
Unknown(String),
2020-04-30 23:45:48 +00:00
}
2020-11-25 22:55:33 +00:00
impl Backend {
pub fn from_setting(setting: Option<String>) -> Backend {
// Git is the default setting until further notice
setting.map_or(Backend::Git, |name| match name.as_ref() {
"git" => Backend::Git,
"mercurial" => Backend::Mercurial,
2020-11-25 22:59:39 +00:00
_ => Backend::Unknown(name.to_string()),
2020-11-25 22:55:33 +00:00
})
}
}
2020-11-25 22:26:52 +00:00
#[derive(Debug)]
pub struct Repo {
pub backend: Backend,
pub source: String,
pub dest: PathBuf,
pub subupdates: bool,
}
impl Repo {
pub fn new(backend: Backend, source: &str, dest: &Path, subupdates: bool) -> Repo {
Repo {
backend,
source: source.to_string(),
dest: dest.to_path_buf(),
2020-11-25 22:59:39 +00:00
subupdates,
2020-11-25 22:26:52 +00:00
}
}
pub fn branch(&self) -> String {
match &self.backend {
Backend::Git => {
let output = Command::new("git")
.arg("rev-parse")
.arg("--abbrev-ref")
.arg("HEAD")
2020-11-25 22:59:39 +00:00
.output()
.expect("WTF");
2020-11-25 22:26:52 +00:00
if !output.status.success() {
panic!("Corrupted git repository???");
}
String::from_utf8(output.stdout).unwrap().trim().to_string()
2020-11-25 22:59:39 +00:00
}
2020-11-25 22:26:52 +00:00
Backend::Mercurial => {
unreachable!("UNIMPLEMENTED!");
2020-11-25 22:59:39 +00:00
}
2020-11-25 22:26:52 +00:00
Backend::Unknown(name) => {
panic!("Uknown backend: {}. Cannot find ranch", name);
2020-11-25 22:59:39 +00:00
}
2020-11-25 22:26:52 +00:00
}
}
pub fn clone(&self) -> bool {
match &self.backend {
2020-04-30 23:45:48 +00:00
Backend::Git => {
let status = Command::new("git")
.arg("clone")
.arg("--recursive")
2020-11-25 22:26:52 +00:00
.arg(&self.source)
.arg(&self.dest)
2020-11-25 22:59:39 +00:00
.status()
.expect("PROCESS ERROR!");
2020-04-30 23:45:48 +00:00
status.success()
2020-11-25 22:59:39 +00:00
}
2020-04-30 23:45:48 +00:00
Backend::Mercurial => {
unreachable!("Unimplemented");
2020-11-25 22:59:39 +00:00
}
2020-04-30 23:45:48 +00:00
Backend::Unknown(name) => {
eprintln!("Unknown DVCS: {}", name);
false
}
}
}
2020-11-25 22:26:52 +00:00
pub fn checkout(&self, target: &str) -> bool {
println!("CHECKOUT TO {}", target);
match &self.backend {
Backend::Git => {
let status = Command::new("git")
.arg("checkout")
.arg(target)
2020-11-25 22:59:39 +00:00
.status()
.expect("PROCESS ERROR!");
2020-11-25 22:26:52 +00:00
status.success()
2020-11-25 22:59:39 +00:00
}
2020-11-25 22:26:52 +00:00
Backend::Mercurial => {
unreachable!("UNIMPLEMENTED");
2020-11-25 22:59:39 +00:00
}
2020-11-25 22:26:52 +00:00
Backend::Unknown(name) => {
eprintln!("Unknown DVCS: {}", name);
false
}
}
}
pub fn has_updates(&self) -> bool {
match &self.backend {
Backend::Git => {
// Refresh remote
if !Command::new("git")
.arg("fetch")
.arg("--quiet")
.arg("origin")
2020-11-25 22:59:39 +00:00
.status()
.expect("WTF")
.success()
{
2020-11-25 22:26:52 +00:00
// FAILED, no internet??
eprintln!("Fetching updates failed");
return false;
}
let branch = self.branch();
if Command::new("git")
.arg("diff")
.arg("--quiet")
.arg(format!("remotes/origin/{}", &branch))
2020-11-25 22:59:39 +00:00
.status()
.expect("WTF")
.success()
{
2020-11-25 22:26:52 +00:00
// Command succeeeded, no updates
return false;
}
// Updates
return true;
2020-11-25 22:59:39 +00:00
}
2020-11-25 22:26:52 +00:00
Backend::Mercurial => {
unreachable!("unimplemented");
2020-11-25 22:59:39 +00:00
}
2020-11-25 22:26:52 +00:00
Backend::Unknown(name) => {
eprintln!("Unknown DVCS:{}!", name);
false
}
}
}
/*
/// Runs an update on the repository in dest. Returns true
/// when an update was performed, false otherwise
pub fn update(&self, dest: &str) -> bool {
match self {
Backend::Git => {
2020-11-25 22:59:39 +00:00
},
Backend::Mercurial => {
},
Backend::Unknown(name) => {
eprintln!("Unknown DVCS: {}", name);
false
}
}
}*/
2020-04-30 23:45:48 +00:00
}