summaryrefslogtreecommitdiff
path: root/src/main.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/main.rs')
-rw-r--r--src/main.rs90
1 files changed, 62 insertions, 28 deletions
diff --git a/src/main.rs b/src/main.rs
index 2bdb29c..068a8fb 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -6,10 +6,10 @@ use crate::cfg::config::Config;
use crate::net::{http_package::HTTPPackage, i2p_package::I2PPackage};
use crate::pkgtoolkit::Package;
-use crate::pkgtoolkit::index::IndexOperations;
-use crate::pkgtoolkit::git_source::GitSource;
use crate::pkgtoolkit::archive::ArchiveOperations;
use crate::pkgtoolkit::build::BuildOperations;
+use crate::pkgtoolkit::git_source::GitSource;
+use crate::pkgtoolkit::index::IndexOperations;
use clap::{Args, Parser, Subcommand};
use std::io::Write;
@@ -72,7 +72,6 @@ struct RemoteInstallArgs {
clean: bool,
}
-
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let cli: Cli = Cli::parse();
@@ -91,7 +90,7 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
}
Err(e) => {
log::error!("Failed to validate package '{}': {}", path, e);
- return Err(e.into());
+ return Err(e.into());
}
}
return Ok(());
@@ -101,24 +100,52 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
let path = Path::new(&pkgname);
if !path.exists() {
- return Err(std::io::Error::other(format!("Package archive not found: {}", pkgname)).into());
+ return Err(std::io::Error::other(format!(
+ "Package archive not found: {}",
+ pkgname
+ ))
+ .into());
}
if !path.is_file() {
- return Err(std::io::Error::other(format!("Path is not a file: {}", pkgname)).into());
+ return Err(
+ std::io::Error::other(format!("Path is not a file: {}", pkgname)).into(),
+ );
}
println!("Extracting archive...");
Package::extract_archive(&pkgname)?;
- let config = Config::parse().unwrap();
+ let config = Config::parse().unwrap();
let cache_dir = &config.paths.cache_dir;
- let install_toml_path = Path::new(cache_dir).join("INSTALL");
-
+
+ // Find the package directory (should be name-version format)
+ let mut pkg_dir_name = None;
+ for entry in std::fs::read_dir(cache_dir)? {
+ let entry = entry?;
+ let path = entry.path();
+ if path.is_dir() {
+ let dir_name = path.file_name().unwrap().to_string_lossy();
+ if dir_name.contains('-') && dir_name != "temp_extract" {
+ let install_path = path.join("INSTALL");
+ if install_path.exists() {
+ pkg_dir_name = Some(dir_name.to_string());
+ break;
+ }
+ }
+ }
+ }
+
+ let pkg_dir_name = pkg_dir_name.ok_or_else(|| {
+ std::io::Error::other("Package directory not found in cache")
+ })?;
+
+ let install_toml_path = Path::new(cache_dir).join(format!("{}/INSTALL", pkg_dir_name));
+
if !install_toml_path.exists() {
- return Err(std::io::Error::other("INSTALL file not found in archive").into());
+ return Err(std::io::Error::other("INSTALL file not found in package directory").into());
}
-
+
let install_content = std::fs::read_to_string(&install_toml_path)?;
let install_data: crate::pkgtoolkit::types::Install = toml::from_str(&install_content)?;
@@ -129,21 +156,25 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
println!("Package '{}' built successfully.", pkg.name);
return Ok(());
}
- Commands::Install { pkgname, source: _, args } => {
- let config = Config::parse().unwrap();
+ Commands::Install {
+ pkgname,
+ source: _,
+ args,
+ } => {
+ let config = Config::parse().unwrap();
if args.http {
println!("Installing {} via HTTP", pkgname);
let mut http_client = HTTPPackage::new(config);
- http_client.fetch_index_http().await?;
+ http_client.fetch_index_http().await?;
log::info!("Index fetched successfully.");
http_client.fetch_package_http(pkgname).await?;
log::info!("Package '{}' installed successfully.", pkgname);
} else {
println!("Installing {} via I2P", pkgname);
let mut i2p_client = I2PPackage::new(config);
- i2p_client.fetch_index().await?;
+ i2p_client.fetch_index().await?;
log::info!("Index fetched successfully.");
- i2p_client.fetch_package(pkgname).await?;
+ i2p_client.fetch_package(pkgname).await?;
log::info!("Package '{}' installed successfully.", pkgname);
}
return Ok(());
@@ -153,15 +184,19 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
return Ok(());
}
Commands::GetSource { pkgname } => {
- let config = Config::parse().unwrap();
+ let config = Config::parse().unwrap();
println!("Getting source of {}", pkgname);
-
let source_path = GitSource::get_source_by_name(pkgname, &config)?;
println!("Source code successfully downloaded to: {}", source_path);
return Ok(());
}
- Commands::DefaultConfig { repo, cachedir, buildir, installed_db } => {
+ Commands::DefaultConfig {
+ repo,
+ cachedir,
+ buildir,
+ installed_db,
+ } => {
println!("Generating config file");
if cachedir.is_none() && repo.is_none() && buildir.is_none() {
let config = Config::default().unwrap();
@@ -173,12 +208,12 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
log::warn!("Writing the default config to /etc/mesk/mesk.toml");
let path = Path::new("/etc/mesk/mesk.toml");
- std::fs::create_dir_all(path.parent().unwrap())?;
- let mut file = std::fs::File::create(path)?;
+ std::fs::create_dir_all(path.parent().unwrap())?;
+ let mut file = std::fs::File::create(path)?;
file.write_all(config.as_bytes())?;
println!("Config tool ending work.");
} else {
- let config = Config::generate(repo, cachedir, buildir, installed_db).unwrap();
+ let config = Config::generate(repo, cachedir, buildir, installed_db).unwrap();
println!("---- Start of generated config ----");
println!("{:?}", config);
@@ -187,19 +222,19 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
log::warn!("Writing the default config to /etc/mesk/mesk.toml");
let path = Path::new("/etc/mesk/mesk.toml");
- std::fs::create_dir_all(path.parent().unwrap())?;
- let mut file = std::fs::File::create(path)?;
- file.write_all(config.as_bytes())?;
+ std::fs::create_dir_all(path.parent().unwrap())?;
+ let mut file = std::fs::File::create(path)?;
+ file.write_all(config.as_bytes())?;
println!("Config tool ending work.");
}
return Ok(());
}
Commands::Update => {
- let config = Config::parse().unwrap();
+ let config = Config::parse().unwrap();
println!("Updating index from {}", config.repo.repo_url);
let mut i2p_client = I2PPackage::new(config);
- i2p_client.fetch_index().await?;
+ i2p_client.fetch_index().await?;
println!("Index updated successfully.");
return Ok(());
}
@@ -223,5 +258,4 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
return Ok(());
}
}
-
}