pub const OVERLAY_NAME: &str = "raiagent";
pub const OVERLAY: &str = "leycec/raiagent";
pub fn overlay_branch_format(version: &str) -> String {
format!("powerline-release-{}", version)
}
pub fn parse_version(s: &str, latest_version: Option<&[u32]>) -> Result<Vec<u32>, String> {
let all_plus = !s.is_empty() && s.chars().all(|c| c == '+');
if all_plus {
let last = latest_version.ok_or_else(|| "No existing versions found".to_string())?;
let mut version: Vec<u32> = Vec::new();
for i in 0..s.len().saturating_sub(1) {
version.push(*last.get(i).unwrap_or(&0));
}
let bump_idx = s.len() - 1;
let next = last.get(bump_idx).map(|v| v + 1).unwrap_or(1);
version.push(next);
if version.len() == 1 {
version.push(0);
}
Ok(version)
} else {
s.split('.')
.map(|p| p.parse::<u32>().map_err(|e| e.to_string()))
.collect()
}
}
pub fn setup_py_develop_filter(line: &str, version_string: &str) -> String {
if line.starts_with("\tbase_version = ") {
format!("\tbase_version = '{}'\n", version_string)
} else {
line.to_string()
}
}
pub fn setup_py_master_filter(line: &str, version_string: &str) -> String {
if line.starts_with("\tversion=") {
format!("\tversion='{}',\n", version_string)
} else if line.contains("Development Status") {
"\t\t'Development Status :: 5 - Production/Stable',\n".to_string()
} else {
line.to_string()
}
}
pub const STAGE_NAMES: &[&str] = &[
"merge",
"push",
"upload",
"create_ebuilds",
"update_overlay",
];
pub fn create_release(
version: &[u32],
_user: &str,
_password: Option<&str>,
run_stages: Option<&[&str]>,
) -> String {
let version_string = version
.iter()
.map(|v| v.to_string())
.collect::<Vec<_>>()
.join(".");
for stname in STAGE_NAMES.iter() {
let in_stages = match run_stages {
None => true,
Some(s) => s.contains(stname),
};
if in_stages {
}
}
version_string
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn overlay_constants_pin_to_upstream() {
assert_eq!(OVERLAY_NAME, "raiagent");
assert_eq!(OVERLAY, "leycec/raiagent");
}
#[test]
fn overlay_branch_format_interpolates_version() {
assert_eq!(
overlay_branch_format("2.7"),
"powerline-release-2.7".to_string()
);
}
#[test]
fn parse_version_plain_dotted() {
assert_eq!(parse_version("1.2.3", None).unwrap(), vec![1, 2, 3]);
assert_eq!(parse_version("2.0", None).unwrap(), vec![2, 0]);
}
#[test]
fn parse_version_rejects_invalid_int() {
assert!(parse_version("1.x.3", None).is_err());
}
#[test]
fn parse_version_plus_bumps_major() {
let r = parse_version("+", Some(&[1, 2, 3])).unwrap();
assert_eq!(r, vec![2, 0]);
}
#[test]
fn parse_version_plusplus_bumps_minor() {
let r = parse_version("++", Some(&[1, 2, 3])).unwrap();
assert_eq!(r, vec![1, 3]);
}
#[test]
fn parse_version_plusplusplus_bumps_patch() {
let r = parse_version("+++", Some(&[1, 2, 3])).unwrap();
assert_eq!(r, vec![1, 2, 4]);
}
#[test]
fn parse_version_plus_no_latest_errors() {
let r = parse_version("+", None);
assert!(r.is_err());
}
#[test]
fn setup_py_develop_filter_rewrites_base_version_line() {
let r = setup_py_develop_filter("\tbase_version = 'old'\n", "1.2.3");
assert_eq!(r, "\tbase_version = '1.2.3'\n");
}
#[test]
fn setup_py_develop_filter_passes_through_other_lines() {
let r = setup_py_develop_filter("# comment\n", "1.2.3");
assert_eq!(r, "# comment\n");
}
#[test]
fn setup_py_master_filter_rewrites_version_line() {
let r = setup_py_master_filter("\tversion='old',\n", "1.2.3");
assert_eq!(r, "\tversion='1.2.3',\n");
}
#[test]
fn setup_py_master_filter_pins_development_status_line() {
let r = setup_py_master_filter("\t\t'Development Status :: 4 - Beta',\n", "1.2.3");
assert_eq!(r, "\t\t'Development Status :: 5 - Production/Stable',\n");
}
#[test]
fn setup_py_master_filter_passes_through_other_lines() {
let r = setup_py_master_filter("\tname='powerline',\n", "1.2.3");
assert_eq!(r, "\tname='powerline',\n");
}
#[test]
fn stage_names_match_upstream_order() {
assert_eq!(
STAGE_NAMES,
&[
"merge",
"push",
"upload",
"create_ebuilds",
"update_overlay"
]
);
}
#[test]
fn create_release_returns_dotted_version_string() {
assert_eq!(create_release(&[1, 2, 3], "user", None, None), "1.2.3");
}
#[test]
fn create_release_with_run_stages_subset() {
let r = create_release(&[2, 0], "u", None, Some(&["merge", "push"]));
assert_eq!(r, "2.0");
}
}