restore的基本代码框架

This commit is contained in:
HouXiaoxuan
2023-12-22 11:07:36 +08:00
parent 05368f67b6
commit fd415fe02b
2 changed files with 76 additions and 7 deletions

View File

@@ -1,6 +1,7 @@
use clap::{ArgGroup, Parser, Subcommand};
use mit::commands::{
add::add, branch::branch, commit::commit, init::init, log::log, remove::remove, status::status, switch::switch,
add::add, branch::branch, commit::commit, init::init, log::log, remove::remove, restore::restore, status::status,
switch::switch,
};
/// Rust实现的简易版本的Git用于学习Rust语言
@@ -90,19 +91,31 @@ enum Command {
branch: Option<String>,
/// 创建并切换到新分支
#[clap(long, short)]
#[clap(long, short, group = "sub")]
create: Option<String>,
/// 是否允许切换到commit
#[clap(long, short, action, default_value = "false", group = "sub")]
detach: bool,
},
/// restore
Restore {
// TODO 行为不确定
/// 要恢复的文件
#[clap(required = true)]
files: Vec<String>,
path: Vec<String>,
/// source
#[clap(long, short)]
source: Option<String>,
/// worktree
#[clap(long, short, action)]
worktree: bool,
/// staged
#[clap(long, short, action)]
staged: bool,
},
}
pub fn handle_command() {
@@ -130,11 +143,19 @@ pub fn handle_command() {
branch(new_branch, commit_hash, list, delete, show_current);
}
Command::Switch { branch, create } => {
switch(branch, create);
Command::Switch { branch, create, detach } => {
switch(branch, create, detach);
}
Command::Restore { files, source } => {
println!("files: {:?}, source: {:?}", files, source);
Command::Restore { path, mut source, mut worktree, staged } => {
// 未指定stage和worktree时默认操作stage
if !staged {
worktree = true;
}
// 未指定source时默认操作HEAD
if source.is_none() {
source = Some("HEAD".to_string());
}
restore(path, source, worktree, staged);
}
}
}

View File

@@ -1 +1,49 @@
use std::path::PathBuf;
use crate::{
head,
models::{commit::Commit, object::Hash},
store::Store,
};
/** 根据filte restore workdir */
pub fn restore_workdir_into_files(filter: Option<PathBuf>, target_blobs: Vec<(PathBuf, Hash)>) {
// TODO
unimplemented!("TODO");
}
/** 根据filte restore staged */
pub fn restore_staged_into_files(filter: Option<PathBuf>, target_blobs: Vec<(PathBuf, Hash)>) {
// TODO
unimplemented!("TODO");
}
pub fn restore(path: Vec<String>, source: String, worktree: bool, staged: bool) {
// TODO
let target_commit = {
if source == "HEAD" {
head::current_head_commit()
} else if head::list_local_branches().contains(&source) {
head::get_branch_head(&source)
} else {
let store = Store::new();
let commit = store.search(&source);
if commit.is_none() {
println!("fatal: 非法的 commit: '{}'", source);
return;
}
commit.unwrap()
}
};
// TODO 处理筛选path的互相包含的情况
// 分别处理worktree和staged
let tree = Commit::load(&target_commit).get_tree();
let target_blobs = tree.get_recursive_blobs();
if worktree {
unimplemented!("TODO")
}
if staged {
unimplemented!("TODO")
}
unimplemented!("TODO");
}