summaryrefslogtreecommitdiffhomepage
path: root/desktop/scripts/release/1-prepare-release
blob: 4becc19d06088e2e215870efd3a3940eab2fdeb4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
#!/usr/bin/env bash

# This script prepares for a release. Run it with the release version as the first argument and it
# will update version numbers, update the changelog, and update copyright year.

set -eu

SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
cd "$SCRIPT_DIR"

REPO_ROOT=../../../

source $REPO_ROOT/scripts/utils/log
source $REPO_ROOT/scripts/utils/print-and-run


for argument in "$@"; do
    case "$argument" in
        -*)
            log_error "Unknown option \"$argument\""
            exit 1
            ;;
        *)
            PRODUCT_VERSION="$argument"
            ;;
    esac
done

changes_path=$REPO_ROOT/desktop/packages/mullvad-vpn/changes.txt
changelog_path=$REPO_ROOT/CHANGELOG.md
product_version_path=$REPO_ROOT/dist-assets/desktop-product-version.txt

function checks {
    if [[ -z ${PRODUCT_VERSION+x} ]]; then
        log_error "Please give the release version as an argument to this script."
        log_error "For example: '2018.1-beta3' for a beta release, or '2018.6' for a stable one."
        exit 1
    fi

    if [[ $(git diff --shortstat 2> /dev/null | tail -n1) != "" ]]; then
        log_error "Dirty working directory! Will not accept that for an official release."
        exit 1
    fi

    if [[ $(grep "CHANGE THIS BEFORE A RELEASE" $changes_path) != "" ]]; then
        log_error "It looks like you did not update $changes_path"
        exit 1
    fi
}

function check_commit_signature {
    if ! git verify-commit HEAD; then
        log_error \
            "Current commit lacks valid signature. Releases can only be made from signed commits."
        exit 1
    fi
    echo ""
}

function check_changelog {
    previous_version=$(grep -oP '## \[\K[^\]]+' $changelog_path | head -2 | tail -1)

    log_header "Changelog since previous release"
    git --no-pager diff -U10 "$previous_version"..HEAD -- $changelog_path

    log_info "\nThe changelog should only contain changes in the \"Unreleased\" section, unless it's a correction of a previous message."
    read -r -n 1 -p "Does this look good? (y: yes, q: abort, r: reload): " response
    echo ""

    if [[ "$response" =~ ^[Yy]$ ]]; then
        return
    elif [[ "$response" =~ ^[QqAa]$ ]]; then
        log_info "Aborting"
        exit 1
    elif [[ "$response" =~ ^[Rr]$ ]]; then
        check_changelog
    else
        log_error "Invalid response"
        check_changelog
    fi
}

function update_copyright_year {
    $REPO_ROOT/scripts/update-copyright
    if [[ $(git diff --shortstat 2> /dev/null | tail -n1) != "" ]]; then
        print_and_run git commit -a -S -m "Update copyright year in project files and code"
    fi
}

function update_changelog {
    sed -i -e "/^## \[Unreleased\]/a \\\n\\n## \[$PRODUCT_VERSION\] - $(date +%F)" $changelog_path

    log_info "\nPaused after editing changelog. Make potential edits, then press any key to continue..."
    read -r -s -n 1

    print_and_run git commit -S -m "Update desktop app changelog with $PRODUCT_VERSION section" \
        $changelog_path
}

function update_product_version {
    echo "$PRODUCT_VERSION" > $product_version_path
    print_and_run git commit -S -m "Update desktop app version to $PRODUCT_VERSION" \
        $product_version_path
}

checks
check_commit_signature
check_changelog
update_changelog
update_copyright_year
update_product_version

log_success "\n================================================="
log_success "| DONE preparing for a release!                 |"
log_success "|    Now verify that everything looks correct   |"
log_success "|    and then create and push the tag by        |"
log_success "|    running:                                   |"
log_success "|    $ $0 \\ "
log_success "|        --push-tag                             |"
log_success "================================================="