1<!-- 2 Licensed to the Apache Software Foundation (ASF) under one 3 or more contributor license agreements. See the NOTICE file 4 distributed with this work for additional information 5 regarding copyright ownership. The ASF licenses this file 6 to you under the Apache License, Version 2.0 (the 7 "License"); you may not use this file except in compliance 8 with the License. You may obtain a copy of the License at 9 10 http://www.apache.org/licenses/LICENSE-2.0 11 12 Unless required by applicable law or agreed to in writing, 13 software distributed under the License is distributed on an 14 "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 15 KIND, either express or implied. See the License for the 16 specific language governing permissions and limitations 17 under the License. 18--> 19 20# trunk vs AOO42X — Functional Difference Analysis 21 22**Date:** 2026-06-08 23**Repository:** apache/openoffice 24**Branches compared:** `trunk` (future 4.5.x / "dev") vs `AOO42X` (the 4.2.x release branch) 25 26--- 27 28## 1. Summary 29 30| | trunk | AOO42X | 31| --- | --- | --- | 32| Branch tip | `9d1a529d5e` | `4ccec83d37` | 33| Tip commit subject | *Fix crash, uninitialized-return, and buffer bugs…* | *(same)* | 34| Common ancestor | `a341bc611d` (2019-01-09) | (same) | 35| Commits ahead of merge-base | 2933 | 2486 | 36| Commits with **no patch-equivalent** on the other side | 711 | 318 | 37| **Python baseline** | **3.10.18** | **2.7.18** | 38| Apple Silicon (arm64) support | yes | yes | 39| Win64 native UNO C++ bridge | **yes** | **no** | 40 41### Headline findings 42 431. **No functional capability exists in AOO42X that is missing from trunk.** Every 44 functional AOO42X-only commit was verified to be present in trunk (most under a 45 different commit hash because of whitespace/pre-commit divergence — see §2). 46 The 318 "AOO42X-only" commits by patch-id are almost entirely **release-branch 47 bookkeeping** (version/build-number bumps, copyright-year updates, SVN-era 48 `Merge rNNNNN from trunk` backports) plus **spelling / pre-commit whitespace** 49 commits that were applied to AOO42X in a different order than trunk. 50 512. **The two branches are functionally very close.** The vast majority of the 711 52 trunk-only commits are **non-functional**: ~270 are cleanup/typo/spelling/whitespace, 53 plus a large block of README/help/translation/graphics-asset updates and test-tree 54 reorganization. Most genuinely-functional work (editeng 32-bit paragraph indices, 55 WebDAV→curl port, dynamic OpenSSL, gbuild port of pyuno/ure, AdoptOpenJDK detection, 56 frame-toolbar fix) has **already been merged to AOO42X** via squash/merge commits and 57 is present on both branches. The Python file-editing/embedding base feature was merged 58 to both branches on the same day (2026-05-24) as parallel commits (`4bb26738ff` trunk, 59 `c779acf6cb` AOO42X), but trunk has since accumulated ~10 additional post-merge 60 improvements to that feature that are not yet on AOO42X (see §3a). 61 623. **The single biggest functional divergence is the platform baseline:** 63 trunk targets **Python 3.10** and ships a **native 64-bit Windows UNO bridge** 64 (`msvc_win64_x86-64`); AOO42X deliberately stays on **Python 2.7** and has **no 65 Win64 bridge**. These are intentional release-stability decisions, *not* missing 66 cherry-picks (cf. the explicit AOO42X commit *"revert the Python 3.10 changes, 67 keep arm64 support"*). 68 694. A **small set of discrete bug fixes is genuinely trunk-only and is suitable for 70 cherry-pick** to AOO42X (see §3). 71 72--- 73 74## 2. Why the commit counts overstate the divergence 75 76`git cherry`/patch-id reports 711 trunk-only and 318 AOO42X-only commits, but most are 77*not* real functional gaps: 78 79- **Pre-commit whitespace hooks.** trunk adopted `pre-commit` end-of-file-fixer, 80 trailing-whitespace, and mixed-line-ending hooks and ran them across the whole tree 81 (PRs #255–#478). AOO42X ran an equivalent but separately-ordered set. This reformats 82 thousands of files, so the *same logical change* produces *different patch-ids* on the 83 two branches and shows up as "unique" on both sides. 84 - Example: the X11 autoscroll-cursor fix (`assw_curs.h`) appears unique to AOO42X, but 85 the actual hex byte values are **identical** to trunk — only the per-line formatting 86 (tabs, bytes-per-line) differs. 87 88- **Release bookkeeping (AOO42X side).** Build-number pre-allocation, `Update copyright 89 year to 2022…2026`, `Bump up revision after tagging DevN`, MSI version strings, and 90 SVN-era `Merge rNNNNN from trunk` commits dominate the AOO42X-only list. 91 92- **Squash/merge re-landing.** Large features were merged into AOO42X as single squash 93 commits (e.g. `c779acf6 Merge branch 'python-editing-embedding'`, 94 `08fafdc14b AOO42X: revert the Python 3.10 changes, keep arm64 support`), so the 95 individual trunk commits that compose them never match by patch-id even though the 96 resulting source is identical. 97 98### Functional AOO42X-only commits — all verified present in trunk 99 100| AOO42X commit | Verified in trunk as | 101| --- | --- | 102| WebDAV provider serf/apr → curl (`9646dec`) | `51ba086bf1` (+ follow-ups `e469ab6`, `f7b97bf`, `88ba7bc`…) | 103| OpenSSL built as dynamic library (`e350def`) | `8eb9a7e66a`, `0ca5b4b7b8` | 104| editeng 32-bit paragraph indices (PR #164) | `d5edfd0976` + full series; `GetParagraphCount()` returns `sal_uInt32` on both | 105| SpreadsheetML `ss:DateTime` import (`48b860b`) | `195282cf3d` | 106| SpreadsheetML R1C1→A1 column bug (`0f570a5`) | `577fe17932` | 107| ODF `covered-table-cell` / `ss:MergeAcross=0` (`b9aa069`) | `a896732bfc` | 108| icu module parallel build fix (`93c12e1`) | `17604d2661` | 109| APR 1.6.x upgrade / Xcode12 (`316716d`) | `b1dc36c016` | 110| Basic single-line-if comment test #i126272 (`3b5ec47`) | `07758af81c` | 111| Tab function test document (`a1409b3`) | `3b297b4615` | 112| X11 / OS/2 / macOS pointer & cursor corrections | byte-identical in trunk (whitespace-only diff) | 113| macOS SDK / C++ build tweaks (`0e91ffb`, `3d8a723`) | superseded by trunk's newer arm64 `configure.ac` | 114| beanshell d.lst path/version (`2aea6da`, `2dbdbb8`) | identical `bsh-2.1.0.jar` mapping in trunk | 115 116**Conclusion for the "no regression" requirement: PASS.** AOO42X contains nothing 117functional that trunk lacks. 118 119--- 120 121## 3. Trunk-only functionality SUITABLE for cherry-pick to AOO42X 122 123These are discrete, self-contained, low-risk fixes confirmed by file-content diff to be 124trunk-only (the touched file genuinely differs between the branches), and they do **not** 125depend on the Python-3 or Win64 baseline. 126 127### 3a. Recommended cherry-picks (bug fixes) 128 129| Area | trunk commit(s) | What it fixes | Risk | 130| --- | --- | --- | --- | 131| **Calc / MS Excel 2003 XML import** | ~~`d10bb11432`~~ | Importing references to **columns 677–702** (and beyond) was wrong: the old XSLT used a `÷26 − 1` scheme instead of base-26² (676). Touches `spreadsheetml2ooo.xsl`. | Low — isolated XSLT + test doc | 132| **Calc / Excel 2003 XML export** | ~~`b045a72b`~~, `3714104178`, `50f8b0f2cf` | Use the correct `of:`/`ooow:` namespace and R1C1 form when exporting ODF formulas to Excel 2003 XML; allow exporting ODF <1.2 formulas. | Low–medium | 133| **Win64 portability — file handles** | `5a41e572de` | `SvStream::GetFileHandle()` returns `sal_uInt32` capped at 32 bits; widen to support 64-bit Windows. (`tools/inc/tools/stream.hxx`, `strmunx.cxx`) | Low (also benefits non-Win64) | 134| **Win64 portability — time_t** | `926379c890` | `rsc` preprocessor used a 32-bit-capped `long` for `time_t`; use native `time_t`. (`rsc/source/rscpp/cpp3.c`) | Low | 135| **i18n unit tests** | `de76a5a`…`cc5c65fb` | New/relocated i18n JUnit API tests under `test/testuno/source/api` (11 files, absent on AOO42X). | None (test-only) | 136| **`senddoc.sh` — xdg-email** | `a946b6b` | On \*nix, call `xdg-email` to send emails when `MAILER` is unset. The 42-line block is entirely absent from AOO42X's `senddoc.sh` (55-line diff confirmed). | Low — shell script only | 137| **`senddoc.sh` — claws-mail** | `14c7d0b586` | Add claws-mail as a recognised mailer in `senddoc.sh`. Same file, same low risk as xdg-email entry above. | Low — shell script only | 138| **Python editor post-merge fixes** | `a7a66e361b`, `8e23be7474`, `1a9bb40f52`, `1b85a9366d`, `d2cc3a1ab9`, `36f82a9eeb`, `511d7659d6` | ~10 commits improving the Python file-editing/embedding feature landed on trunk after the parallel 2026-05-24 merge. Includes: fixed-width font in editor, `pop()`/`del` key-error fix, module-cache reload fix (ZIP timestamp bug), PythonScriptProvider marked active. | Low–medium (evaluate as a group) | 139 140> Note: the *frame-toolbar-missing-in-Writer* fix (`6bd5b10f`, `1714b106`), 141> AdoptOpenJDK/Java>1.8 detection (`2bf1cfb`, `779db4a`), and the Python 142> file-editing/embedding *base* feature were **checked and are already present on 143> AOO42X** — do **not** re-cherry-pick those. The `xdg-email`, claws-mail, and 144> post-merge Python fixes listed above are **not** present on AOO42X. 145 146### 3b. Build-system / infrastructure (cherry-pick only if AOO42X wants the same CI) 147 148| Area | trunk commit(s) | Notes | 149| --- | --- | --- | 150| **gbuild port** of `pyuno`, `ure`, `packimages`, `apple_remote`, `qadevOOo`, `test`, `testgraphical` | `1c25f25`, `453cfdf`, `147182f`, `e2cbcf0`, `62e2780`, `19ee18f`… | Large; trunk migrated dmake→gbuild for these modules. AOO42X already received the pyuno/ure `.mk` files via merge, but the **JUnit/Ant test migration in `qadevOOo` is the single largest divergence** (2310 files): trunk moved tests into `test/testuno` + JUnit; AOO42X keeps the legacy `qadevOOo/objdsc` CSV-driven framework. Migrating this to a release branch is **high-effort and not recommended** mid-release. | 151| **pre-commit hooks + GitHub Actions linter** | `cc42a29`, `4ae038e`, `819addb`, `ffa4afe`, `98279f3` | trunk's `.pre-commit-config.yaml`, codespell word-list, `actions/checkout@v6`, `actions/cache@v5`. AOO42X already backported an equivalent set (`f30d168 Backport pre-commit and CI configuration from trunk`). | 152 153### 3c. NOT suitable for cherry-pick (intentional baseline / release-policy decisions) 154 155| Item | trunk | AOO42X | Why not | 156| --- | --- | --- | --- | 157| **Python 3.10 baseline** | `PYMAJOR=3 / 3.10.18` | `PYMAJOR=2 / 2.7.18` | AOO42X **explicitly reverted** the Py3.10 change (`08fafdc14b`) to keep the 4.2.x release on Python 2.7. Cherry-picking would change the shipped runtime. | 158| **Native Win64 UNO C++ bridge** (`msvc_win64_x86-64/`) | full directory present | directory **absent** | A whole new architecture target (`b146d3b`, `b7f28a5`, `4844d31`, `2cf0c06`, `d35e03c`, `8a51f61`…). New platform support belongs in a feature release, not a maintenance branch. | 159| Boost / `-std=gnu++98` Clang build tweaks (`8ef8ad0`) | applied | n/a | Tied to trunk's toolchain modernization. | 160| Various version-string / build-number / dev-build branding | trunk = 4.5.x line | AOO42X = 4.2.x line | Branch-identity, must stay divergent. | 161 162--- 163 164## 4. Largest divergence areas (by changed-file count, `git diff trunk AOO42X`) 165 166``` 1672310 main/qadevOOo <- test framework migration (trunk: JUnit/Ant; AOO42X: legacy) 168 28 main/filter <- mostly whitespace + the SpreadsheetML fixes (§3a) 169 26 main/jurt <- JUnit test ports 170 25 main/test <- gbuild/Google-Test port 171 23 main/bridges <- Win64 bridge (§3c) + whitespace 172 21 main/forms <- JUnit complex-test cleanup 173 13 main/connectivity 174 11 test/testuno <- new JUnit api tests (§3a) 175 11 main/solenv 176 10 main/vcl <- pointer assets (whitespace) + Win64 177 10 main/bean <- Win64 fixes for main/bean 178``` 179 180The dominant `qadevOOo` delta is **test-infrastructure modernization**, not product 181functionality. End-user behavior of the two branches is nearly identical apart from the 182Python runtime and Win64 availability. 183 184--- 185 186## 5. Methodology 187 1881. `git merge-base trunk AOO42X` → common ancestor `a341bc611d` (2019-01-09, the 4.2.x 189 branch point). 1902. `git cherry -v AOO42X trunk` / `git cherry -v trunk AOO42X` → patch-id-unique commits 191 in each direction (711 / 318). 1923. Filtered out non-functional commits (cleanup, whitespace, spelling, pre-commit, 193 copyright/version bumps, merges, README/translation/graphics) → ~434 trunk-only 194 "signal" commits, manually triaged. 1954. For every functional AOO42X-only commit, verified presence in trunk by **commit 196 message search and by file-content diff** (`git diff -w trunk AOO42X -- <file>`), 197 distinguishing whitespace-only differences from real ones. 1985. Confirmed key baselines directly from source: `main/python/pyversion.mk` 199 (`PYMAJOR` 3 vs 2), `main/bridges/source/cpp_uno/` directory listing (Win64 bridge), 200 editeng `GetParagraphCount()` signature, pyuno gbuild `.mk` presence. 201 202*All commit hashes in this document were resolved against the working tree on 2026-06-08.* 203