<feed xmlns='http://www.w3.org/2005/Atom'>
<title>cccms/Gemfile.lock, branch erdgeist-modernize-auth</title>
<subtitle>[no description]</subtitle>
<id>https://erdgeist.org/gitweb/cccms/atom?h=erdgeist-modernize-auth</id>
<link rel='self' href='https://erdgeist.org/gitweb/cccms/atom?h=erdgeist-modernize-auth'/>
<link rel='alternate' type='text/html' href='https://erdgeist.org/gitweb/cccms/'/>
<updated>2026-07-16T17:45:42Z</updated>
<entry>
<title>Implement transparent password hash migration</title>
<updated>2026-07-16T17:45:42Z</updated>
<author>
<name>erdgeist</name>
<email>erdgeist@erdgeist.org</email>
</author>
<published>2026-07-16T17:45:42Z</published>
<link rel='alternate' type='text/html' href='https://erdgeist.org/gitweb/cccms/commit/?id=220ed6c7914f5977d36b7617e9c38999317f57e5'/>
<id>urn:sha1:220ed6c7914f5977d36b7617e9c38999317f57e5</id>
<content type='text'>
Add has_secure_password and bcrypt while retaining compatibility with
legacy SHA-1 password hashes. Existing users are upgraded to
password_digest on their next successful login.

Add regression tests covering both legacy and modern authentication
paths.
</content>
</entry>
<entry>
<title>Add rails_icons (Tabler) for SVG iconography</title>
<updated>2026-07-12T21:41:52Z</updated>
<author>
<name>erdgeist</name>
<email>erdgeist@erdgeist.org</email>
</author>
<published>2026-07-12T21:41:52Z</published>
<link rel='alternate' type='text/html' href='https://erdgeist.org/gitweb/cccms/commit/?id=d320f8509751a886adb3ca723ebfafccaa8c191b'/>
<id>urn:sha1:d320f8509751a886adb3ca723ebfafccaa8c191b</id>
<content type='text'>
Vendors the Tabler outline/filled icon sets via rails_icons' sync
mechanism rather than a hand-rolled SVG set or a webfont -- this app
had no icon system of any kind before. Icons are committed like any
other static asset; re-syncing is only needed when adding an icon
that isn't vendored yet, via the new `make sync_icons` target.
</content>
</entry>
<entry>
<title>Retire vendored cacycle_diff.js for a diff-lcs-based diff view</title>
<updated>2026-07-09T22:35:24Z</updated>
<author>
<name>erdgeist</name>
<email>erdgeist@erdgeist.org</email>
</author>
<published>2026-07-09T22:35:24Z</published>
<link rel='alternate' type='text/html' href='https://erdgeist.org/gitweb/cccms/commit/?id=a25d90335ad3738b6831288190132c2f7498465c'/>
<id>urn:sha1:a25d90335ad3738b6831288190132c2f7498465c</id>
<content type='text'>
Revisions#diff now computes an inline or side-by-side word diff
server-side (Page#diff_against, lib/html_word_diff.rb) instead of
shipping raw/escaped content to the browser for a 2008-era vendored
JS differ to mangle. View mode is picked via a `view` param, settable
either on the diff page itself or directly from the revisions#index
sticky bar next to "Diff revisions".

Also fixes a pre-existing bug in RevisionsController#diff's single-
revision branch, which set params[:start]/params[:end] instead of
params[:start_revision]/params[:end_revision].
</content>
</entry>
<entry>
<title>Replace awesome_nested_set with a plain parent_id-based NestedTree concern</title>
<updated>2026-07-07T00:46:37Z</updated>
<author>
<name>erdgeist</name>
<email>erdgeist@erdgeist.org</email>
</author>
<published>2026-07-07T00:46:37Z</published>
<link rel='alternate' type='text/html' href='https://erdgeist.org/gitweb/cccms/commit/?id=7b6af89509e8439fe2474e623ee97e4db67ab011'/>
<id>urn:sha1:7b6af89509e8439fe2474e623ee97e4db67ab011</id>
<content type='text'>
Root-caused this session: appending a child to any node never widened
that parent's own rgt boundary, on the pinned revision (Gemfile tracked
main directly, chasing a too-conservative gemspec constraint - not, as
first assumed, a deliberate pin to avoid a known bug). Reproduced
cleanly on a single ordinary create with no concurrency and no bulk
operation involved, confirmed via the gem's own SetValidator, then
confirmed as the root cause of nodes_controller_test.rb's 3 long-standing
"pre-existing" failures - not three separate mysteries, one bug.

admin_controller's sitemap needed its own real conversion, not just a
drop-in: awesome_nested_set's lft column implicitly provided correct
depth-first tree order for free, which the old code combined with a
separate class-level each_with_level iterator. Both replaced by one
method, self_and_descendants_ordered_with_level, computing an ordered
[node, level] list in a single query-then-walk pass - checked against
the actual view template first (admin/index.html.erb) rather than
assumed, since it relies on list order alone to render correct visual
nesting.

