Skip to content
Merged

Dev #32

Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
18 commits
Select commit Hold shift + click to select a range
cbf2192
ci: align release flow with version tags
ZhuchkaTriplesix Apr 20, 2026
e90b519
fix
ZhuchkaTriplesix Apr 22, 2026
c699da1
chore(license): add MIT LICENSE
ZhuchkaTriplesix Apr 24, 2026
23b8526
feat(storage): keep connection secrets in OS secure store
ZhuchkaTriplesix Apr 24, 2026
a99657f
refactor(connections): remove JDBC driver download UI
ZhuchkaTriplesix Apr 24, 2026
34bf5ba
fix(linux): always install Flutter bundle under build/, not /usr/local
ZhuchkaTriplesix Apr 24, 2026
dccbafa
chore(linux): check libsecret before flutter run
ZhuchkaTriplesix Apr 24, 2026
a742db4
feat(ui): wire Connection menu to new database connection flow
ZhuchkaTriplesix Apr 24, 2026
42c9744
feat(ui): add empty-workspace hints for menu path and docs
ZhuchkaTriplesix Apr 24, 2026
99e1e7d
docs: security model, user guide, release checklist, release process
ZhuchkaTriplesix Apr 24, 2026
41d5601
ci: install libsecret-1-dev on Linux for flutter_secure_storage
ZhuchkaTriplesix Apr 24, 2026
acedddb
feat(settings): add max result rows, editor font size, AppSettingsRev…
ZhuchkaTriplesix Apr 24, 2026
ac4fa85
feat(settings): add shared SqlStatementTimeoutDropdown widget
ZhuchkaTriplesix Apr 24, 2026
fba8ba7
feat(ui): add Edit → Preferences dialog
ZhuchkaTriplesix Apr 24, 2026
fc7d3d0
feat(sql): sync SQL workspaces with AppSettingsRevision
ZhuchkaTriplesix Apr 24, 2026
022323a
test: cover AppSettingsRevision, timeout dropdown, QueryEditorTab fon…
ZhuchkaTriplesix Apr 24, 2026
0590615
docs: document Preferences in user guide
ZhuchkaTriplesix Apr 24, 2026
62b3629
docs: add CHANGELOG for 0.1.0
ZhuchkaTriplesix Apr 24, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .flutter-plugins-dependencies
Original file line number Diff line number Diff line change
@@ -1 +1 @@
{"info":"This is a generated file; do not edit or check into version control.","plugins":{"ios":[{"name":"path_provider_foundation","path":"/home/zhuchka/.pub-cache/hosted/pub.dev/path_provider_foundation-2.6.0/","native_build":false,"dependencies":[],"dev_dependency":false},{"name":"sqflite_darwin","path":"/home/zhuchka/.pub-cache/hosted/pub.dev/sqflite_darwin-2.4.2/","shared_darwin_source":true,"native_build":true,"dependencies":[],"dev_dependency":false}],"android":[{"name":"jni","path":"/home/zhuchka/.pub-cache/hosted/pub.dev/jni-1.0.0/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"jni_flutter","path":"/home/zhuchka/.pub-cache/hosted/pub.dev/jni_flutter-1.0.1/","native_build":true,"dependencies":["jni"],"dev_dependency":false},{"name":"path_provider_android","path":"/home/zhuchka/.pub-cache/hosted/pub.dev/path_provider_android-2.3.1/","native_build":false,"dependencies":["jni","jni_flutter"],"dev_dependency":false},{"name":"sqflite_android","path":"/home/zhuchka/.pub-cache/hosted/pub.dev/sqflite_android-2.4.2+3/","native_build":true,"dependencies":[],"dev_dependency":false}],"macos":[{"name":"bitsdojo_window_macos","path":"/home/zhuchka/.pub-cache/hosted/pub.dev/bitsdojo_window_macos-0.1.4/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"path_provider_foundation","path":"/home/zhuchka/.pub-cache/hosted/pub.dev/path_provider_foundation-2.6.0/","native_build":false,"dependencies":[],"dev_dependency":false},{"name":"sqflite_darwin","path":"/home/zhuchka/.pub-cache/hosted/pub.dev/sqflite_darwin-2.4.2/","shared_darwin_source":true,"native_build":true,"dependencies":[],"dev_dependency":false}],"linux":[{"name":"bitsdojo_window_linux","path":"/home/zhuchka/.pub-cache/hosted/pub.dev/bitsdojo_window_linux-0.1.4/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"jni","path":"/home/zhuchka/.pub-cache/hosted/pub.dev/jni-1.0.0/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"path_provider_linux","path":"/home/zhuchka/.pub-cache/hosted/pub.dev/path_provider_linux-2.2.1/","native_build":false,"dependencies":[],"dev_dependency":false}],"windows":[{"name":"bitsdojo_window_windows","path":"/home/zhuchka/.pub-cache/hosted/pub.dev/bitsdojo_window_windows-0.1.6/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"jni","path":"/home/zhuchka/.pub-cache/hosted/pub.dev/jni-1.0.0/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"path_provider_windows","path":"/home/zhuchka/.pub-cache/hosted/pub.dev/path_provider_windows-2.3.0/","native_build":false,"dependencies":[],"dev_dependency":false}],"web":[]},"dependencyGraph":[{"name":"bitsdojo_window","dependencies":["bitsdojo_window_windows","bitsdojo_window_macos","bitsdojo_window_linux"]},{"name":"bitsdojo_window_linux","dependencies":[]},{"name":"bitsdojo_window_macos","dependencies":[]},{"name":"bitsdojo_window_windows","dependencies":[]},{"name":"jni","dependencies":[]},{"name":"jni_flutter","dependencies":["jni"]},{"name":"path_provider","dependencies":["path_provider_android","path_provider_foundation","path_provider_linux","path_provider_windows"]},{"name":"path_provider_android","dependencies":["jni","jni_flutter"]},{"name":"path_provider_foundation","dependencies":[]},{"name":"path_provider_linux","dependencies":[]},{"name":"path_provider_windows","dependencies":[]},{"name":"sqflite","dependencies":["sqflite_android","sqflite_darwin"]},{"name":"sqflite_android","dependencies":[]},{"name":"sqflite_darwin","dependencies":[]}],"date_created":"2026-04-19 12:51:07.216547","version":"3.41.6","swift_package_manager_enabled":{"ios":false,"macos":false}}
{"info":"This is a generated file; do not edit or check into version control.","plugins":{"ios":[{"name":"flutter_secure_storage","path":"/home/zhuchka/.pub-cache/hosted/pub.dev/flutter_secure_storage-9.2.4/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"path_provider_foundation","path":"/home/zhuchka/.pub-cache/hosted/pub.dev/path_provider_foundation-2.6.0/","native_build":false,"dependencies":[],"dev_dependency":false},{"name":"sqflite_darwin","path":"/home/zhuchka/.pub-cache/hosted/pub.dev/sqflite_darwin-2.4.2/","shared_darwin_source":true,"native_build":true,"dependencies":[],"dev_dependency":false}],"android":[{"name":"flutter_secure_storage","path":"/home/zhuchka/.pub-cache/hosted/pub.dev/flutter_secure_storage-9.2.4/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"jni","path":"/home/zhuchka/.pub-cache/hosted/pub.dev/jni-1.0.0/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"jni_flutter","path":"/home/zhuchka/.pub-cache/hosted/pub.dev/jni_flutter-1.0.1/","native_build":true,"dependencies":["jni"],"dev_dependency":false},{"name":"path_provider_android","path":"/home/zhuchka/.pub-cache/hosted/pub.dev/path_provider_android-2.3.1/","native_build":false,"dependencies":["jni","jni_flutter"],"dev_dependency":false},{"name":"sqflite_android","path":"/home/zhuchka/.pub-cache/hosted/pub.dev/sqflite_android-2.4.2+3/","native_build":true,"dependencies":[],"dev_dependency":false}],"macos":[{"name":"bitsdojo_window_macos","path":"/home/zhuchka/.pub-cache/hosted/pub.dev/bitsdojo_window_macos-0.1.4/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"flutter_secure_storage_macos","path":"/home/zhuchka/.pub-cache/hosted/pub.dev/flutter_secure_storage_macos-3.1.3/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"path_provider_foundation","path":"/home/zhuchka/.pub-cache/hosted/pub.dev/path_provider_foundation-2.6.0/","native_build":false,"dependencies":[],"dev_dependency":false},{"name":"sqflite_darwin","path":"/home/zhuchka/.pub-cache/hosted/pub.dev/sqflite_darwin-2.4.2/","shared_darwin_source":true,"native_build":true,"dependencies":[],"dev_dependency":false}],"linux":[{"name":"bitsdojo_window_linux","path":"/home/zhuchka/.pub-cache/hosted/pub.dev/bitsdojo_window_linux-0.1.4/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"flutter_secure_storage_linux","path":"/home/zhuchka/.pub-cache/hosted/pub.dev/flutter_secure_storage_linux-1.2.3/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"jni","path":"/home/zhuchka/.pub-cache/hosted/pub.dev/jni-1.0.0/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"path_provider_linux","path":"/home/zhuchka/.pub-cache/hosted/pub.dev/path_provider_linux-2.2.1/","native_build":false,"dependencies":[],"dev_dependency":false}],"windows":[{"name":"bitsdojo_window_windows","path":"/home/zhuchka/.pub-cache/hosted/pub.dev/bitsdojo_window_windows-0.1.6/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"flutter_secure_storage_windows","path":"/home/zhuchka/.pub-cache/hosted/pub.dev/flutter_secure_storage_windows-3.1.2/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"jni","path":"/home/zhuchka/.pub-cache/hosted/pub.dev/jni-1.0.0/","native_build":true,"dependencies":[],"dev_dependency":false},{"name":"path_provider_windows","path":"/home/zhuchka/.pub-cache/hosted/pub.dev/path_provider_windows-2.3.0/","native_build":false,"dependencies":[],"dev_dependency":false}],"web":[{"name":"flutter_secure_storage_web","path":"/home/zhuchka/.pub-cache/hosted/pub.dev/flutter_secure_storage_web-1.2.1/","dependencies":[],"dev_dependency":false}]},"dependencyGraph":[{"name":"bitsdojo_window","dependencies":["bitsdojo_window_windows","bitsdojo_window_macos","bitsdojo_window_linux"]},{"name":"bitsdojo_window_linux","dependencies":[]},{"name":"bitsdojo_window_macos","dependencies":[]},{"name":"bitsdojo_window_windows","dependencies":[]},{"name":"flutter_secure_storage","dependencies":["flutter_secure_storage_linux","flutter_secure_storage_macos","flutter_secure_storage_web","flutter_secure_storage_windows"]},{"name":"flutter_secure_storage_linux","dependencies":[]},{"name":"flutter_secure_storage_macos","dependencies":[]},{"name":"flutter_secure_storage_web","dependencies":[]},{"name":"flutter_secure_storage_windows","dependencies":["path_provider"]},{"name":"jni","dependencies":[]},{"name":"jni_flutter","dependencies":["jni"]},{"name":"path_provider","dependencies":["path_provider_android","path_provider_foundation","path_provider_linux","path_provider_windows"]},{"name":"path_provider_android","dependencies":["jni","jni_flutter"]},{"name":"path_provider_foundation","dependencies":[]},{"name":"path_provider_linux","dependencies":[]},{"name":"path_provider_windows","dependencies":[]},{"name":"sqflite","dependencies":["sqflite_android","sqflite_darwin"]},{"name":"sqflite_android","dependencies":[]},{"name":"sqflite_darwin","dependencies":[]}],"date_created":"2026-04-24 10:36:12.197519","version":"3.41.6","swift_package_manager_enabled":{"ios":false,"macos":false}}
7 changes: 6 additions & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,11 @@ jobs:
channel: 'stable'
cache: true

