From 68eba72bf1b705a6983bab79a426ebf41edd3052 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sampo=20Kivist=C3=B6?= Date: Tue, 17 Mar 2026 14:56:30 +0200 Subject: [PATCH 01/30] v0.1.1 --- Cargo.lock | 14 +++++++------- Cargo.toml | 1 + crates/gitcomet-app/Cargo.toml | 2 +- crates/gitcomet-core/Cargo.toml | 2 +- crates/gitcomet-git-gix/Cargo.toml | 2 +- crates/gitcomet-git/Cargo.toml | 2 +- crates/gitcomet-state/Cargo.toml | 2 +- crates/gitcomet-ui-gpui/Cargo.toml | 2 +- crates/gitcomet-ui/Cargo.toml | 2 +- 9 files changed, 15 insertions(+), 14 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index f0d1ab5..e3256ad 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2240,7 +2240,7 @@ dependencies = [ [[package]] name = "gitcomet-app" -version = "0.1.0" +version = "0.1.1" dependencies = [ "clap", "embed-resource", @@ -2256,7 +2256,7 @@ dependencies = [ [[package]] name = "gitcomet-core" -version = "0.1.0" +version = "0.1.1" dependencies = [ "regex", "rustc-hash 2.1.1", @@ -2267,14 +2267,14 @@ dependencies = [ [[package]] name = "gitcomet-git" -version = "0.1.0" +version = "0.1.1" dependencies = [ "gitcomet-core", ] [[package]] name = "gitcomet-git-gix" -version = "0.1.0" +version = "0.1.1" dependencies = [ "gitcomet-core", "gix", @@ -2285,7 +2285,7 @@ dependencies = [ [[package]] name = "gitcomet-state" -version = "0.1.0" +version = "0.1.1" dependencies = [ "gitcomet-core", "gix", @@ -2299,14 +2299,14 @@ dependencies = [ [[package]] name = "gitcomet-ui" -version = "0.1.0" +version = "0.1.1" dependencies = [ "gitcomet-core", ] [[package]] name = "gitcomet-ui-gpui" -version = "0.1.0" +version = "0.1.1" dependencies = [ "criterion", "gitcomet-core", diff --git a/Cargo.toml b/Cargo.toml index 482d9fb..f791b69 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -21,6 +21,7 @@ default-members = [ ] [workspace.package] +version = "0.1.1" edition = "2024" license = "AGPL-3.0-only" authors = ["AutoExplore Oy "] diff --git a/crates/gitcomet-app/Cargo.toml b/crates/gitcomet-app/Cargo.toml index 03e993f..1d6608d 100644 --- a/crates/gitcomet-app/Cargo.toml +++ b/crates/gitcomet-app/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "gitcomet-app" -version = "0.1.0" +version.workspace = true edition.workspace = true authors.workspace = true license.workspace = true diff --git a/crates/gitcomet-core/Cargo.toml b/crates/gitcomet-core/Cargo.toml index 57d7b75..7bf9574 100644 --- a/crates/gitcomet-core/Cargo.toml +++ b/crates/gitcomet-core/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "gitcomet-core" -version = "0.1.0" +version.workspace = true edition.workspace = true authors.workspace = true license.workspace = true diff --git a/crates/gitcomet-git-gix/Cargo.toml b/crates/gitcomet-git-gix/Cargo.toml index 682a400..e5fcfd5 100644 --- a/crates/gitcomet-git-gix/Cargo.toml +++ b/crates/gitcomet-git-gix/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "gitcomet-git-gix" -version = "0.1.0" +version.workspace = true edition.workspace = true authors.workspace = true license.workspace = true diff --git a/crates/gitcomet-git/Cargo.toml b/crates/gitcomet-git/Cargo.toml index 4355f25..c813ed6 100644 --- a/crates/gitcomet-git/Cargo.toml +++ b/crates/gitcomet-git/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "gitcomet-git" -version = "0.1.0" +version.workspace = true edition.workspace = true authors.workspace = true license.workspace = true diff --git a/crates/gitcomet-state/Cargo.toml b/crates/gitcomet-state/Cargo.toml index 2061732..4aeff35 100644 --- a/crates/gitcomet-state/Cargo.toml +++ b/crates/gitcomet-state/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "gitcomet-state" -version = "0.1.0" +version.workspace = true edition.workspace = true authors.workspace = true license.workspace = true diff --git a/crates/gitcomet-ui-gpui/Cargo.toml b/crates/gitcomet-ui-gpui/Cargo.toml index 8541b3b..bc9f149 100644 --- a/crates/gitcomet-ui-gpui/Cargo.toml +++ b/crates/gitcomet-ui-gpui/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "gitcomet-ui-gpui" -version = "0.1.0" +version.workspace = true edition.workspace = true authors.workspace = true license.workspace = true diff --git a/crates/gitcomet-ui/Cargo.toml b/crates/gitcomet-ui/Cargo.toml index e696f74..f3bad2b 100644 --- a/crates/gitcomet-ui/Cargo.toml +++ b/crates/gitcomet-ui/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "gitcomet-ui" -version = "0.1.0" +version.workspace = true edition.workspace = true authors.workspace = true license.workspace = true From 45f3e7db5e100bc6b2d243b5fc0fac20af696639 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sampo=20Kivist=C3=B6?= Date: Tue, 17 Mar 2026 14:58:35 +0200 Subject: [PATCH 02/30] fix deployment --- .github/workflows/release-manual-main.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/release-manual-main.yml b/.github/workflows/release-manual-main.yml index 62eed85..e174820 100644 --- a/.github/workflows/release-manual-main.yml +++ b/.github/workflows/release-manual-main.yml @@ -82,10 +82,10 @@ jobs: - name: Verify crate version matches release version run: | set -euo pipefail - crate_version="$(sed -n 's/^version = "\([^"]*\)"/\1/p' crates/gitcomet-app/Cargo.toml | head -n1)" + crate_version="$(sed -n 's/^version = "\([^"]*\)"/\1/p' Cargo.toml | head -n1)" wanted="${{ steps.norm.outputs.version }}" if [ "$crate_version" != "$wanted" ]; then - echo "::error title=Version mismatch::crates/gitcomet-app/Cargo.toml version '$crate_version' does not match requested release '$wanted'." + echo "::error title=Version mismatch::Cargo.toml version '$crate_version' does not match requested release '$wanted'." exit 1 fi From d338711642696503285dcd134bc4d103f4d68d01 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sampo=20Kivist=C3=B6?= Date: Tue, 17 Mar 2026 15:30:11 +0200 Subject: [PATCH 03/30] trying to fix homebrew script --- .github/workflows/build-release-artifacts.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.github/workflows/build-release-artifacts.yml b/.github/workflows/build-release-artifacts.yml index 4f92f5e..bde8b47 100644 --- a/.github/workflows/build-release-artifacts.yml +++ b/.github/workflows/build-release-artifacts.yml @@ -357,6 +357,11 @@ jobs: RELEASE_ID: ${{ needs.prepare.outputs.release_id }} ENABLE_KEYLESS_SIGNING: ${{ vars.ENABLE_KEYLESS_SIGNING }} steps: + - uses: actions/checkout@v6 + with: + ref: ${{ needs.prepare.outputs.tag }} + fetch-depth: 0 + - uses: actions/download-artifact@v8 with: name: windows-release-artifacts From 27e03b1000e0b0a951758588452d6d270d42d420 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sampo=20Kivist=C3=B6?= Date: Tue, 17 Mar 2026 16:17:33 +0200 Subject: [PATCH 04/30] trying to fix homebrew --- .github/workflows/deploy-homebrew-tap.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/deploy-homebrew-tap.yml b/.github/workflows/deploy-homebrew-tap.yml index a727a7b..87e2666 100644 --- a/.github/workflows/deploy-homebrew-tap.yml +++ b/.github/workflows/deploy-homebrew-tap.yml @@ -191,7 +191,8 @@ jobs: cp dist/gitcomet.rb tap-repo/Formula/gitcomet.rb pushd tap-repo >/dev/null - if git diff --quiet -- Formula/gitcomet.rb; then + git add Formula/gitcomet.rb + if git diff --cached --quiet -- Formula/gitcomet.rb; then echo "No formula changes detected; tap already up to date." popd >/dev/null exit 0 @@ -199,7 +200,6 @@ jobs: git config user.name "github-actions[bot]" git config user.email "41898282+github-actions[bot]@users.noreply.github.com" - git add Formula/gitcomet.rb git commit -m "gitcomet ${TAG}" git push origin "HEAD:${TAP_BRANCH}" popd >/dev/null From 53a6a47c376156a408fbfb4fefeb3f80b1808d22 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sampo=20Kivist=C3=B6?= Date: Tue, 17 Mar 2026 16:24:34 +0200 Subject: [PATCH 05/30] apt and homebrew variables and defaults --- .github/workflows/deploy-apt-repo.yml | 76 +++++++++++++---------- .github/workflows/deploy-homebrew-tap.yml | 10 +-- .github/workflows/deployment-ci.yml | 49 ++++++++++++++- scripts/build-apt-repo.sh | 5 +- 4 files changed, 98 insertions(+), 42 deletions(-) diff --git a/.github/workflows/deploy-apt-repo.yml b/.github/workflows/deploy-apt-repo.yml index 51e3342..b7508b1 100644 --- a/.github/workflows/deploy-apt-repo.yml +++ b/.github/workflows/deploy-apt-repo.yml @@ -48,7 +48,7 @@ on: repo_description: required: false type: string - default: "GitComet APT repository" + default: "GitComet APT repository." container_public_access: required: false type: string @@ -75,32 +75,32 @@ on: required: false type: string storage_account: - description: "Azure Storage account name" + description: "Azure Storage account name. Defaults to repository variable APT_STORAGE_ACCOUNT when omitted." required: false default: "" type: string storage_container: - description: "Azure Blob container that holds the APT repository" + description: "Azure Blob container that holds the APT repository. Defaults to APT_STORAGE_CONTAINER when omitted." required: false default: "apt" type: string storage_prefix: - description: "Optional blob prefix within the container" + description: "Optional blob prefix within the container. Defaults to APT_STORAGE_PREFIX when omitted." required: false default: "" type: string repo_base_url: - description: "Public HTTPS base URL for the APT repo root" + description: "Public HTTPS base URL for the APT repo root. Defaults to APT_REPO_BASE_URL when omitted." required: false default: "" type: string distribution: - description: "APT suite/codename" + description: "APT suite/codename. Defaults to APT_REPO_DISTRIBUTION when omitted." required: false default: "stable" type: string component: - description: "APT component" + description: "APT component. Defaults to APT_REPO_COMPONENT when omitted." required: false default: "main" type: string @@ -110,22 +110,22 @@ on: default: "amd64" type: string repo_origin: - description: "Origin metadata in Release file" + description: "Origin metadata in Release file. Defaults to APT_REPO_ORIGIN when omitted." required: false default: "GitComet" type: string repo_label: - description: "Label metadata in Release file" + description: "Label metadata in Release file. Defaults to APT_REPO_LABEL when omitted." required: false default: "GitComet" type: string repo_description: - description: "Description metadata in Release file" + description: "Description metadata in Release file. Defaults to APT_REPO_DESCRIPTION when omitted." required: false - default: "GitComet APT repository" + default: "GitComet APT repository." type: string container_public_access: - description: "Public access used only when the blob container must be created" + description: "Public access used only when the blob container must be created. Defaults to APT_STORAGE_PUBLIC_ACCESS when omitted." required: false default: "blob" type: choice @@ -165,26 +165,36 @@ jobs: DISPATCH_VERSION: ${{ github.event.inputs.version }} INPUT_STORAGE_ACCOUNT: ${{ inputs.storage_account }} DISPATCH_STORAGE_ACCOUNT: ${{ github.event.inputs.storage_account }} + VAR_STORAGE_ACCOUNT: ${{ vars.APT_STORAGE_ACCOUNT }} INPUT_STORAGE_CONTAINER: ${{ inputs.storage_container }} DISPATCH_STORAGE_CONTAINER: ${{ github.event.inputs.storage_container }} + VAR_STORAGE_CONTAINER: ${{ vars.APT_STORAGE_CONTAINER }} INPUT_STORAGE_PREFIX: ${{ inputs.storage_prefix }} DISPATCH_STORAGE_PREFIX: ${{ github.event.inputs.storage_prefix }} + VAR_STORAGE_PREFIX: ${{ vars.APT_STORAGE_PREFIX }} INPUT_REPO_BASE_URL: ${{ inputs.repo_base_url }} DISPATCH_REPO_BASE_URL: ${{ github.event.inputs.repo_base_url }} + VAR_REPO_BASE_URL: ${{ vars.APT_REPO_BASE_URL }} INPUT_DISTRIBUTION: ${{ inputs.distribution }} DISPATCH_DISTRIBUTION: ${{ github.event.inputs.distribution }} + VAR_DISTRIBUTION: ${{ vars.APT_REPO_DISTRIBUTION }} INPUT_COMPONENT: ${{ inputs.component }} DISPATCH_COMPONENT: ${{ github.event.inputs.component }} + VAR_COMPONENT: ${{ vars.APT_REPO_COMPONENT }} INPUT_ARCHITECTURE: ${{ inputs.architecture }} DISPATCH_ARCHITECTURE: ${{ github.event.inputs.architecture }} INPUT_REPO_ORIGIN: ${{ inputs.repo_origin }} DISPATCH_REPO_ORIGIN: ${{ github.event.inputs.repo_origin }} + VAR_REPO_ORIGIN: ${{ vars.APT_REPO_ORIGIN }} INPUT_REPO_LABEL: ${{ inputs.repo_label }} DISPATCH_REPO_LABEL: ${{ github.event.inputs.repo_label }} + VAR_REPO_LABEL: ${{ vars.APT_REPO_LABEL }} INPUT_REPO_DESCRIPTION: ${{ inputs.repo_description }} DISPATCH_REPO_DESCRIPTION: ${{ github.event.inputs.repo_description }} + VAR_REPO_DESCRIPTION: ${{ vars.APT_REPO_DESCRIPTION }} INPUT_CONTAINER_PUBLIC_ACCESS: ${{ inputs.container_public_access }} DISPATCH_CONTAINER_PUBLIC_ACCESS: ${{ github.event.inputs.container_public_access }} + VAR_CONTAINER_PUBLIC_ACCESS: ${{ vars.APT_STORAGE_PUBLIC_ACCESS }} INPUT_DRY_RUN: ${{ inputs.dry_run }} DISPATCH_DRY_RUN: ${{ github.event.inputs.dry_run }} run: | @@ -192,17 +202,17 @@ jobs: tag="${INPUT_TAG:-${DISPATCH_TAG:-}}" version="${INPUT_VERSION:-${DISPATCH_VERSION:-}}" - storage_account="${INPUT_STORAGE_ACCOUNT:-${DISPATCH_STORAGE_ACCOUNT:-}}" - storage_container="${INPUT_STORAGE_CONTAINER:-${DISPATCH_STORAGE_CONTAINER:-apt}}" - storage_prefix="${INPUT_STORAGE_PREFIX:-${DISPATCH_STORAGE_PREFIX:-}}" - repo_base_url="${INPUT_REPO_BASE_URL:-${DISPATCH_REPO_BASE_URL:-}}" - distribution="${INPUT_DISTRIBUTION:-${DISPATCH_DISTRIBUTION:-stable}}" - component="${INPUT_COMPONENT:-${DISPATCH_COMPONENT:-main}}" + storage_account="${INPUT_STORAGE_ACCOUNT:-${DISPATCH_STORAGE_ACCOUNT:-${VAR_STORAGE_ACCOUNT:-}}}" + storage_container="${INPUT_STORAGE_CONTAINER:-${DISPATCH_STORAGE_CONTAINER:-${VAR_STORAGE_CONTAINER:-apt}}}" + storage_prefix="${INPUT_STORAGE_PREFIX:-${DISPATCH_STORAGE_PREFIX:-${VAR_STORAGE_PREFIX:-}}}" + repo_base_url="${INPUT_REPO_BASE_URL:-${DISPATCH_REPO_BASE_URL:-${VAR_REPO_BASE_URL:-}}}" + distribution="${INPUT_DISTRIBUTION:-${DISPATCH_DISTRIBUTION:-${VAR_DISTRIBUTION:-stable}}}" + component="${INPUT_COMPONENT:-${DISPATCH_COMPONENT:-${VAR_COMPONENT:-main}}}" architecture="${INPUT_ARCHITECTURE:-${DISPATCH_ARCHITECTURE:-amd64}}" - repo_origin="${INPUT_REPO_ORIGIN:-${DISPATCH_REPO_ORIGIN:-GitComet}}" - repo_label="${INPUT_REPO_LABEL:-${DISPATCH_REPO_LABEL:-GitComet}}" - repo_description="${INPUT_REPO_DESCRIPTION:-${DISPATCH_REPO_DESCRIPTION:-GitComet APT repository}}" - container_public_access="${INPUT_CONTAINER_PUBLIC_ACCESS:-${DISPATCH_CONTAINER_PUBLIC_ACCESS:-blob}}" + repo_origin="${INPUT_REPO_ORIGIN:-${DISPATCH_REPO_ORIGIN:-${VAR_REPO_ORIGIN:-GitComet}}}" + repo_label="${INPUT_REPO_LABEL:-${DISPATCH_REPO_LABEL:-${VAR_REPO_LABEL:-GitComet}}}" + repo_description="${INPUT_REPO_DESCRIPTION:-${DISPATCH_REPO_DESCRIPTION:-${VAR_REPO_DESCRIPTION:-GitComet APT repository.}}}" + container_public_access="${INPUT_CONTAINER_PUBLIC_ACCESS:-${DISPATCH_CONTAINER_PUBLIC_ACCESS:-${VAR_CONTAINER_PUBLIC_ACCESS:-blob}}}" dry_run="${INPUT_DRY_RUN:-${DISPATCH_DRY_RUN:-false}}" tag="$(echo "$tag" | tr -d '[:space:]')" @@ -365,7 +375,7 @@ jobs: echo "Key-Type: RSA" echo "Key-Length: 3072" echo "Name-Real: GitComet APT Dry Run" - echo "Name-Email: ci@example.invalid" + echo "Name-Email: ci@autoexplore.ai" echo "Expire-Date: 0" echo "%no-protection" echo "%commit" @@ -419,16 +429,16 @@ jobs: blob_prefix="${blob_prefix}/" fi - mapfile -t existing_blobs < <( - az storage blob list \ - --account-name "$STORAGE_ACCOUNT" \ - --container-name "$STORAGE_CONTAINER" \ - --account-key "$AZURE_STORAGE_ACCOUNT_KEY" \ - --prefix "$blob_prefix" \ - --num-results "*" \ - --query "[].name" \ - -o tsv - ) + existing_blobs_file="${RUNNER_TEMP}/apt-existing-blobs.txt" + az storage blob list \ + --account-name "$STORAGE_ACCOUNT" \ + --container-name "$STORAGE_CONTAINER" \ + --account-key "$AZURE_STORAGE_ACCOUNT_KEY" \ + --prefix "$blob_prefix" \ + --num-results "*" \ + --query "[].name" \ + -o tsv > "$existing_blobs_file" + mapfile -t existing_blobs < "$existing_blobs_file" if [ "${#existing_blobs[@]}" -eq 0 ]; then exit 0 diff --git a/.github/workflows/deploy-homebrew-tap.yml b/.github/workflows/deploy-homebrew-tap.yml index 87e2666..c6e8266 100644 --- a/.github/workflows/deploy-homebrew-tap.yml +++ b/.github/workflows/deploy-homebrew-tap.yml @@ -35,12 +35,12 @@ on: required: false type: string tap_repo: - description: "Target tap repository in OWNER/REPO form (e.g. Auto-Explore/homebrew-gitcomet)" + description: "Target tap repository in OWNER/REPO form (e.g. Auto-Explore/homebrew-gitcomet). Defaults to HOMEBREW_TAP_REPO when omitted." required: false default: "" type: string tap_branch: - description: "Target branch in tap repo" + description: "Target branch in tap repo. Defaults to HOMEBREW_TAP_BRANCH when omitted." required: false default: "main" type: string @@ -74,8 +74,10 @@ jobs: DISPATCH_VERSION: ${{ github.event.inputs.version }} INPUT_TAP_REPO: ${{ inputs.tap_repo }} DISPATCH_TAP_REPO: ${{ github.event.inputs.tap_repo }} + VAR_TAP_REPO: ${{ vars.HOMEBREW_TAP_REPO }} INPUT_TAP_BRANCH: ${{ inputs.tap_branch }} DISPATCH_TAP_BRANCH: ${{ github.event.inputs.tap_branch }} + VAR_TAP_BRANCH: ${{ vars.HOMEBREW_TAP_BRANCH }} INPUT_DRY_RUN: ${{ inputs.dry_run }} DISPATCH_DRY_RUN: ${{ github.event.inputs.dry_run }} REPO_OWNER: ${{ github.repository_owner }} @@ -84,8 +86,8 @@ jobs: tag="${INPUT_TAG:-${DISPATCH_TAG:-}}" version="${INPUT_VERSION:-${DISPATCH_VERSION:-}}" - tap_repo="${INPUT_TAP_REPO:-${DISPATCH_TAP_REPO:-}}" - tap_branch="${INPUT_TAP_BRANCH:-${DISPATCH_TAP_BRANCH:-main}}" + tap_repo="${INPUT_TAP_REPO:-${DISPATCH_TAP_REPO:-${VAR_TAP_REPO:-}}}" + tap_branch="${INPUT_TAP_BRANCH:-${DISPATCH_TAP_BRANCH:-${VAR_TAP_BRANCH:-main}}}" dry_run="${INPUT_DRY_RUN:-${DISPATCH_DRY_RUN:-false}}" tag="$(echo "$tag" | tr -d '[:space:]')" diff --git a/.github/workflows/deployment-ci.yml b/.github/workflows/deployment-ci.yml index bac7bf3..96c68e1 100644 --- a/.github/workflows/deployment-ci.yml +++ b/.github/workflows/deployment-ci.yml @@ -53,6 +53,27 @@ jobs: .github/workflows/release-manual-main.yml ].each { |path| YAML.load_file(path) }' + - name: Validate deployment workflow config keys + run: | + set -euo pipefail + grep -Fq 'vars.APT_STORAGE_ACCOUNT' .github/workflows/release-manual-main.yml + grep -Fq 'vars.APT_STORAGE_CONTAINER' .github/workflows/release-manual-main.yml + grep -Fq 'vars.APT_REPO_DISTRIBUTION' .github/workflows/release-manual-main.yml + grep -Fq 'vars.APT_REPO_COMPONENT' .github/workflows/release-manual-main.yml + grep -Fq 'vars.APT_REPO_ORIGIN' .github/workflows/release-manual-main.yml + grep -Fq 'vars.APT_REPO_LABEL' .github/workflows/release-manual-main.yml + grep -Fq 'vars.APT_REPO_DESCRIPTION' .github/workflows/release-manual-main.yml + grep -Fq 'vars.APT_STORAGE_PUBLIC_ACCESS' .github/workflows/release-manual-main.yml + grep -Fq 'vars.APT_STORAGE_ACCOUNT' .github/workflows/deploy-apt-repo.yml + grep -Fq 'vars.APT_STORAGE_CONTAINER' .github/workflows/deploy-apt-repo.yml + grep -Fq 'vars.APT_REPO_DISTRIBUTION' .github/workflows/deploy-apt-repo.yml + grep -Fq 'vars.APT_REPO_COMPONENT' .github/workflows/deploy-apt-repo.yml + grep -Fq 'vars.APT_REPO_ORIGIN' .github/workflows/deploy-apt-repo.yml + grep -Fq 'vars.APT_REPO_LABEL' .github/workflows/deploy-apt-repo.yml + grep -Fq 'vars.APT_REPO_DESCRIPTION' .github/workflows/deploy-apt-repo.yml + grep -Fq 'vars.APT_STORAGE_PUBLIC_ACCESS' .github/workflows/deploy-apt-repo.yml + grep -Fq 'HOMEBREW_TAP_TOKEN' .github/workflows/deploy-homebrew-tap.yml + - name: Generate formula from synthetic artifacts run: | set -euo pipefail @@ -73,6 +94,29 @@ jobs: grep -q "on_linux do" dist/deployment-ci/gitcomet.rb grep -q "gitcomet-v0.0.0-ci-linux-x86_64.tar.gz" dist/deployment-ci/gitcomet.rb + - name: Validate Homebrew tap initial publish detection + run: | + set -euo pipefail + rm -rf dist/deployment-ci/tap-repo + git init --initial-branch=main dist/deployment-ci/tap-repo + + pushd dist/deployment-ci/tap-repo >/dev/null + git config user.name "GitComet CI" + git config user.email "ci@autoexplore.ai" + echo "# Homebrew Tap" > README.md + git add README.md + git commit -m "Initial tap repo" + + mkdir -p Formula + cp ../gitcomet.rb Formula/gitcomet.rb + + git add Formula/gitcomet.rb + if git diff --cached --quiet -- Formula/gitcomet.rb; then + echo "Expected initial formula publish to be detected as a change." + exit 1 + fi + popd >/dev/null + apt-repo-generation-smoke: name: Validate APT repo generation script runs-on: ubuntu-latest @@ -98,7 +142,7 @@ jobs: echo "Package: gitcomet" echo "Version: 0.0.0~ci1" echo "Architecture: amd64" - echo "Maintainer: GitComet CI " + echo "Maintainer: GitComet CI " echo "Description: Synthetic GitComet package for deployment CI." } > "${pkg_root}/DEBIAN/control" @@ -116,7 +160,7 @@ jobs: echo "Key-Type: RSA" echo "Key-Length: 3072" echo "Name-Real: GitComet CI" - echo "Name-Email: ci@example.invalid" + echo "Name-Email: ci@autoexplore.ai" echo "Expire-Date: 0" echo "%no-protection" echo "%commit" @@ -141,6 +185,7 @@ jobs: --label GitComet \ --description "GitComet deployment CI repository" \ --repo-url https://example.invalid/gitcomet/apt \ + --gpg-passphrase "deployment-ci-passphrase" \ --signing-key "${APT_TEST_GPG_KEY_ID}" - name: Validate generated repo diff --git a/scripts/build-apt-repo.sh b/scripts/build-apt-repo.sh index bf16878..c7ca399 100755 --- a/scripts/build-apt-repo.sh +++ b/scripts/build-apt-repo.sh @@ -220,12 +220,11 @@ write_release_checksums() { run_gpg() { local -a args args=(--batch --yes --pinentry-mode loopback --local-user "$signing_key") - args+=("$@") if [[ -n "$gpg_passphrase" ]]; then - gpg "${args[@]}" --passphrase-fd 0 <<<"$gpg_passphrase" + gpg "${args[@]}" --passphrase-fd 0 "$@" <<<"$gpg_passphrase" else - gpg "${args[@]}" + gpg "${args[@]}" "$@" fi } From 6703f2543d1abb2546b609d0787a2777bfbd97f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sampo=20Kivist=C3=B6?= Date: Tue, 17 Mar 2026 16:38:39 +0200 Subject: [PATCH 06/30] fix reading gpt passphrase from secrets --- .github/workflows/deployment-ci.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/deployment-ci.yml b/.github/workflows/deployment-ci.yml index 96c68e1..40eaf4b 100644 --- a/.github/workflows/deployment-ci.yml +++ b/.github/workflows/deployment-ci.yml @@ -173,6 +173,7 @@ jobs: - name: Build signed APT repo env: GNUPGHOME: ${{ github.workspace }}/dist/apt-ci/gnupg + APT_GPG_PASSPHRASE: ${{ secrets.APT_GPG_PASSPHRASE }} run: | set -euo pipefail scripts/build-apt-repo.sh \ @@ -185,7 +186,7 @@ jobs: --label GitComet \ --description "GitComet deployment CI repository" \ --repo-url https://example.invalid/gitcomet/apt \ - --gpg-passphrase "deployment-ci-passphrase" \ + --gpg-passphrase "${APT_GPG_PASSPHRASE}" \ --signing-key "${APT_TEST_GPG_KEY_ID}" - name: Validate generated repo From edcfe68bf46ccc4e4f9bfd859324e975762f3904 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sampo=20Kivist=C3=B6?= Date: Tue, 17 Mar 2026 17:01:25 +0200 Subject: [PATCH 07/30] renamed gitcomet-app to gitcomet --- .github/workflows/build-release-artifacts.yml | 20 ++--- .github/workflows/cross-platform-tests.yml | 12 +-- .github/workflows/deployment-ci.yml | 13 +-- .github/workflows/rust.yml | 18 ++-- CONTRIBUTING.md | 8 +- Cargo.lock | 2 +- Cargo.toml | 4 +- README.md | 14 +-- assets/linux/gitcomet.desktop | 2 +- crates/gitcomet-state/src/session.rs | 2 +- crates/gitcomet-ui-gpui/src/focused_diff.rs | 2 +- crates/{gitcomet-app => gitcomet}/Cargo.toml | 2 +- crates/{gitcomet-app => gitcomet}/build.rs | 0 .../src/bin/gitcomet-launcher.rs | 2 +- crates/{gitcomet-app => gitcomet}/src/cli.rs | 4 +- .../src/cli/compat.rs | 0 .../src/cli/git_config.rs | 0 .../src/cli/tests.rs | 88 +++++++++---------- .../src/crashlog.rs | 8 +- .../src/difftool_mode.rs | 0 .../src/extract_fixtures_mode.rs | 0 crates/{gitcomet-app => gitcomet}/src/main.rs | 65 +++++++++++--- .../src/mergetool_mode.rs | 0 .../src/mergetool_mode/tests.rs | 0 .../src/setup_mode.rs | 20 ++--- .../tests/difftool_git_integration.rs | 9 +- .../extract_merge_fixtures_integration.rs | 9 +- .../tests/mergetool_git_integration.rs | 15 ++-- .../tests/standalone_tool_mode_integration.rs | 59 ++++++------- .../windows/gitcomet.rc | 0 .../{gitcomet-app => gitcomet}/wix/main.wxs | 8 +- scripts/build_release_debug.sh | 2 +- scripts/generate-homebrew-formula.sh | 9 +- scripts/install-linux.sh | 12 +-- scripts/package-macos.sh | 10 +-- scripts/test_windows_installer.cmd | 2 +- scripts/uninstall-linux.sh | 2 +- scripts/valgrind_cdp | 4 +- 38 files changed, 236 insertions(+), 191 deletions(-) rename crates/{gitcomet-app => gitcomet}/Cargo.toml (97%) rename crates/{gitcomet-app => gitcomet}/build.rs (100%) rename crates/{gitcomet-app => gitcomet}/src/bin/gitcomet-launcher.rs (93%) rename crates/{gitcomet-app => gitcomet}/src/cli.rs (99%) rename crates/{gitcomet-app => gitcomet}/src/cli/compat.rs (100%) rename crates/{gitcomet-app => gitcomet}/src/cli/git_config.rs (100%) rename crates/{gitcomet-app => gitcomet}/src/cli/tests.rs (98%) rename crates/{gitcomet-app => gitcomet}/src/crashlog.rs (99%) rename crates/{gitcomet-app => gitcomet}/src/difftool_mode.rs (100%) rename crates/{gitcomet-app => gitcomet}/src/extract_fixtures_mode.rs (100%) rename crates/{gitcomet-app => gitcomet}/src/main.rs (91%) rename crates/{gitcomet-app => gitcomet}/src/mergetool_mode.rs (100%) rename crates/{gitcomet-app => gitcomet}/src/mergetool_mode/tests.rs (100%) rename crates/{gitcomet-app => gitcomet}/src/setup_mode.rs (98%) rename crates/{gitcomet-app => gitcomet}/tests/difftool_git_integration.rs (99%) rename crates/{gitcomet-app => gitcomet}/tests/extract_merge_fixtures_integration.rs (95%) rename crates/{gitcomet-app => gitcomet}/tests/mergetool_git_integration.rs (99%) rename crates/{gitcomet-app => gitcomet}/tests/standalone_tool_mode_integration.rs (98%) rename crates/{gitcomet-app => gitcomet}/windows/gitcomet.rc (100%) rename crates/{gitcomet-app => gitcomet}/wix/main.wxs (96%) diff --git a/.github/workflows/build-release-artifacts.yml b/.github/workflows/build-release-artifacts.yml index bde8b47..2ae2a05 100644 --- a/.github/workflows/build-release-artifacts.yml +++ b/.github/workflows/build-release-artifacts.yml @@ -142,14 +142,14 @@ jobs: - name: Build release binary shell: pwsh run: | - cargo build -p gitcomet-app --release --locked --features ui-gpui,gix --bins + cargo build -p gitcomet --release --locked --features ui-gpui,gix --bins - name: Package portable ZIP shell: pwsh run: | $ErrorActionPreference = "Stop" New-Item -ItemType Directory -Path dist\portable -Force | Out-Null - Copy-Item target\release\gitcomet-app.exe dist\portable\gitcomet-app.exe -Force + Copy-Item target\release\gitcomet.exe dist\portable\gitcomet.exe -Force Copy-Item README.md dist\portable\README.md -Force Copy-Item LICENSE-AGPL-3.0 dist\portable\LICENSE-AGPL-3.0 -Force Copy-Item NOTICE dist\portable\NOTICE -Force @@ -164,11 +164,11 @@ jobs: $ErrorActionPreference = "Stop" choco install wixtoolset --version "${env:WIXTOOLSET_VERSION}" --yes --no-progress cargo install cargo-wix --version "${env:CARGO_WIX_VERSION}" --locked - if (!(Test-Path "crates\gitcomet-app\wix\main.wxs")) { - cargo wix init --package gitcomet-app + if (!(Test-Path "crates\gitcomet\wix\main.wxs")) { + cargo wix init --package gitcomet } $msiName = "gitcomet-v${env:VERSION}-windows-x86_64.msi" - cargo wix --package gitcomet-app --profile release --nocapture --no-build --output "dist\$msiName" + cargo wix --package gitcomet --profile release --nocapture --no-build --output "dist\$msiName" - name: Upload Windows artifacts uses: actions/upload-artifact@v7 @@ -212,7 +212,7 @@ jobs: uses: Swatinem/rust-cache@v2 - name: Build release binary - run: cargo build -p gitcomet-app --release --locked --features ui-gpui,gix + run: cargo build -p gitcomet --release --locked --features ui-gpui,gix - name: Normalize desktop entry metadata run: | @@ -227,7 +227,7 @@ jobs: set -euo pipefail root="gitcomet-v${VERSION}-linux-x86_64" mkdir -p "dist/stage/${root}" - install -m755 target/release/gitcomet-app "dist/stage/${root}/gitcomet-app" + install -m755 target/release/gitcomet "dist/stage/${root}/gitcomet" install -m644 README.md "dist/stage/${root}/README.md" install -m644 LICENSE-AGPL-3.0 "dist/stage/${root}/LICENSE-AGPL-3.0" install -m644 NOTICE "dist/stage/${root}/NOTICE" @@ -245,7 +245,7 @@ jobs: mkdir -p "${pkg_root}/usr/share/applications" mkdir -p "${pkg_root}/usr/share/icons/hicolor/512x512/apps" - install -m755 target/release/gitcomet-app "${pkg_root}/usr/bin/gitcomet-app" + install -m755 target/release/gitcomet "${pkg_root}/usr/bin/gitcomet" install -m644 dist/gitcomet.desktop "${pkg_root}/usr/share/applications/gitcomet.desktop" install -m644 assets/gitcomet-512.png "${pkg_root}/usr/share/icons/hicolor/512x512/apps/gitcomet.png" @@ -267,7 +267,7 @@ jobs: set -euo pipefail appdir="dist/AppDir" mkdir -p "${appdir}/usr/bin" - install -m755 target/release/gitcomet-app "${appdir}/usr/bin/gitcomet-app" + install -m755 target/release/gitcomet "${appdir}/usr/bin/gitcomet" install -m644 dist/gitcomet.desktop "${appdir}/gitcomet.desktop" install -m644 assets/gitcomet-512.png "${appdir}/gitcomet.png" @@ -275,7 +275,7 @@ jobs: echo '#!/usr/bin/env bash' echo 'set -euo pipefail' echo 'HERE="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"' - echo 'exec "${HERE}/usr/bin/gitcomet-app" "$@"' + echo 'exec "${HERE}/usr/bin/gitcomet" "$@"' } > "${appdir}/AppRun" chmod +x "${appdir}/AppRun" diff --git a/.github/workflows/cross-platform-tests.yml b/.github/workflows/cross-platform-tests.yml index b28771f..c4d8044 100644 --- a/.github/workflows/cross-platform-tests.yml +++ b/.github/workflows/cross-platform-tests.yml @@ -163,8 +163,8 @@ jobs: echo "XDG_CURRENT_DESKTOP=${XDG_CURRENT_DESKTOP:-}" - name: Run display-selection integration tests run: | - cargo test -p gitcomet-app $APP_FEATURES --test mergetool_git_integration gui_default --verbose - cargo test -p gitcomet-app $APP_FEATURES --test difftool_git_integration gui_default --verbose + cargo test -p gitcomet $APP_FEATURES --test mergetool_git_integration gui_default --verbose + cargo test -p gitcomet $APP_FEATURES --test difftool_git_integration gui_default --verbose - name: Run UI smoke test under selected profile run: cargo test -p gitcomet-ui-gpui smoke_tests::smoke_view_renders_without_panicking -- --exact @@ -200,9 +200,9 @@ jobs: --verbose - name: Gatekeeper and code-signing check (informational) run: | - cargo build -p gitcomet-app $APP_FEATURES --release --locked - codesign --verify --verbose target/release/gitcomet-app || true - spctl --assess --type execute --verbose target/release/gitcomet-app || true + cargo build -p gitcomet $APP_FEATURES --release --locked + codesign --verify --verbose target/release/gitcomet || true + spctl --assess --type execute --verbose target/release/gitcomet || true windows-tests: name: Windows Tests (PowerShell + CMD) @@ -235,7 +235,7 @@ jobs: --verbose - name: Run standalone smoke test in CMD shell: cmd - run: cargo test -p gitcomet-app --no-default-features --features gix --test standalone_tool_mode_integration help_flag_exits_zero -- --exact + run: cargo test -p gitcomet --no-default-features --features gix --test standalone_tool_mode_integration help_flag_exits_zero -- --exact - name: Show path behavior (CMD + Git Bash) shell: cmd run: | diff --git a/.github/workflows/deployment-ci.yml b/.github/workflows/deployment-ci.yml index 40eaf4b..6267440 100644 --- a/.github/workflows/deployment-ci.yml +++ b/.github/workflows/deployment-ci.yml @@ -93,6 +93,9 @@ jobs: ruby -c dist/deployment-ci/gitcomet.rb grep -q "on_linux do" dist/deployment-ci/gitcomet.rb grep -q "gitcomet-v0.0.0-ci-linux-x86_64.tar.gz" dist/deployment-ci/gitcomet.rb + grep -q 'libexec.install "GitComet.app"' dist/deployment-ci/gitcomet.rb + grep -q 'bin.install_symlink libexec/"GitComet.app/Contents/MacOS/gitcomet"' dist/deployment-ci/gitcomet.rb + grep -q 'bin.install "gitcomet"' dist/deployment-ci/gitcomet.rb - name: Validate Homebrew tap initial publish detection run: | @@ -135,8 +138,8 @@ jobs: pkg_root="dist/apt-ci/pkg" mkdir -p "${pkg_root}/DEBIAN" "${pkg_root}/usr/bin" - printf '%s\n' '#!/usr/bin/env bash' 'echo "GitComet CI"' > "${pkg_root}/usr/bin/gitcomet-app" - chmod +x "${pkg_root}/usr/bin/gitcomet-app" + printf '%s\n' '#!/usr/bin/env bash' 'echo "GitComet CI"' > "${pkg_root}/usr/bin/gitcomet" + chmod +x "${pkg_root}/usr/bin/gitcomet" { echo "Package: gitcomet" @@ -231,7 +234,7 @@ jobs: uses: Swatinem/rust-cache@v2 - name: Build release binary - run: cargo build -p gitcomet-app --release --locked --features ui-gpui,gix --bins + run: cargo build -p gitcomet --release --locked --features ui-gpui,gix --bins - name: Package macOS artifacts run: | @@ -248,7 +251,7 @@ jobs: set -euo pipefail tarball="dist/gitcomet-v0.0.0-ci-macos-${{ matrix.arch }}.tar.gz" test -f "$tarball" - tar -tzf "$tarball" | grep -q "GitComet.app/Contents/MacOS/gitcomet-app$" + tar -tzf "$tarball" | grep -q "GitComet.app/Contents/MacOS/gitcomet$" - name: Verify DMG launches binary run: | @@ -262,5 +265,5 @@ jobs: exit 1 fi - "${mount_point}/GitComet.app/Contents/MacOS/gitcomet-app" --help >/dev/null + "${mount_point}/GitComet.app/Contents/MacOS/gitcomet" --help >/dev/null hdiutil detach "$mount_point" diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml index b02a407..9b719c1 100644 --- a/.github/workflows/rust.yml +++ b/.github/workflows/rust.yml @@ -18,7 +18,7 @@ concurrency: env: CARGO_TERM_COLOR: always - # Build gitcomet-app in headless mode (no GPUI system deps required). + # Build gitcomet in headless mode (no GPUI system deps required). # The UI-only code paths are behind #[cfg(feature = "ui-gpui")] guards. APP_FEATURES: "--no-default-features --features gix" @@ -77,7 +77,7 @@ jobs: echo "Skipping cargo clippy -p gitcomet-ui-gpui in this job." echo "Reason: GPUI requires native windowing/system dependencies that are not available in headless CI." - name: Clippy (app — headless) - run: cargo clippy -p gitcomet-app $APP_FEATURES -- -D warnings + run: cargo clippy -p gitcomet $APP_FEATURES -- -D warnings build: name: Build @@ -92,7 +92,7 @@ jobs: - name: Build (core + state + backend) run: cargo build -p gitcomet-core -p gitcomet-state -p gitcomet-git-gix --verbose - name: Build (app — headless) - run: cargo build -p gitcomet-app $APP_FEATURES --verbose + run: cargo build -p gitcomet $APP_FEATURES --verbose # Core merge algorithm correctness — Phase 1A/1B/1C portability tests merge-algorithm: @@ -148,16 +148,16 @@ jobs: uses: dtolnay/rust-toolchain@stable - name: Cache Rust artifacts uses: Swatinem/rust-cache@v2 - - name: Build gitcomet-app binary (headless) - run: cargo build -p gitcomet-app $APP_FEATURES + - name: Build gitcomet binary (headless) + run: cargo build -p gitcomet $APP_FEATURES - name: Git mergetool E2E (Phase 4A — t7610 parity) - run: cargo test -p gitcomet-app $APP_FEATURES --test mergetool_git_integration --verbose + run: cargo test -p gitcomet $APP_FEATURES --test mergetool_git_integration --verbose - name: Git difftool E2E (Phase 4B — t7800 parity) - run: cargo test -p gitcomet-app $APP_FEATURES --test difftool_git_integration --verbose + run: cargo test -p gitcomet $APP_FEATURES --test difftool_git_integration --verbose - name: Standalone tool-mode E2E (exit codes + validation) - run: cargo test -p gitcomet-app $APP_FEATURES --test standalone_tool_mode_integration --verbose + run: cargo test -p gitcomet $APP_FEATURES --test standalone_tool_mode_integration --verbose - name: Mergetool/difftool runtime unit tests (bin target) - run: cargo test -p gitcomet-app $APP_FEATURES --bin gitcomet-app --verbose + run: cargo test -p gitcomet $APP_FEATURES --bin gitcomet --verbose # Backend integration — mergetool launcher, status, conflict checkout backend-integration: diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 2739728..d1113c2 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -8,7 +8,7 @@ - `crates/gitcomet-state`: MVU state store, reducers, effects, conflict session management. - `crates/gitcomet-ui`: UI model/state (toolkit-independent). - `crates/gitcomet-ui-gpui`: gpui views/components (focused diff/merge windows, conflict resolver, word diff). -- `crates/gitcomet-app`: binary entrypoint, CLI (clap), difftool/mergetool/setup/uninstall modes. +- `crates/gitcomet`: binary entrypoint, CLI (clap), difftool/mergetool/setup/uninstall modes. ### Getting started @@ -28,19 +28,19 @@ cargo build To build the actual app you'll enable features (requires network for dependencies): ```bash -cargo build -p gitcomet-app --features ui,gix +cargo build -p gitcomet --features ui,gix ``` To also compile the gpui-based UI crate: ```bash -cargo build -p gitcomet-app --features ui-gpui,gix +cargo build -p gitcomet --features ui-gpui,gix ``` Run (opens the repo passed as the first arg, or falls back to the current directory): ```bash -cargo run -p gitcomet-app --features ui-gpui,gix -- /path/to/repo +cargo run -p gitcomet --features ui-gpui,gix -- /path/to/repo ``` ### Testing diff --git a/Cargo.lock b/Cargo.lock index e3256ad..d58e74e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2239,7 +2239,7 @@ dependencies = [ ] [[package]] -name = "gitcomet-app" +name = "gitcomet" version = "0.1.1" dependencies = [ "clap", diff --git a/Cargo.toml b/Cargo.toml index f791b69..ba8fc26 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,7 +1,7 @@ [workspace] resolver = "3" members = [ - "crates/gitcomet-app", + "crates/gitcomet", "crates/gitcomet-core", "crates/gitcomet-git", "crates/gitcomet-git-gix", @@ -11,7 +11,7 @@ members = [ ] default-members = [ - "crates/gitcomet-app", + "crates/gitcomet", "crates/gitcomet-core", "crates/gitcomet-git", "crates/gitcomet-git-gix", diff --git a/README.md b/README.md index aabc2b7..37eddad 100644 --- a/README.md +++ b/README.md @@ -76,8 +76,8 @@ Measured on Linux 6.19.6-zen (x64), Ryzen 5950x, 128GB DDR4. Detailed test steps ### Build from source ```bash -cargo build -p gitcomet-app --features ui-gpui,gix -cargo run -p gitcomet-app --features ui-gpui,gix -- /path/to/repo +cargo build -p gitcomet --features ui-gpui,gix +cargo run -p gitcomet --features ui-gpui,gix -- /path/to/repo ``` ### Contributing @@ -92,10 +92,10 @@ GitComet can be used as a standalone diff and merge tool invoked by `git difftoo ```bash # Configure Git globally to use GitComet for both difftool + mergetool -gitcomet-app setup +gitcomet setup # Remove GitComet integration safely -gitcomet-app uninstall +gitcomet uninstall ``` - Use `--local` to target only the current repository instead of global config. @@ -110,7 +110,7 @@ This setup registers both headless and GUI variants with `guiDefault=auto`, so G Built-in `setup` writes these Git config entries: ```bash -GITCOMET_BIN="/absolute/path/to/gitcomet-app" +GITCOMET_BIN="/absolute/path/to/gitcomet" # Headless tool: algorithm-only merge/diff for CI, scripts, and no-display environments git config --global merge.tool gitcomet @@ -153,7 +153,7 @@ Built-in `uninstall` restores those backups only when the key still has the setu **Difftool:** ```bash -gitcomet-app difftool --local --remote [--path ] [--label-left