
The ModemManager releases are generated using meson.

0.1) For major releases:
     * Increment mm_minor_version and reset mm_micro_version.
     * Assuming API/ABI compatibility in libmm-glib, increment both
       mm_glib_lt_current and mm_glib_lt_age.

0.2) For stable branch releases:
     * Increment mm_micro_version.

1) Add signed tag:
    $ git tag -s 1.20.0

   The description included in the signed tag could be:
    Release 1.20.0

2) Configure and build the whole project, making sure gtk-doc and introspection
   are enabled:
    $ meson setup build \
        --prefix=/usr \
        --buildtype=release \
        -Dintrospection=true \
        -Dgtk_doc=true
    $ ninja -C build

3) Run the test suite and install locally:
    $ ninja -C build test
    $ sudo ninja -C build install

4) Create directories for the manpages and gtk-doc documentation in
   freedesktop.org, and also update the 'latest' links:
    $ ssh fd.o
    [fd.o] $ cd ${ModemManager}/man/
    [fd.o] $ rm latest
    [fd.o] $ mkdir -p ${VERSION}
    [fd.o] $ ln -s ${VERSION} latest
    [fd.o] $ cd ${ModemManager}/doc/
    [fd.o] $ rm latest
    [fd.o] $ mkdir -p ${VERSION}/ModemManager
    [fd.o] $ mkdir -p ${VERSION}/libmm-glib
    [fd.o] $ ln -s ${VERSION} latest

5) Generate HTML for the manpages:
    $ roffit < docs/man/mmcli.1 > mmcli.1.html
    $ roffit < docs/man/ModemManager.8 > ModemManager.8.html

6) Upload manpages in HTML to freedesktop.org:
    $ scp *.html fd.o:${ModemManager}/man/${VERSION}/

7) Copy documentation from /usr/share/gtk-doc and fix online references manually
    $ mkdir ModemManager-html
    $ cp -r /usr/share/gtk-doc/html/ModemManager/* ModemManager-html/
    $ for FILE in $(ls ModemManager-html/*.html); do \
        sed -i 's|<a[^>]* href="\.\./glib/[^"]*|<a href="https://docs.gtk.org/glib/|g' $FILE; \
        sed -i 's|<a[^>]* href="\.\./gobject/[^"]*|<a href="https://docs.gtk.org/gobject/|g' $FILE; \
        sed -i 's|<a[^>]* href="\.\./gio/[^"]*|<a href="https://docs.gtk.org/gio/|g' $FILE; \
      done
    $ mkdir libmm-glib-html
    $ cp -r /usr/share/gtk-doc/html/libmm-glib/* libmm-glib-html/
    $ for FILE in $(ls libmm-glib-html/*.html); do \
        sed -i 's|<a[^>]* href="\.\./glib/[^"]*|<a href="https://docs.gtk.org/glib/|g' $FILE; \
        sed -i 's|<a[^>]* href="\.\./gobject/[^"]*|<a href="https://docs.gtk.org/gobject/|g' $FILE; \
        sed -i 's|<a[^>]* href="\.\./gio/[^"]*|<a href="https://docs.gtk.org/gio/|g' $FILE; \
      done

8) Upload the modified HTML files to freedesktop.org:
    $ scp ModemManager-html/* fd.o:${ModemManager}/doc/${VERSION}/ModemManager/
    $ scp libmm-glib-html/* fd.o:${ModemManager}/doc/${VERSION}/libmm-glib/

9.1) For major releases:
     * Fork new stable branch (e.g. mm-${MAJOR}-${MINOR})
     * Post-release version bump in the main branch, increment mm_minor_version.
     * Post-release version bump in the stable branch, increment mm_micro_version.

9.2) For stable branch releases:
     * Post-release version bump, increment mm_micro_version.

-------------------------------------------------------------------------------

*) Verifying the release signature requires the public key of the person who
   signed it, e.g.:

    $ curl https://www.freedesktop.org/software/ModemManager/0xAECE0239C6606AD5.asc | gpg --import
