mirror of
https://github.com/tmux/tmux.git
synced 2026-10-12 05:34:24 +00:00
Tweak previous; include SYNCING.md
This commit is contained in:
234
SYNCING.md
Normal file
234
SYNCING.md
Normal file
@@ -0,0 +1,234 @@
|
|||||||
|
# Preamble
|
||||||
|
|
||||||
|
tmux portable is maintained from two repositories:
|
||||||
|
|
||||||
|
* `tmux` is the portable repository. It contains the portability layer,
|
||||||
|
autotools build files, regression tests, documentation, and code needed for
|
||||||
|
platforms outside OpenBSD.
|
||||||
|
* `tmux-openbsd-cutover` is the OpenBSD tmux import repository. Its `master`
|
||||||
|
branch is the OpenBSD tmux history after the OpenBSD Git cutover. Portable
|
||||||
|
merges this branch when importing OpenBSD changes.
|
||||||
|
|
||||||
|
To create the commits in the tmux-openbsd-cutover repo, the source repo is the
|
||||||
|
Github mirror of OpenBSD's src repo:
|
||||||
|
|
||||||
|
```text
|
||||||
|
https://github.com/openbsd/src.git
|
||||||
|
```
|
||||||
|
|
||||||
|
The update automation filters the OpenBSD source tree to `usr.bin/tmux/`,
|
||||||
|
publishes that filtered history as `openbsd-git` in the cutover repository,
|
||||||
|
cherry-picks new filtered commits onto cutover `master`, then merges cutover
|
||||||
|
`master` into portable `master`.
|
||||||
|
|
||||||
|
If you've never used git before, configure your identity before committing:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
git config [--global] user.name "Your name"
|
||||||
|
git config [--global] user.email "you@yourdomain.com"
|
||||||
|
```
|
||||||
|
|
||||||
|
# Repository layout
|
||||||
|
|
||||||
|
The usual local layout is:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
cd /some/where/useful
|
||||||
|
git clone https://github.com/tmux/tmux.git tmux-portable
|
||||||
|
git clone https://github.com/ThomasAdam/tmux-obsd.git tmux-openbsd-cutover
|
||||||
|
```
|
||||||
|
|
||||||
|
The exact directory names do not matter, but the examples below use:
|
||||||
|
|
||||||
|
```text
|
||||||
|
/path/to/tmux-portable
|
||||||
|
/path/to/tmux-openbsd-cutover
|
||||||
|
```
|
||||||
|
|
||||||
|
The cutover repository has three important branches:
|
||||||
|
|
||||||
|
* `master` is the branch portable consumes. It should contain tmux source
|
||||||
|
only, not automation files.
|
||||||
|
* `openbsd-git` is the raw filtered OpenBSD tmux branch generated from
|
||||||
|
OpenBSD src `master`.
|
||||||
|
* `automation` is an orphan branch containing the GitHub Actions workflow. It
|
||||||
|
is separate so that workflow files are not merged into portable.
|
||||||
|
|
||||||
|
# Adding the OpenBSD remote to portable
|
||||||
|
|
||||||
|
In the portable repository, add the cutover repository as a remote:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
cd /path/to/tmux-portable
|
||||||
|
git remote add tmux-openbsd /path/to/tmux-openbsd-cutover
|
||||||
|
git config remote.tmux-openbsd.tagOpt --no-tags
|
||||||
|
```
|
||||||
|
|
||||||
|
If the remote already exists, update it instead:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
git remote set-url tmux-openbsd /path/to/tmux-openbsd-cutover
|
||||||
|
git config remote.tmux-openbsd.tagOpt --no-tags
|
||||||
|
```
|
||||||
|
|
||||||
|
Fetch the cutover master branch explicitly:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
git fetch --no-tags tmux-openbsd master:refs/remotes/tmux-openbsd/master
|
||||||
|
```
|
||||||
|
|
||||||
|
# Automated syncing
|
||||||
|
|
||||||
|
The normal sync is performed by the GitHub Actions workflow in the
|
||||||
|
`automation` branch of the cutover repository. That workflow:
|
||||||
|
|
||||||
|
1. Fetches or clones OpenBSD src using a blobless clone.
|
||||||
|
2. Filters `usr.bin/tmux/` into a local `tmux-openbsd` branch.
|
||||||
|
3. Updates `tmux-openbsd-cutover/openbsd-git`.
|
||||||
|
4. Cherry-picks new `openbsd-git` commits onto cutover `master`.
|
||||||
|
5. Merges cutover `master` into portable `master`.
|
||||||
|
6. Pushes the changed repositories.
|
||||||
|
|
||||||
|
The workflow deliberately runs from the orphan `automation` branch but checks
|
||||||
|
out cutover `master` as the branch to update. This keeps `.github/` out of
|
||||||
|
cutover `master`, so portable does not import workflow files when it merges
|
||||||
|
OpenBSD changes.
|
||||||
|
|
||||||
|
# Manual portable merge
|
||||||
|
|
||||||
|
If the workflow fails while merging into portable, do the merge locally and
|
||||||
|
push the result.
|
||||||
|
|
||||||
|
Start from an up-to-date portable master:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
cd /path/to/tmux-portable
|
||||||
|
git fetch origin
|
||||||
|
git checkout master
|
||||||
|
git pull --ff-only origin master
|
||||||
|
```
|
||||||
|
|
||||||
|
Fetch the cutover branch:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
git remote add tmux-openbsd /path/to/tmux-openbsd-cutover 2>/dev/null || true
|
||||||
|
git config remote.tmux-openbsd.tagOpt --no-tags
|
||||||
|
git fetch --no-tags tmux-openbsd master:refs/remotes/tmux-openbsd/master
|
||||||
|
```
|
||||||
|
|
||||||
|
Merge it:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
git merge --no-ff --log refs/remotes/tmux-openbsd/master
|
||||||
|
```
|
||||||
|
|
||||||
|
Resolve conflicts by deciding whether portable or OpenBSD owns the file.
|
||||||
|
|
||||||
|
Useful commands:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
git checkout --ours path/to/file
|
||||||
|
git add path/to/file
|
||||||
|
```
|
||||||
|
|
||||||
|
This keeps the portable version of a conflicted file.
|
||||||
|
|
||||||
|
```sh
|
||||||
|
git checkout --theirs path/to/file
|
||||||
|
git add path/to/file
|
||||||
|
```
|
||||||
|
|
||||||
|
This takes the OpenBSD/cutover version of a conflicted file.
|
||||||
|
|
||||||
|
Before committing, inspect the result:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
git status
|
||||||
|
git diff --check
|
||||||
|
git diff --cached --stat
|
||||||
|
```
|
||||||
|
|
||||||
|
Then finish and publish:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
git commit
|
||||||
|
git push origin master
|
||||||
|
```
|
||||||
|
|
||||||
|
If the merge attempt is wrong, abort it:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
git merge --abort
|
||||||
|
```
|
||||||
|
|
||||||
|
After pushing a manually resolved merge, rerun the workflow. It should either
|
||||||
|
no-op or continue from the now-merged portable state.
|
||||||
|
|
||||||
|
# Manual cutover update
|
||||||
|
|
||||||
|
Normally this is handled by the workflow. If it must be done manually, update
|
||||||
|
`openbsd-git` in the cutover repository from a filtered OpenBSD src checkout,
|
||||||
|
then cherry-pick the new filtered commits onto cutover `master`.
|
||||||
|
|
||||||
|
The important range is:
|
||||||
|
|
||||||
|
```text
|
||||||
|
origin/openbsd-git..openbsd-git
|
||||||
|
```
|
||||||
|
|
||||||
|
where `origin/openbsd-git` is the previously published filtered OpenBSD tmux
|
||||||
|
branch and `openbsd-git` is the newly generated filtered branch.
|
||||||
|
|
||||||
|
In the cutover repository:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
cd /path/to/tmux-openbsd-cutover
|
||||||
|
git checkout master
|
||||||
|
git cherry-pick origin/openbsd-git..openbsd-git
|
||||||
|
git push origin master openbsd-git
|
||||||
|
```
|
||||||
|
|
||||||
|
Do not put workflow files on cutover `master`; keep them on the orphan
|
||||||
|
`automation` branch.
|
||||||
|
|
||||||
|
# Keeping an eye on libutil in OpenBSD
|
||||||
|
|
||||||
|
A lot of the `compat/` code in tmux comes from OpenBSD libraries, especially
|
||||||
|
imsg. Sometimes APIs change in OpenBSD in ways that require corresponding
|
||||||
|
portable changes. It is worth checking periodically for relevant OpenBSD
|
||||||
|
libutil changes and syncing those files into `compat/` as appropriate.
|
||||||
|
|
||||||
|
# Release tmux for next version
|
||||||
|
|
||||||
|
1. Update and commit README and CHANGES. The former should be checked for
|
||||||
|
anything outdated and updated with a list of things that might break
|
||||||
|
upgrades and the latter should mention all the major changes since the last
|
||||||
|
version.
|
||||||
|
2. Make sure `configure.ac` has the new version number.
|
||||||
|
3. Tag with:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
% git tag -a 2.X
|
||||||
|
```
|
||||||
|
|
||||||
|
Where `2.X` is the next version.
|
||||||
|
|
||||||
|
Push the tag out with:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
% git push --tags
|
||||||
|
```
|
||||||
|
|
||||||
|
4. Build the tarball with `make dist`.
|
||||||
|
5. Check the tarball. If it is good, go here to select the tag just pushed:
|
||||||
|
|
||||||
|
```text
|
||||||
|
https://github.com/tmux/tmux/tags
|
||||||
|
```
|
||||||
|
|
||||||
|
Click "Add release notes", upload the tarball and add a link in the
|
||||||
|
description field to the CHANGES file.
|
||||||
|
6. Clone the tmux.github.io repository, and change the RELEASE version in the
|
||||||
|
Makefile. Commit it, and run `make` to replace `%%RELEASE%%`. Push the
|
||||||
|
result out.
|
||||||
|
7. Change version back to master in `configure.ac`.
|
||||||
Reference in New Issue
Block a user