-
Notifications
You must be signed in to change notification settings - Fork 1.9k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge in DNS/adguard-home from 2412-versions to master Squashed commit of the following: commit 8c7f11c Merge: 43cd037 1789c96 Author: Ainar Garipov <A.Garipov@AdGuard.COM> Date: Wed Mar 10 17:05:58 2021 +0300 Merge branch 'master' into 2412-versions commit 43cd037 Author: Ainar Garipov <A.Garipov@AdGuard.COM> Date: Fri Mar 5 15:27:13 2021 +0300 scripts: imp version
- Loading branch information
Showing
3 changed files
with
101 additions
and
20 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,59 +1,132 @@ | ||
#!/bin/sh | ||
|
||
# AdGuard Home Version Generation Script | ||
# | ||
# This script generates versions based on the current git tree state. | ||
# The valid output formats are: | ||
# | ||
# * For release versions, "v0.123.4". This version should be the one | ||
# in the current tag, and the script merely checks, that the current | ||
# commit is properly tagged. | ||
# | ||
# * For prerelease beta versions, "v0.123.4-b.5". This version should | ||
# be the one in the current tag, and the script merely checks, that | ||
# the current commit is properly tagged. | ||
# | ||
# * For prerelease alpha versions (aka snapshots), | ||
# "v0.123.4-a.6+a1b2c3d4". | ||
# | ||
# BUG(a.garipov): The script currently can't differentiate between beta | ||
# tags and release tags if they are on the same commit, so the beta tag | ||
# **must** be pushed and built **before** the release tag is pushed. | ||
# | ||
# TODO(a.garipov): The script currently doesn't handle release branches, | ||
# so it must be modified once we have those. | ||
|
||
readonly verbose="${VERBOSE:-0}" | ||
if [ "$verbose" -gt '1' ] | ||
if [ "$verbose" -gt '0' ] | ||
then | ||
set -x | ||
fi | ||
|
||
set -e -f -u | ||
|
||
readonly awk_program='/^v[0-9]+\.[0-9]+\.[0-9]+.*$/ { | ||
if (!$4) { | ||
# The last tag is a full release version, so bump the | ||
# minor release number and zero the patch release number | ||
# to get the next release. | ||
$2++; | ||
$3 = 0; | ||
} | ||
print($1 "." $2 "." $3); | ||
# bump_minor is an awk program that reads a minor release version, | ||
# increments the minor part of it, and prints the next version. | ||
readonly bump_minor='/^v[0-9]+\.[0-9]+\.0$/ { | ||
print($1 "." $2 + 1 ".0"); | ||
next; | ||
} | ||
{ | ||
printf("invalid version: \"%s\"\n", $0); | ||
printf("invalid release version: \"%s\"\n", $0); | ||
exit 1; | ||
}' | ||
|
||
readonly last_tag="$(git describe --abbrev=0)" | ||
readonly current_desc="$(git describe)" | ||
# get_last_minor_zero returns the last new minor release. | ||
get_last_minor_zero() { | ||
# List all tags. Then, select those that fit the pattern of | ||
# a new minor release: a semver version with the patch part set | ||
# to zero. | ||
# | ||
# Then, sort them first by the first field ("1"), starting with | ||
# the second character to skip the "v" prefix (".2"), and only | ||
# spanning the first field (",1"). The sort is numeric and | ||
# reverse ("nr"). | ||
# | ||
# Then, sort them by the second field ("2"), and only spanning | ||
# the second field (",2"). The sort is also numeric and reverse | ||
# ("nr"). | ||
# | ||
# Finally, get the top (that is, most recent) version. | ||
git tag\ | ||
| grep -e 'v[0-9]\+\.[0-9]\+\.0$'\ | ||
| sort -k 1.2,1nr -k 2,2nr -t '.'\ | ||
| head -n 1 | ||
} | ||
|
||
readonly channel="$CHANNEL" | ||
|
||
case "$channel" | ||
in | ||
('development') | ||
echo 'v0.0.0' | ||
# Use the dummy version for development builds. | ||
version='v0.0.0' | ||
;; | ||
('edge') | ||
next=$(echo $last_tag | awk -F '[.+-]' "$awk_program") | ||
echo "${next}-SNAPSHOT-$(git rev-parse --short HEAD)" | ||
# last_minor_zero is the last new minor release. | ||
readonly last_minor_zero="$(get_last_minor_zero)" | ||
|
||
# num_commits_since_minor is the number of commits since the | ||
# last new minor release. If the current commit is the new | ||
# minor release, num_commits_since_minor is zero. | ||
readonly num_commits_since_minor="$(git rev-list "${last_minor_zero}..HEAD" | wc -l)" | ||
|
||
# next_minor is the next minor release version. | ||
readonly next_minor="$(echo "$last_minor_zero" | awk -F '.' "$bump_minor")" | ||
|
||
# Make this commit a prerelease version for the next minor | ||
# release. For example, if the last minor release was v0.123.0, | ||
# and the current commit is the fifth since then, the version | ||
# will look something like: | ||
# | ||
# v0.124.0-a.5+a1b2c3d4 | ||
# | ||
version="${next_minor}-a.${num_commits_since_minor}+$(git rev-parse --short HEAD)" | ||
;; | ||
('beta'|'release') | ||
# current_desc is the description of the current git commit. If | ||
# the current commit is tagged, git describe will show the tag. | ||
readonly current_desc="$(git describe)" | ||
|
||
# last_tag is the most recent git tag. | ||
readonly last_tag="$(git describe --abbrev=0)" | ||
|
||
# Require an actual tag for the beta and final releases. | ||
if [ "$current_desc" != "$last_tag" ] | ||
then | ||
echo 'need a tag' 1>&2 | ||
|
||
exit 1 | ||
fi | ||
|
||
echo "$last_tag" | ||
version="$last_tag" | ||
;; | ||
(*) | ||
echo "invalid channel '$channel', supported values are\ | ||
'development', 'edge', 'beta', and 'release'" 1>&2 | ||
exit 1 | ||
;; | ||
esac | ||
|
||
# Finally, make sure that we don't output invalid versions. | ||
if ! echo "$version" | grep -E -e '^v[0-9]+\.[0-9]+\.[0-9]+(-[ab]\.[0-9]+)?(\+[[:xdigit:]]+)?' -q | ||
then | ||
echo "generated an invalid version '$version'" 1>&2 | ||
|
||
exit 1 | ||
fi | ||
|
||
echo "$version" |