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(-)

diff --git a/build/parsePreamble.c b/build/parsePreamble.c
index 306a029..5ae1ecf 100644
--- a/build/parsePreamble.c
+++ b/build/parsePreamble.c
@@ -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