diff --git a/helpers/DATA/reprepro/ddeb.patch b/helpers/DATA/reprepro/ddeb.patch new file mode 100644 index 0000000000000000000000000000000000000000..85e23985d4562cab471170e349250a0e6c57b4d9 --- /dev/null +++ b/helpers/DATA/reprepro/ddeb.patch @@ -0,0 +1,730 @@ +diff -ru reprepro.orig/source/atoms.c reprepro/source/atoms.c +--- reprepro.orig/source/atoms.c 2016-12-23 19:11:30.000000000 -0500 ++++ reprepro/source/atoms.c 2020-11-01 16:33:38.182181608 -0500 +@@ -26,7 +26,7 @@ + + const char **atoms_architectures; + const char **atoms_components; +-const char * const packagetypes[4] = { "!!NONE!!", "dsc", "deb", "udeb" }; ++const char * const packagetypes[5] = { "!!NONE!!", "dsc", "deb", "udeb", "ddeb" }; + const char **atoms_packagetypes = (const char **)&packagetypes; + const char **atoms_commands; + static int command_count; +@@ -159,6 +159,8 @@ + return pt_deb; + else if (strcmp(value, "udeb") == 0) + return pt_udeb; ++ else if (strcmp(value, "ddeb") == 0) ++ return pt_ddeb; + else + return atom_unknown; + } +@@ -169,8 +171,12 @@ + return pt_dsc; + else if (strncmp(value, "deb", 3) == 0) + return pt_deb; +- } else if (len == 4 && strncmp(value, "udeb", 4) == 0) +- return pt_udeb; ++ } else if (len == 4) { ++ if (strncmp(value, "udeb", 4) == 0) ++ return pt_udeb; ++ else if (strncmp(value, "ddeb", 4) == 0) ++ return pt_ddeb; ++ } + return atom_unknown; + } + +diff -ru reprepro.orig/source/atoms.h reprepro/source/atoms.h +--- reprepro.orig/source/atoms.h 2016-12-23 19:11:30.000000000 -0500 ++++ reprepro/source/atoms.h 2020-11-01 16:33:38.182181608 -0500 +@@ -19,6 +19,7 @@ + #define pt_dsc ((packagetype_t)1) + #define pt_deb ((packagetype_t)2) + #define pt_udeb ((packagetype_t)3) ++#define pt_ddeb ((packagetype_t)4) + + #define atom_defined(a) ((a) > (atom_t)0) + +diff -ru reprepro.orig/source/changes.c reprepro/source/changes.c +--- reprepro.orig/source/changes.c 2016-12-23 19:11:30.000000000 -0500 ++++ reprepro/source/changes.c 2020-11-01 16:33:38.182181608 -0500 +@@ -164,6 +164,8 @@ + + if (l >= 4 && memcmp(p-4, ".deb", 4) == 0) + type = fe_DEB; ++ else if (l >= 5 && memcmp(p-5, ".ddeb", 5) == 0) ++ type = fe_DDEB; + else if (l >= 5 && memcmp(p-5, ".udeb", 5) == 0) + type = fe_UDEB; + else +@@ -189,7 +191,7 @@ + if (type == fe_DEB) + archend = versionstart + l - 4; + else { +- assert (type == fe_UDEB); ++ assert (type == fe_DDEB || type == fe_UDEB); + archend = versionstart + l - 5; + } + if (archend - archstart == 6 && +@@ -203,7 +205,7 @@ + const char *eoi; + + /* without those, it gets more complicated. +- * It's not .deb or .udeb, so most likely a ++ * It's not .deb, .ddeb or .udeb, so most likely a + * source file (or perhaps a log (reprepro extension)) */ + + /* if it uses a known compression, things are easy, +diff -ru source.or/changes.h source/changes.h +--- reprepro.orig/source/changes.h 2018-09-09 01:17:15.000000000 -0400 ++++ reprepro/source/changes.h 2022-03-08 19:52:49.495104016 -0500 +@@ -7,7 +7,7 @@ + + typedef enum { + fe_UNKNOWN=0, +- fe_DEB, fe_UDEB, ++ fe_DEB, fe_UDEB, fe_DDEB, + fe_DSC, fe_DIFF, fe_ORIG, fe_TAR, + fe_SIG, + fe_ALTSRC, +@@ -15,8 +15,8 @@ + fe_BUILDINFO + } filetype; + +-#define FE_PACKAGE(ft) ((ft) == fe_DEB || (ft) == fe_UDEB || (ft) == fe_DSC) +-#define FE_BINARY(ft) ((ft) == fe_DEB || (ft) == fe_UDEB) ++#define FE_PACKAGE(ft) ((ft) == fe_DEB || (ft) == fe_UDEB || (ft) == fe_DSC || (ft) == fe_DDEB) ++#define FE_BINARY(ft) ((ft) == fe_DEB || (ft) == fe_DDEB || (ft) == fe_UDEB) + #define FE_SOURCE(ft) ((ft) == fe_DIFF || (ft) == fe_ORIG || (ft) == fe_TAR || (ft) == fe_DSC || (ft) == fe_UNKNOWN || (ft) == fe_ALTSRC || (ft) == fe_SIG) + + struct hash_data; +diff -ru reprepro.orig/source/checkin.c reprepro/source/checkin.c +--- reprepro.orig/source/checkin.c 2016-12-28 10:03:44.000000000 -0500 ++++ reprepro/source/checkin.c 2020-11-01 16:33:38.182181608 -0500 +@@ -207,6 +207,11 @@ + *ignoredlines_p = true; + return RET_NOTHING; + } ++ if (e->type == fe_DDEB && limitations_missed(packagetypes, pt_ddeb)) { ++ freeentries(e); ++ *ignoredlines_p = true; ++ return RET_NOTHING; ++ } + if (e->type != fe_LOG && e->type != fe_BUILDINFO && + e->architecture_into == architecture_source && + strcmp(e->name, sourcename) != 0) { +@@ -1208,6 +1213,15 @@ + e->filekey, e->checksums, + &changes->binaries, + changes->source, changes->sourceversion); ++ } else if (e->type == fe_DDEB) { ++ r = deb_prepare(&e->pkg.deb, ++ e->component, e->architecture_into, ++ e->section, e->priority, ++ pt_ddeb, ++ distribution, fullfilename, ++ e->filekey, e->checksums, ++ &changes->binaries, ++ changes->source, changes->sourceversion); + } else if (e->type == fe_DSC) { + if (!changes->isbinnmu || IGNORING(dscinbinnmu, + "File '%s' looks like a source package, but this .changes looks like a binNMU\n" +@@ -1256,6 +1270,15 @@ + pt_deb, distribution, trackingdata); + if (r == RET_NOTHING) + *missed_p = true; ++ } else if (e->type == fe_DDEB) { ++ r = deb_addprepared(e->pkg.deb, ++ /* architecture all needs this, the rest is ++ * already filtered out */ ++ (e->architecture_into == architecture_all)? ++ forcearchitectures:NULL, ++ pt_ddeb, distribution, trackingdata); ++ if (r == RET_NOTHING) ++ *missed_p = true; + } else if (e->type == fe_UDEB) { + r = deb_addprepared(e->pkg.deb, + /* architecture all needs this, the rest is +diff -ru reprepro.orig/source/checkindeb.c reprepro/source/checkindeb.c +--- reprepro.orig/source/checkindeb.c 2016-12-28 10:13:15.000000000 -0500 ++++ reprepro/source/checkindeb.c 2020-11-01 16:33:38.182181608 -0500 +@@ -105,7 +105,13 @@ + const struct overridedata *oinfo; + retvalue r; + +- if (packagetype == pt_udeb) { ++ if (packagetype == pt_ddeb) { ++ /* ddebs don't have overrides */ ++ forcesection = "debug"; ++ forcepriority = "extra"; ++ binoverride = NULL; ++ components = &distribution->ddebcomponents; ++ } else if (packagetype == pt_udeb) { + binoverride = distribution->overrides.udeb; + components = &distribution->udebcomponents; + } else { +@@ -113,14 +119,21 @@ + components = &distribution->components; + } + +- oinfo = override_search(binoverride, pkg->deb.name); +- *oinfo_ptr = oinfo; +- if (forcesection == NULL) { +- forcesection = override_get(oinfo, SECTION_FIELDNAME); +- } +- if (forcepriority == NULL) { +- forcepriority = override_get(oinfo, PRIORITY_FIELDNAME); ++ if (binoverride == NULL) { ++ oinfo = NULL; ++ } else { ++ oinfo = override_search(binoverride, pkg->deb.name); ++ ++ if (forcesection == NULL) { ++ forcesection = override_get(oinfo, SECTION_FIELDNAME); ++ } ++ ++ if (forcepriority == NULL) { ++ forcepriority = override_get(oinfo, PRIORITY_FIELDNAME); ++ } + } ++ *oinfo_ptr = oinfo; ++ + if (!atom_defined(forcecomponent)) { + const char *fc; + +@@ -261,7 +274,29 @@ + base = NULL; + } + +- if (!strlist_in(allowed_binaries, packagenametocheck) && ++ if (packagetype == pt_ddeb) { ++ /* ddebs are allowed if they are an allowed ++ * binary + "-dbgsym" */ ++ int i; ++ bool found = false; ++ ++ for (i = 0; i < allowed_binaries->count; i++) { ++ const char *s = allowed_binaries->values[i]; ++ size_t len = strlen(s); ++ ++ if (strncmp(s, pkg->deb.name, len) == 0 && ++ strcmp(pkg->deb.name + len, "-dbgsym") == 0) { ++ found = true; ++ } ++ } ++ ++ if (!found && !IGNORING(surprisingbinary, ++ "'%s' has packagename '%s' not corresponding to a .deb listed in the .changes file!\n", ++ debfilename, pkg->deb.name)) { ++ deb_free(pkg); ++ return RET_ERROR; ++ } ++ } else if (!strlist_in(allowed_binaries, packagenametocheck) && + !IGNORING(surprisingbinary, + "'%s' has packagename '%s' not listed in the .changes file!\n", + debfilename, packagenametocheck)) { +diff -ru reprepro.orig/source/contents.c reprepro/source/contents.c +--- reprepro.orig/source/contents.c 2016-12-23 19:11:30.000000000 -0500 ++++ reprepro/source/contents.c 2020-11-01 16:33:38.182181608 -0500 +@@ -43,6 +43,7 @@ + cf_uncompressed, cf_gz, cf_bz2, cf_xz, + cf_percomponent, cf_allcomponents, + cf_compatsymlink, cf_nocompatsymlink, ++ cf_ddebs, + cf_COUNT + }; + bool flags[cf_COUNT]; +@@ -60,6 +61,7 @@ + {".bz2", cf_bz2}, + {".gz", cf_gz}, + {".", cf_uncompressed}, ++ {"ddebs", cf_ddebs}, + {NULL, -1} + }; + retvalue r; +@@ -130,6 +132,7 @@ + distribution->contents.compressions |= IC_FLAG(ic_xz); + #endif + distribution->contents.flags.udebs = flags[cf_udebs]; ++ distribution->contents.flags.ddebs = flags[cf_ddebs]; + distribution->contents.flags.nodebs = flags[cf_nodebs]; + if (flags[cf_allcomponents]) + distribution->contents.flags.allcomponents = true; +@@ -173,20 +176,36 @@ + struct filetorelease *file; + struct filelist_list *contents; + struct package_cursor iterator; ++ const char *suffix; ++ const char *symlink_prefix; + + if (onlyneeded && target->saved_wasmodified) + onlyneeded = false; + ++ switch (target->packagetype) { ++ case pt_ddeb: ++ symlink_prefix = "d"; ++ suffix = "-ddeb"; ++ break; ++ case pt_udeb: ++ symlink_prefix = "s"; ++ suffix = "-udeb"; ++ break; ++ default: ++ symlink_prefix = ""; ++ suffix = ""; ++ } ++ + contentsfilename = mprintf("%s/Contents%s-%s", + atoms_components[target->component], +- (target->packagetype == pt_udeb)?"-udeb":"", ++ suffix, + atoms_architectures[target->architecture]); + if (FAILEDTOALLOC(contentsfilename)) + return RET_ERROR_OOM; + + if (symlink) { + char *symlinkas = mprintf("%sContents-%s", +- (target->packagetype == pt_udeb)?"s":"", ++ symlink_prefix, + atoms_architectures[target->architecture]); + if (FAILEDTOALLOC(symlinkas)) { + free(contentsfilename); +@@ -244,17 +263,30 @@ + const struct atomlist *components; + struct target *target; + bool combinedonlyifneeded; ++ const char *prefix; ++ const char *symlink_prefix; + +- if (type == pt_udeb) { ++ if (type == pt_ddeb) { ++ if (distribution->contents_components_set) ++ components = &distribution->contents_dcomponents; ++ else ++ components = &distribution->ddebcomponents; ++ prefix = "d"; ++ symlink_prefix = "d"; ++ } else if (type == pt_udeb) { + if (distribution->contents_components_set) + components = &distribution->contents_ucomponents; + else + components = &distribution->udebcomponents; ++ prefix = "u"; ++ symlink_prefix = "s"; + } else { + if (distribution->contents_components_set) + components = &distribution->contents_components; + else + components = &distribution->components; ++ prefix = ""; ++ symlink_prefix = ""; + } + + if (components->count == 0) +@@ -286,7 +318,7 @@ + if (!distribution->contents.flags.allcomponents) { + if (!distribution->contents.flags.compatsymlink) { + char *symlinkas = mprintf("%sContents-%s", +- (type == pt_udeb)?"s":"", ++ symlink_prefix, + atoms_architectures[architecture]); + if (FAILEDTOALLOC(symlinkas)) + return RET_ERROR_OOM; +@@ -298,7 +330,7 @@ + } + + contentsfilename = mprintf("%sContents-%s", +- (type == pt_udeb)?"u":"", ++ prefix, + atoms_architectures[architecture]); + if (FAILEDTOALLOC(contentsfilename)) + return RET_ERROR_OOM; +@@ -365,6 +397,12 @@ + release, onlyneeded); + RET_UPDATE(result, r); + } ++ if (distribution->contents.flags.ddebs) { ++ r = genarchcontents(distribution, ++ architecture, pt_ddeb, ++ release, onlyneeded); ++ RET_UPDATE(result, r); ++ } + } + return result; + } +diff -ru reprepro.orig/source/contents.h reprepro/source/contents.h +--- reprepro.orig/source/contents.h 2016-12-23 19:11:30.000000000 -0500 ++++ reprepro/source/contents.h 2020-11-01 16:33:38.182181608 -0500 +@@ -19,6 +19,7 @@ + bool percomponent; + bool allcomponents; + bool compatsymlink; ++ bool ddebs; + } flags; + compressionset compressions; + }; +diff -ru reprepro.orig/source/copypackages.c reprepro/source/copypackages.c +--- reprepro.orig/source/copypackages.c 2016-12-23 19:11:30.000000000 -0500 ++++ reprepro/source/copypackages.c 2020-11-01 16:33:38.182181608 -0500 +@@ -779,7 +779,14 @@ + into->codename, + atoms_architectures[architecture]); + } +- if (packagetype != pt_udeb) { ++ if (packagetype == pt_ddeb) { ++ if (!atomlist_in(&into->ddebcomponents, component)) { ++ fprintf(stderr, ++"Distribution '%s' does not contain ddeb component '%s!'\n", ++ into->codename, ++ atoms_components[component]); ++ } ++ } else if (packagetype != pt_udeb) { + if (!atomlist_in(&into->components, component)) { + fprintf(stderr, + "Distribution '%s' does not contain component '%s!'\n", +diff -ru reprepro.orig/source/distribution.c reprepro/source/distribution.c +--- reprepro.orig/source/distribution.c 2016-12-23 19:11:30.000000000 -0500 ++++ reprepro/source/distribution.c 2020-11-01 16:33:38.182181608 -0500 +@@ -69,8 +69,10 @@ + exportmode_done(&distribution->dsc); + exportmode_done(&distribution->deb); + exportmode_done(&distribution->udeb); ++ exportmode_done(&distribution->ddeb); + atomlist_done(&distribution->contents_architectures); + atomlist_done(&distribution->contents_components); ++ atomlist_done(&distribution->contents_dcomponents); + atomlist_done(&distribution->contents_ucomponents); + override_free(distribution->overrides.deb); + override_free(distribution->overrides.udeb); +@@ -185,6 +187,26 @@ + return r; + + } ++ if (atomlist_in(&distribution->ddebcomponents, c)) { ++ r = target_initialize_dbinary( ++ distribution, ++ c, a, ++ &distribution->ddeb, ++ distribution->readonly, ++ distribution->exportoptions[deo_noexport], ++ distribution->fakecomponentprefix, ++ &t); ++ if (RET_IS_OK(r)) { ++ if (last != NULL) { ++ last->next = t; ++ } else { ++ distribution->targets = t; ++ } ++ last = t; ++ } ++ if (RET_WAS_ERROR(r)) ++ return r; ++ } + } + /* check if this distribution contains source + * (yes, yes, source is not really an architecture, but +@@ -227,6 +249,11 @@ + (void)distribution_free(n); + return r; + } ++ r = exportmode_init(&n->ddeb, true, "Release", "Packages"); ++ if (RET_WAS_ERROR(r)) { ++ (void)distribution_free(n); ++ return r; ++ } + r = exportmode_init(&n->deb, true, "Release", "Packages"); + if (RET_WAS_ERROR(r)) { + (void)distribution_free(n); +@@ -329,6 +356,9 @@ + notpropersuperset(&n->components, "Components", + &n->contents_components, "ContentsComponents", + atoms_components, n) || ++ notpropersuperset(&n->ddebcomponents, "DDebComponents", ++ &n->contents_dcomponents, "ContentsDComponents", ++ atoms_components, n) || + notpropersuperset(&n->udebcomponents, "UDebComponents", + &n->contents_ucomponents, "ContentsUComponents", + atoms_components, n) || +@@ -336,6 +366,9 @@ + // in the rest of the code...: + notpropersuperset(&n->components, "Components", + &n->udebcomponents, "UDebComponents", ++ atoms_components, n) || ++ notpropersuperset(&n->components, "Components", ++ &n->ddebcomponents, "DDebComponents", + atoms_components, n)) { + (void)distribution_free(n); + return RET_ERROR; +@@ -357,6 +390,14 @@ + n->contents.flags.udebs = false; + } + } ++ if (n->contents_dcomponents_set) { ++ if (n->contents_dcomponents.count > 0) { ++ n->contents.flags.enabled = true; ++ n->contents.flags.ddebs = true; ++ } else { ++ n->contents.flags.ddebs = false; ++ } ++ } + if (n->contents_architectures_set) { + if (n->contents_architectures.count > 0) + n->contents.flags.enabled = true; +@@ -410,8 +451,11 @@ + CFinternatomsSETPROC(distribution, architectures, checkforarchitecture, at_architecture) + CFatomsublistSETPROC(distribution, contents_architectures, at_architecture, architectures, "Architectures") + CFatomsublistSETPROC(distribution, contents_components, at_component, components, "Components") ++CFatomsublistSETPROC(distribution, ddebcomponents, at_component, components, "Components") + CFatomsublistSETPROC(distribution, udebcomponents, at_component, components, "Components") ++CFatomsublistSETPROC(distribution, contents_dcomponents, at_component, ddebcomponents, "DDebComponents") + CFatomsublistSETPROC(distribution, contents_ucomponents, at_component, udebcomponents, "UDebComponents") ++CFexportmodeSETPROC(distribution, ddeb) + CFexportmodeSETPROC(distribution, udeb) + CFexportmodeSETPROC(distribution, deb) + CFexportmodeSETPROC(distribution, dsc) +@@ -461,6 +505,8 @@ + CF("ContentsComponents", distribution, contents_components), + CF("Contents", distribution, Contents), + CF("ContentsUComponents", distribution, contents_ucomponents), ++ CF("DDebComponents", distribution, ddebcomponents), ++ CF("DDebIndices", distribution, ddeb), + CF("DebIndices", distribution, deb), + CF("DebOverride", distribution, deb_override), + CF("Description", distribution, description), +diff -ru reprepro.orig/source/distribution.h reprepro/source/distribution.h +--- reprepro.orig/source/distribution.h 2016-12-23 19:11:30.000000000 -0500 ++++ reprepro/source/distribution.h 2020-11-01 16:33:38.182181608 -0500 +@@ -63,8 +63,10 @@ + /* the list of components containing a debian-installer dir, + * normally only "main" */ + struct atomlist udebcomponents; ++ /* the list of components containing a debug directory */ ++ struct atomlist ddebcomponents; + /* what kind of index files to generate */ +- struct exportmode dsc, deb, udeb; ++ struct exportmode dsc, deb, udeb, ddeb; + bool exportoptions[deo_COUNT]; + /* (NONE must be 0 so it is the default) */ + enum trackingtype { dt_NONE=0, dt_KEEP, dt_ALL, dt_MINIMAL } tracking; +@@ -80,11 +82,14 @@ + struct contentsoptions contents; + struct atomlist contents_architectures, + contents_components, ++ contents_dcomponents, + contents_ucomponents; + bool contents_architectures_set, + contents_components_set, ++ contents_dcomponents_set, + contents_ucomponents_set, + /* not used, just here to keep things simpler: */ ++ ddebcomponents_set, + udebcomponents_set; + /* A list of all targets contained in the distribution*/ + struct target *targets; +diff -ru reprepro.orig/source/incoming.c reprepro/source/incoming.c +--- reprepro.orig/source/incoming.c 2016-12-28 10:10:28.000000000 -0500 ++++ reprepro/source/incoming.c 2020-11-01 16:33:38.182181608 -0500 +@@ -1264,9 +1264,13 @@ + assert (file == package->master); + if (file->type == fe_DEB) + package->packagetype = pt_deb; ++ else if (file->type == fe_DDEB) ++ package->packagetype = pt_ddeb; + else + package->packagetype = pt_udeb; + ++ /* we use the deb overrides for ddebs too - ddebs aren't ++ * meant to have overrides so this is probably fine */ + oinfo = override_search(file->type==fe_UDEB?into->overrides.udeb: + into->overrides.deb, + file->name); +@@ -1277,6 +1281,16 @@ + if (RET_WAS_ERROR(r)) + return r; + ++ if (file->type == fe_DDEB && ++ !atomlist_in(&into->ddebcomponents, package->component)) { ++ fprintf(stderr, ++"Cannot put file '%s' of '%s' into component '%s',\n" ++"as it is not listed in DDebComponents of '%s'!\n", ++ BASENAME(i, file->ofs), BASENAME(i, c->ofs), ++ atoms_components[package->component], ++ into->codename); ++ return RET_ERROR; ++ } + if (file->type == fe_UDEB && + !atomlist_in(&into->udebcomponents, package->component)) { + fprintf(stderr, +@@ -1670,6 +1684,7 @@ + switch (file->type) { + case fe_UDEB: + case fe_DEB: ++ case fe_DDEB: + r = prepare_deb(i, c, d, file); + break; + case fe_DSC: +diff -ru reprepro.orig/source/main.c reprepro/source/main.c +--- reprepro.orig/source/main.c 2016-12-28 10:02:44.000000000 -0500 ++++ reprepro/source/main.c 2020-11-01 16:35:21.842197208 -0500 +@@ -2512,7 +2512,9 @@ + retvalue result, r; + + assert(target->packages == NULL); +- assert(target->packagetype == pt_deb || target->packagetype == pt_udeb); ++ assert(target->packagetype == pt_deb || ++ target->packagetype == pt_udeb || ++ target->packagetype == pt_ddeb); + + if (verbose > 2) { + printf( +@@ -2688,6 +2690,13 @@ + "Calling includeudeb with a -T not containing udeb makes no sense!\n"); + return RET_ERROR; + } ++ } else if (strcmp(argv[0], "includeddeb") == 0) { ++ packagetype = pt_ddeb; ++ if (limitations_missed(packagetypes, pt_ddeb)) { ++ fprintf(stderr, ++"Calling includeddeb with a -T not containing ddeb makes no sense!\n"); ++ return RET_ERROR; ++ } + } else if (strcmp(argv[0], "includedeb") == 0) { + packagetype = pt_deb; + if (limitations_missed(packagetypes, pt_deb)) { +@@ -2708,6 +2717,10 @@ + if (!endswith(filename, ".udeb") && !IGNORING(extension, + "includeudeb called with file '%s' not ending with '.udeb'\n", filename)) + return RET_ERROR; ++ } else if (packagetype == pt_ddeb) { ++ if (!endswith(filename, ".ddeb") && !IGNORING(extension, ++"includeddeb called with file '%s' not ending with '.ddeb'\n", filename)) ++ return RET_ERROR; + } else { + if (!endswith(filename, ".deb") && !IGNORING(extension, + "includedeb called with file '%s' not ending with '.deb'\n", filename)) +@@ -2730,6 +2743,8 @@ + result = override_read(distribution->udeb_override, + &distribution->overrides.udeb, false); + else ++ /* we use the normal deb overrides for ddebs too - ++ * they're not meant to have overrides anyway */ + result = override_read(distribution->deb_override, + &distribution->overrides.deb, false); + if (RET_WAS_ERROR(result)) { +@@ -3993,6 +4008,8 @@ + 2, -1, "[--delete] includedeb <distribution> <.deb-file>"}, + {"includeudeb", A_Dactsp(includedeb)|NEED_DELNEW, + 2, -1, "[--delete] includeudeb <distribution> <.udeb-file>"}, ++ {"includeddeb", A_Dactsp(includedeb)|NEED_DELNEW, ++ 2, -1, "[--delete] includeddeb <distribution> <.ddeb-file>"}, + {"includedsc", A_Dactsp(includedsc)|NEED_DELNEW, + 2, 2, "[--delete] includedsc <distribution> <package>"}, + {"include", A_Dactsp(include)|NEED_DELNEW, +@@ -4183,7 +4200,7 @@ + if (r == RET_NOTHING) { + fprintf(stderr, + "Error: Packagetype '%s' as given to --packagetype is not know.\n" +-"(only dsc, deb, udeb and combinations of those are allowed)\n", ++"(only dsc, deb, udeb, ddeb and combinations of those are allowed)\n", + unknownitem); + r = RET_ERROR; + } +@@ -4450,7 +4467,7 @@ + " -P, --priority <priority>: Force include* to set priority.\n" + " -C, --component <component>: Add,list or delete only in component.\n" + " -A, --architecture <architecture>: Add,list or delete only to architecture.\n" +-" -T, --type <type>: Add,list or delete only type (dsc,deb,udeb).\n" ++" -T, --type <type>: Add,list or delete only type (dsc,deb,udeb,ddeb).\n" + "\n" + "actions (selection, for more see manpage):\n" + " dumpreferences: Print all saved references\n" +@@ -4469,6 +4486,8 @@ + " Include the given upload.\n" + " includedeb <distribution> <.deb-file>\n" + " Include the given binary package.\n" ++" includeddeb <distribution> <.ddeb-file>\n" ++" Include the given debug binary package.\n" + " includeudeb <distribution> <.udeb-file>\n" + " Include the given installer binary package.\n" + " includedsc <distribution> <.dsc-file>\n" +diff -ru reprepro.orig/source/target.c reprepro/source/target.c +--- reprepro.orig/source/target.c 2016-12-23 19:11:30.000000000 -0500 ++++ reprepro/source/target.c 2020-11-01 16:33:38.186181609 -0500 +@@ -53,6 +53,10 @@ + return mprintf("u|%s|%s|%s", codename, + atoms_components[component], + atoms_architectures[architecture]); ++ else if (packagetype == pt_ddeb) ++ return mprintf("d|%s|%s|%s", codename, ++ atoms_components[component], ++ atoms_architectures[architecture]); + else + return mprintf("%s|%s|%s", codename, + atoms_components[component], +@@ -129,6 +133,25 @@ + dist_component_name(component, + fakecomponentprefix), + atoms_architectures[architecture]), ++ exportmode, readonly, noexport, target); ++} ++retvalue target_initialize_dbinary(struct distribution *d, component_t component, architecture_t architecture, const struct exportmode *exportmode, bool readonly, bool noexport, const char *fakecomponentprefix, struct target **target) { ++ return target_initialize(d, component, architecture, pt_ddeb, ++ binaries_getversion, ++ binaries_getinstalldata, ++ binaries_getarchitecture, ++ binaries_getfilekeys, binaries_getchecksums, ++ binaries_getsourceandversion, ++ /* we use the main overrides */ ++ binaries_doreoverride, binaries_retrack, ++ binaries_complete_checksums, ++ /* FIXME: we don't know what the Debian archive layout ++ * is going to look like yet, so take a guess based ++ * on udebs */ ++ mprintf("%s/debug/binary-%s", ++ dist_component_name(component, ++ fakecomponentprefix), ++ atoms_architectures[architecture]), + exportmode, readonly, noexport, target); + } + retvalue target_initialize_binary(struct distribution *d, component_t component, architecture_t architecture, const struct exportmode *exportmode, bool readonly, bool noexport, const char *fakecomponentprefix, struct target **target) { +diff -ru reprepro.orig/source/target.h reprepro/source/target.h +--- reprepro.orig/source/target.h 2016-12-23 19:11:30.000000000 -0500 ++++ reprepro/source/target.h 2020-11-01 16:33:38.186181609 -0500 +@@ -76,6 +76,7 @@ + }; + + retvalue target_initialize_ubinary(/*@dependant@*/struct distribution *, component_t, architecture_t, /*@dependent@*/const struct exportmode *, bool /*readonly*/, bool /*noexport*/, /*@NULL@*/const char *fakecomponentprefix, /*@out@*/struct target **); ++retvalue target_initialize_dbinary(/*@dependant@*/struct distribution *, component_t, architecture_t, /*@dependent@*/const struct exportmode *, bool /*readonly*/, bool /*noexport*/, /*@NULL@*/const char *fakecomponentprefix, /*@out@*/struct target **); + retvalue target_initialize_binary(/*@dependant@*/struct distribution *, component_t, architecture_t, /*@dependent@*/const struct exportmode *, bool /*readonly*/, bool /*noexport*/, /*@NULL@*/const char *fakecomponentprefix, /*@out@*/struct target **); + retvalue target_initialize_source(/*@dependant@*/struct distribution *, component_t, /*@dependent@*/const struct exportmode *, bool /*readonly*/, bool /*noexport*/, /*@NULL@*/const char *fakecomponentprefix, /*@out@*/struct target **); + retvalue target_free(struct target *); +diff -ru reprepro.orig/source/tests/genpackage.sh reprepro/source/tests/genpackage.sh +--- reprepro.orig/source/tests/genpackage.sh 2016-12-23 19:11:30.000000000 -0500 ++++ reprepro/source/tests/genpackage.sh 2020-11-01 16:33:38.186181609 -0500 +@@ -9,6 +9,8 @@ + fi + + DIR="$PACKAGE-$VERSION" ++ARCH="${ARCH:-$(dpkg-architecture -qDEB_HOST_ARCH)}" ++rm -rf "$DIR" + mkdir "$DIR" + mkdir "$DIR"/debian + cat >"$DIR"/debian/control <<END +@@ -28,6 +30,17 @@ + Description: bla + blub + END ++ ++if test -n "${DDEB-}" ; then ++cat >>"$DIR"/debian/control <<END ++ ++Package: ${PACKAGE}-dbgsym ++Architecture: ${ARCH} ++Description: ${PACKAGE} debug symbols ++Package-Type: ddeb ++END ++fi ++ + if test -z "$DISTRI" ; then + DISTRI=test1 + fi diff --git a/helpers/make-reprepro b/helpers/make-reprepro new file mode 100644 index 0000000000000000000000000000000000000000..0807bbced0cadd5e62bd49a24e98a7a1d893bda3 --- /dev/null +++ b/helpers/make-reprepro @@ -0,0 +1,30 @@ +#!/bin/sh +# +# Copyright (C) 2022 Ruben Rodriguez <ruben@trisquel.info> +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + +VERSION=1 + +. ./config + +patch -p2 < $DATA/ddeb.patch + +#https://github.com/ionos-cloud/reprepro +changelog "Adds support for ddeb files" + +compile +