Skip to content

Merge skipstone into skip repo - #756

Open
marcprux wants to merge 2661 commits into
skiptools:mainfrom
marcprux:skipstone-monorepo
Open

marcprux wants to merge 2661 commits into
skiptools:mainfrom
marcprux:skipstone-monorepo

Conversation

@marcprux

@marcprux marcprux commented Nov 8, 2026

Copy link
Copy Markdown
Member

This is a draft PR that merges the skipstone repository into the skip build plugin repo, as per recent discussions about streamlining the build process. It preserved skipstone history, but any outstanding PRs would need to be re-filed against this repository.

The benefit is that it makes the build process much simpler, and enables us to have CI perform the release (upon tagging main with a semantic version number), rather than having to run the skipstone/scripts/release_skip.sh on a local machine.

marcprux and others added 30 commits January 17, 2026 00:27
piercifani and others added 23 commits October 23, 2026 17:11
1.9.18 linked SkipDriveExternal but still could not run skip android commands:
the release checkout's build folder kept SkipBuild objects compiled while the
module was missing, and canImport results are not build inputs, so nothing
recompiled them. The symbol-count guard passed because the module itself was
linked. Clean the build before releasing, and fail when the binary contains the
messages that only the #if !canImport(SkipDriveExternal) branches compile in.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Clean before release builds and guard on the compiled fallback paths
The output folder snapshot comes from FileManager's enumerator, which
resolves /var to /private/var on macOS, while the produced output paths
keep whatever form they were given in. When skip export runs the
skip-transpile plugin with a /var/folders project path, none of the
strings match, so every freshly written Kotlin file is treated as stale
and deleted, and Gradle then compiles the modules with no sources.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
release_skip.sh had its test steps commented out and nothing checked CI,
so 1.9.17 to 1.9.19 shipped with skip CI failing or cancelled. The script
now requires a successful skipstone CI run on the skipstone commit, and a
successful skip CI run on the skip commit that started after that
skipstone commit (skip CI checks out skipstone main when it starts).
DRY_RUN skips the check; SKIP_RELEASE_IGNORE_CI=1 overrides it, e.g. to
ship a fix for a red CI.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…inked-paths

Compare canonical paths when removing stale transpiler outputs
Sources/SkipDriveExternal links into the skip submodule, and release_skip.sh
built from whatever the submodule was pinned at, so the CLI could compile
SkipDrive sources several releases old. The release script now checks the
submodule out at the ../skip commit being tagged, copies in the bumped
Version.swift, fails if Sources/SkipDrive differs from what gets tagged, and
pins the submodule to the new tag in the skipstone release commit.

Also bump the submodule to skip main and add a CI job that fails when the
submodule's Sources/SkipDrive falls behind skip main.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Refuse to release unless CI passed on what is being released
…le-sync

Build the skip CLI against the SkipDrive that the release tags
…esting

Run native Swift Testing on the Android main run loop
…-root

Find owning manifests for native package mirrors
…ation

Preserve logical paths when enumerating symlinked targets
The skipstone package that produces the skip command-line tool now lives in
the skipstone/ folder of this repository instead of a separate repository
that pinned this one as a submodule. The two packages share the SkipDrive
sources through the skipstone/Sources/SkipDriveExternal symbolic link, which
now points at ../../Sources/SkipDrive, so the submodule, the .gitmodules file,
and the CI job that checked the submodule pin are gone.

SKIPLOCAL builds the tool from the bundled skipstone/ folder when set to an
empty value; a non-empty value still names another checkout. The PWD
heuristic that Xcode relies on is kept. The branch for hosts other than macOS
and Linux, which depended on the skipstone package by URL, is removed since it
would now refer to this repository.

CI is split into two workflows in this repository: ci.yml builds and tests the
plugin package with the tool compiled from skipstone/, and skipstone-ci.yml
builds and tests the skipstone package and exercises the tool on the Android
emulator. release.yml now checks out this repository alone and can perform a
release when dispatched manually; pushes and the nightly schedule remain dry
runs. The release script releases to the repository of the origin remote (or
the one running the workflow) so forks can rehearse releases, updates both
version constants, verifies both CI workflows passed for the commit, and only
updates the Homebrew cask when a homebrew-skip checkout is available.
Both packages are licensed under the Apache License 2.0 with the Runtime
Library Exception, as are the other Skip repositories, so the duplicate
skipstone/LICENSE.txt is removed and the root license file is renamed to
LICENSE.txt to match them. The per-file copyright header comments are removed
from the Swift and Java sources; the license is conveyed by the root license
file alone. The attribution block for the code adapted from the Swift project
in Sources/SkipDrive/ToolSupport.swift is kept.
…nse file

skip init no longer writes a LICENSE.txt into the projects it creates, so the
file trees that testSkipIcon compares against must not list one.
@marcprux
marcprux requested review from a team and piercifani November 8, 2026 13:40
@piercifani

Copy link
Copy Markdown
Contributor

This looks like a great improvement!

Didn't see any regression when trying this out locally, so great stuff!

@marcprux
marcprux marked this pull request as ready for review November 9, 2026 14:32
@marcprux

marcprux commented Nov 9, 2026

Copy link
Copy Markdown
Member Author

Great! I've marked this "Ready for Review", so if anyone else can take a look, I would appreciate it. It would be best to get this merge sooner rather than later so we can mark the skipstone repo read-only and not risk any "drift" in terms of PRs or other code changes.

Pushing a semantic version tag for a commit on main now triggers the release
workflow, which builds the macOS and Linux artifacts, creates a "Release X.Y.Z"
commit that bumps the version constants and points the plugin's binary targets
at them, moves the tag onto that commit, publishes the GitHub release with the
artifacts, and updates the Homebrew cask when a token for it is configured.

The release script takes the version from the tag instead of bumping the last
one itself, refuses to release a commit that is not on main, a version whose
release already exists, or a commit whose CI has not passed, and exits early
when run for a commit that already references the release artifacts, which is
what the moved tag triggers when it is pushed with a personal access token.
Dry runs restore the files they modify. Manual dispatch releases a given
version, or performs a dry run when no version is given; the nightly dry run
remains, and the dry run on every push is dropped since the skipstone CI
workflow already builds the plugin bundles.

@fhasse95 fhasse95 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I also tested building my app locally using the Skipstone plugin from this branch and didn’t notice any regressions. Thanks for the changes, including the simplified release process using version tags. That should make things easier going forward!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

10 participants