mirror of
https://github.com/Pagwin-Fedora/ppi.git
synced 2025-07-17 22:15:42 +00:00
It works!!
This commit is contained in:
parent
ee5bec00e9
commit
002e5f3316
3 changed files with 89 additions and 64 deletions
51
Cargo.lock
generated
51
Cargo.lock
generated
|
@ -25,15 +25,6 @@ version = "1.3.2"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
|
checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "bstr"
|
|
||||||
version = "0.2.17"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "ba3569f383e8f1598449f1a423e72e99569137b47740b1da11ef19af3d5c3223"
|
|
||||||
dependencies = [
|
|
||||||
"memchr",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "cc"
|
name = "cc"
|
||||||
version = "1.0.73"
|
version = "1.0.73"
|
||||||
|
@ -248,21 +239,6 @@ dependencies = [
|
||||||
"cfg-if",
|
"cfg-if",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "memchr"
|
|
||||||
version = "2.5.0"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "num-traits"
|
|
||||||
version = "0.2.15"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd"
|
|
||||||
dependencies = [
|
|
||||||
"autocfg",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "once_cell"
|
name = "once_cell"
|
||||||
version = "1.14.0"
|
version = "1.14.0"
|
||||||
|
@ -308,12 +284,11 @@ checksum = "1df8c4ec4b0627e53bdf214615ad287367e482558cf84b109250b37464dc03ae"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "ppi"
|
name = "ppi"
|
||||||
version = "0.1.0"
|
version = "1.0.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"clap",
|
"clap",
|
||||||
"dirs",
|
"dirs",
|
||||||
"git2",
|
"git2",
|
||||||
"rlua",
|
|
||||||
"serde",
|
"serde",
|
||||||
"toml",
|
"toml",
|
||||||
]
|
]
|
||||||
|
@ -380,30 +355,6 @@ dependencies = [
|
||||||
"thiserror",
|
"thiserror",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "rlua"
|
|
||||||
version = "0.19.4"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "95b38117a836316ef62c02f6751e6d28e2eb53a1c35f0329427a9fb9c1c7b6a0"
|
|
||||||
dependencies = [
|
|
||||||
"bitflags",
|
|
||||||
"bstr",
|
|
||||||
"libc",
|
|
||||||
"num-traits",
|
|
||||||
"rlua-lua54-sys",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "rlua-lua54-sys"
|
|
||||||
version = "0.1.3"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "23ae48797c3e76fb2c205fda8f30e28416a15b9fc1d649cc7cea9ff1fb9cf028"
|
|
||||||
dependencies = [
|
|
||||||
"cc",
|
|
||||||
"libc",
|
|
||||||
"pkg-config",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "serde"
|
name = "serde"
|
||||||
version = "1.0.144"
|
version = "1.0.144"
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
[package]
|
[package]
|
||||||
name = "ppi"
|
name = "ppi"
|
||||||
version = "0.1.0"
|
version = "1.0.0"
|
||||||
edition = "2021"
|
edition = "2021"
|
||||||
|
|
||||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||||
|
@ -9,6 +9,5 @@ edition = "2021"
|
||||||
clap = { version = "3.2.22", features = ["derive", "cargo"] }
|
clap = { version = "3.2.22", features = ["derive", "cargo"] }
|
||||||
dirs = "4.0.0"
|
dirs = "4.0.0"
|
||||||
git2 = "0.15.0"
|
git2 = "0.15.0"
|
||||||
rlua = "0.19.4"
|
|
||||||
serde = { version = "1.0.144", features = ["derive"] }
|
serde = { version = "1.0.144", features = ["derive"] }
|
||||||
toml = "0.5.9"
|
toml = "0.5.9"
|
||||||
|
|
99
src/main.rs
99
src/main.rs
|
@ -1,23 +1,47 @@
|
||||||
extern crate rlua;
|
|
||||||
extern crate clap;
|
extern crate clap;
|
||||||
extern crate serde;
|
extern crate serde;
|
||||||
extern crate toml;
|
extern crate toml;
|
||||||
extern crate git2;
|
extern crate git2;
|
||||||
|
|
||||||
use std::{path::{Path, PathBuf}, io::Read, collections::{HashMap, HashSet}};
|
use std::{path::{PathBuf, Path}, io::{Read, Cursor}, collections::{HashMap, HashSet}, ffi::OsStr};
|
||||||
|
|
||||||
use clap::{Command, AppSettings, Arg};
|
use clap::{Command, Arg};
|
||||||
use serde::{Serialize, Deserialize};
|
use serde::{Serialize, Deserialize};
|
||||||
|
|
||||||
|
|
||||||
#[derive(Serialize, Deserialize,Default)]
|
#[derive(Serialize, Deserialize,Default)]
|
||||||
struct Config{
|
struct Subcommands{
|
||||||
//a hashmap of subcommands which can be created via cloning a skeleton repository
|
//a hashmap of subcommands which can be created via cloning a skeleton repository
|
||||||
skeletons:HashMap<String, Box<str>>,
|
skeletons:HashMap<String, String>,
|
||||||
// a hashmap of subcommands which can be created via running an external executable
|
// a hashmap of subcommands which can be created via running an external executable
|
||||||
scripts: HashMap<String,PathBuf>
|
scripts: HashMap<String,PathBuf>
|
||||||
}
|
}
|
||||||
pub fn main() {
|
#[derive(Serialize, Deserialize,Default)]
|
||||||
//
|
struct Config{
|
||||||
|
subcommands: Subcommands
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
enum Errors{IoErr(std::io::Error), GitErr(git2::Error), CliErr(CliError), Unknown}
|
||||||
|
impl From<std::io::Error> for Errors {
|
||||||
|
fn from(e: std::io::Error) -> Self {
|
||||||
|
Self::IoErr(e)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
impl From<git2::Error> for Errors {
|
||||||
|
fn from(e: git2::Error) -> Self {
|
||||||
|
Self::GitErr(e)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
impl From<CliError> for Errors{
|
||||||
|
fn from(e: CliError) -> Self{
|
||||||
|
Self::CliErr(e)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() -> Result<(),Errors> {
|
||||||
|
|
||||||
let config:Config = toml::from_str({
|
let config:Config = toml::from_str({
|
||||||
let mut buf = String::new();
|
let mut buf = String::new();
|
||||||
let _ = std::fs::File::open(
|
let _ = std::fs::File::open(
|
||||||
|
@ -28,7 +52,7 @@ pub fn main() {
|
||||||
buf
|
buf
|
||||||
}.as_str()).unwrap_or_default();
|
}.as_str()).unwrap_or_default();
|
||||||
|
|
||||||
let Config {scripts,skeletons} = config;
|
let Config {subcommands:Subcommands { skeletons, scripts }} = config;
|
||||||
|
|
||||||
// Making sure the skeletons and scripts don't have overlap that will cause issue later
|
// Making sure the skeletons and scripts don't have overlap that will cause issue later
|
||||||
{
|
{
|
||||||
|
@ -39,16 +63,39 @@ pub fn main() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
let mut program = Command::new("project-init")
|
let mut program = Command::new(clap::crate_name!())
|
||||||
.subcommands(skeletons.keys().map(|v|Command::new(v).arg(Arg::new("output_dir").takes_value(true))))
|
.version(clap::crate_version!())
|
||||||
|
.author(clap::crate_authors!())
|
||||||
|
.subcommands(skeletons.keys().map(|v|Command::new(v).arg(Arg::new("output_dir").takes_value(true).action(clap::ArgAction::Append))))
|
||||||
.subcommands(scripts.keys().map(|v|Command::new(v).arg(Arg::new("script_args").takes_value(true))));
|
.subcommands(scripts.keys().map(|v|Command::new(v).arg(Arg::new("script_args").takes_value(true))));
|
||||||
|
let mut short_help = String::new();
|
||||||
|
let mut long_help = String::new();
|
||||||
|
{
|
||||||
|
let mut short_help_buf = Vec::new();
|
||||||
|
let mut long_help_buf = Vec::new();
|
||||||
|
program.write_help(&mut Cursor::new(&mut short_help_buf))?;
|
||||||
|
program.write_help(&mut Cursor::new(&mut long_help_buf))?;
|
||||||
|
short_help_buf.as_slice().read_to_string(&mut short_help)?;
|
||||||
|
long_help_buf.as_slice().read_to_string(&mut long_help)?;
|
||||||
|
}
|
||||||
program.build();
|
program.build();
|
||||||
let matches = program.get_matches();
|
let matches = program.get_matches();
|
||||||
for skelly in skeletons {
|
for skelly in skeletons {
|
||||||
if let Some(sub) = matches.subcommand_matches(skelly.0){
|
if let Some(sub) = matches.subcommand_matches(skelly.0){
|
||||||
match sub.get_one::<String>(""){
|
match sub.get_one::<String>("output_dir"){
|
||||||
Some(loc)=>{
|
Some(loc)=>{
|
||||||
|
let repo = match git2::Repository::clone(skelly.1.as_ref(), loc){
|
||||||
|
Ok(repo)=>{
|
||||||
|
repo
|
||||||
|
}
|
||||||
|
Err(_)=>{
|
||||||
|
eprintln!("libgit2 failed clone falling back to cli");
|
||||||
|
cli_fallback(skelly.1,loc)?;
|
||||||
|
git2::Repository::open(loc)?
|
||||||
|
}
|
||||||
|
};
|
||||||
|
repo.remote_delete("origin")?;
|
||||||
|
return Ok(())
|
||||||
}
|
}
|
||||||
None=>{
|
None=>{
|
||||||
println!("failed to provide a path to clone the skeleton directory into");
|
println!("failed to provide a path to clone the skeleton directory into");
|
||||||
|
@ -57,4 +104,32 @@ pub fn main() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
for script in scripts {
|
||||||
|
if let Some(sub) = matches.subcommand_matches(script.0){
|
||||||
|
std::process::exit(std::process::Command::new(script.1).args(sub.get_many::<String>("script_args").map(Iterator::collect).unwrap_or(Vec::new())).spawn()?.wait()?.code().ok_or(Errors::Unknown)?);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
println!("{}", short_help);
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
#[derive(Debug)]
|
||||||
|
enum CliError{Io(std::io::Error), NonZero}
|
||||||
|
impl From<std::io::Error> for CliError {
|
||||||
|
fn from(e: std::io::Error) -> Self {
|
||||||
|
Self::Io(e)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fn cli_fallback<S:AsRef<OsStr>, P:AsRef<Path>>(source:S, dest: P)->Result<(),CliError>{
|
||||||
|
|
||||||
|
let mut child = std::process::Command::new("git");
|
||||||
|
child
|
||||||
|
.arg("clone")
|
||||||
|
.arg(source)
|
||||||
|
.arg(dest.as_ref());
|
||||||
|
if !child.spawn()?.wait()?.success() {
|
||||||
|
Err(CliError::NonZero)
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue