Skip to content

Commit 0891c29

Browse files
authored
Adapt upgrade.sh scripts to new versioning (#717)
Follow-up to #701
2 parents bcadfeb + 54a22f4 commit 0891c29

File tree

2 files changed

+83
-32
lines changed

2 files changed

+83
-32
lines changed

crates/libduckdb-sys/upgrade.sh

Lines changed: 27 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,35 @@
11
#!/bin/bash
22

3-
set -e
4-
5-
# NOTE: This script is currently broken and needs updating for the new
6-
# duckdb-rs versioning scheme before it can be used reliably.
3+
set -e -o pipefail
74

85
SCRIPT=$(realpath "$0")
96
SCRIPT_DIR=$(dirname "$SCRIPT")
7+
WORKSPACE_DIR=$(realpath "$SCRIPT_DIR/../..")
108

119
echo "$SCRIPT_DIR"
1210
cd "$SCRIPT_DIR"
11+
12+
current_workspace_version() {
13+
grep '^version = "' "$WORKSPACE_DIR/Cargo.toml" | head -n1 | sed -E 's/version = "([^"]+)"/\1/'
14+
}
15+
16+
crate_version_to_duckdb_version() {
17+
local CRATE_VERSION=$1
18+
local ENCODED
19+
ENCODED=$(echo "$CRATE_VERSION" | cut -d. -f2)
20+
local DUCKDB_MAJOR=$((ENCODED / 10000))
21+
local DUCKDB_MINOR=$(((ENCODED / 100) % 100))
22+
local DUCKDB_PATCH=$((ENCODED % 100))
23+
printf 'v%s.%s.%s' "$DUCKDB_MAJOR" "$DUCKDB_MINOR" "$DUCKDB_PATCH"
24+
}
25+
1326
cargo clean
1427
mkdir -p "$SCRIPT_DIR/../../target" "$SCRIPT_DIR/duckdb"
1528
export DUCKDB_LIB_DIR="$SCRIPT_DIR/duckdb"
1629

1730
# Download and extract amalgamation
18-
DUCKDB_VERSION=v1.5.0
31+
DUCKDB_VERSION=${1:-$(crate_version_to_duckdb_version "$(current_workspace_version)")}
32+
DUCKDB_VERSION="v${DUCKDB_VERSION#v}"
1933
git submodule update --init --checkout
2034
cd "$SCRIPT_DIR/duckdb-sources"
2135
git fetch
@@ -29,6 +43,10 @@ rm -f "$SCRIPT_DIR/src/bindgen_bundled_version_loadable.rs"
2943
find "$SCRIPT_DIR/../../target" -type f -name bindgen.rs -exec rm {} \;
3044
cargo build --features "extensions-full buildtime_bindgen loadable-extension"
3145
find "$SCRIPT_DIR/../../target" -type f -name bindgen.rs -exec cp {} "$SCRIPT_DIR/src/bindgen_bundled_version_loadable.rs" \;
46+
if [ ! -f "$SCRIPT_DIR/src/bindgen_bundled_version_loadable.rs" ]; then
47+
echo "ERROR: bindgen_bundled_version_loadable.rs was not regenerated" >&2
48+
exit 1
49+
fi
3250

3351
# Sanity checks
3452
# FIXME: how to test this here?
@@ -39,6 +57,10 @@ rm -f "$SCRIPT_DIR/src/bindgen_bundled_version.rs"
3957
find "$SCRIPT_DIR/../../target" -type f -name bindgen.rs -exec rm {} \;
4058
cargo build --features "extensions-full buildtime_bindgen"
4159
find "$SCRIPT_DIR/../../target" -type f -name bindgen.rs -exec cp {} "$SCRIPT_DIR/src/bindgen_bundled_version.rs" \;
60+
if [ ! -f "$SCRIPT_DIR/src/bindgen_bundled_version.rs" ]; then
61+
echo "ERROR: bindgen_bundled_version.rs was not regenerated" >&2
62+
exit 1
63+
fi
4264

4365
# Sanity checks
4466
cd "$SCRIPT_DIR/.."

upgrade.sh

Lines changed: 56 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,44 +1,73 @@
11
#!/bin/bash
22

3-
set -e
3+
set -e -o pipefail
44

5-
# NOTE: This script is currently broken and needs updating for the new
6-
# duckdb-rs versioning scheme before it can be used reliably.
5+
sed_inplace() {
6+
if sed --version 2>/dev/null | grep -q GNU; then
7+
sed -i "$@"
8+
else
9+
sed -i '' "$@"
10+
fi
11+
}
712

8-
if sed --version 2>/dev/null | grep -q GNU; then
9-
SED_INPLACE="sed -i"
10-
else
11-
SED_INPLACE="sed -i ''"
12-
fi
13+
get_latest_release() {
14+
local REPO=$1
15+
gh api "repos/$REPO/releases/latest" --jq '.tag_name'
16+
}
1317

14-
## How to run
15-
## `./upgrade.sh`
18+
current_workspace_version() {
19+
grep '^version = "' Cargo.toml | head -n1 | sed -E 's/version = "([^"]+)"/\1/'
20+
}
1621

17-
# https://gist.github.com/lukechilds/a83e1d7127b78fef38c2914c4ececc3c
18-
# Usage
19-
# $ get_latest_release "duckdb/duckdb"
20-
get_latest_release() {
21-
curl -fSs "https://api.github.com/repos/$1/releases/latest" | # Get latest release from GitHub api
22-
grep '"tag_name":' | # Get tag line
23-
sed -E 's/.*"v([^"]+)".*/\1/' # Pluck JSON value
22+
crate_version_to_duckdb_version() {
23+
local CRATE_VERSION=$1
24+
local ENCODED
25+
ENCODED=$(echo "$CRATE_VERSION" | cut -d. -f2)
26+
local DUCKDB_MAJOR=$((ENCODED / 10000))
27+
local DUCKDB_MINOR=$(((ENCODED / 100) % 100))
28+
local DUCKDB_PATCH=$((ENCODED % 100))
29+
printf 'v%s.%s.%s' "$DUCKDB_MAJOR" "$DUCKDB_MINOR" "$DUCKDB_PATCH"
2430
}
2531

26-
duckdb_version=$(get_latest_release "duckdb/duckdb")
27-
duckdb_rs_version=$(get_latest_release "duckdb/duckdb-rs")
32+
duckdb_version_to_crate_version() {
33+
local DUCKDB_VERSION=${1#v}
34+
local CRATE_MAJOR=$2
35+
local DUCKDB_MAJOR DUCKDB_MINOR DUCKDB_PATCH
36+
IFS=. read -r DUCKDB_MAJOR DUCKDB_MINOR DUCKDB_PATCH <<<"$DUCKDB_VERSION"
37+
printf '%s.%d%02d%02d.0' "$CRATE_MAJOR" "$DUCKDB_MAJOR" "$DUCKDB_MINOR" "$DUCKDB_PATCH"
38+
}
39+
40+
DUCKDB_VERSION=${1:-$(get_latest_release "duckdb/duckdb")}
41+
DUCKDB_VERSION="v${DUCKDB_VERSION#v}"
42+
CURRENT_CRATE_VERSION=$(current_workspace_version)
43+
CURRENT_DUCKDB_VERSION=$(crate_version_to_duckdb_version "$CURRENT_CRATE_VERSION")
44+
CRATE_MAJOR=$(echo "$CURRENT_CRATE_VERSION" | cut -d. -f1)
45+
TARGET_CRATE_VERSION=$(duckdb_version_to_crate_version "$DUCKDB_VERSION" "$CRATE_MAJOR")
46+
CURRENT_CRATE_VERSION_PATTERN=${CURRENT_CRATE_VERSION//./\\.}
47+
CURRENT_DUCKDB_VERSION_PATTERN=${CURRENT_DUCKDB_VERSION//./\\.}
2848

29-
if [ $duckdb_version = $duckdb_rs_version ]; then
30-
echo "Already update to date, latest version is $duckdb_version"
49+
if [ "$DUCKDB_VERSION" = "$CURRENT_DUCKDB_VERSION" ]; then
50+
echo "Already up to date, latest DuckDB version is $DUCKDB_VERSION and workspace version is $CURRENT_CRATE_VERSION"
3151
exit 0
3252
fi
3353

34-
echo "Start to upgrade from $duckdb_rs_version to $duckdb_version"
54+
echo "Start to upgrade DuckDB from $CURRENT_DUCKDB_VERSION to $DUCKDB_VERSION"
55+
echo "Update crate version from $CURRENT_CRATE_VERSION to $TARGET_CRATE_VERSION"
3556

36-
$SED_INPLACE "s/$duckdb_rs_version/$duckdb_version/g" \
57+
sed_inplace "s!$CURRENT_CRATE_VERSION_PATTERN!$TARGET_CRATE_VERSION!g" \
3758
Cargo.toml \
3859
crates/duckdb/Cargo.toml \
39-
crates/libduckdb-sys/upgrade.sh \
4060
crates/libduckdb-sys/Cargo.toml \
41-
.github/workflows/rust.yaml \
42-
README.md
61+
crates/duckdb-loadable-macros/Cargo.toml
62+
63+
sed_inplace "s!$CURRENT_DUCKDB_VERSION_PATTERN!$DUCKDB_VERSION!g" \
64+
.github/workflows/rust.yaml
65+
66+
# Update README: only Cargo.toml examples and download URLs, not prose/history.
67+
sed_inplace "/version = \"/s!$CURRENT_CRATE_VERSION_PATTERN!$TARGET_CRATE_VERSION!g" README.md
68+
sed_inplace "/releases\/download/s!$CURRENT_DUCKDB_VERSION_PATTERN!$DUCKDB_VERSION!g" README.md
69+
70+
# Let Cargo rewrite Cargo.lock from the updated manifests instead of editing it as text.
71+
cargo metadata --format-version 1 >/dev/null
4372

44-
exec ./crates/libduckdb-sys/upgrade.sh
73+
exec ./crates/libduckdb-sys/upgrade.sh "$DUCKDB_VERSION"

0 commit comments

Comments
 (0)