Your message dated Tue, 06 Oct 2026 15:34:04 +0000
with message-id <[email protected]>
and subject line Bug#1149638: fixed in horizon 3:27.0.0-2
has caused the Debian Bug report #1149638,
regarding horizon: reproducible-builds: timestamps in shipped .pot files
to be marked as done.
This means that you claim that the problem has been dealt with.
If this is not the case it is now your responsibility to reopen the
Bug report if necessary, and/or fix the problem forthwith.
(NB: If you are a system administrator and have no idea what this
message is talking about, this may indicate a serious mail system
misconfiguration somewhere. Please contact [email protected]
immediately.)
--
1149638: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1149638
Debian Bug Tracking System
Contact [email protected] with problems
--- Begin Message ---
Source: horizon
Version: 3:26.0.0-1
Severity: important
Tags: patch
User: [email protected]
Usertags: timestamps
X-Debbugs-Cc: [email protected]
The build timestamp is getting embedded in various shipped .pot files:
https://reproduce.debian.net/all/api/v1/builds/234931/artifacts/514050/diffoscope
│ │ ├── ./usr/lib/python3/dist-packages/horizon/locale/django.pot
...
│ │ │ -"POT-Creation-Date: 2026-09-21 07:22+0000\n"
│ │ │ +"POT-Creation-Date: 2026-09-26 10:01+0000\n"
This issue is currently blocking migration to testing:
https://reproduce.debian.net/excuses.html?source_name=horizon
This appears to have been introduced in upstream version 26.0.0 and is
present in newer versions as well:
https://tests.reproducible-builds.org/debian/history/amd64/horizon.html
Reverting an upstream commit appears to resolve the issue:
63ed6a1d6b1fe3f153b80ed580c7a49eaf2f1d12
Avoid calling setup.py in the extract_messages command
Although it is hopefully possible to fix this in some better way than
reverting the upstream commit, offering the attached patch as a
workaround until a better solution that can be merged upstream can be
found.
live well,
vagrant
From: Vagrant Cascadian <[email protected]>
Date: Thu, 1 Oct 2026 12:13:02 -0700
X-Dgit-Generated: 3:27.0.0-1.1~0 002f142d2f5d7c6163bad9147ac59ceb6e37cc36
Subject: Revert "Avoid calling setup.py in the extract_messages command"
This reverts commit 63ed6a1d6b1fe3f153b80ed580c7a49eaf2f1d12.
---
diff --git a/babel-django.cfg b/babel-django.cfg
index 6590355fa..f5e77263f 100644
--- a/babel-django.cfg
+++ b/babel-django.cfg
@@ -1,5 +1,3 @@
[python: **.py]
[django: **/templates/**.html]
[django: **/templates/**.csv]
-[extractors]
-django = horizon.utils.babel_extract_django:extract_django
diff --git a/babel-djangojs.cfg b/babel-djangojs.cfg
index 03f75ac7d..f51212ad7 100644
--- a/babel-djangojs.cfg
+++ b/babel-djangojs.cfg
@@ -5,5 +5,3 @@
# /openstack_dashboard/dashboards/XYZ/static which will ensure
# that plugins are also translated.
[angular: **/static/**.html]
-[extractors]
-angular = horizon.utils.babel_extract_angular:extract_angular
diff --git a/openstack_dashboard/management/commands/extract_messages.py b/openstack_dashboard/management/commands/extract_messages.py
index 60877840b..4def2971b 100644
--- a/openstack_dashboard/management/commands/extract_messages.py
+++ b/openstack_dashboard/management/commands/extract_messages.py
@@ -13,9 +13,10 @@
# limitations under the License.
import os
+from subprocess import call
-from babel.messages.frontend import CommandLineInterface
from django.core.management.base import BaseCommand
+from setuptools.dist import Distribution
DOMAINS = ['django', 'djangojs']
@@ -43,6 +44,17 @@ class Command(BaseCommand):
"polluting the source code"))
def handle(self, *args, **options):
+ cmd = ('python setup.py {quiet} extract_messages '
+ '-F babel-{domain}.cfg '
+ '--input-dirs {module} '
+ '-o {potfile}')
+ distribution = Distribution()
+ distribution.parse_config_files(distribution.find_config_files())
+
+ quiet = '-q' if int(options['verbosity']) == 0 else ''
+ if options['check_only']:
+ cmd += " ; rm {potfile}"
+
for module in options['module']:
for domain in options['domain']:
potfile = '{module}/locale/{domain}.pot'.format(module=module,
@@ -50,14 +62,6 @@ class Command(BaseCommand):
if not os.path.exists(potfile):
with open(potfile, 'wb') as f:
f.write(b'')
- command = [
- 'pybabel', 'extract',
- '-F', f'babel-{domain}.cfg',
- '--input-dirs', module,
- '-o', potfile,
- ]
- if int(options['verbosity']) == 0:
- command.insert(1, '-q')
- CommandLineInterface().run(command)
- if options['check_only']:
- os.remove(potfile)
+
+ call(cmd.format(module=module, domain=domain, potfile=potfile,
+ quiet=quiet), shell=True)
diff --git a/pyproject.toml b/pyproject.toml
index 8bb559c99..aea237593 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -35,6 +35,13 @@ classifiers = [
openstack_dashboard = "openstack_dashboard.utils.config:list_options"
openstack_dashboard_integration_tests = "openstack_dashboard.test.integration_tests.config:list_opts"
+[project.entry-points."babel.extractors"]
+# We use a custom extractor to find translatable strings in AngularJS templates.
+# See https://babel.pocoo.org/en/latest/messages.html#referencing-extraction-methods
+# for details on how this works.
+angular = "horizon.utils.babel_extract_angular:extract_angular"
+django = "horizon.utils.babel_extract_django:extract_django"
+
[project.urls]
Homepage = "https://docs.openstack.org/horizon"
Repository = "https://opendev.org/openstack/horizon/"
signature.asc
Description: PGP signature
--- End Message ---
--- Begin Message ---
Source: horizon
Source-Version: 3:27.0.0-2
Done: Thomas Goirand <[email protected]>
We believe that the bug you reported is fixed in the latest version of
horizon, which is due to be installed in the Debian FTP archive.
A summary of the changes between this version and the previous one is
attached.
Thank you for reporting the bug, which will now be closed. If you
have further comments please address them to [email protected],
and the maintainer will reopen the bug report if appropriate.
Debian distribution maintenance software
pp.
Thomas Goirand <[email protected]> (supplier of updated horizon package)
(This message was generated automatically at their request; if you
believe that there is a problem with it please contact the archive
administrators by mailing [email protected])
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA512
Format: 1.8
Date: Tue, 06 Oct 2026 16:47:01 +0200
Source: horizon
Architecture: source
Version: 3:27.0.0-2
Distribution: unstable
Urgency: medium
Maintainer: Debian OpenStack <[email protected]>
Changed-By: Thomas Goirand <[email protected]>
Closes: 1149638
Changes:
horizon (3:27.0.0-2) unstable; urgency=medium
.
* Fixed a reproducible-builds issue in python3-horizon: babel always
embeds the current build time as POT-Creation-Date when regenerating
the .pot files at build time, making builds unreproducible. Strip
that header from the generated files in debian/compile-messages
(Closes: #1149638). Thanks Vagrant Cascadian for the bug report.
Checksums-Sha1:
1aa497238c6148b9797cfcd873d80fd796b3a7da 4372 horizon_27.0.0-2.dsc
874c724cb2a31154a7a0be5b26e2146b0bdcf668 36300 horizon_27.0.0-2.debian.tar.xz
84f344005a569fd972ddccdf8daaac41b153ca36 17464 horizon_27.0.0-2_amd64.buildinfo
Checksums-Sha256:
baabfd52b9663e79c5b36bf30feec191836d013eaa7a022a9643011255af7e29 4372
horizon_27.0.0-2.dsc
ff06ab625190511b9e42d3af37c9c445fc3ed7228c76a5f43db500601bd04d8f 36300
horizon_27.0.0-2.debian.tar.xz
f7630523dac8e9e0f68186808e0819ada8e051f61825887fe8f363339afc805a 17464
horizon_27.0.0-2_amd64.buildinfo
Files:
cbf341f2db29a7a54e50738b4d72c3f8 4372 net optional horizon_27.0.0-2.dsc
07c60f7138cfa9b38aa5eab91c76c8fb 36300 net optional
horizon_27.0.0-2.debian.tar.xz
31de26e9d6948f6602b5f1ee301c9c4c 17464 net optional
horizon_27.0.0-2_amd64.buildinfo
-----BEGIN PGP SIGNATURE-----
iQIzBAEBCgAdFiEEoLGp81CJVhMOekJc1BatFaxrQ/4FAmrFDUAACgkQ1BatFaxr
Q/7eTw//difky45CO7riBbTAPDd55adEEUEeMzNhuJwZWikswSanVraY13GWveti
3ye1eercrqDo/DChVU4rfbZ1JOczc/zQmPhKAZ5MBY9uMVkeTLS+/ivGai0ZaVSb
y3n0aeFaIG5/Fbe5hBNrtsFR1Hs38MzZVRiOSffsNLL5pmlu6vKWjL9kZt5ARCKf
S7vwIomU1V50B0Wh9ePqoeWprd7alZdLuuRG1PCdBj7u3+KenyowjcuJddeghGbl
bjYMPn2iXRQInwkGsmu95GQm8SIo+Iqd0uoaQHDDhgZ5xis4KaBBh3I8gYPITGfc
TzW+SnyTe0YwixDgZzoX0aHfhp/wC/bjivlZ17rw2ANAT1Q++3pL2SRVV+xi8tJy
wL7Co7DhO2nrKex3T0LhFONJNQjkoHI1CjQ5ev5987U8ALEsvb5mfw1WWNzCdzVP
TeOLg0GmsmZOLgRtil8siKHeoyo3fY4kdC8IQpMVal3YZTIv2ONwCzxa5rIeK0ph
pGAn9TuNmCidpJrEfhBnKfFwJWDup0x4N37c9lVaRrUX6RfSPAX2liHTPry3xFwa
M8htZjS/4+G56VNVFicPMXJ9nNirY+EPf+61nvmgHkupAJfC6KyWl750djcXWwO9
L4UANW/BXdtgwWebBtIlnFLs+zTDzUFOB1c7wzJcywBUKaNQWOg=
=sQBt
-----END PGP SIGNATURE-----
pgp5TjeEHCQXW.pgp
Description: PGP signature
--- End Message ---