- name: Install Linux dependencies (plugins)
run: |
sudo apt-get update
sudo apt-get install -y libsecret-1-dev

- name: Get dependencies
run: flutter pub get

Expand Down Expand Up @@ -60,7 +65,7 @@ jobs:
- name: Install Linux dependencies
run: |
sudo apt-get update
sudo apt-get install -y clang cmake ninja-build pkg-config libgtk-3-dev
sudo apt-get install -y clang cmake ninja-build pkg-config libgtk-3-dev libsecret-1-dev

- name: Setup Flutter
uses: subosito/flutter-action@v2
Expand Down
86 changes: 45 additions & 41 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
@@ -1,14 +1,10 @@
# Release: сборка артефактов → единая публикация с git-cliff и SHA256SUMS.
# Триггер: git tag v0.1.0 && git push origin v0.1.0
#
# Рекомендуемые коммиты: Conventional Commits (feat:, fix:, …) — см. cliff.toml
# Release: ручной запуск сборки артефактов и публикация релиза с тегом v<version>.
# Триггер: Actions -> Release -> Run workflow

name: Release

on:
push:
tags:
- 'v*'
workflow_dispatch:

permissions:
contents: write
Expand All @@ -21,9 +17,24 @@ jobs:
build-windows:
name: Build Windows
runs-on: windows-latest
outputs:
version: ${{ steps.version.outputs.version }}
full_version: ${{ steps.version.outputs.full_version }}
build_number: ${{ steps.version.outputs.build_number }}
steps:
- uses: actions/checkout@v4

