Skip to content

Remove the core fonts a new install wouldn't have on the upgrade to 6.19 - #1998

Merged
jakejackson1 merged 1 commit into
developmentfrom
feature/core-font-upgrade-prune
Nov 6, 2026
Merged

jakejackson1 merged 1 commit into
developmentfrom
feature/core-font-upgrade-prune

Conversation

@gravitypdf-bot

@gravitypdf-bot gravitypdf-bot commented Nov 2, 2026 •

Copy link
Copy Markdown
Contributor

Summary

Sites that ran the old Core Font installer carry all 82 core font files (about 91 MB) in their fonts folder. Missing core fonts now download when needed, so on the upgrade to 6.19 this PR deletes the core fonts a new install wouldn't have. Anything still needed downloads again the next time a PDF uses it.

  • What's kept: the default font, the site's language fonts, files from required font sources, and the fonts the active forms' PDFs select.
  • Only unmodified installer files: a file is deleted only when it's on the v1.0.0 manifest (the files the old Core Font installer downloaded) and its size and SHA-1 match it. Modified copies, files that aren't core fonts, and the plugin's bundled fonts/ folder are left alone.
  • Downloads off: a font that downloads are turned off for, through gfpdf_auto_install_fonts or GPDF_AUTO_INSTALL_FONTS, is kept, since the site couldn't get it back.
  • When: only on upgrades from before 6.19.0, never on a new install. On Multisite, once per network, because the fonts folder is shared.
  • Uninstall: deletes the gfpdf_core_font_pruned network option.
  • Logging: a summary of the files and bytes removed, plus any font it kept because downloads are off, or couldn't delete.
  • Dependencies: updates mpdf/mpdf to the gravitypdf-v6 tip (dehinted bundled fonts, Strip TrueType hinting from the bundled fonts whose licences allow it mpdf#850 and Strip TrueType hinting from Khmer OS, Ayar and MPH 2B Damase (v6) mpdf#854, and the link border fix, Write the border entry inside internal link dictionaries (v6) mpdf#852), and the core font manifest to mpdf-core-fonts v1.1.1 (47 dehinted fonts with new hashes). The four DejaVu test fixtures now use the v1.1.1 files.
  • Installer files: v1.1.1 dehinted 47 fonts, so a 6.18 site's files no longer match the current manifest. The core source gains a frozen legacy_manifest, fonts/core-fonts-v1.0.0.php, which the prune checks against and record adoption also accepts, so 6.18 Font Manager records of installer files are still adopted.

Try it

  1. On a 6.18 site, install the core fonts from the Tools tab, so wp-content/uploads/PDF_EXTENDED_TEMPLATES/fonts/ has all 82 files.
  2. Pick DejaVu Serif as one PDF's font, and leave the default font unset.
  3. Switch to this branch and load any admin page to run the upgrade.
  4. The fonts folder now has only DejaVu Sans Condensed (the default font the upgrade saves), DejaVu Serif and the fonts of the site's languages. With logging on, the log shows "Core Font cleanup complete" with the count and bytes removed.
  5. View a PDF that uses a removed font, e.g. Free Serif. The font downloads again and the PDF renders in it.
  6. Repeat from step 1 with define( 'GPDF_AUTO_INSTALL_FONTS', false ); in wp-config.php. Nothing is deleted.

Test plan

  • Full single-site and multisite PHPUnit passed before the rebase onto development and the /simplify pass; CI covers the final commit.
  • Locally, the 359 tests in the font downloader, font sources, required fonts, upgrade routine, uninstaller, Git_Blob, font rendering, System Report and removed-methods classes pass, bar four environment-only failures (chmod checks running as root, and the harness shim's define warning).
  • A real v1.0.0 file is pruned on upgrade, and a Font Manager record of one is adopted, against the shipped v1.0.0 manifest.
  • Prune: deletes unmodified fonts and licences; keeps kept, modified (same and other size) and non-core files; never hashes kept files or those of another size; deletes nothing without a manifest or with downloads off; logs a failed delete; handles a missing fonts folder.
  • A Font Manager record whose file copies a core font loses it, and the finder downloads it again on use.
  • Upgrade: runs on 6.18 → 6.19 and 6.17.2 → 7.0, not on a new install or 6.19.0 → 6.19.1; keeps the saved default font; once per network on Multisite.
  • PHPCS is clean.
  • CI is green.
More info

Model_Font_Downloader::prune( ?array $keep = null ) walks the core source's legacy manifest (Model_Font_Sources::get_legacy_manifest( 'core' ), mpdf-core-fonts v1.0.0), not the folder, so it only ever touches manifest names. The keep list defaults to the downloader's own Model_Required_Fonts::get_required_font_files(), the same set sync() downloads, and is only built once the manifest has loaded. Per file, it checks in this order: kept, on disk, same size, downloads on, then the git blob SHA-1. It deletes through wp_delete_file_from_directory() against the fonts folder, and returns the files it removed.

Controller_Upgrade_Routines::remove_unneeded_core_fonts() runs in the existing < 6.19.0 block, after save_unset_default_font( 'dejavusanscondensed' ), so the default it saves is kept.

  • The keep set already includes the upgrading site's selections, so the plan's ( true ) argument isn't needed.
  • On Multisite, add_site_option( Model_Font_Downloader::PRUNED ) claims the prune before it runs, so a second site's upgrade skips it. The selections are those of the site whose request runs the upgrade, with no switch_to_blog(). Other sites' fonts download again the next time they render a PDF that needs them.
  • The controller resolves the downloader through GPDFAPI::get_mvc_class() with an instanceof guard, as adopt_font_source_records() does; its constructor is unchanged.

legacy_manifest: a source key beside the existing legacy hash map. get_known_files() folds it in, so adopt_records( 'core' ) matches v1.0.0 and v1.1.1 copies. The file is frozen; fonts/README.md records the command that wrote it, and it goes when the 6.19 upgrade routine does.

Tests: the fonts-folder path helper the downloader and upgrade tests each had moves into CopiesFontFixtures::font_path().

Accepted: fonts used only by inactive or trashed forms, and a Font Manager record whose file is a byte-identical core font that no PDF selects, are removed. Both download again when used.

Snapshots: none changed.

@github-actions

github-actions Bot commented Nov 2, 2026 •

Copy link
Copy Markdown
Contributor

Coverage report for commit: 56936aa
File: ./tmp/jest-coverage/clover.xml

Cover ┌─────────────────────────┐ Freq.
   0% │ ░░░░░░░░░░░░░░░░░░░░░░░ │  0.0%
  10% │ ░░░░░░░░░░░░░░░░░░░░░░░ │  0.0%
  20% │ ░░░░░░░░░░░░░░░░░░░░░░░ │  0.0%
  30% │ ░░░░░░░░░░░░░░░░░░░░░░░ │  0.0%
  40% │ ░░░░░░░░░░░░░░░░░░░░░░░ │  0.0%
  50% │ ░░░░░░░░░░░░░░░░░░░░░░░ │  0.0%
  60% │ ░░░░░░░░░░░░░░░░░░░░░░░ │  0.0%
  70% │ █░░░░░░░░░░░░░░░░░░░░░░ │  1.7%
  80% │ ███░░░░░░░░░░░░░░░░░░░░ │  8.5%
  90% │ ███████░░░░░░░░░░░░░░░░ │ 18.6%
 100% │ ███████████████████████ │ 71.2%
      └─────────────────────────┘
 *Legend:* █ = Current Distribution 
Summary - Lines: 92.90% | Methods: 87.66% | Branches: 81.85%
FilesLinesMethodsBranches
src/assets/js/react/actions
   fontManager.js100.00%100.00%100.00%
   templates.js100.00%100.00%100.00%
src/assets/js/react/components/Alert
   Alert.js100.00%100.00%100.00%
src/assets/js/react/components
   CustomHashRouter.js100.00%100.00%100.00%
   Empty.js100.00%100.00%100.00%
   ShowMessage.js80.65%80.00%72.22%
   Spinner.js100.00%100.00%100.00%
src/assets/js/react/components/FontManager
   AddFont.js100.00%100.00%100.00%
   AddUpdateFontFooter.js85.00%50.00%88.71%
   AdvancedButton.js100.00%100.00%100.00%
   FontList.js100.00%50.00%65.22%
   FontListAlertMessage.js100.00%100.00%100.00%
   FontListHeader.js100.00%100.00%100.00%
   FontListIcon.js100.00%100.00%100.00%
   FontListItems.js84.15%62.50%65.57%
   FontListSkeleton.js100.00%100.00%100.00%
   FontManager.js76.47%57.14%50.00%
   FontManagerBody.js96.30%96.43%90.29%
   FontManagerHeader.js100.00%100.00%100.00%
   FontVariant.js90.00%60.00%70.00%
   FontVariantLabel.js100.00%100.00%100.00%
   InitialAddUpdateState.js100.00%100.00%100.00%
   SearchBox.js90.00%66.67%69.23%
   TemplateTooltip.js100.00%75.00%100.00%
   UpdateFont.js75.00%50.00%75.00%
src/assets/js/react/components/Modal
   CloseDialog.js93.33%66.67%70.59%
src/assets/js/react/components/Template
   TemplateActivateButton.js100.00%100.00%100.00%
   TemplateButton.js85.71%66.67%100.00%
   TemplateContainer.js71.43%66.67%25.00%
   TemplateDeleteButton.js100.00%100.00%70.00%
   TemplateDocsLink.js100.00%100.00%100.00%
   TemplateFooterActions.js100.00%100.00%100.00%
   TemplateHeaderNavigation.js82.35%85.71%70.00%
   TemplateHeaderTitle.js100.00%100.00%100.00%
   TemplateList.js100.00%100.00%100.00%
   TemplateListItem.js100.00%100.00%92.86%
   TemplateListItemComponents.js100.00%100.00%100.00%
   TemplateManagerClosed.js100.00%100.00%100.00%
   TemplateScreenshot.js100.00%100.00%100.00%
   TemplateScreenshots.js100.00%100.00%50.00%
   TemplateSearch.js93.75%88.89%50.00%
   TemplateSingle.js100.00%100.00%100.00%
   TemplateSingleComponents.js100.00%100.00%75.00%
   TemplateUploader.js100.00%100.00%95.00%
   TemplateUploaderContext.js100.00%100.00%100.00%
   TemplateUploaderTile.js100.00%100.00%100.00%
src/assets/js/react/reducers
   fontManagerReducer.js86.25%75.00%75.71%
   index.js100.00%100.00%100.00%
   templateReducer.js100.00%100.00%100.00%
src/assets/js/react/sagas
   fontManager.js86.96%90.00%83.33%
   index.js100.00%100.00%100.00%
   templates.js91.30%100.00%100.00%
src/assets/js/react/selectors
   getTemplates.js91.11%100.00%83.33%
src/assets/js/react/utilities/FontManager
   adjustFontListHeight.js100.00%100.00%100.00%
   associatedFontManagerSelectBox.js94.44%100.00%66.67%
   fontManagerReducer.js100.00%100.00%100.00%
   toggleUpdateFont.js100.00%100.00%100.00%
src/assets/js/react/utilities/Template
   hasPendingUpload.js100.00%100.00%100.00%
src/assets/js/react/utilities
   withRouterHooks.js100.00%100.00%100.00%

🤖 Jest coverage report

@github-actions

github-actions Bot commented Nov 2, 2026 •

Copy link
Copy Markdown
Contributor

Coverage report for commit: 56936aa
File: tmp/coverage/report-xml/merged.xml

Cover ┌─────────────────────────┐ Freq.
   0% │ ██████░░░░░░░░░░░░░░░░░ │  7.6%
  10% │ ░░░░░░░░░░░░░░░░░░░░░░░ │  0.0%
  20% │ █░░░░░░░░░░░░░░░░░░░░░░ │  0.4%
  30% │ █░░░░░░░░░░░░░░░░░░░░░░ │  1.3%
  40% │ █░░░░░░░░░░░░░░░░░░░░░░ │  0.4%
  50% │ ███████░░░░░░░░░░░░░░░░ │  9.4%
  60% │ █░░░░░░░░░░░░░░░░░░░░░░ │  0.9%
  70% │ ██░░░░░░░░░░░░░░░░░░░░░ │  2.7%
  80% │ █████████████░░░░░░░░░░ │ 17.0%
  90% │ ███████████████████████ │ 32.1%
 100% │ █████████████████████░░ │ 28.1%
      └─────────────────────────┘
 *Legend:* █ = Current Distribution 
Summary - Lines: 89.17% | Methods: 95.58%
FilesLinesMethodsBranches
/var/www/html/wp-content/plugins/gravity-pdf
   api.php98.14%100.00%100.00%
   gravity-pdf-updater.php53.97%100.00%100.00%
   pdf.php59.82%81.25%100.00%
/var/www/html/wp-content/plugins/gravity-pdf/src/Controller
   Controller_Actions.php99.10%100.00%100.00%
   Controller_Activation.php95.83%100.00%100.00%
   Controller_Custom_Fonts.php95.09%100.00%100.00%
   Controller_Debug.php100.00%100.00%100.00%
   Controller_Export_Entries.php96.77%100.00%100.00%
   Controller_Font_Downloader.php100.00%100.00%100.00%
   Controller_Font_Sources.php100.00%100.00%100.00%
   Controller_Form_Settings.php87.37%90.00%100.00%
   Controller_Install.php100.00%100.00%100.00%
   Controller_Mergetags.php100.00%100.00%100.00%
   Controller_PDF.php81.46%100.00%100.00%
   Controller_Pdf_Cache.php100.00%100.00%100.00%
   Controller_Pdf_Queue.php85.27%87.50%100.00%
   Controller_Save_Core_Fonts.php91.67%100.00%100.00%
   Controller_Settings.php86.90%100.00%100.00%
   Controller_Shortcodes.php100.00%100.00%100.00%
   Controller_System_Report.php100.00%100.00%100.00%
   Controller_Templates.php100.00%100.00%100.00%
   Controller_Uninstaller.php83.33%77.78%100.00%
   Controller_Upgrade_Routines.php94.39%100.00%100.00%
   Controller_Webhooks.php100.00%100.00%100.00%
   Controller_Zapier.php100.00%100.00%100.00%
/var/www/html/wp-content/plugins/gravity-pdf/src/Exceptions
   GravityPdfDatabaseUpdateException.php50.00%100.00%100.00%
   GravityPdfDomainException.php50.00%100.00%100.00%
   GravityPdfException.php50.00%100.00%100.00%
   GravityPdfFontNotFoundException.php50.00%100.00%100.00%
   GravityPdfIdException.php50.00%100.00%100.00%
   GravityPdfModelNotUpdatedException.php50.00%100.00%100.00%
   GravityPdfNotATemplateException.php50.00%100.00%100.00%
   GravityPdfRuntimeException.php50.00%100.00%100.00%
   GravityPdfShortcodeEntryIdException.php50.00%100.00%100.00%
   GravityPdfShortcodePdfConditionalLogicFailedException.php50.00%100.00%100.00%
   GravityPdfShortcodePdfConfigNotFoundException.php50.00%100.00%100.00%
   GravityPdfShortcodePdfInactiveException.php50.00%100.00%100.00%
/var/www/html/wp-content/plugins/gravity-pdf/src/Helper/Fields
   Field_Address.php92.86%100.00%100.00%
   Field_Chainedselect.php66.67%75.00%100.00%
   Field_Checkbox.php94.44%100.00%100.00%
   Field_Consent.php95.00%100.00%100.00%
   Field_Coupon.php--100.00%
   Field_Creditcard.php83.33%100.00%100.00%
   Field_Date.php83.33%100.00%100.00%
   Field_Default.php83.33%100.00%100.00%
   Field_Discount.php44.00%75.00%100.00%
   Field_Email.php83.33%100.00%100.00%
   Field_Fg_Ls_Consent.php92.86%100.00%100.00%
   Field_Fg_Ls_Signature.php73.08%66.67%100.00%
   Field_Fileupload.php95.83%100.00%100.00%
   Field_Form.php90.91%100.00%100.00%
   Field_Hidden.php81.82%100.00%100.00%
   Field_Html.php89.47%100.00%100.00%
   Field_Image_Choice.php86.67%100.00%100.00%
   Field_Likert.php97.22%100.00%100.00%
   Field_List.php92.41%100.00%100.00%
   Field_Multi_Choice.php50.00%100.00%100.00%
   Field_Multiselect.php92.59%100.00%100.00%
   Field_Name.php84.62%100.00%100.00%
   Field_Number.php83.33%100.00%100.00%
   Field_Option.php96.15%100.00%100.00%
   Field_Page.php83.33%100.00%100.00%
   Field_Phone.php94.55%100.00%100.00%
   Field_Poll.php93.75%100.00%100.00%
   Field_Post_Category.php85.00%100.00%100.00%
   Field_Post_Content.php82.35%100.00%100.00%
   Field_Post_Custom_Field.php50.00%100.00%100.00%
   Field_Post_Excerpt.php81.82%100.00%100.00%
   Field_Post_Image.php94.00%100.00%100.00%
   Field_Post_Tags.php90.91%100.00%100.00%
   Field_Post_Title.php81.82%100.00%100.00%
   Field_Product.php92.31%100.00%100.00%
   Field_Products.php84.32%100.00%100.00%
   Field_Quantity.php84.62%100.00%100.00%
   Field_Quiz.php89.74%100.00%100.00%
   Field_Radio.php94.74%100.00%100.00%
   Field_Rank.php95.24%100.00%100.00%
   Field_Rating.php95.24%100.00%100.00%
   Field_Repeater.php97.39%100.00%100.00%
   Field_Section.php90.74%100.00%100.00%
   Field_Select.php94.12%100.00%100.00%
   Field_Shipping.php92.86%100.00%100.00%
   Field_Signature.php71.11%100.00%100.00%
   Field_Slim.php82.35%100.00%100.00%
   Field_Slim_Post.php91.30%100.00%100.00%
   Field_Subtotal.php65.38%75.00%100.00%
   Field_Survey.php95.00%100.00%100.00%
   Field_Tax.php32.00%50.00%100.00%
   Field_Text.php81.82%100.00%100.00%
   Field_Textarea.php91.18%100.00%100.00%
   Field_Time.php81.82%100.00%100.00%
   Field_Tos.php92.86%100.00%100.00%
   Field_Total.php88.00%100.00%100.00%
   Field_Website.php85.71%100.00%100.00%
/var/www/html/wp-content/plugins/gravity-pdf/src/Helper/Fonts
   FlushCache.php92.31%100.00%100.00%
   LocalFile.php88.89%100.00%100.00%
   LocalFilesystem.php66.67%100.00%100.00%
   SupportsOtl.php87.50%100.00%100.00%
   TtfFontValidation.php84.62%100.00%100.00%
/var/www/html/wp-content/plugins/gravity-pdf/src/Helper
   Helper_Abstract_Addon.php94.09%100.00%100.00%
   Helper_Abstract_Config_Settings.php75.00%100.00%100.00%
   Helper_Abstract_Controller.php-100.00%100.00%
   Helper_Abstract_Field_Products.php89.47%66.67%100.00%
   Helper_Abstract_Fields.php96.10%95.83%100.00%
   Helper_Abstract_Fields_Input_Type.php84.00%100.00%100.00%
   Helper_Abstract_Form.php--100.00%
   Helper_Abstract_Model.php100.00%100.00%100.00%
   Helper_Abstract_Options.php77.13%79.66%100.00%
   Helper_Abstract_Pdf_Shortcode.php94.67%95.65%100.00%
   Helper_Abstract_View.php96.77%100.00%100.00%
   Helper_Async_Notifications.php64.29%100.00%100.00%
   Helper_Data.php98.25%100.00%100.00%
   Helper_Field_Container.php92.31%100.00%100.00%
   Helper_Field_Container_Gf25.php92.00%100.00%100.00%
   Helper_Field_Container_Void.php16.67%-100.00%
   Helper_Form.php80.65%64.29%100.00%
   Helper_Interface_Actions.php-100.00%100.00%
   Helper_Interface_Config.php50.00%100.00%100.00%
   Helper_Interface_Config_Settings.php50.00%100.00%100.00%
   Helper_Interface_Deprecated_Features.php50.00%100.00%100.00%
   Helper_Interface_Extension_Settings.php-100.00%100.00%
   Helper_Interface_Extension_Uninstaller.php-100.00%100.00%
   Helper_Interface_Field_Pdf_Config.php50.00%100.00%100.00%
   Helper_Interface_Filters.php-100.00%100.00%
   Helper_Interface_Setup_TearDown.php50.00%100.00%100.00%
   Helper_Interface_Url_Signer.php-100.00%100.00%
   Helper_Logger.php-100.00%100.00%
   Helper_Misc.php89.17%100.00%100.00%
   Helper_Mpdf.php50.00%100.00%100.00%
   Helper_Notices.php92.98%100.00%100.00%
   Helper_Options_Fields.php98.10%100.00%100.00%
   Helper_PDF.php88.61%97.56%100.00%
   Helper_PDF_List_Table.php84.50%92.31%100.00%
   Helper_Pdf_Queue.php84.31%100.00%100.00%
   Helper_QueryPath.php80.00%100.00%100.00%
   Helper_Render_Health.php85.71%100.00%100.00%
   Helper_Sha256_Url_Signer.php90.91%100.00%100.00%
   Helper_Singleton.php100.00%100.00%100.00%
   Helper_Templates.php97.29%100.00%100.00%
   Helper_Trait_Logger.php25.00%-100.00%
   Helper_Trait_Removed_Methods.php100.00%100.00%100.00%
   Helper_Url_Signer.php84.82%100.00%100.00%
/var/www/html/wp-content/plugins/gravity-pdf/src/Helper/Licensing
Table truncated to fit comment

🤖 PHPUnit coverage report

@gravitypdf-bot
gravitypdf-bot force-pushed the feature/core-font-upgrade-prune branch from a28fb49 to 3e03eb0 Compare November 2, 2026 06:47
@gravitypdf-bot
gravitypdf-bot force-pushed the feature/core-font-upgrade-prune branch from 3e03eb0 to 21789c6 Compare November 2, 2026 06:50
@gravitypdf-bot
gravitypdf-bot force-pushed the feature/core-font-upgrade-prune branch from 21789c6 to 9c38e63 Compare November 3, 2026 09:28
@jakejackson1
jakejackson1 added this pull request to stack #2001 November 3, 2026 09:31
@jakejackson1
jakejackson1 removed this pull request from stack #2001 November 3, 2026 09:32
@jakejackson1
jakejackson1 force-pushed the feature/core-font-upgrade-prune branch from 9c38e63 to 6610982 Compare November 3, 2026 23:23
@gravitypdf-bot
gravitypdf-bot force-pushed the feature/core-font-upgrade-prune branch from 6610982 to bfaf443 Compare November 4, 2026 01:40
Base automatically changed from refactor/remove-tools-tab to development November 5, 2026 03:04
@gravitypdf-bot
gravitypdf-bot force-pushed the feature/core-font-upgrade-prune branch 2 times, most recently from 38baf0d to ce1d9b5 Compare November 5, 2026 03:19
Sites that ran the old Core Font installer carry all 82 files (~91 MB) in the uploads fonts folder. Now that missing
core fonts are downloaded on use, the upgrade deletes everything outside the required set: the default font (after the
upgrade saves DejaVu Sans Condensed for sites that never chose one), the site's language fonts, required sources' files
and the fonts the active forms' PDFs select.

Model_Font_Downloader::prune() walks the manifest rather than the folder, so it only ever touches manifest names. Its
keep list defaults to the downloader's own Model_Required_Fonts, the set sync() downloads, so the two can't drift.
It skips kept files before any stat, checks size before hashing, and deletes a file (font or licence) only when its
git blob SHA-1 matches, so kept, user-modified and non-core files are never hashed or removed. A manifest that fails to
load deletes nothing. A font that downloads are turned off for (the gfpdf_auto_install_fonts filter, per file, or
GPDF_AUTO_INSTALL_FONTS) stays, since the site couldn't get it back; those are logged, and a summary of the files and
bytes removed is always logged. Deletion goes through wp_delete_file_from_directory(), and a failed delete is logged.

The step runs from Controller_Upgrade_Routines on upgrades from before 6.19.0, never on new installs, resolving the
downloader through GPDFAPI::get_mvc_class() as adopt_font_source_records() does. The fonts folder is network-wide, so a
Multisite runs it once: add_site_option( Model_Font_Downloader::PRUNED ) claims it, keeping the selections of whichever
site's request upgrades; other sites' fonts come back on their next render. The bundled fonts/ folder is never touched.
Uninstall deletes the gfpdf_core_font_pruned flag.

A Font Manager record whose file is a byte-identical core font loses that file unless a PDF selects it; mPDF asks for
the file by name and the on-demand finder downloads it again, which a test covers.

The tests' fonts-folder path helper moves into CopiesFontFixtures::font_path().

Also updates mpdf/mpdf to the GravityPDF/mpdf gravitypdf-v6 tip (0c6322c: dehinted bundled fonts, #850/#854, and the
internal link border fix, #852), and the core font manifest to mpdf-core-fonts v1.1.1, whose 47 dehinted fonts have
new sizes and hashes. The four DejaVu test fixtures are replaced with their v1.1.1 files to keep matching it.

Sites upgrading from 6.18 hold the installer's v1.0.0 files, so the core source gains a legacy_manifest,
fonts/core-fonts-v1.0.0.php: a frozen copy of the v1.0.0 listing, read only by the 6.19 upgrade. prune() checks files
against it through Model_Font_Sources::get_legacy_manifest( 'core' ), and adopt_records() accepts its hashes alongside
the current manifest's, so a 6.18 Font Manager record of installer-downloaded files is still adopted. A v1.0.0
DejaVu Serif Condensed fixture (the blob already in history) covers both end to end.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
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.

2 participants