Replies: 3 comments
|
For users on 6.x or earlier, I would publish a staged migration path before asking them to try the latest build. The main risk is not the Git pull itself; it is that a newer structure or configuration format can turn a working personal system into a manual reconstruction project. A safe upgrade guide should include:
For a major jump, I would recommend cloning the current setup into a separate directory, running the migration there, and comparing the resulting structure before touching the live 6.x installation. Keep the old directory and tag/commit until the new version has survived a normal work cycle. If there are several historical formats, a one-shot importer from the oldest supported version is often less confusing than documenting every pairwise upgrade. The guide should also say what is intentionally not migrated, because silent omission is worse than an explicit manual step. The missing information needed to give a precise command is the exact 6.x release and whether the setup uses the default layout or custom paths. Those two facts determine whether a direct upgrade is safe or whether an intermediate release is needed. |
|
We did this jump twelve days ago — a heavily modified 6.0.5 to 7.1.1 — and the checklist above matches what actually mattered. Some numbers from the other side of it, plus the two things that bit us that no checklist predicted. What we didThe migration itself was by hand, phase by phase, with the old tree kept intact and read-only rather than deleted. That part worked and I would do it the same way again: the old install is still on disk, still readable, and we go back to it for history several times a week. Keeping the predecessor is worth more than the disk it costs — not as a rollback (we never rolled back) but as a reference for "how did this used to work". What we skipped, and paid for, was measuring the result. For eleven days we assumed the new install was "7.1.1 plus a few tweaks" without ever checking. Last night we finally compared the extracted release tree against the install, file by file, by SHA-256:
Two of those numbers are lies you should expect to see yourself. The 98 "missing" were almost entirely the Anyone can run this today, before upgrading, with no tooling: download the release tarball for the version you are on, hash every file in The two things that bit us1. Migration detectors that could not answer their own question. The migration registry ships detectors that report each step as applied or missing. One of them tested for The general shape: a detector that has never been made to fail is an assertion wearing a lab coat. Before you trust "7 of 7 applied", make one of them go red on purpose. 2. Scheduled jobs survive the version change; their targets do not. launchd agents live outside the repo, in What we built, and how it answers the six pointsBecause the delta turned out to be small but load-bearing, we built a registry of it — and it maps onto the checklist above more directly than we expected:
The verdict we care about most is the fourth one: a fix that works without our change too, because upstream has since fixed the underlying defect. That does not retire anything automatically — it emits a comparison and a human decides. We have a patch whose upstream issue reads CLOSED while the fix never landed in the upstream file, so anything that drops local changes on issue status will delete live guards. An issue state is an opinion; a defect that will not reproduce is a fact; and two working solutions still do not choose between themselves. And the problem we caused ourselvesBuilding that verifier, we wrote a fork bomb. The upgrade check spawns the verifier; a probe in the verifier spawned the upgrade check to measure whether it mutated anything. Neither had a recursion guard, because each was written believing it was the one doing the verifying. Roughly 700 processes in four minutes, every one of them fetching from the network, and it drained the unauthenticated GitHub API bucket (60/hour per IP) so that the tool then answered 403 to itself for an hour. It was caught because the bandwidth was noticed — nothing reported an error, since every individual process was behaving exactly as designed. Two transferable lessons: the guard belongs in the child's environment at the spawn site, never exported into the process (an exported value outlives the command and silently disables the probe in legitimate runs); and "cannot answer from here" deserves a different verdict from "tried and failed", printed rather than skipped silently. The negative pole for a fork bomb is pleasingly simple, too: the command has to terminate. Full write-up of the mechanism is in #1613 if it is useful. None of it is a substitute for the staged path and the version map you are asking for — those have to come from the project. But the part a user can own is knowing exactly what their own delta is, and having something that goes red when an upgrade takes a piece of it away, instead of finding out weeks later when the bug you fixed in March comes back looking new. |
|
This should be significantly improved in the last two releases, and especially the latest one. |
Uh oh!
There was an error while loading. Please reload this page.
I find documentation really lacking on this front, and frankly, it prevents me as a user from being able to get the latest build (because I know that it might result in my spending an inordinate amount of time that I don't have trying to get my setup right). To be clear, I really love the setup that I have right now.
All reactions