- name: Get version from pubspec.yaml
id: version
shell: bash
run: |
FULL_VERSION=$(grep "^version:" pubspec.yaml | sed 's/version: //')
VERSION=$(echo "$FULL_VERSION" | sed 's/+.*//')
BUILD_NUMBER=$(echo "$FULL_VERSION" | sed 's/.*+//')
echo "version=$VERSION" >> "$GITHUB_OUTPUT"
echo "full_version=$FULL_VERSION" >> "$GITHUB_OUTPUT"
echo "build_number=$BUILD_NUMBER" >> "$GITHUB_OUTPUT"

- name: Setup Flutter
uses: subosito/flutter-action@v2
with:
Expand All @@ -39,26 +50,35 @@ jobs:

- name: Zip Windows artifact
run: |
$tag = "${{ github.ref_name }}"
$tag = "v${{ steps.version.outputs.version }}"
$dir = "build\windows\x64\runner\Release"
Compress-Archive -Path "$dir\*" -DestinationPath "Querya-Desktop-$tag-windows.zip"

- uses: actions/upload-artifact@v4
with:
name: bundle-windows
path: Querya-Desktop-${{ github.ref_name }}-windows.zip
path: Querya-Desktop-v${{ steps.version.outputs.version }}-windows.zip
if-no-files-found: error

