diff options
Diffstat (limited to 'src/core.rs')
-rw-r--r-- | src/core.rs | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/src/core.rs b/src/core.rs new file mode 100644 index 0000000..1223bb7 --- /dev/null +++ b/src/core.rs @@ -0,0 +1,52 @@ +use std::collections::HashMap; +use std::path::PathBuf; +use std::process; +use ini::ini; + +pub struct GitRepository { + pub worktree: PathBuf, + gitdir: PathBuf, + conf: HashMap<String, HashMap<String, Option<String>>> +} + +fn die(msg: &str) { + println!("{}", msg); + process::exit(1); +} + +impl GitRepository { + pub fn new(worktree: PathBuf) -> Self { + let gitdir = worktree.join(".git"); + let conf: HashMap<String, HashMap<String, Option<String>>> = HashMap::new(); + Self { worktree, gitdir, conf } + } + + pub fn from_dir(worktree: PathBuf) -> Self { + if !worktree.exists() { + die("Worktree does not exist"); + } + let gitdir = worktree.join(".git"); + if !gitdir.exists() { + die("Not a valid git repository"); + } + let conf_file = gitdir.join("config"); + if !conf_file.exists() { + die("Config file does not exist"); + } + let conf = ini!(conf_file.to_str().unwrap()); + let repo_format_version = conf["core"]["repositoryformatversion"].clone(); + if let Some(version) = repo_format_version { + if version != "0" { + die("Unsupported format version"); + } + } else { + die("Could not determine repository format version"); + } + + Self { + worktree, + gitdir, + conf + } + } +}
\ No newline at end of file |