From fed67641185d6a7144fa54a009bb4608576d984e Mon Sep 17 00:00:00 2001
From: zhangyao <zhangyao108@h-partners.com>
Date: Tue, 27 Jan 2026 19:12:08 +0800
Subject: [PATCH] support config enable default subr macro
build/parsePreamble.c | 78 +++++++++++++++++++++++++++++++++++++++----
1 file changed, 72 insertions(+), 6 deletions(-)
@@ -749,6 +749,30 @@ int addLangTag(rpmSpec spec, Header h, rpmTagVal tag,
return 0;
}
+static int validate_macro_subr_format(const char *macro_subr) {
+ if (macro_subr == NULL || strlen(macro_subr) < 3) {
+ return 0;
+ }
+
+ size_t len = strlen(macro_subr);
+
+ if (!isalpha((unsigned char)macro_subr[0])) {
+ return 0;
+ }
+
+ if (macro_subr[len - 1] != '.') {
+ return 0;
+ }
+
+ for (size_t i = 1; i < len - 1; i++) {
+ if (!isdigit((unsigned char)macro_subr[i])) {
+ return 0;
+ }
+ }
+
+ return 1;
+}
+
static rpmRC handlePreambleTag(rpmSpec spec, Package pkg, rpmTagVal tag,
const char *macro, const char *lang)
{
@@ -799,12 +823,54 @@ static rpmRC handlePreambleTag(rpmSpec spec, Package pkg, rpmTagVal tag,
case RPMTAG_VERSION:
case RPMTAG_RELEASE:
SINGLE_TOKEN_ONLY;
- if (tag == RPMTAG_RELEASE) {
- char *dist = rpmExpand("%{?dist}",NULL);
- rasprintf(&field,"%s%s",field,
- (dist && strstr(field, dist)) ? "" : dist);
- free(dist);
- }
+ if (tag == RPMTAG_RELEASE) {
+ char *dist = rpmExpand("%{?dist}", NULL);
+ if (rpmExpandNumeric("%{?enable_default_subr}")) {
+ const char *str_subr = "";
+ char *macro_subr = rpmExpand("%{?subr}", NULL);
+ size_t size = strlen(macro_subr);
+ char *pos = size > 0 ? strstr(field, macro_subr) : NULL;
+ if (pos != NULL && rpmExpandNumeric("%{?is_self_package}")) {
+ field = NULL;
+ rpmlog(RPMLOG_ERR,"is_self_package and subr cannot be used together.\n");
+ free(dist);
+ free(macro_subr);
+ goto exit;
+ }
+ if (size > 0 && !validate_macro_subr_format(macro_subr)) {
+ field = NULL;
+ rpmlog(RPMLOG_ERR,"The subr format must be: letter + digits + dot (e.g., 'a123.').\n");
+ free(dist);
+ free(macro_subr);
+ goto exit;
+ }
+
+ if (size > 0 && pos == NULL && macro_subr[size - 1] == '.') {
+ macro_subr[size - 1] = '\0';
+ }
+
+ if (size > 0 && pos == NULL) {
+ str_subr = macro_subr;
+ }
+
+ size_t field_length = strlen(field);
+ if (rpmExpandNumeric("%{?is_self_package}")) {
+ char *field_copy = strdup(field);
+ rasprintf(&field, "%s.%s%s", str_subr + 1, field_copy, (dist && strstr(field, dist)) ? "" : dist);
+ free(field_copy);
+ }else if (field_length && field[field_length - 1] == '.') {
+ rasprintf(&field, "%s%s%s%s", field, str_subr, strlen(str_subr) ? "." : str_subr, (dist && strstr(field, dist)) ? "" : dist);
+ }else {
+ rasprintf(&field, "%s%s%s%s", field, strlen(str_subr) ? "." : str_subr, str_subr, (dist && strstr(field, dist)) ? "" : dist);
+ }
+
+ free(macro_subr);
+ } else {
+ rasprintf(&field,"%s%s",field,
+ (dist && strstr(field, dist)) ? "" : dist);
+ }
+ free(dist);
+ }
if (rpmCharCheck(spec, field, ALLOWED_CHARS_VERREL, NULL))
goto exit;
headerPutString(pkg->header, tag, field);
--
2.33.0