lft/rgt/depth columns intentionally left in schema, unused - dropping
them is a separate, deliberately deferred migration once this is proven
running for a while, not bundled with the behavior change.
</content>
</entry>
<entry>
<title>Fix DST drift in occurrence generation</title>
<updated>2026-07-02T13:13:40Z</updated>
<author>
<name>erdgeist</name>
<email>erdgeist@erdgeist.org</email>
</author>
<published>2026-07-02T13:13:40Z</published>
<link rel='alternate' type='text/html' href='https://erdgeist.org/gitweb/cccms/commit/?id=9a3274345dc83096a9bdea612ec77cb2406fef21'/>
<id>urn:sha1:9a3274345dc83096a9bdea612ec77cb2406fef21</id>
<content type='text'>
- Occurrence.generate_dates: use ChaosCalendar::occurrences_for_timezone
  with Time.zone.tzinfo.identifier — occurrences now keep wall-clock
  time across DST boundaries (19:00 stays 19:00 in summer and winter);
  requires chaoscalendar gem with occurrences_for_timezone support
  (Gemfile.lock bumped accordingly)
- Occurrence.find_in_range: joins(:event) inner join excludes occurrences
  whose event no longer exists (107k orphaned rows from the pre-revival
  calendar era were purged from the test DB); includes(:node) retained
  for eager loading; column references qualified with table name
</content>
</entry>
<entry>
<title>Stage 7: Rails 7.2 → 8.1 on Ruby 3.2.11</title>
<updated>2026-06-27T14:58:53Z</updated>
<author>
<name>erdgeist</name>
<email>erdgeist@erdgeist.org</email>
</author>
<published>2026-06-27T14:58:53Z</published>
<link rel='alternate' type='text/html' href='https://erdgeist.org/gitweb/cccms/commit/?id=420506e58fdfc84f1a5bede0a01dedf0af3bb4f3'/>
<id>urn:sha1:420506e58fdfc84f1a5bede0a01dedf0af3bb4f3</id>
<content type='text'>
- Bump Rails to 8.1.3 (Ruby unchanged at 3.2.11, new gemset rails8-upgrade)
- config.load_defaults 8.1; merge app:update diffs for all environment files
- Remove routing-filter 0.7.0; replace with native scope '(:locale)' in
  routes.rb and default_url_options in ApplicationController
- Delete config/initializers/routing_filter_rails71_patch.rb
- Replace vendored TinyMCE 3.x (~200 files) with tinymce-rails ~&gt; 8.3;
  migrate admin_interface.js from jQuery .tinymce()/advanced theme to
  tinymce.init(); add config/tinymce.yml; note: TinyMCE 7+ is GPL
- rails-i18n ~&gt; 8.0 added explicitly (previously indirect dependency)
- awesome_nested_set, acts-as-taggable-on pinned to git main/master
  (gemspec activerecord &lt; 8.1 ceiling; no functional incompatibility;
  repin to version once upstream releases updated gemspecs)
- globalize ~&gt; 7.0, libxml-ruby ~&gt; 5.0, nokogiri ~&gt; 1.18, pg ~&gt; 1.5
- sass-rails, coffee-rails, uglifier moved from :assets group to main
  (Sprockets 4 convention; :assets group no longer meaningful)
- Node: head, draft, lock_owner marked belongs_to optional: true
- Page: node, user, editor marked belongs_to optional: true
- Static assets in public/images/ and public/javascripts/ referenced via
  plain HTML tags; Rails 8 load_defaults raises on pipeline helpers for
  undeclared assets
- sessions_controller_test.rb: remove stale require and dead rescue_action
- users_controller_test.rb: assert button[type=submit] not input[type=submit]
  (Rails 8 button_to renders &lt;button&gt; not &lt;input&gt;)
- test_helper.rb: node.reload after children.create! (awesome_nested_set
  3.9.0 does not refresh parent in memory after callback)
