| Preamble | 
 | ======== | 
 |  | 
 | Tmux portable relies on  repositories "tmux" and "tmux-openbsd". | 
 | Here's a description of them: | 
 |  | 
 | * "tmux" is the portable version, the one which contains code for other | 
 |   operating systems, and autotools, etc., which isn't found or needed in the | 
 |   OpenBSD base system. | 
 |  | 
 | * "tmux-openbsd" is the version of tmux in OpenBSD base system which provides | 
 |   the basis of the portable tmux version. | 
 |  | 
 | Note:  The "tmux-openbsd" repository is actually handled by "git cvsimport" | 
 | running at 15 minute intervals, so a commit made to OpenBSD's tmux CVS | 
 | repository will take at least that long to appear in this git repository. | 
 | (It might take longer, depending on the CVS mirror used to import the | 
 | OpenBSD code). | 
 |  | 
 | If you've never used git before, git tracks meta-data about the committer | 
 | and the author, as part of a commit, hence: | 
 |  | 
 | % git config [--global] user.name "Your name" | 
 | % git config [--global] user.email "you@yourdomain.com" | 
 |  | 
 | Note that, if you already have this in the global ~/.gitconfig option, then | 
 | this will be used.  Setting this per-repository would involve not using the | 
 | "--global" flag above.   If you wish to use the same credentials always, | 
 | pass the "--global" option, as shown. | 
 |  | 
 | This is a one-off operation once the repository has been cloned, assuming | 
 | this information has ever been set before. | 
 |  | 
 | Cloning repositories | 
 | ==================== | 
 |  | 
 | This involves having both tmux and tmux-openbsd cloned, as in: | 
 |  | 
 | % cd /some/where/useful | 
 | % git clone https://github.com/tmux/tmux.git | 
 | % git clone https://github.com/ThomasAdam/tmux-openbsd.git | 
 |  | 
 | Note that you do not need additional checkouts to manage the sync -- an | 
 | existing clone of either repositories will suffice.  So if you already have | 
 | these checkouts existing, skip that. | 
 |  | 
 | Adding in git-remotes | 
 | ===================== | 
 |  | 
 | Because the portable "tmux" git repository and the "tmux-openbsd" | 
 | repository do not inherently share any history between each other, the | 
 | history has been faked between them.  This "faking of history" is something | 
 | which has to be told to git for the purposes of comparing the "tmux" and | 
 | "tmux-openbsd" repositories for syncing.  To do this, we must reference the | 
 | clone of the "tmux-openbsd" repository from the "tmux" repository, as | 
 | shown by the following command: | 
 |  | 
 | % cd /path/to/tmux | 
 | % git remote add obsd-tmux file:///path/to/tmux-openbsd | 
 |  | 
 | So that now, the remote "obsd-tmux" can be used to reference branches and | 
 | commits from the "tmux-openbsd" repository, but from the context of the | 
 | portable "tmux" repository, which makes sense because it's the "tmux" | 
 | repository which will have the updates applied to them. | 
 |  | 
 | Fetching updates | 
 | ================ | 
 |  | 
 | To ensure the latest commits from "tmux-openbsd" can be found from within | 
 | "tmux", we have to ensure the "master" branch from "tmux-openbsd" is | 
 | up-to-date first, and then reference that update in "tmux", as in: | 
 |  | 
 | % cd /path/to/tmux-openbsd | 
 | % git checkout master | 
 | % git pull | 
 |  | 
 | Then back in "tmux": | 
 |  | 
 | % cd /path/to/tmux | 
 | % git fetch obsd-tmux | 
 |  | 
 | Creating the necessary branches | 
 | =============================== | 
 |  | 
 | Now that "tmux" can see commits and branches from "tmux-openbsd" by way | 
 | of the remote name "obsd-tmux", we can now create the master branch from | 
 | "tmux-openbsd" in the "tmux" repository: | 
 |  | 
 | % git checkout -b obsd-master obsd-tmux/master | 
 |  | 
 | Adding in the fake history points | 
 | =================================  | 
 |  | 
 | To tie both the "master" branch from "tmux" and the "obsd-master" | 
 | branch from "tmux-openbsd" together, the fake history points added to the | 
 | "tmux" repository need to be added.  To do this, we must add an | 
 | additional refspec line, as in: | 
 |  | 
 | % cd /path/to/tmux | 
 | % git config --add remote.origin.fetch '+refs/replace/*:refs/replace/*' | 
 | % git fetch origin | 
 |  | 
 | Performing the Sync | 
 | =================== | 
 |  | 
 | Make sure the "master" branch is checked out: | 
 |  | 
 | % git checkout master | 
 |  | 
 | The following will show commits on OpenBSD not yet synched with "tmux": | 
 |  | 
 | % git log master..obsd-master | 
 |  | 
 | From there, merge the result in, fixing up any conflicts which might arise. | 
 |  | 
 | % git merge obsd-master | 
 |  | 
 | Then ensure things look correct by BUILDING the result of that sync: | 
 |  | 
 | % make clean && ./autogen.sh && ./configure && make | 
 |  | 
 | Compare the git merge result with what's on origin/master -- that is, check | 
 | which commits you're about to push: | 
 |  | 
 | % git log origin/master..master | 
 |  | 
 | And if happy: | 
 |  | 
 | % git push origin master | 
 |  | 
 | Keeping an eye on libutil in OpenBSD | 
 | ==================================== | 
 |  | 
 | A lot of the compat/ code in tmux comes from libutil, especially imsg. | 
 | Sometimes the API can change, etc., which might cause interesting problems | 
 | trying to run the portable version of tmux.  It's worth checking | 
 | periodically for any changes to libutil in OpenBSD and syncing those files | 
 | to compat/ as and when 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: | 
 |  | 
 |    % git tag -a 2.X | 
 |  | 
 |    Where "2.X" is the next version. | 
 |  | 
 |    Push the tag out with: | 
 |  | 
 |    % git push --tags | 
 |  | 
 | 4. Build the tarball with 'make dist'. | 
 |  | 
 | 5. Check the tarball.  If it's good, go here to select the tag just pushed: | 
 |  | 
 |    https://github.com/tmux/tmux/tags | 
 |  | 
 |    Click the "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. |