feat(server): route for removing packages
parent
bcab4948e3
commit
44f27cf7d0
|
@ -131,7 +131,7 @@ impl RepoGroupManager {
|
||||||
.join(format!("{}-{}", pkg.info.name, pkg.info.version));
|
.join(format!("{}-{}", pkg.info.name, pkg.info.version));
|
||||||
|
|
||||||
// We first remove the previous version of the package, if present
|
// We first remove the previous version of the package, if present
|
||||||
self.remove_pkg_from_arch_repo(repo, arch, &pkg.info.name)?;
|
self.remove_pkg_from_arch_repo(repo, arch, &pkg.info.name, false)?;
|
||||||
|
|
||||||
fs::create_dir_all(&pkg_dir)?;
|
fs::create_dir_all(&pkg_dir)?;
|
||||||
|
|
||||||
|
@ -176,6 +176,7 @@ impl RepoGroupManager {
|
||||||
repo: &str,
|
repo: &str,
|
||||||
arch: &str,
|
arch: &str,
|
||||||
pkg_name: &str,
|
pkg_name: &str,
|
||||||
|
sync: bool,
|
||||||
) -> io::Result<bool> {
|
) -> io::Result<bool> {
|
||||||
let arch_repo_dir = self.repo_dir.join(repo).join(arch);
|
let arch_repo_dir = self.repo_dir.join(repo).join(arch);
|
||||||
|
|
||||||
|
@ -222,6 +223,10 @@ impl RepoGroupManager {
|
||||||
})
|
})
|
||||||
})?;
|
})?;
|
||||||
|
|
||||||
|
if sync {
|
||||||
|
self.sync(repo, arch)?;
|
||||||
|
}
|
||||||
|
|
||||||
return Ok(true);
|
return Ok(true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -26,6 +26,7 @@ pub fn router(global: &crate::Global) -> Router<crate::Global> {
|
||||||
.get(serve_repos.clone()),
|
.get(serve_repos.clone()),
|
||||||
)
|
)
|
||||||
.route("/:repo/:arch", delete(delete_arch_repo))
|
.route("/:repo/:arch", delete(delete_arch_repo))
|
||||||
|
.route("/:repo/:arch/:filename", delete(delete_package))
|
||||||
.fallback(serve_repos)
|
.fallback(serve_repos)
|
||||||
.with_state(global.clone())
|
.with_state(global.clone())
|
||||||
}
|
}
|
||||||
|
@ -83,3 +84,34 @@ async fn delete_arch_repo(
|
||||||
Ok(StatusCode::NOT_FOUND)
|
Ok(StatusCode::NOT_FOUND)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async fn delete_package(
|
||||||
|
State(global): State<crate::Global>,
|
||||||
|
Path((repo, arch, file_name)): Path<(String, String, String)>,
|
||||||
|
) -> crate::Result<StatusCode> {
|
||||||
|
let name_parts = file_name.split('-').collect::<Vec<_>>();
|
||||||
|
|
||||||
|
// Package archive files use the naming scheme pkgname-pkgver-pkgrel-arch, so a valid
|
||||||
|
// name contains at least 4 dash-separated sections
|
||||||
|
if name_parts.len() < 4 {
|
||||||
|
return Ok(StatusCode::NOT_FOUND);
|
||||||
|
}
|
||||||
|
|
||||||
|
let name = name_parts[..name_parts.len() - 3].join("-");
|
||||||
|
|
||||||
|
let clone = Arc::clone(&global.repo_manager);
|
||||||
|
|
||||||
|
let pkg_removed = tokio::task::spawn_blocking(move || {
|
||||||
|
clone
|
||||||
|
.write()
|
||||||
|
.unwrap()
|
||||||
|
.remove_pkg_from_arch_repo(&repo, &arch, &name, true)
|
||||||
|
})
|
||||||
|
.await??;
|
||||||
|
|
||||||
|
if pkg_removed {
|
||||||
|
Ok(StatusCode::OK)
|
||||||
|
} else {
|
||||||
|
Ok(StatusCode::NOT_FOUND)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue