1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
|
mod repository;
mod utilities;
mod object;
use crate::repository::GitRepository;
use clap::{Parser, Subcommand};
use std::path::PathBuf;
#[derive(Parser)]
#[command(version, about, long_about = None)]
struct Cli {
#[command(subcommand)]
command: Command
}
#[derive(Subcommand)]
enum Command {
Init {
path: Option<PathBuf>,
},
CatFile {
#[arg(
value_name="TYPE",
value_parser = clap::builder::PossibleValuesParser::new(
["blob", "commit", "tag", "tree"])
)]
object_type: String,
sha: String,
},
HashObject {
#[arg(short, long)]
write: bool,
#[arg(
short,
long,
value_name = "TYPE",
value_parser = clap::builder::PossibleValuesParser::new(
["blob", "commit", "tag", "tree"])
)]
object_type: String,
#[arg(value_name = "FILE")]
file_path: PathBuf,
},
Log,
Commit {
message: String,
},
Checkout {
branch: String,
},
Rm {
pathspec: PathBuf,
},
Status,
}
fn main() {
let cli = Cli::parse();
match &cli.command {
Command::Init { path} => {
let mut p = PathBuf::new();
if let Some(path) = path.clone() {
p = path.clone();
} else {
if let Ok(path) = std::env::current_dir() {
p = path;
}
}
GitRepository::create_new_repo(p);
}
_ => {}
}
}
|