diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 70d6cead..691bd31a 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -1,5 +1,11 @@ name: Publish packages -on: workflow_dispatch +on: + push: + tags: + - "powersync-v[0-9]+.[0-9]+.[0-9]+" + - "powersync_attachments_helper-v[0-9]+.[0-9]+.[0-9]+*" + - "powersync_flutter_libs-v[0-9]+.[0-9]+.[0-9]+*" + workflow_dispatch: jobs: publish-packages: @@ -9,11 +15,20 @@ jobs: id-token: write # Required for authentication using OIDC runs-on: [ubuntu-latest] steps: - - uses: actions/checkout@v3 - - uses: subosito/flutter-action@v2 - with: - flutter-version: '3.x' - channel: 'stable' - - uses: bluefireteam/melos-action@v3 - with: - publish: true + - uses: actions/checkout@v4 + + - uses: dart-lang/setup-dart@v1 # Creates and configures token for publishing + + - name: Install melos + run: dart pub global activate melos + + - name: Set powersync core version + run: echo "CORE_VERSION=v0.1.8" >> $GITHUB_ENV + + - name: Publish packages dry run + run: | + melos publish + + - name: Publish packages + run: | + melos publish --no-dry-run diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index da809996..52473045 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -4,11 +4,6 @@ name: Compile Assets and Create Draft Release on: push: tags: - # Trigger on tags beginning with 'v' - # Note that `melos version ...` adds the package name as a suffix - # This action is not compatible with tags such as `powersync-v1.1.1` - # marvinpinto/action-automatic-releases struggles to generate changelogs - # Be sure to manually tag the commit to trigger this action - "powersync-v[0-9]+.[0-9]+.[0-9]+" jobs: @@ -40,5 +35,5 @@ jobs: run: | tag="${{ github.ref_name }}" body="Release $tag" - gh release create --draft "$tag" --title "$tag" --notes "$body" --generate-notes --prerelease + gh release create --draft "$tag" --title "$tag" --notes "$body" --generate-notes gh release upload "${{ github.ref_name }}" packages/powersync/assets/powersync_db.worker.js diff --git a/RELEASING.md b/RELEASING.md new file mode 100644 index 00000000..682cfe46 --- /dev/null +++ b/RELEASING.md @@ -0,0 +1,28 @@ +# Preparing Release + +Bump the version of the packages to be released using `melos`: + +``` +melos version +``` + +if melos does not pick up changes or does not bump the version correctly, you can manually version the packages using + +``` +melos version -V ${PACKAGE_NAME}:M.M.P +for e.g melos version -V powersync:1.6.3 +``` + +This will create a tag for all packages updated in the format of ${PACKAGE_NAME}-vM.M.P + +``` +e.g powersync-v1.6.4, powersync_attachments_helper-v0.6.3+1, etc. +``` + +# Perform Release + +``` +git push --follow-tags +``` + +A version bump and tag push for `powersync` will also create a draft github release for the powersync web worker. The worker needs to be manually published in the GitHub [releases](https://github.com/powersync-ja/powersync.dart/releases). diff --git a/melos.yaml b/melos.yaml index 740b688a..d4083fcf 100644 --- a/melos.yaml +++ b/melos.yaml @@ -14,6 +14,11 @@ command: changelog: false packageFilters: noPrivate: true + publish: + hooks: + pre: sh tool/download_binaries.sh + packageFilters: + noPrivate: true scripts: prepare: diff --git a/packages/powersync/lib/src/open_factory/native/native_open_factory.dart b/packages/powersync/lib/src/open_factory/native/native_open_factory.dart index 9f0d3713..ef40398c 100644 --- a/packages/powersync/lib/src/open_factory/native/native_open_factory.dart +++ b/packages/powersync/lib/src/open_factory/native/native_open_factory.dart @@ -84,10 +84,11 @@ class PowerSyncOpenFactory extends AbstractPowerSyncOpenFactory { case Abi.macosX64: return 'libpowersync.dylib'; case Abi.linuxX64: - return 'libpowersync.so'; - case Abi.windowsArm64: + return 'libpowersync_x64.so'; + case Abi.linuxArm64: + return 'libpowersync_aarch64.so'; case Abi.windowsX64: - return 'powersync.dll'; + return 'powersync_x64.dll'; case Abi.androidIA32: throw PowersyncNotReadyException( 'Unsupported processor architecture. X86 Android emulators are not ' diff --git a/packages/powersync/test/util.dart b/packages/powersync/test/util.dart deleted file mode 100644 index a2bfc93a..00000000 --- a/packages/powersync/test/util.dart +++ /dev/null @@ -1,143 +0,0 @@ -import 'dart:async'; -import 'dart:ffi'; -import 'dart:io'; - -import 'package:logging/logging.dart'; -import 'package:powersync/powersync.dart'; -import 'package:powersync/sqlite_async.dart'; -import 'package:sqlite3/open.dart' as sqlite_open; -import 'package:sqlite_async/sqlite3_common.dart'; -import 'package:test_api/src/backend/invoker.dart'; - -const schema = Schema([ - Table('assets', [ - Column.text('created_at'), - Column.text('make'), - Column.text('model'), - Column.text('serial_number'), - Column.integer('quantity'), - Column.text('user_id'), - Column.text('customer_id'), - Column.text('description'), - ], indexes: [ - Index('makemodel', [IndexedColumn('make'), IndexedColumn('model')]) - ]), - Table('customers', [Column.text('name'), Column.text('email')]) -]); - -const defaultSchema = schema; - -class TestOpenFactory extends PowerSyncOpenFactory { - TestOpenFactory({required super.path}); - - @override - CommonDatabase open(SqliteOpenOptions options) { - sqlite_open.open.overrideFor(sqlite_open.OperatingSystem.linux, () { - return DynamicLibrary.open('libsqlite3.so.0'); - }); - sqlite_open.open.overrideFor(sqlite_open.OperatingSystem.macOS, () { - return DynamicLibrary.open('libsqlite3.dylib'); - }); - return super.open(options); - } - - @override - String getLibraryForPlatform({String? path = "."}) { - switch (Abi.current()) { - case Abi.androidArm: - case Abi.androidArm64: - case Abi.androidX64: - return '$path/libpowersync.so'; - case Abi.macosArm64: - case Abi.macosX64: - return '$path/libpowersync.dylib'; - case Abi.linuxX64: - return '$path/libpowersync.so'; - case Abi.windowsArm64: - case Abi.windowsX64: - return '$path/powersync.dll'; - case Abi.androidIA32: - throw PowersyncNotReadyException( - 'Unsupported processor architecture. X86 Android emulators are not ' - 'supported. Please use an x86_64 emulator instead. All physical ' - 'Android devices are supported including 32bit ARM.', - ); - default: - throw PowersyncNotReadyException( - 'Unsupported processor architecture "${Abi.current()}". ' - 'Please open an issue on GitHub to request it.', - ); - } - } -} - -Future setupPowerSync( - {required String path, Schema? schema}) async { - final db = PowerSyncDatabase.withFactory(TestOpenFactory(path: path), - schema: schema ?? defaultSchema, logger: testLogger); - return db; -} - -Future setupSqlite( - {required PowerSyncDatabase powersync}) async { - await powersync.initialize(); - - final sqliteDb = await powersync.isolateConnectionFactory().openRawDatabase(); - - return sqliteDb; -} - -Future cleanDb({required String path}) async { - try { - await File(path).delete(); - } on PathNotFoundException { - // Not an issue - } - try { - await File("$path-shm").delete(); - } on PathNotFoundException { - // Not an issue - } - try { - await File("$path-wal").delete(); - } on PathNotFoundException { - // Not an issue - } -} - -String dbPath() { - final test = Invoker.current!.liveTest; - var testName = test.test.name; - var testShortName = testName.replaceAll(RegExp(r'\s'), '_').toLowerCase(); - var dbName = "test-db/$testShortName.db"; - Directory("test-db").createSync(recursive: false); - return dbName; -} - -final testLogger = _makeTestLogger(); - -Logger _makeTestLogger() { - final logger = Logger.detached('PowerSync Tests'); - logger.level = Level.ALL; - logger.onRecord.listen((record) { - print( - '[${record.loggerName}] ${record.level.name}: ${record.time}: ${record.message}'); - if (record.error != null) { - print(record.error); - } - if (record.stackTrace != null) { - print(record.stackTrace); - } - - if (record.error != null && record.level >= Level.SEVERE) { - // Hack to fail the test if a SEVERE error is logged. - // Not ideal, but works to catch "Sync Isolate error". - uncaughtError() async { - throw record.error!; - } - - uncaughtError(); - } - }); - return logger; -} diff --git a/packages/powersync/test/utils/native_test_utils.dart b/packages/powersync/test/utils/native_test_utils.dart index 353679e7..8be005e9 100644 --- a/packages/powersync/test/utils/native_test_utils.dart +++ b/packages/powersync/test/utils/native_test_utils.dart @@ -35,8 +35,8 @@ class TestOpenFactory extends PowerSyncOpenFactory { case Abi.macosX64: return '$path/libpowersync.dylib'; case Abi.linuxX64: + case Abi.linuxArm64: return '$path/libpowersync.so'; - case Abi.windowsArm64: case Abi.windowsX64: return '$path/powersync.dll'; case Abi.androidIA32: diff --git a/packages/powersync_flutter_libs/linux/CMakeLists.txt b/packages/powersync_flutter_libs/linux/CMakeLists.txt index b499b5ee..99e3ada7 100644 --- a/packages/powersync_flutter_libs/linux/CMakeLists.txt +++ b/packages/powersync_flutter_libs/linux/CMakeLists.txt @@ -23,23 +23,19 @@ target_include_directories(${PLUGIN_NAME} INTERFACE "${CMAKE_CURRENT_SOURCE_DIR} target_link_libraries(${PLUGIN_NAME} PRIVATE flutter) # ---------------------------------------------------------------------- -# Download and add powersync prebuilt library. +# Add powersync prebuilt library. set(POWERSYNC_VERSION 0.1.6) +set(CORE_FILE_NAME "libpowersync.so") set(POWERSYNC_ARCH ${CMAKE_SYSTEM_PROCESSOR}) if (${POWERSYNC_ARCH} MATCHES "x86_64" OR ${POWERSYNC_ARCH} MATCHES "AMD64") - set(POWERSYNC_ARCH x64) + set(CORE_FILE_NAME "libpowersync_x64.so") elseif (${POWERSYNC_ARCH} MATCHES "^arm64" OR ${POWERSYNC_ARCH} MATCHES "^armv8") - set(POWERSYNC_ARCH aarch64) + set(CORE_FILE_NAME "libpowersync_aarch64.so") endif () -set(POWERSYNC_FILE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/libpowersync.so") - -file(DOWNLOAD - "https://github.com/powersync-ja/powersync-sqlite-core/releases/download/v${POWERSYNC_VERSION}/libpowersync_${POWERSYNC_ARCH}.so" - ${POWERSYNC_FILE_PATH} -) +set(POWERSYNC_FILE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/${CORE_FILE_NAME}") # ---------------------------------------------------------------------- diff --git a/packages/powersync_flutter_libs/windows/CMakeLists.txt b/packages/powersync_flutter_libs/windows/CMakeLists.txt index e8e1fad6..a8c12e69 100644 --- a/packages/powersync_flutter_libs/windows/CMakeLists.txt +++ b/packages/powersync_flutter_libs/windows/CMakeLists.txt @@ -24,23 +24,18 @@ target_include_directories(${PLUGIN_NAME} INTERFACE "${CMAKE_CURRENT_SOURCE_DIR} target_link_libraries(${PLUGIN_NAME} PRIVATE flutter flutter_wrapper_plugin) # ---------------------------------------------------------------------- -# Download and add powersync prebuilt library. - -set(POWERSYNC_VERSION 0.1.6) +# Add powersync prebuilt library. set(POWERSYNC_ARCH ${CMAKE_SYSTEM_PROCESSOR}) +set(CORE_FILE_NAME "powersync.dll") + if (${POWERSYNC_ARCH} MATCHES "x86_64" OR ${POWERSYNC_ARCH} MATCHES "AMD64") - set(POWERSYNC_ARCH x64) + set(CORE_FILE_NAME "powersync_x64.dll") elseif (${POWERSYNC_ARCH} MATCHES "^arm64" OR ${POWERSYNC_ARCH} MATCHES "^armv8") - set(POWERSYNC_ARCH aarch64) + message(FATAL_ERROR "Unsupported architecture: ${POWERSYNC_ARCH}, we are working on adding support for windows arm.") endif () -set(POWERSYNC_FILE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/powersync.dll") - -file(DOWNLOAD - "https://github.com/powersync-ja/powersync-sqlite-core/releases/download/v${POWERSYNC_VERSION}/powersync_${POWERSYNC_ARCH}.dll" - ${POWERSYNC_FILE_PATH} -) +set(POWERSYNC_FILE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/powersync_x64.dll") # ---------------------------------------------------------------------- diff --git a/scripts/init_powersync_core_binary.dart b/scripts/init_powersync_core_binary.dart index 3bd78ba3..db4af56f 100644 --- a/scripts/init_powersync_core_binary.dart +++ b/scripts/init_powersync_core_binary.dart @@ -6,7 +6,7 @@ import 'dart:io'; import 'package:melos/melos.dart'; final sqliteUrl = - 'https://github.com/powersync-ja/powersync-sqlite-core/releases/download/v0.1.7'; + 'https://github.com/powersync-ja/powersync-sqlite-core/releases/download/v0.1.8'; void main() async { final sqliteCoreFilename = getLibraryForPlatform(); diff --git a/tool/download_binaries.sh b/tool/download_binaries.sh new file mode 100644 index 00000000..12d243f8 --- /dev/null +++ b/tool/download_binaries.sh @@ -0,0 +1,12 @@ +#!/bin/bash + +if [ -z "$CORE_VERSION" ]; then + echo "CORE_VERSION is not set"; + exit 2; +fi + +github="https://github.com/powersync-ja/powersync-sqlite-core/releases/download/$CORE_VERSION" + +curl "${github}/libpowersync_aarch64.so" -o packages/powersync_flutter_libs/linux/libpowersync_aarch64.so --create-dirs -L -f +curl "${github}/libpowersync_x64.so" -o packages/powersync_flutter_libs/linux/libpowersync_x64.so --create-dirs -L -f +curl "${github}/powersync_x64.dll" -o packages/powersync_flutter_libs/windows/powersync_x64.dll --create-dirs -L -f \ No newline at end of file