|  | 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. |