use std::path;
use crate::cargo;
use crate::empty;
use crate::go;
use crate::node;
pub trait PackageManager {
fn language_name(&self) -> &'static str;
fn major(&self, repo: &git2::Repository, version: &semver::Version) -> Result<(), String>;
fn minor(&self, repo: &git2::Repository, version: &semver::Version) -> Result<(), String>;
fn patch(&self, repo: &git2::Repository, version: &semver::Version) -> Result<(), String>;
fn create_tag(&self, repo: &git2::Repository, tag_name: String) -> Result<(), String> {
let head = match repo.head() {
Ok(reference) => reference,
Err(msg) => return Err(msg.to_string()),
};
let head_obj = repo
.find_object(head.target().unwrap(), Some(git2::ObjectType::Commit))
.unwrap();
match repo.tag_lightweight(&tag_name, &head_obj, false) {
Ok(_) => (),
Err(msg) => return Err(msg.to_string()),
};
println!("✅ Created tag {}", tag_name);
Ok(())
}
}
pub fn identify_dir<'a>(
fs: &impl filesystem::FileSystem,
dir: &path::PathBuf,
) -> &'a PackageManager {
if fs.read_file(dir.join("package.json")).is_ok() {
return &node::PackageManager {};
}
if fs.read_file(dir.join("go.mod")).is_ok() {
return &go::PackageManager {};
}
if fs.read_file(dir.join("cargo.toml")).is_ok() {
return &cargo::PackageManager {};
}
return &empty::PackageManager {};
}