rgit/src/remote.rs

69 lines
2.0 KiB
Rust
Raw Normal View History

use std::collections::HashMap;
2020-12-02 00:15:21 +01:00
#[path = "data.rs"]
mod data;
#[path = "base.rs"]
mod base;
static REMOTE_REFS_BASE: &'static str = "refs/heads/";
static LOCAL_REFS_BASE: &'static str = "refs/remote/";
2020-12-02 00:15:21 +01:00
pub fn fetch(path: String) {
// Get refs from server
let refs = get_remote_refs(path.clone(), REMOTE_REFS_BASE);
let commit_oids: Vec<&String> = refs.values().collect();
2020-12-06 19:25:41 +01:00
base::copy_objects_in_commits_and_parents(commit_oids, path.clone(), false);
// Update local refs to match server
for (remote_name, value) in refs.iter() {
let refname = remote_name.trim_start_matches(REMOTE_REFS_BASE);
data::update_ref(
format!("{}/{}", LOCAL_REFS_BASE, refname),
data::RefValue {
symbolic: false,
value: value.clone(),
},
true,
)
}
}
2020-12-06 19:25:41 +01:00
pub fn push(remote_path: String, reference: String) {
2020-12-06 19:57:23 +01:00
let refs = get_remote_refs(remote_path.clone(), REMOTE_REFS_BASE);
let empty = "".to_owned();
let remote_ref = refs.get(&reference).unwrap_or(&empty);
2020-12-06 19:25:41 +01:00
let local_ref = data::get_ref(reference.clone(), true).value;
assert!(local_ref != "".to_string());
2020-12-06 19:57:23 +01:00
// Don't allow force push
assert!(
*remote_ref == "".to_owned() || base::is_ancestor_of(local_ref.clone(), remote_ref.clone())
);
2020-12-06 19:25:41 +01:00
let commit_oids = vec![&local_ref];
base::copy_objects_in_commits_and_parents(commit_oids, remote_path.clone(), true);
data::set_rgit_dir(remote_path.as_str());
data::update_ref(
reference,
data::RefValue {
symbolic: false,
value: local_ref,
},
true,
);
data::reset_rgit_dir();
}
fn get_remote_refs(path: String, prefix: &str) -> HashMap<String, String> {
let mut refs = HashMap::new();
2020-12-02 00:15:21 +01:00
data::set_rgit_dir(path.as_str());
for (refname, reference) in data::iter_refs(prefix, true) {
refs.insert(refname, reference.value);
2020-12-02 00:15:21 +01:00
}
data::reset_rgit_dir();
return refs;
2020-12-02 00:15:21 +01:00
}