Skip to content

Add the Plone 1.0 legacy image, completing the matrix - #208

Merged
ericof merged 1 commit into
mainfrom
issue-197
Aug 28, 2026
Merged

ericof merged 1 commit into
mainfrom
issue-197

Conversation

@ericof

@ericof ericof commented Aug 28, 2026

Copy link
Copy Markdown
Member

Adds the Plone 1.0.6 image — the eleventh and last series. The matrix is complete: every release from 1.0 to 4.2 now ships.

Closes #197

Plone 1.0.6 with CMF 1.3.3 on Zope 2.7.8 / Python 2.3.7 — the same stack 2.0 uses. No new shared scripts.

This is the only image assembled from more than one artifact, and the only one that patches upstream source.

Three sources for one image

No single 1.0.6 artifact carries a working Plone. CMFPlone/INSTALL.txt asks for CMFPlone, DCWorkflow and Formulator plus CMF 1.3+, and the 1.0.6 tarball holds only the first.

Source Supplies
dist.plone.org/archive/Plone-1.0.6.tar.gz CMFPlone — and nothing else
dist.plone.org/archive/CMFPlone1.0.5.tar.gz DCWorkflow, Formulator
old.zope.dev/.../CMF-1.3.3.tar.gz CMFCore, CMFDefault, CMFTopic, CMFCalendar

Neither DCWorkflow nor Formulator is separately downloadable any more — old.zope.dev 404s for both — so the 1.0.5 release bundle is the only surviving source for the two companions of a 1.0.6 CMFPlone.

The two patches

Both are consequences of running a Zope 2.6-era Plone on 2.7. They live in 1.0/patches/ as unified diffs applied with patch -p1 --forward --batch, never as in-line sed. --forward makes an already-applied patch a hard failure rather than a silent re-application, and the build stops if either is rejected.

0001-isExpired-datetime-syntaxerror.patch widens an exception handler. Zope 2.6's DateTime raised IndexError on an unparseable string, which is what the handler was written against; 2.7's raises DateTime.SyntaxError, and CMF hands it the literal string 'None' whenever no expiry is set — so the exception escaped and every page render 500'd.

0002-login_form-tal-nesting.patch splits HTML close-tags inside a <script> block across a string concatenation. Zope 2.6's parser tolerated them inline; 2.7's HTMLTALParser raises NestingError and the template fails to compile.

The shared gate absorbed a third era, again unchanged

Plone 1.0 predates the <meta name="generator"> tag that every other series is asserted against. shared/smoke-test.sh fell back to a plone.css resource reference on its own:

OK: site root renders Plone markup via plone_javascripts/plone.css
    (pre-2.0: no generator tag)   (21167 bytes)

That is the third era-specific behaviour it has handled without modification, after discovering the two different site factories during the 2.1 and 2.5 ports. Nothing version-specific was added to the gate for any of the four tarball-era ports.

Two claims corrected rather than left to rot

legacy/2.0/README.md opened with "The oldest image in the matrix" — accurate until this commit, and now contradicted by 1.0/README.md's own first paragraph. It states what remains true: 2.0 is the oldest image that runs upstream source unmodified.

legacy/README.md's "one series lands per pull request; the remaining one follows these" is replaced by a completion statement noting why 1.0 is the sole patched image.

Verification

  • make lint — 12 Dockerfiles, 11 shell scripts, workflow YAML
  • make -n on all four 1.0 targets, including the test-demo-1.0 case the GNU Make 3.81 stem rule would otherwise route to test-%
  • SMOKE_CREATE_SITE=1 make test-1.0 — 6/6, site root 21167 bytes
  • make test-demo-1.0 — 6/6, build-time password confirmed dead after the ADMIN_PASSWORD reset

Read out of the built image, not from the ARGs: Products/CMFPlone/version.txt → 1.0.6, interpreter → 2.3.7, simplejson → 1.9.3, both patch markers present in the patched files, and Products/ holds exactly the seven products the three sources are meant to supply — CMFPlone, DCWorkflow, Formulator, CMFCore, CMFDefault, CMFTopic, CMFCalendar.

