[6/8] repository: create isar-apt with a reproducible timestamp

Message ID 20260820083014.3377283-7-felix.moessbauer@siemens.com
State New
Headers show
Series Make all sstate artifacts reproducible | expand

Commit Message

Felix Moessbauer Aug. 20, 2026, 8:30 a.m. UTC
As this timestamp ends up in the "Date:" field of the release file, it
also ends up in our internal rootfs'. To make these reproducible, we
have to set this to a fixed date. As the date itself is completely
irrelevant and not part of the generated images, we just use 1h after
epoch (similar to our default changelog date, as 0 cannot be used).

Signed-off-by: Felix Moessbauer <felix.moessbauer@siemens.com>
---
 meta/classes-recipe/repository.bbclass | 19 +++++++++++++++++++
 1 file changed, 19 insertions(+)

Patch

diff --git a/meta/classes-recipe/repository.bbclass b/meta/classes-recipe/repository.bbclass
index ba2803ad..a2061100 100644
--- a/meta/classes-recipe/repository.bbclass
+++ b/meta/classes-recipe/repository.bbclass
@@ -10,6 +10,20 @@  def repo_expand_opt_fields(d, var):
         return ''
     return '\n'.join('{}: {}'.format(k, v) for k, v in f.items())
 
+# use a fixed but arbitrary date for the Release file to make it reproducible
+ISAR_APT_RELEASE_DATE = "3600"
+repo_set_release_date() {
+    local dir="$1"
+    local codename="$2"
+    local release="${dir}/dists/${codename}/Release"
+
+    [ "${dir}" = "${REPO_ISAR_DIR}/${DISTRO}" ] || return 0
+    [ -f "${release}" ] || return 0
+
+    sed -i -e "s/^Date: .*/Date: $(LC_ALL=C date -u -R -d @${ISAR_APT_RELEASE_DATE})/" \
+        "${release}"
+}
+
 repo_create() {
     local dir="$1"
     local dbdir="$2"
@@ -40,6 +54,7 @@  repo_create() {
     fi
     if [ ! -d "${dbdir}" ]; then
         reprepro -b "${dir}" --dbdir "${dbdir}" export "${codename}"
+        repo_set_release_date "${dir}" "${codename}"
     fi
 }
 
@@ -55,6 +70,7 @@  repo_add_srcpackage() {
     reprepro -b "${dir}" --dbdir "${dbdir}" -C main -S - -P source \
         includedsc "${codename}" \
         "$@"
+    repo_set_release_date "${dir}" "${codename}"
 }
 
 repo_add_packages() {
@@ -77,6 +93,7 @@  repo_add_packages() {
         fi
         reprepro -b "${dir}" --dbdir "${dbdir}" -C main ${prio_opt} \
             includedeb "${codename}" "${package}"
+        repo_set_release_date "${dir}" "${codename}"
     done
 }
 
@@ -92,6 +109,7 @@  repo_del_srcpackage() {
     reprepro -b "${dir}" --dbdir "${dbdir}" -A source \
         remove "${codename}" \
         "${packagename}"
+    repo_set_release_date "${dir}" "${codename}"
 }
 
 repo_del_package() {
@@ -108,6 +126,7 @@  repo_del_package() {
     reprepro -b "${dir}" --dbdir "${dbdir}" -C main \
         removefilter "${codename}" \
         'Package (= '${p}'), Architecture (= '${a}'), $PackageType (= deb)'
+    repo_set_release_date "${dir}" "${codename}"
 }
 
 repo_contains_package() {