summaryrefslogtreecommitdiffhomepage
path: root/version-metadata.sh
blob: e7001e19af529d31fe1f5432348c978cbf64c78d (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
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
#!/usr/bin/env bash
#
# Can inject correctly formatted version strings/numbers in all the various
# project metadata files. Can also back them up and restore them.

set -eu

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

INCLUDED_CRATES=(
    "mullvad-daemon"
    "mullvad-cli"
    "mullvad-problem-report"
    "mullvad-setup"
    "mullvad-exclude"
    "talpid-openvpn-plugin"
)
MANIFESTS=( "${INCLUDED_CRATES[@]/%//Cargo.toml}" )

# Parse arguments
COMMAND="$1"
shift 1

PRODUCT_VERSION=""
ANDROID="false"
DESKTOP="false"
for argument in "$@"; do
    case "$argument" in
        "--android")
            ANDROID="true"
            ;;
        "--desktop")
            DESKTOP="true"
            ;;
        -*)
            echo >&2 "Unknown option \"$argument\""
            exit 1
            ;;
        *)
            PRODUCT_VERSION="$argument"
            ;;
    esac
done

function inject_version {
    # Regex that only matches valid Mullvad VPN versions. It also captures
    # relevant values into capture groups, read out via BASH_REMATCH[x].
    local VERSION_REGEX="^20([0-9]{2})\.([1-9][0-9]?)(-beta([1-9][0-9]?))?(-dev-[0-9a-f]+)?$"

    if [[ ! $PRODUCT_VERSION =~ $VERSION_REGEX ]]; then
        echo >&2 "Invalid version format. Please specify version as:"
        echo >&2 "<YEAR>.<NUMBER>[-beta<NUMBER>]"
        return 1
    fi

    local semver_version
    semver_version=$(echo "$PRODUCT_VERSION" | sed -Ee 's/($|-.*)/.0\1/g')
    local semver_major="20${BASH_REMATCH[1]}"
    local semver_minor=${BASH_REMATCH[2]}
    local semver_patch="0"

    echo "Setting Rust crate versions to $semver_version"
    # Rust crates
    for toml in "${MANIFESTS[@]}"; do
        cp "$toml" "$toml.bak"
        awk "BEGIN { matches=0; } matches==0 && /^version = \"[^\"]+\"$/ \
             { print \"version = \\\"$semver_version\\\"\"; matches++; next; } { print }" "$toml.bak" > "$toml"
    done

    if [[ "$DESKTOP" == "true" ]]; then
        echo "Setting desktop version to $semver_version"

        # Electron GUI
        cp gui/package.json gui/package.json.bak
        cp gui/package-lock.json gui/package-lock.json.bak
        (cd gui/ && npm version "$semver_version" --no-git-tag-version --allow-same-version)

        # Windows C++
        cp dist-assets/windows/version.h dist-assets/windows/version.h.bak
        cat <<EOF > dist-assets/windows/version.h
#define MAJOR_VERSION $semver_major
#define MINOR_VERSION $semver_minor
#define PATCH_VERSION $semver_patch
#define PRODUCT_VERSION "$PRODUCT_VERSION"
EOF
    fi

    if [[ "$ANDROID" == "true" ]]; then
        # Android
        local version_year
        version_year=$(printf "%02d" "${BASH_REMATCH[1]}")
        local version_number
        version_number=$(printf "%02d" "${BASH_REMATCH[2]}")
        local version_patch="00" # Not used for now.
        local version_beta
        version_beta=$(printf "%02d" "${BASH_REMATCH[4]:-99}")
        local android_version_code=${version_year}${version_number}${version_patch}${version_beta}

        echo "Setting Android versionName to $PRODUCT_VERSION and versionCode to $android_version_code"

        cp android/app/build.gradle.kts android/app/build.gradle.kts.bak
        sed -i -Ee "s/versionCode = [0-9]+/versionCode = $android_version_code/g" \
            android/app/build.gradle.kts
        sed -i -Ee "s/versionName = \"[^\"]+\"/versionName = \"$PRODUCT_VERSION\"/g" \
            android/app/build.gradle.kts
    fi
}

function restore_backup {
    set +e

    # Rust crates
    for toml in "${MANIFESTS[@]}"; do
        mv "${toml}.bak" "${toml}"
    done

    if [[ "$DESKTOP" == "true" ]]; then
        # Electron GUI
        mv gui/package.json.bak gui/package.json
        mv gui/package-lock.json.bak gui/package-lock.json
        # Windows C++
        mv dist-assets/windows/version.h.bak dist-assets/windows/version.h

    fi

    if [[ "$ANDROID" == "true" ]]; then
        # Android
        mv android/app/build.gradle.kts.bak android/app/build.gradle.kts
    fi
    set -e
}

function delete_backup {
    set +e

    # Rust crates
    for toml in "${MANIFESTS[@]}"; do
        rm "${toml}.bak"
    done

    if [[ "$DESKTOP" == "true" ]]; then
        # Electron GUI
        rm gui/package.json.bak
        rm gui/package-lock.json.bak
        # Windows C++
        rm dist-assets/windows/version.h.bak

    fi

    if [[ "$ANDROID" == "true" ]]; then
        # Android
        rm android/app/build.gradle.kts.bak
    fi
    set -e
}

case "$COMMAND" in
    "inject")
        inject_version
        ;;
    "restore-backup")
        restore_backup
        ;;
    "delete-backup")
        delete_backup
        ;;
    *)
        echo >&2 "Invalid command"
        exit 1
        ;;
esac