diff options
Diffstat (limited to 'debian/uncrustify-trinity/uncrustify-trinity-0.75.0/release-process.rst')
-rw-r--r-- | debian/uncrustify-trinity/uncrustify-trinity-0.75.0/release-process.rst | 325 |
1 files changed, 325 insertions, 0 deletions
diff --git a/debian/uncrustify-trinity/uncrustify-trinity-0.75.0/release-process.rst b/debian/uncrustify-trinity/uncrustify-trinity-0.75.0/release-process.rst new file mode 100644 index 00000000..f16173a1 --- /dev/null +++ b/debian/uncrustify-trinity/uncrustify-trinity-0.75.0/release-process.rst @@ -0,0 +1,325 @@ +============================ + Uncrustify Release Process +============================ + +.. Update the date in the next line when editing this document! + +*This document was last updated on 2021-05-12, for Uncrustify 0.73.0.* + +This document uses "0.1.2" throughout as an example version number. +Whenever you see this, you should substitute the version number +of the new release being prepared. + +Paths are specified in git syntax, i.e. ``:/`` is the repository root. + +Requirements +============ + +This document assumes you are using a Linux-based OS. +While it should be possible to cut a release on Windows, +using e.g. the `Git for Windows SDK <https://gitforwindows.org/>`_ +or a MinGW_ environment, the names and/or arguments to some commands +may be different. + + +In addition to the build and test requirements for Uncrustify itself +(CMake, a C++ compiler, Python, git), you will also need: + +- tar +- python3-git +- Binutils-mingw-w64 +- Gcc-mingw-w64 +- G++-mingw-w64 +- zip +- wget (optional) +- scp (to update documentation on the SourceForge page) + +Using packages provided by your OS distribution is *strongly* recommended. +(Exact package names may vary depending on your distribution.) +Examples use ``wget`` to download files via command line, +but any mechanism of obtaining files over HTTPS may be employed. + +Preparing a Candidate +===================== + +The first step, obviously, is deciding to make a release. +Prior to making a release, verify that the repository is in a stable state +and that all CI (continuous integration - Travis and AppVeyor) has passed. +This should ensure all tests pass and building +(including cross-compiling) for Windows is working. + +Once the release process is started, +only pull requests needed to fix critical bugs, +or related to the release process, should be accepted. +(This will minimize the need to redo or repeat work +such as updating the documentation, especially the change log.) + +To start the release process, first check that: + +- You are on the ``master`` branch +- Your local clone is up to date +- ``CMAKE_BUILD_TYPE`` is set to ``Release`` (or ``RelWithDebInfo``) +- Your build is up to date +- check the list of authors with scripts/prepare_list_of_authors.sh + +Then, run:: + + $ scripts/release_tool.py init + $ scripts/release_tool.py update path/to/uncrustify + +(Replace ``path/to/uncrustify`` with the path to the Uncrustify executable +you just built, e.g. ``build/uncrustify``.) + +This will create a branch for the release candidate +and perform some automated updates to various files. +With no arguments, ``init`` will prompt you for the new version number, +defaulting to ``x.(y+1).0``, where ``x.y.z`` is the previous release. +The ``--version`` argument may also be used to specify the version +(e.g. if the script will not be able to prompt for input). + +After, you should check that the following files +show the correct version number and option count: + +- ``:/CMakeLists.txt`` (version number only; look for ``UNCRUSTIFY_VERSION``) +- ``:/package.json`` (version number only; you'll see it, the file is tiny) +- ``:/README.md`` (look for "options as of version") +- ``:/documentation/htdocs/index.html`` (look for "options as of version") + +(Note that ``uncrustify`` itself will not show the new version number +until the final release has been tagged.) + +Update Documentation +==================== + +Update ``:/ChangeLog``. +There is a helper script, ``:/scripts/gen_changelog.py``, +that can help extract new options since the previous release: + +.. code:: + + $ scripts/gen_changelog.py uncrustify-0.0.0 + +Replace ``0.0.0`` with the version of the *previous* release. +This will generate a bunch of output like:: + + 0123456789abcdef0123456789abcdef01234567 + Added : better_name Jan 13 1970 + Removed : poor_name Jan 13 1970 + fedcba9876543210fedcba9876543210fedcba98 + Added : new_option_1 Jan 18 1970 + Added : new_option_2 Jan 18 1970 + +Your goal is to turn the "raw" output into something like this:: + + Deprecated options: + - poor_name Jan 13 1970 + Renamed to better_name + + New options: + - new_option_1 Jan 18 1970 + - new_option_1 Jan 18 1970 + +To accomplish this, you will need to inspect any removed options, +possibly consulting the commits in which they were removed, +to determine the reason for deprecation and what replacement is recommended. +(Note that it may not be as simple as "use X instead".) +Also watch for options that were added and subsequently renamed +since the last release. (This has happened a few times. +In such cases, the new name should show up as an ordinary "new" option, +and the old name should be entirely omitted from the change log.) + +It helps to copy the output to a scratch file for editing. +Move deprecated options to the top and add a "Deprecated options:" header, +then add a "New options:" header in front of what's left, +and remove the commit SHAs (``sed -r '/^[[:xdigit:]]{40}/d`` +if you don't want to do it by hand). +Then, check that the options are in order by date; +date of authorship vs. date of merge may cause discrepancies. +Finally, replace occurrences of ``\w+ +:`` with ``-`` +(if your editor supports regular expressions; +otherwise you can individually replace ``Added :`` and ``Removed :``). + +Add a new release header (don't forget to add the date!) to the change log +and insert the list of option changes as created above. +Also fill in the list of resolved issues, new keywords (if any), +as well as any other changes that need to be mentioned. + +If any command line arguments have been added or changed, +including descriptions for the same, check to see if +``:/man/uncrustify.1.in`` needs to be updated. +(Hopefully this happened when the source was changed!) + +Finalize the Code Changes +========================= + +Inspect your working tree. +Use ``git add -p`` to stage the changes made to the documentation +and other artifacts that contain version-dependent information. +Verify that only desired changes are staged, +and that your working tree is otherwise clean. + +Now is a good time to recheck +that everything builds, and that all the tests pass. +This is also a good time to manually test 32- and 64-bit builds. + +When you are ready, commit the changes using: + +.. code:: + + $ scripts/release_tool.py commit + +(If you prefer, you can also commit the changes manually; +the script just fills in the commit message for you.) + +Submit and Tag the Release +========================== + +Push the release candidate branch to GitHub, and create a pull request. +Once the pull request is merged, tag the release using: +Make sure, the file .git/config has the right value: +[remote "origin"] + url = https://github.com/uncrustify/uncrustify.git + +.. code:: + + $ scripts/release_tool.py tag + +Note that this will only work if the merge of the release candidate +is the most recent commit upstream. +Otherwise, the merge commit must be specified by using the ``-c`` option. + +(Tagging the release does not need to be done on any particular branch. +The command will not affect or look at your work tree at all.) + +Create Binaries +=============== + +Now that the release is published, grab a copy of the sources from GitHub: + +.. code:: + + $ wget https://github.com/uncrustify/uncrustify/archive/uncrustify-0.1.2.zip + $ unzip -e uncrustify-0.1.2.zip + +Next, build the 32- and 64-bit Windows binaries: + +.. code:: + + $ cd /path/to/uncrustify-uncrustify-0.1.2 + $ mkdir buildwin-32 + $ cd buildwin-32 + $ cmake -G Ninja \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_TOOLCHAIN_FILE=../cmake/Toolchain-mingw32.cmake \ + -DCMAKE_EXE_LINKER_FLAGS="-static -s" \ + .. + $ ninja + $ cpack + +.. code:: + + $ cd /path/to/uncrustify-uncrustify-0.1.2 + $ mkdir buildwin-64 + $ cd buildwin-64 + $ cmake -G Ninja \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_TOOLCHAIN_FILE=../cmake/Toolchain-mingw64.cmake \ + -DCMAKE_EXE_LINKER_FLAGS="-static -s" \ + .. + $ ninja + $ cpack + +Create a tarball: + +.. code:: + + $ cd /path/to/uncrustify + $ git archive -o uncrustify-0.1.2.tar.gz --prefix=uncrustify-0.1.2/ uncrustify-0.1.2 +TODO: find the best strategie... + +(If you don't have Ninja_, or just don't want to use it for whatever reason, +omit ``-G Ninja`` and run ``make`` instead of ``ninja``.) + +This is also a good time to test the tagged build on Linux: + +.. code:: + + $ wget https://github.com/uncrustify/uncrustify/archive/uncrustify-0.1.2.tar.gz + $ tar xzf uncrustify-0.1.2.tar.gz + $ cd uncrustify-uncrustify-0.1.2 + $ mkdir build + $ cd build + $ cmake -G Ninja -DCMAKE_BUILD_TYPE=Release .. + $ ninja + $ ctest + $ ./uncrustify --version + +Upload to SourceForge +===================== + +- Login as admin under https://sourceforge.net/projects/uncrustify/ +- Change to https://sourceforge.net/projects/uncrustify/files/ +- "Add Folder"; the name should be e.g. "uncrustify-0.1.2" +- Navigate to the new folder + (e.g. https://sourceforge.net/projects/uncrustify/files/uncrustify-0.1.2/) +- "Add File"; upload the following files + (adjusting for the actual version number): + + - README.md + - uncrustify-0.1.2.tar.gz + - buildwin-32/uncrustify-0.1.2_f-win32.zip + - buildwin-64/uncrustify-0.1.2_f-win64.zip + +- "Done" +- Upload the documentation: + + .. code:: + + $ scp -r documentation/htdocs/* ChangeLog \ + USER,[email protected]:htdocs/ + +- Use the web interface (file manager) to create the release folder + and upload the files to SourceForge. + +Announce the Release (Optional) +=============================== + +The new release is live! Spread the word! Consider these ideas: + +- Create a news item. +- Update freshmeat.net project. + +Release Checklist +================= + +The following list serves as a quick reference for making a release. +These items are explained in greater detail above. + +#. Verify that CI passes + +#. Use ``release_tool.py`` to initialize the release + and perform automated updates. Check: + + #. ``:/CMakeLists.txt`` + #. ``:/package.json`` + #. ``:/README.md`` + #. ``:/documentation/htdocs/index.html`` + +#. Update documentation as needed: + + #. ``:/ChangeLog`` + #. ``:/man/uncrustify.1.in`` + +#. Stage changes. +#. Test everything again. +#. Finalize the code changes. +#. Push to GitHub and create a merge request. +#. Tag the merged release branch. +#. Create Windows (32- and 64-bit) binaries. +#. Run a test build on Linux. +#. Upload the release and documentation to SourceForge. +#. Announce the release! + +.. _MinGW: http://www.mingw.org/ +.. _GitPython: https://github.com/gitpython-developers/GitPython +.. _Ninja: https://ninja-build.org/ |