|  | Preamble | 
|  | ======== | 
|  |  | 
|  | Tmux on SourceForge has two git repositories [1] "tmux-code" and "tmux-openbsd". | 
|  | Here's a description of them: | 
|  |  | 
|  | * "tmux-code" 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). | 
|  |  | 
|  | It is assumed that the person doing the sync has read/write access to the | 
|  | tmux-code repository on SourceForge already. | 
|  |  | 
|  | 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-code and tmux-openbsd cloned, as in: | 
|  |  | 
|  | % cd /some/where/useful | 
|  | % git clone ssh://${USER}@git.code.sf.net/p/tmux/tmux | 
|  | % git clone ssh://${USER}@git.code.sf.net/p/tmux/tmux-openbsd | 
|  |  | 
|  | 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-code" 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-code" repository, as | 
|  | shown by the following command: | 
|  |  | 
|  | % cd /path/to/tmux-code | 
|  | % 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-code" 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-code", we have to ensure the "master" branch from "tmux-openbsd" is | 
|  | up-to-date first, and then reference that update in "tmux-code", as in: | 
|  |  | 
|  | % cd /path/to/tmux-openbsd | 
|  | % git checkout master | 
|  | % git pull | 
|  |  | 
|  | Then back in "tmux-code": | 
|  |  | 
|  | % cd /path/to/tmux-code | 
|  | % git fetch obsd-tmux-code | 
|  |  | 
|  | Creating the necessary branches | 
|  | =============================== | 
|  |  | 
|  | Now that "tmux-code" 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-code" repository: | 
|  |  | 
|  | % git checkout -b obsd-master obsd-tmux/master | 
|  |  | 
|  | Adding in the fake history points | 
|  | ================================= | 
|  |  | 
|  | To tie both the "master" branch from "tmux-code" and the "obsd-master" | 
|  | branch from "tmux-openbsd" together, the fake history points added to the | 
|  | "tmux-code" repository need to be added.  To do this, we must add an | 
|  | additional refspec line, as in: | 
|  |  | 
|  | % cd /path/to/tmux-code | 
|  | % 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-code": | 
|  |  | 
|  | % 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 BULDING 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 | 
|  |  | 
|  | Release tmux for next version | 
|  | ============================= | 
|  |  | 
|  | 1. Comment the "found_debug=yes" line in configure.ac, since releases | 
|  | don't have debugging enabled, otherwise make(1) aborts when | 
|  | preparing the distribution. | 
|  |  | 
|  | 2. 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. | 
|  |  | 
|  | 3. Tag with: | 
|  |  | 
|  | % git tag -a 1.X | 
|  |  | 
|  | Where "1.X" is the next version. | 
|  |  | 
|  | Push the tag out with: | 
|  |  | 
|  | % git push 1.X | 
|  |  | 
|  | 4. Build the tarball with make dist.  Now that it's using autoconf there | 
|  | shouldn't be any weird files (such as the original and rejection files | 
|  | from patch(1)) but it doesn't hurt taking a quick look at it. | 
|  |  | 
|  | 5. Split the release changes into a new file.  This should be named | 
|  | tmux-$VERSION-readme to make sourceforge show it automagically in specific | 
|  | parts of the project page. | 
|  |  | 
|  | 6. Upload the tarball and the above file. Make the tarball the default | 
|  | download by selecting all operating systems under the file details. | 
|  |  | 
|  | 7. Run make update-index.html upload-index.html to replace %%VERSION%%. | 
|  |  | 
|  | 8. Bump version in configure.ac and uncomment "found_debug=yes" to create | 
|  | a debug build by default. | 
|  |  | 
|  | 9. Update freshmeat. | 
|  |  | 
|  | [1] https://sourceforge.net/p/tmux/_list/git |