build-linux:
name: Build Linux
runs-on: ubuntu-latest
outputs:
version: ${{ steps.version.outputs.version }}
steps:
- uses: actions/checkout@v4

- name: Get version from pubspec.yaml
id: version
run: |
FULL_VERSION=$(grep "^version:" pubspec.yaml | sed 's/version: //')
VERSION=$(echo "$FULL_VERSION" | sed 's/+.*//')
echo "version=$VERSION" >> "$GITHUB_OUTPUT"

- name: Install Linux dependencies
run: |
sudo apt-get update
sudo apt-get install -y clang cmake ninja-build pkg-config libgtk-3-dev
sudo apt-get install -y clang cmake ninja-build pkg-config libgtk-3-dev libsecret-1-dev

- name: Setup Flutter
uses: subosito/flutter-action@v2
Expand All @@ -76,12 +96,12 @@ jobs:
- name: Zip Linux artifact
run: |
cd build/linux/x64/release/bundle
zip -r "${GITHUB_WORKSPACE}/Querya-Desktop-${{ github.ref_name }}-linux.zip" .
zip -r "${GITHUB_WORKSPACE}/Querya-Desktop-v${{ steps.version.outputs.version }}-linux.zip" .

- uses: actions/upload-artifact@v4
with:
name: bundle-linux
path: Querya-Desktop-${{ github.ref_name }}-linux.zip
path: Querya-Desktop-v${{ steps.version.outputs.version }}-linux.zip
if-no-files-found: error

publish:
Expand All @@ -93,10 +113,6 @@ jobs:
with:
fetch-depth: 0

- uses: taiki-e/install-action@v2
with:
tool: git-cliff@2.11.0

- uses: actions/download-artifact@v4
with:
path: artifacts
Expand All @@ -112,37 +128,25 @@ jobs:
cd dist
sha256sum *.zip | tee SHA256SUMS.txt

- name: Generate changelog (git-cliff + GitHub API)
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
GITHUB_REPO: ${{ github.repository }}
run: |
set -euo pipefail
TAG="${{ github.ref_name }}"
# Текст страницы релиза: без глобального header из cliff.toml
git-cliff --latest \
--config cliff.toml \
--strip header \
--github-token "$GITHUB_TOKEN" \
--github-repo "$GITHUB_REPO" \
-o release-body.md
# Вложение: полный фрагмент с header (удобно архивировать / копировать в docs)
git-cliff --latest \
--config cliff.toml \
--github-token "$GITHUB_TOKEN" \
--github-repo "$GITHUB_REPO" \
-o "CHANGELOG-${TAG}.md"

- name: Create GitHub Release
uses: softprops/action-gh-release@v2
with:
tag_name: ${{ github.ref_name }}
name: Release ${{ github.ref_name }}
body_path: release-body.md
tag_name: v${{ needs.build-windows.outputs.version }}
name: Release v${{ needs.build-windows.outputs.version }}
body: |
## Querya Desktop v${{ needs.build-windows.outputs.version }}

### Downloads
- **Linux**: Querya-Desktop-v${{ needs.build-windows.outputs.version }}-linux.zip
- **Windows**: Querya-Desktop-v${{ needs.build-windows.outputs.version }}-windows.zip