- 129 runs, 339 assertions, 3 failures, 0 errors — identical baseline to 7.2
</content>
</entry>
<entry>
<title>Update pg gem to ~&gt; 1.5 now that PostgreSQL 16 is in use</title>
<updated>2026-06-26T19:49:46Z</updated>
<author>
<name>Charlie Root</name>
<email>root@web.ccc-migrate-target.local</email>
</author>
<published>2026-06-26T19:49:46Z</published>
<link rel='alternate' type='text/html' href='https://erdgeist.org/gitweb/cccms/commit/?id=7c19e71780128fabd60a49960a3a829fa5f3287c'/>
<id>urn:sha1:7c19e71780128fabd60a49960a3a829fa5f3287c</id>
<content type='text'>
</content>
</entry>
<entry>
<title>Stage 5 click-testing fixes</title>
<updated>2026-06-26T11:40:55Z</updated>
<author>
<name>erdgeist</name>
<email>erdgeist@erdgeist.org</email>
</author>
<published>2026-06-26T11:40:55Z</published>
<link rel='alternate' type='text/html' href='https://erdgeist.org/gitweb/cccms/commit/?id=811bb04649365b0faaa00b1e0810bb101a4d19b1'/>
<id>urn:sha1:811bb04649365b0faaa00b1e0810bb101a4d19b1</id>
<content type='text'>
- Fix link_to :method → button_to for all PUT/DELETE actions
- Add button_to CSS reset to admin.css for visual consistency
- Fix admin layout: replace broken jquery/jquery_ujs pipeline refs with
  admin_bundle via sprockets; add sprockets-rails, jquery-ui-rails gems
- Add app/assets/javascripts/admin_bundle.js pipeline manifest
- Fix event_information helper: use safe_join to avoid double-escaping
- Fix nodes_helper: to_s(:db) → to_fs(:db) for event times
- Fix revisions view: eliminate nested forms; diff button uses vanilla JS
  to collect radio button values before POST
- Fix config/environments/development.rb and test.rb: cache_classes →
  enable_reloading
- Add routing_filter_rails71_patch.rb version guard
- Move LockedByAnotherUser to own file for Zeitwerk autoloading
- Fix Globalize fallbacks via config.i18n.fallbacks in application.rb
</content>
</entry>
<entry>
<title>Stage 5 fixes: RouteWithParams removal, Globalize fallbacks, search stub, to_s(:db) → to_fs(:db), LockedByAnotherUser autoload, test environment config</title>
<updated>2026-06-26T03:19:28Z</updated>
<author>
<name>erdgeist</name>
<email>erdgeist@erdgeist.org</email>
</author>
<published>2026-06-26T03:19:28Z</published>
<link rel='alternate' type='text/html' href='https://erdgeist.org/gitweb/cccms/commit/?id=a1ddc25da0d2aa79a4d9216ef7792f26233bd38e'/>
<id>urn:sha1:a1ddc25da0d2aa79a4d9216ef7792f26233bd38e</id>
<content type='text'>
- Remove safe_path helper and content_path shim from link_helper.rb
- Update all safe_path call sites in views to use named route helpers directly
- Fix Globalize fallbacks via config.i18n.fallbacks in application.rb, remove i18n initializer
- Stub Node.search returning none (search disabled pending PostgreSQL upgrade)
- Replace to_s(:db) with to_fs(:db) in node.rb, nodes_helper.rb, link_helper.rb, admin view
- Move LockedByAnotherUser to app/models/locked_by_another_user.rb for Zeitwerk autoloading
- Fix config/environments/test.rb: config.assets removed, cache_classes → enable_reloading,
  test_order removed, minitest pinned to ~&gt; 5.25
- Fix config/environments/development.rb: cache_classes → enable_reloading
- Park search vector migration in doc/ pending PostgreSQL and plpgsql availability
</content>
</entry>
<entry>
<title>Stage 5: Rails 6.1 → 7.2 on Ruby 3.2.11</title>
<updated>2026-06-26T02:05:04Z</updated>
<author>
<name>erdgeist</name>
<email>erdgeist@erdgeist.org</email>
</author>
<published>2026-06-26T02:05:04Z</published>
<link rel='alternate' type='text/html' href='https://erdgeist.org/gitweb/cccms/commit/?id=fa0ccc43010297c0c10e3075095c0a9171989498'/>
<id>urn:sha1:fa0ccc43010297c0c10e3075095c0a9171989498</id>
<content type='text'>
- Bump Rails to 7.2.3, Ruby to 3.2.11 (new gemset rails7-upgrade)
- pg pinned to 1.4.6 (bridge: Ruby 3.2 compatible, PostgreSQL 9.6 tolerant)
- acts-as-taggable-on → 12.x (Rails 7.2 + Ruby 3.2 support)
- awesome_nested_set → 3.7.0 (Rails 7.2 support, avoids 3.9.0 lft/rgt bug)
- globalize → 7.0 (Rails 7.x required)
- libxml-ruby → 5.x (Ruby 3.2 required)
- unicorn → 6.x; fix unicorn.rb: RAILS_ROOT→Rails.root, RAILS_ENV→ENV,
  File.exists?→File.exist?
- Add puma for development server
- Remove dead initializers: assets.rb, ruby2.rb, backtrace_silencers.rb,
  new_rails_defaults.rb
- Fix File.exists? → File.exist? in page.rb and authors_importer.rb
- Add routing_filter_rails71_patch.rb (restores params[:locale] on Rails 7.1+)
</content>
</entry>
</feed>
