Skip to content

Commit c411e3b

Browse files
committed
fix: properly handle packages field for pkg_name and provides metadata
When using packages field, use the package key (e.g., 'clipcat') for GHCR path and pkg_name, while resolving provides entries to find the actual main binary (e.g., 'clipcatd'). Also include provides field in the output JSON metadata.
1 parent b7ff918 commit c411e3b

3 files changed

Lines changed: 69 additions & 88 deletions

File tree

sbuild/src/commands/build.rs

Lines changed: 60 additions & 88 deletions
Original file line numberDiff line numberDiff line change
@@ -595,6 +595,10 @@ async fn post_build_processing(
595595
.filter_map(|f| fs::metadata(f).ok().map(|m| m.len()))
596596
.sum();
597597

598+
let pkg_provides = metadata
599+
.as_ref()
600+
.and_then(|m| m.get_package_provides(pkg_name_dir));
601+
598602
let json_path = pkg_dir.join(format!("{}.json", pkg_name_dir));
599603
if json_path.exists() {
600604
if let Err(e) = update_json_metadata(
@@ -608,6 +612,7 @@ async fn post_build_processing(
608612
checksum_bsum.as_deref(),
609613
binary_size,
610614
Some(ghcr_total_size),
615+
pkg_provides,
611616
) {
612617
warn!("Failed to update JSON metadata: {}", e);
613618
}
@@ -690,109 +695,75 @@ async fn post_build_processing(
690695
}
691696

692697
let default_pkg_name = pkg_name.unwrap_or(&pkg_family).to_string();
693-
let binaries_to_push: Vec<String> = {
694-
let packages = metadata
695-
.as_ref()
696-
.map(|m| m.get_provided_packages())
697-
.unwrap_or_default();
698-
if !packages.is_empty() && packages != vec![default_pkg_name.clone()] {
699-
info!("Using packages from provides: {:?}", packages);
700-
packages
701-
} else {
702-
info!(
703-
"No packages from provides, using pkg name: {}",
704-
default_pkg_name
705-
);
706-
vec![default_pkg_name.clone()]
707-
}
708-
};
698+
let packages_to_push: Vec<String> = metadata
699+
.as_ref()
700+
.map(|m| m.get_provided_packages())
701+
.unwrap_or_else(|| vec![default_pkg_name.clone()]);
702+
703+
if packages_to_push.len() > 1
704+
|| packages_to_push
705+
.first()
706+
.map_or(true, |p| p != &default_pkg_name)
707+
{
708+
info!("Using packages from provides: {:?}", packages_to_push);
709+
}
709710

710-
for binary_name in &binaries_to_push {
711-
let sanitized_binary_name = sanitize_oci_name(binary_name);
711+
for pkg_name_item in &packages_to_push {
712+
let sanitized_pkg_name = sanitize_oci_name(pkg_name_item);
712713
let owner = base_repo.split('/').next().unwrap_or(base_repo);
713714
let full_repo = if let Some(ref custom_base) =
714715
metadata.as_ref().and_then(|m| m.ghcr_pkg.as_ref())
715716
{
716-
format!("{}/{}/{}", owner, custom_base, sanitized_binary_name)
717+
format!("{}/{}/{}", owner, custom_base, sanitized_pkg_name)
717718
} else {
718719
format!(
719720
"{}/{}/{}/{}",
720-
base_repo, pkg_family, recipe_name, sanitized_binary_name
721+
base_repo, pkg_family, recipe_name, sanitized_pkg_name
721722
)
722723
};
723-
info!("Pushing {} to {}", binary_name, full_repo);
724-
725-
let mut files_to_push: Vec<PathBuf> = Vec::new();
726-
let mut main_binary_path: Option<PathBuf> = None;
724+
info!("Pushing {} to {}", pkg_name_item, full_repo);
727725

728-
let packages = metadata
726+
let pkg_provides: Vec<String> = metadata
729727
.as_ref()
730-
.map(|m| m.get_provided_packages())
731-
.unwrap_or_default();
732-
if packages.len() <= 1
733-
&& packages.first().map_or(true, |p| p == &default_pkg_name)
734-
{
735-
files_to_push = all_files.clone();
736-
main_binary_path = all_files
737-
.iter()
738-
.find(|p| {
739-
p.file_name().and_then(|n| n.to_str()) == Some(binary_name.as_ref())
740-
})
741-
.cloned();
742-
} else {
743-
let binary_path = outdir.join(binary_name);
744-
if binary_path.exists() {
745-
files_to_push.push(binary_path.clone());
746-
main_binary_path = Some(binary_path);
747-
}
728+
.and_then(|m| m.get_package_provides(pkg_name_item))
729+
.map(|p| p.to_vec())
730+
.unwrap_or_else(|| vec![pkg_name_item.clone()]);
748731

749-
for ext in &[
750-
"json",
751-
"png",
752-
"svg",
753-
"desktop",
754-
"appdata.xml",
755-
"metainfo.xml",
756-
] {
757-
let assoc_file = outdir.join(format!("{}.{}", binary_name, ext));
758-
if assoc_file.exists() {
759-
files_to_push.push(assoc_file);
760-
}
761-
}
732+
let main_binary_name = pkg_provides
733+
.iter()
734+
.find(|p| !p.starts_with('@'))
735+
.map(|p| {
736+
p.split("=>")
737+
.next()
738+
.unwrap_or(p)
739+
.split("==")
740+
.next()
741+
.unwrap_or(p)
742+
.split(':')
743+
.next()
744+
.unwrap_or(p)
745+
.to_string()
746+
})
747+
.unwrap_or_else(|| pkg_name_item.clone());
762748

763-
for file in &all_files {
764-
let name = file.file_name().and_then(|n| n.to_str()).unwrap_or("");
765-
let ext = file.extension().and_then(|e| e.to_str()).unwrap_or("");
766-
if matches!(name, "CHECKSUM" | "SBUILD" | "LICENSE")
767-
|| matches!(ext, "log" | "version")
768-
{
769-
if !files_to_push.contains(file) {
770-
files_to_push.push(file.clone());
771-
}
772-
}
773-
}
774-
}
749+
let main_binary_path = all_files
750+
.iter()
751+
.find(|p| p.file_name().and_then(|n| n.to_str()) == Some(&main_binary_name))
752+
.cloned();
775753

776-
if files_to_push.is_empty() {
777-
warn!("No files found for {}", binary_name);
778-
continue;
779-
}
754+
let mut files_to_push = all_files.clone();
780755

781756
let mut binaries_to_sign: Vec<PathBuf> = Vec::new();
782757
if let Some(ref bin_path) = main_binary_path {
783758
binaries_to_sign.push(bin_path.clone());
784759
}
785760

786-
for extra_bin in metadata
787-
.as_ref()
788-
.map(|m| m.get_binaries())
789-
.unwrap_or_default()
790-
{
791-
let extra_path = outdir.join(&extra_bin);
792-
if extra_path.exists() && !binaries_to_sign.contains(&extra_path) {
793-
binaries_to_sign.push(extra_path.clone());
794-
if !files_to_push.contains(&extra_path) {
795-
files_to_push.push(extra_path);
761+
for provide in &pkg_provides {
762+
if provide.starts_with('@') {
763+
let bin_name = provide.strip_prefix('@').unwrap();
764+
let bin_path = outdir.join(bin_name);
765+
if bin_path.exists() && !binaries_to_sign.contains(&bin_path) {
766+
binaries_to_sign.push(bin_path);
796767
}
797768
}
798769
}
@@ -829,30 +800,31 @@ async fn post_build_processing(
829800
.filter_map(|f| fs::metadata(f).ok().map(|m| m.len()))
830801
.sum();
831802

832-
let json_path = outdir.join(format!("{}.json", binary_name));
803+
let json_path = outdir.join(format!("{}.json", main_binary_name));
833804
let meta_pkg_name = metadata
834805
.as_ref()
835806
.map(|m| m.pkg.as_str())
836-
.unwrap_or(binary_name);
807+
.unwrap_or(pkg_name_item);
837808
if json_path.exists() {
838809
if let Err(e) = update_json_metadata(
839810
&json_path,
840811
meta_pkg_name,
841-
binary_name,
812+
&main_binary_name,
842813
&full_repo,
843814
&tag,
844815
bsum.as_deref(),
845816
shasum.as_deref(),
846817
checksum_bsum.as_deref(),
847818
binary_size,
848819
Some(ghcr_total_size),
820+
Some(&pkg_provides),
849821
) {
850822
warn!("Failed to update JSON metadata: {}", e);
851823
}
852824
}
853825

854826
let annotations = PackageAnnotations {
855-
pkg: binary_name.to_string(),
827+
pkg: main_binary_name.clone(),
856828
pkg_id: metadata
857829
.as_ref()
858830
.map(|m| m.pkg_id.clone())
@@ -904,11 +876,11 @@ async fn post_build_processing(
904876
&annotations,
905877
) {
906878
Ok(target) => {
907-
info!("Pushed {} to {}", binary_name, target);
879+
info!("Pushed {} to {}", pkg_name_item, target);
908880
pushed_urls.push(target);
909881
}
910882
Err(e) => {
911-
error!("Failed to push {}: {}", binary_name, e);
883+
error!("Failed to push {}: {}", pkg_name_item, e);
912884
push_success = false;
913885
}
914886
}

sbuild/src/commands/meta.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -490,6 +490,10 @@ async fn cmd_inspect(
490490
pkg_metadata.ghcr_url = Some(ghcr_info.ghcr_url());
491491
pkg_metadata.pkg_webpage = Some(ghcr_info.pkg_webpage(&arch));
492492

493+
if let Some(pkg_provides) = recipe.get_package_provides(&ghcr_info.pkg_name) {
494+
pkg_metadata.provides = Some(pkg_provides.to_vec());
495+
}
496+
493497
let recipe_path_str = recipe_path.to_string_lossy();
494498
pkg_metadata.build_script = Some(format!(
495499
"https://github.com/pkgforge/soarpkgs/blob/main/{}",

sbuild/src/lib.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ pub fn update_json_metadata(
5454
checksum_bsum: Option<&str>,
5555
binary_size: Option<u64>,
5656
ghcr_total_size: Option<u64>,
57+
provides: Option<&[String]>,
5758
) -> Result<(), String> {
5859
let content =
5960
std::fs::read_to_string(json_path).map_err(|e| format!("Failed to read JSON: {}", e))?;
@@ -101,6 +102,10 @@ pub fn update_json_metadata(
101102
obj.insert("ghcr_size".to_string(), serde_json::json!(format_size(s)));
102103
obj.insert("ghcr_size_raw".to_string(), serde_json::json!(s));
103104
}
105+
106+
if let Some(p) = provides {
107+
obj.insert("provides".to_string(), serde_json::json!(p));
108+
}
104109
}
105110

106111
let updated = serde_json::to_string_pretty(&json)

0 commit comments

Comments
 (0)