### Build Info
- Version: ${{ needs.build-windows.outputs.full_version }}
- Build Number: ${{ needs.build-windows.outputs.build_number }}
- Commit: ${{ github.sha }}
fail_on_unmatched_files: true
files: |
dist/*.zip
dist/SHA256SUMS.txt
CHANGELOG-${{ github.ref_name }}.md
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
76 changes: 76 additions & 0 deletions .github/workflows/version-bump.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
name: Auto Version Bump

on:
pull_request:
types:
- closed
branches:
- main

jobs:
bump-version:
runs-on: ubuntu-latest
permissions:
contents: write

steps:
- name: Check if PR was merged
id: check
run: |
if [ "${{ github.event.pull_request.merged }}" = "true" ]; then
echo "merged=true" >> "$GITHUB_OUTPUT"
else
echo "merged=false" >> "$GITHUB_OUTPUT"
fi

- name: Checkout main branch
if: steps.check.outputs.merged == 'true'
uses: actions/checkout@v4
with:
ref: main
token: ${{ secrets.GITHUB_TOKEN }}

- name: Get current version
if: steps.check.outputs.merged == 'true'
id: current_version
run: |
CURRENT_VERSION=$(grep "^version:" pubspec.yaml | sed 's/version: //' | sed 's/+.*//')
BUILD_NUMBER=$(grep "^version:" pubspec.yaml | sed 's/.*+//')
echo "current_version=$CURRENT_VERSION" >> "$GITHUB_OUTPUT"
echo "current_build=$BUILD_NUMBER" >> "$GITHUB_OUTPUT"

- name: Bump patch version
if: steps.check.outputs.merged == 'true'
id: bump
run: |
CURRENT_VERSION="${{ steps.current_version.outputs.current_version }}"
CURRENT_BUILD="${{ steps.current_version.outputs.current_build }}"
MAJOR=$(echo "$CURRENT_VERSION" | cut -d. -f1)
MINOR=$(echo "$CURRENT_VERSION" | cut -d. -f2)
PATCH=$(echo "$CURRENT_VERSION" | cut -d. -f3)
NEW_PATCH=$((PATCH + 1))
NEW_VERSION="$MAJOR.$MINOR.$NEW_PATCH"
if [ -z "$CURRENT_BUILD" ]; then
NEW_BUILD=1
else
NEW_BUILD=$((CURRENT_BUILD + 1))
fi
echo "new_version=$NEW_VERSION" >> "$GITHUB_OUTPUT"
echo "new_build=$NEW_BUILD" >> "$GITHUB_OUTPUT"

- name: Update pubspec.yaml
if: steps.check.outputs.merged == 'true'
run: |
NEW_VERSION="${{ steps.bump.outputs.new_version }}"
NEW_BUILD="${{ steps.bump.outputs.new_build }}"
sed -i "s/^version: .*/version: ${NEW_VERSION}+${NEW_BUILD}/" pubspec.yaml
grep "^version:" pubspec.yaml

- name: Commit version bump
if: steps.check.outputs.merged == 'true'
run: |
git config --local user.email "action@github.com"
git config --local user.name "GitHub Action"
git add pubspec.yaml
git commit -m "Bump version to ${{ steps.bump.outputs.new_version }}+${{ steps.bump.outputs.new_build }}"
git push origin main
30 changes: 30 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
# Changelog

All notable changes to this project are documented in this file.

The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## [0.1.0] - 2026-04-24

### Added

- **Preferences** — **Edit → Preferences** dialog: global SQL statement timeout (shared dropdown), max result rows presets, editor font size, and `AppSettingsRevision` so open SQL workspaces refresh when settings change.
- **Security** — connection passwords and sensitive connection material stored via **`flutter_secure_storage`** (OS keychain/credential store); local SQLite schema migration for non-secret fields only (see `docs/security.md`).
- **MIT LICENSE** at repository root.
- **Documentation** — `docs/security.md`, `docs/user-guide.md`, `docs/release-checklist.md`; release/tag process updates in `docs/tags-and-releases.md`.
- **Linux** — `run_linux.sh` checks for `libsecret` via `pkg-config` before `flutter run`.
- **UI** — empty-workspace hints (menu path to new connection and docs); **Connection → New Database Connection** wired in the menu.
- **Tests** — coverage for `AppSettingsRevision`, `SqlStatementTimeoutDropdown`, and `QueryEditorTab` font size behavior.

### Changed

- **Connections / drivers** — removed JDBC driver download UI and related storage/URL helpers; MySQL/Postgres use Dart clients only.
- **CI / release** — Linux runners install **`libsecret-1-dev`**; release workflow aligned with version tags from `pubspec`.
- **Linux build** — CMake install prefix forced so the Flutter bundle installs under **`build/`** instead of system paths such as `/usr/local`.

### Fixed

- Linux desktop build/install layout no longer targets `/usr/local` when building the app bundle.

[0.1.0]: https://github.com/QueryaHub/Querya-Desktop/compare/0.0.1...0.1.0
Loading
Loading