Both builds were cache-hit from the plone-legacy checkout, so the cold build is exercised for the first time in this PR's CI run.

Eleventh and last series. Refs #197. Every release from 1.0 to 4.2 now ships.

Plone 1.0.6 with CMF 1.3.3 on Zope 2.7.8 / Python 2.3.7 -- the same stack 2.0
uses. No new shared scripts.

1.0 is the only image in the matrix assembled from more than one artifact, and
the only one that patches upstream source.

No single 1.0.6 artifact carries a working Plone. CMFPlone/INSTALL.txt asks for
CMFPlone, DCWorkflow and Formulator plus CMF 1.3 or later, and the 1.0.6
tarball holds only the first. Neither DCWorkflow nor Formulator is separately
downloadable any more -- old.zope.dev 404s for both -- so the 1.0.5 release
bundle supplies them, and CMF comes from old.zope.dev. Three sources for one
image, where every other series has one.

The two patches are consequences of running a Zope 2.6-era Plone on 2.7, and
they live in 1.0/patches/ as unified diffs applied with
`patch -p1 --forward --batch`, never as in-line sed. --forward makes an
already-applied patch a hard failure rather than a silent re-application, and
the build stops if either is rejected.

0001 widens an exception handler in isExpired.py. Zope 2.6's DateTime raised
IndexError on an unparseable string, which is what the handler was written
against; 2.7's raises DateTime.SyntaxError, and CMF hands it the literal string
'None' whenever no expiry is set -- so the exception escaped and every page
render 500'd.

0002 splits HTML close-tags inside a <script> block in login_form.pt across a
string concatenation. Zope 2.6's parser tolerated them inline; 2.7's
HTMLTALParser raises NestingError and the template fails to compile.

The smoke gate absorbed a third era-specific behaviour without a change. Plone
1.0 predates the <meta name="generator"> tag every other series is asserted
against, so shared/smoke-test.sh fell back to a plone.css resource reference on
its own -- after already discovering the two different site factories in 2.1
and 2.5. Nothing version-specific was added to the gate for any of the four
tarball-era ports.

Two documentation claims stop being true with this commit and are corrected
here rather than left to rot.

2.0/README.md opened with "The oldest image in the matrix", which was accurate
until this commit and is now contradicted by 1.0/README.md's own first
paragraph. It now says what remains true: 2.0 is the oldest image that runs
upstream source unmodified.

legacy/README.md's "one series lands per pull request; the remaining one
follows these" is replaced by a statement that the matrix is complete, noting
why 1.0 is the sole patched image.

Verified locally: make lint passes with 12 Dockerfiles and 11 shell scripts;
make -n resolves all four 1.0 targets, including the test-demo-1.0 case the GNU
Make 3.81 stem rule would otherwise send to test-%. The base image passes the
smoke gate with SMOKE_CREATE_SITE=1 (6/6, site root 21167 bytes) and the -demo
variant passes make test-demo-1.0 (6/6), with the build-time password confirmed
dead after the ADMIN_PASSWORD reset.

Read out of the built image rather than taken from the ARGs:
Products/CMFPlone/version.txt reads 1.0.6, the interpreter reports 2.3.7,
simplejson is 1.9.3, both patch markers are present in the patched files, and
Products/ holds exactly the seven products the three sources are meant to
supply -- CMFPlone, DCWorkflow, Formulator, CMFCore, CMFDefault, CMFTopic and
CMFCalendar.

Both builds were cache-hit from the source repository's layers, so the cold
build is exercised for the first time in CI.
@ericof ericof self-assigned this Aug 28, 2026
@ericof
ericof merged commit f7d6b6f into main Aug 28, 2026
16 checks passed
@ericof
ericof deleted the issue-197 branch August 28, 2026 19:53
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Plone 1.0 image

1 participant