feat: re-implement package remove route
parent
044d3a33eb
commit
60d4478d83
|
@ -1660,7 +1660,6 @@ dependencies = [
|
||||||
"futures",
|
"futures",
|
||||||
"http-body-util",
|
"http-body-util",
|
||||||
"libarchive",
|
"libarchive",
|
||||||
"regex",
|
|
||||||
"sea-orm",
|
"sea-orm",
|
||||||
"sea-orm-migration",
|
"sea-orm-migration",
|
||||||
"serde",
|
"serde",
|
||||||
|
|
|
@ -22,6 +22,13 @@ Another usecase for this would be creating a local mirror of your
|
||||||
distribution's repositories, which can greatly reduce your update times
|
distribution's repositories, which can greatly reduce your update times
|
||||||
depending on your internet connection.
|
depending on your internet connection.
|
||||||
|
|
||||||
|
Most users however don't need a full copy of a distro's package repository, so
|
||||||
|
Rieter also provides a "smart mirror" mode. In this mode, a Rieter instance
|
||||||
|
only syncs packages that have been requested before, e.g. from a previous
|
||||||
|
system update. This way, your updates will still be a lot faster as the
|
||||||
|
required packages are cached, but packages you don't use don't get stored,
|
||||||
|
saving you a lot of storage space.
|
||||||
|
|
||||||
### Build system
|
### Build system
|
||||||
|
|
||||||
The second goal is to create an easy-to-use build system for Pacman packages.
|
The second goal is to create an easy-to-use build system for Pacman packages.
|
||||||
|
|
|
@ -13,7 +13,6 @@ clap = { version = "4.3.12", features = ["env", "derive"] }
|
||||||
futures = "0.3.28"
|
futures = "0.3.28"
|
||||||
http-body-util = "0.1.1"
|
http-body-util = "0.1.1"
|
||||||
libarchive = { path = "../libarchive" }
|
libarchive = { path = "../libarchive" }
|
||||||
regex = "1.10.4"
|
|
||||||
sea-orm-migration = "0.12.1"
|
sea-orm-migration = "0.12.1"
|
||||||
serde = { version = "1.0.178", features = ["derive"] }
|
serde = { version = "1.0.178", features = ["derive"] }
|
||||||
sha256 = "1.1.4"
|
sha256 = "1.1.4"
|
||||||
|
|
|
@ -83,13 +83,10 @@ impl Cli {
|
||||||
};
|
};
|
||||||
let repo_manager = MetaRepoMgr::new(&self.data_dir.join("repos"));
|
let repo_manager = MetaRepoMgr::new(&self.data_dir.join("repos"));
|
||||||
|
|
||||||
let pkg_filename_re = regex::Regex::new(r"^([a-z0-9@_+][a-z0-9@_+-.]*)-((?:[0-9]+:)?[a-z0-9._]+-[0-9.]+)-([a-z0-9_]+)\.pkg\.tar\.([a-z0-9]+)$").unwrap();
|
|
||||||
|
|
||||||
let global = Global {
|
let global = Global {
|
||||||
config,
|
config,
|
||||||
repo_manager: Arc::new(RwLock::new(repo_manager)),
|
repo_manager: Arc::new(RwLock::new(repo_manager)),
|
||||||
db,
|
db,
|
||||||
pkg_filename_re,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
// build our application with a single route
|
// build our application with a single route
|
||||||
|
|
|
@ -21,7 +21,6 @@ pub struct Global {
|
||||||
config: Config,
|
config: Config,
|
||||||
repo_manager: Arc<RwLock<MetaRepoMgr>>,
|
repo_manager: Arc<RwLock<MetaRepoMgr>>,
|
||||||
db: sea_orm::DbConn,
|
db: sea_orm::DbConn,
|
||||||
pkg_filename_re: regex::Regex,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[tokio::main]
|
#[tokio::main]
|
||||||
|
|
|
@ -107,8 +107,10 @@ impl MetaRepoMgr {
|
||||||
ar_db.close().await?;
|
ar_db.close().await?;
|
||||||
ar_files.close().await?;
|
ar_files.close().await?;
|
||||||
|
|
||||||
tokio::fs::remove_file(desc_tmp_file_path).await?;
|
// If this fails there's no point in failing the function + if there were no packages in
|
||||||
tokio::fs::remove_file(files_tmp_file_path).await?;
|
// the repo, this fails anyway because the temp file doesn't exist
|
||||||
|
let _ = tokio::fs::remove_file(desc_tmp_file_path).await;
|
||||||
|
let _ = tokio::fs::remove_file(files_tmp_file_path).await;
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
@ -188,8 +190,21 @@ impl MetaRepoMgr {
|
||||||
let pkg = db::query::package::by_fields(conn, repo.id, arch, name, None, None).await?;
|
let pkg = db::query::package::by_fields(conn, repo.id, arch, name, None, None).await?;
|
||||||
|
|
||||||
if let Some(pkg) = pkg {
|
if let Some(pkg) = pkg {
|
||||||
// Remove package from database
|
// Remove package from database & file system
|
||||||
|
tokio::fs::remove_file(
|
||||||
|
self.repo_dir
|
||||||
|
.join(&repo.name)
|
||||||
|
.join(super::package::filename(&pkg)),
|
||||||
|
)
|
||||||
|
.await?;
|
||||||
pkg.delete(conn).await?;
|
pkg.delete(conn).await?;
|
||||||
|
|
||||||
|
if arch == ANY_ARCH {
|
||||||
|
self.generate_archives_all(conn, &repo.name).await?;
|
||||||
|
} else {
|
||||||
|
self.generate_archives(conn, &repo.name, arch).await?;
|
||||||
|
}
|
||||||
|
|
||||||
Ok(true)
|
Ok(true)
|
||||||
} else {
|
} else {
|
||||||
Ok(false)
|
Ok(false)
|
||||||
|
|
|
@ -126,34 +126,25 @@ async fn delete_arch_repo(
|
||||||
|
|
||||||
async fn delete_package(
|
async fn delete_package(
|
||||||
State(global): State<crate::Global>,
|
State(global): State<crate::Global>,
|
||||||
Path((repo, arch, file_name)): Path<(String, String, String)>,
|
Path((repo, arch, pkg_name)): Path<(String, String, String)>,
|
||||||
) -> crate::Result<StatusCode> {
|
) -> crate::Result<StatusCode> {
|
||||||
|
let pkg_removed = global
|
||||||
|
.repo_manager
|
||||||
|
.write()
|
||||||
|
.await
|
||||||
|
.remove_pkg(&global.db, &repo, &arch, &pkg_name)
|
||||||
|
.await?;
|
||||||
|
|
||||||
|
if pkg_removed {
|
||||||
|
tracing::info!(
|
||||||
|
"Removed package '{}' ({}) from repository '{}'",
|
||||||
|
pkg_name,
|
||||||
|
arch,
|
||||||
|
repo
|
||||||
|
);
|
||||||
|
|
||||||
|
Ok(StatusCode::OK)
|
||||||
|
} else {
|
||||||
Ok(StatusCode::NOT_FOUND)
|
Ok(StatusCode::NOT_FOUND)
|
||||||
//global.repo_manager.write().unwrap().remove_pkg(&global.db, &repo, &arch, name)
|
}
|
||||||
//let clone = Arc::clone(&global.repo_manager);
|
|
||||||
//let path = PathBuf::from(&repo).join(arch).join(&file_name);
|
|
||||||
//
|
|
||||||
//let res = tokio::task::spawn_blocking(move || {
|
|
||||||
// clone.write().unwrap().remove_pkg_from_path(path, true)
|
|
||||||
//})
|
|
||||||
//.await??;
|
|
||||||
//
|
|
||||||
//if let Some((name, version, release, arch)) = res {
|
|
||||||
// let res = db::query::repo::by_name(&global.db, &repo).await?;
|
|
||||||
//
|
|
||||||
// if let Some(repo_entry) = res {
|
|
||||||
// let res =
|
|
||||||
// db::query::package::by_fields(&global.db, repo_entry.id, &arch, &name).await?;
|
|
||||||
//
|
|
||||||
// if let Some(entry) = res {
|
|
||||||
// entry.delete(&global.db).await?;
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// tracing::info!("Removed '{}' from repository '{}'", file_name, repo);
|
|
||||||
//
|
|
||||||
// Ok(StatusCode::OK)
|
|
||||||
//} else {
|
|
||||||
// Ok(StatusCode::NOT_FOUND)
|
|
||||||
//}
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue