Why Nostr? What is Njump?
2024-07-03 00:55:29

npub143…3ckzc on Nostr: commit 83fd1024483b5882a29e7cdb8c6f12f3bb05134d Author: randymcmillan ...

commit 83fd1024483b5882a29e7cdb8c6f12f3bb05134d
Author: randymcmillan <[email protected]>
Date: Mon May 20 21:04:42 2024 -0400

.github:cargo dist config

diff --git a/.github/workflows/c-cpp.yml b/.github/workflows/c-cpp.yml
index b42baf712..5fe03fcf8 100644
--- a/.github/workflows/c-cpp.yml
+++ b/.github/workflows/c-cpp.yml
@@ -13,5 +13,7 @@ jobs:

steps:
- uses: actions/checkout@v3
- - name: make
- run: make
+ - name: apt-get install cmake
+ run: sudo apt-get install cmake
+ - name: make
+ run: cmake . && make
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
new file mode 100644
index 000000000..2af5dc685
--- /dev/null
+++ b/.github/workflows/release.yml
@@ -0,0 +1,312 @@
+# Copyright 2022-2024, axodotdev
+# SPDX-License-Identifier: MIT or Apache-2.0
+#
+# CI that:
+#
+# * checks for a Git Tag that looks like a release
+# * builds artifacts with cargo-dist (archives, installers, hashes)
+# * uploads those artifacts to temporary workflow zip
+# * on success, uploads the artifacts to a GitHub Release
+#
+# Note that the GitHub Release will be created with a generated
+# title/body based on your changelogs.
+
+name: Release
+
+permissions:
+ contents: write
+
+# This task will run whenever you push a git tag that looks like a version
+# like "1.0.0", "v0.1.0-prerelease.1", "my-app/0.1.0", "releases/v1.0.0", etc.
+# Various formats will be parsed into a VERSION and an optional PACKAGE_NAME, where
+# PACKAGE_NAME must be the name of a Cargo package in your workspace, and VERSION
+# must be a Cargo-style SemVer Version (must have at least major.minor.patch).
+#
+# If PACKAGE_NAME is specified, then the announcement will be for that
+# package (erroring out if it doesn't have the given version or isn't cargo-dist-able).
+#
+# If PACKAGE_NAME isn't specified, then the announcement will be for all
+# (cargo-dist-able) packages in the workspace with that version (this mode is
+# intended for workspaces with only one dist-able package, or with all dist-able
+# packages versioned/released in lockstep).
+#
+# If you push multiple tags at once, separate instances of this workflow will
+# spin up, creating an independent announcement for each one. However, GitHub
+# will hard limit this to 3 tags per commit, as it will assume more tags is a
+# mistake.
+#
+# If there's a prerelease-style suffix to the version, then the release(s)
+# will be marked as a prerelease.
+on:
+ push:
+ tags:
+ - '**[0-9]+.[0-9]+.[0-9]+*'
+ pull_request:
+
+jobs:
+ # Run 'cargo dist plan' (or host) to determine what tasks we need to do
+ plan:
+ runs-on: ubuntu-latest
+ outputs:
+ val: ${{ steps.plan.outputs.manifest }}
+ tag: ${{ !github.event.pull_request && github.ref_name || '' }}
+ tag-flag: ${{ !github.event.pull_request && format('--tag={0}', github.ref_name) || '' }}
+ publishing: ${{ !github.event.pull_request }}
+ env:
+ GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ steps:
+ - uses: actions/checkout@v4
+ with:
+ submodules: recursive
+ - name: Install cargo-dist
+ # we specify bash to get pipefail; it guards against the `curl` command
+ # failing. otherwise `sh` won't catch that `curl` returned non-0
+ shell: bash
+ run: "curl --proto '=https' --tlsv1.2 -LsSf https://github.com/axodotdev/cargo-dist/releases/download/v0.14.1/cargo-dist-installer.sh | sh"
+ # sure would be cool if github gave us proper conditionals...
+ # so here's a doubly-nested ternary-via-truthiness to try to provide the best possible
+ # functionality based on whether this is a pull_request, and whether it's from a fork.
+ # (PRs run on the *source* but secrets are usually on the *target* -- that's *good*
+ # but also really annoying to build CI around when it needs secrets to work right.)
+ - id: plan
+ run: |
+ cargo dist ${{ (!github.event.pull_request && format('host --steps=create --tag={0}', github.ref_name)) || 'plan' }} --output-format=json > plan-dist-manifest.json
+ echo "cargo dist ran successfully"
+ cat plan-dist-manifest.json
+ echo "manifest=$(jq -c "." plan-dist-manifest.json)" >> "$GITHUB_OUTPUT"
+ - name: "Upload dist-manifest.json"
+ uses: actions/upload-artifact@v4
+ with:
+ name: artifacts-plan-dist-manifest
+ path: plan-dist-manifest.json
+
+ # Build and packages all the platform-specific things
+ build-local-artifacts:
+ name: build-local-artifacts (${{ join(matrix.targets, ', ') }})
+ # Let the initial task tell us to not run (currently very blunt)
+ needs:
+ - plan
+ if: ${{ fromJson(needs.plan.outputs.val).ci.github.artifacts_matrix.include != null && (needs.plan.outputs.publishing == 'true' || fromJson(needs.plan.outputs.val).ci.github.pr_run_mode == 'upload') }}
+ strategy:
+ fail-fast: false
+ # Target platforms/runners are computed by cargo-dist in create-release.
+ # Each member of the matrix has the following arguments:
+ #
+ # - runner: the github runner
+ # - dist-args: cli flags to pass to cargo dist
+ # - install-dist: expression to run to install cargo-dist on the runner
+ #
+ # Typically there will be:
+ # - 1 "global" task that builds universal installers
+ # - N "local" tasks that build each platform's binaries and platform-specific installers
+ matrix: ${{ fromJson(needs.plan.outputs.val).ci.github.artifacts_matrix }}
+ runs-on: ${{ matrix.runner }}
+ env:
+ GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ BUILD_MANIFEST_NAME: target/distrib/${{ join(matrix.targets, '-') }}-dist-manifest.json
+ steps:
+ - name: enable windows longpaths
+ run: |
+ git config --global core.longpaths true
+ - uses: actions/checkout@v4
+ with:
+ submodules: recursive
+ - uses: swatinem/rust-cache@v2
+ with:
+ key: ${{ join(matrix.targets, '-') }}
+ - name: Install cargo-dist
+ run: ${{ matrix.install_dist }}
+ # Get the dist-manifest
+ - name: Fetch local artifacts
+ uses: actions/download-artifact@v4
+ with:
+ pattern: artifacts-*
+ path: target/distrib/
+ merge-multiple: true
+ - name: Install dependencies
+ run: |
+ ${{ matrix.packages_install }}
+ - name: Build artifacts
+ run: |
+ # Actually do builds and make zips and whatnot
+ cargo dist build ${{ needs.plan.outputs.tag-flag }} --print=linkage --output-format=json ${{ matrix.dist_args }} > dist-manifest.json
+ echo "cargo dist ran successfully"
+ - id: cargo-dist
+ name: Post-build
+ # We force bash here just because github makes it really hard to get values up
+ # to "real" actions without writing to env-vars, and writing to env-vars has
+ # inconsistent syntax between shell and powershell.
+ shell: bash
+ run: |
+ # Parse out what we just built and upload it to scratch storage
+ echo "paths<<EOF" >> "$GITHUB_OUTPUT"
+ jq --raw-output ".upload_files[]" dist-manifest.json >> "$GITHUB_OUTPUT"
+ echo "EOF" >> "$GITHUB_OUTPUT"
+
+ cp dist-manifest.json "$BUILD_MANIFEST_NAME"
+ - name: "Upload artifacts"
+ uses: actions/upload-artifact@v4
+ with:
+ name: artifacts-build-local-${{ join(matrix.targets, '_') }}
+ path: |
+ ${{ steps.cargo-dist.outputs.paths }}
+ ${{ env.BUILD_MANIFEST_NAME }}
+
+ # Build and package all the platform-agnostic(ish) things
+ build-global-artifacts:
+ needs:
+ - plan
+ - build-local-artifacts
+ runs-on: "ubuntu-20.04"
+ env:
+ GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ BUILD_MANIFEST_NAME: target/distrib/global-dist-manifest.json
+ steps:
+ - uses: actions/checkout@v4
+ with:
+ submodules: recursive
+ - name: Install cargo-dist
+ shell: bash
+ run: "curl --proto '=https' --tlsv1.2 -LsSf https://github.com/axodotdev/cargo-dist/releases/download/v0.14.1/cargo-dist-installer.sh | sh"
+ # Get all the local artifacts for the global tasks to use (for e.g. checksums)
+ - name: Fetch local artifacts
+ uses: actions/download-artifact@v4
+ with:
+ pattern: artifacts-*
+ path: target/distrib/
+ merge-multiple: true
+ - id: cargo-dist
+ shell: bash
+ run: |
+ cargo dist build ${{ needs.plan.outputs.tag-flag }} --output-format=json "--artifacts=global" > dist-manifest.json
+ echo "cargo dist ran successfully"
+
+ # Parse out what we just built and upload it to scratch storage
+ echo "paths<<EOF" >> "$GITHUB_OUTPUT"
+ jq --raw-output ".upload_files[]" dist-manifest.json >> "$GITHUB_OUTPUT"
+ echo "EOF" >> "$GITHUB_OUTPUT"
+
+ cp dist-manifest.json "$BUILD_MANIFEST_NAME"
+ - name: "Upload artifacts"
+ uses: actions/upload-artifact@v4
+ with:
+ name: artifacts-build-global
+ path: |
+ ${{ steps.cargo-dist.outputs.paths }}
+ ${{ env.BUILD_MANIFEST_NAME }}
+ # Determines if we should publish/announce
+ host:
+ needs:
+ - plan
+ - build-local-artifacts
+ - build-global-artifacts
+ # Only run if we're "publishing", and only if local and global didn't fail (skipped is fine)
+ if: ${{ always() && needs.plan.outputs.publishing == 'true' && (needs.build-global-artifacts.result == 'skipped' || needs.build-global-artifacts.result == 'success') && (needs.build-local-artifacts.result == 'skipped' || needs.build-local-artifacts.result == 'success') }}
+ env:
+ GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ runs-on: "ubuntu-20.04"
+ outputs:
+ val: ${{ steps.host.outputs.manifest }}
+ steps:
+ - uses: actions/checkout@v4
+ with:
+ submodules: recursive
+ - name: Install cargo-dist
+ run: "curl --proto '=https' --tlsv1.2 -LsSf https://github.com/axodotdev/cargo-dist/releases/download/v0.14.1/cargo-dist-installer.sh | sh"
+ # Fetch artifacts from scratch-storage
+ - name: Fetch artifacts
+ uses: actions/download-artifact@v4
+ with:
+ pattern: artifacts-*
+ path: target/distrib/
+ merge-multiple: true
+ # This is a harmless no-op for GitHub Releases, hosting for that happens in "announce"
+ - id: host
+ shell: bash
+ run: |
+ cargo dist host ${{ needs.plan.outputs.tag-flag }} --steps=upload --steps=release --output-format=json > dist-manifest.json
+ echo "artifacts uploaded and released successfully"
+ cat dist-manifest.json
+ echo "manifest=$(jq -c "." dist-manifest.json)" >> "$GITHUB_OUTPUT"
+ - name: "Upload dist-manifest.json"
+ uses: actions/upload-artifact@v4
+ with:
+ # Overwrite the previous copy
+ name: artifacts-dist-manifest
+ path: dist-manifest.json
+
+ publish-homebrew-formula:
+ needs:
+ - plan
+ - host
+ runs-on: "ubuntu-20.04"
+ env:
+ GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ PLAN: ${{ needs.plan.outputs.val }}
+ GITHUB_USER: "axo bot"
+ GITHUB_EMAIL: "[email protected]"
+ if: ${{ !fromJson(needs.plan.outputs.val).announcement_is_prerelease || fromJson(needs.plan.outputs.val).publish_prereleases }}
+ steps:
+ - uses: actions/checkout@v4
+ with:
+ repository: "gnostr-org/homebrew-gnostr-org"
+ token: ${{ secrets.HOMEBREW_TAP_TOKEN }}
+ # So we have access to the formula
+ - name: Fetch homebrew formulae
+ uses: actions/download-artifact@v4
+ with:
+ pattern: artifacts-*
+ path: Formula/
+ merge-multiple: true
+ # This is extra complex because you can make your Formula name not match your app name
+ # so we need to find releases with a *.rb file, and publish with that filename.
+ - name: Commit formula files
+ run: |
+ git config --global user.name "${GITHUB_USER}"
+ git config --global user.email "${GITHUB_EMAIL}"
+
+ for release in $(echo "$PLAN" | jq --compact-output '.releases[] | select([.artifacts[] | endswith(".rb")] | any)'); do
+ filename=$(echo "$release" | jq '.artifacts[] | select(endswith(".rb"))' --raw-output)
+ name=$(echo "$filename" | sed "s/\.rb$//")
+ version=$(echo "$release" | jq .app_version --raw-output)
+
+ git add "Formula/${filename}"
+ git commit -m "${name} ${version}"
+ done
+ git push
+
+ # Create a GitHub Release while uploading all files to it
+ announce:
+ needs:
+ - plan
+ - host
+ - publish-homebrew-formula
+ # use "always() && ..." to allow us to wait for all publish jobs while
+ # still allowing individual publish jobs to skip themselves (for prereleases).
+ # "host" however must run to completion, no skipping allowed!
+ if: ${{ always() && needs.host.result == 'success' && (needs.publish-homebrew-formula.result == 'skipped' || needs.publish-homebrew-formula.result == 'success') }}
+ runs-on: "ubuntu-20.04"
+ env:
+ GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ steps:
+ - uses: actions/checkout@v4
+ with:
+ submodules: recursive
+ - name: "Download GitHub Artifacts"
+ uses: actions/download-artifact@v4
+ with:
+ pattern: artifacts-*
+ path: artifacts
+ merge-multiple: true
+ - name: Cleanup
+ run: |
+ # Remove the granular manifests
+ rm -f artifacts/*-dist-manifest.json
+ - name: Create GitHub Release
+ uses: ncipollo/release-action@v1
+ with:
+ tag: ${{ needs.plan.outputs.tag }}
+ name: ${{ fromJson(needs.host.outputs.val).announcement_title }}
+ body: ${{ fromJson(needs.host.outputs.val).announcement_github_body }}
+ prerelease: ${{ fromJson(needs.host.outputs.val).announcement_is_prerelease }}
+ artifacts: "artifacts/*"
diff --git a/Cargo.toml b/Cargo.toml
index b86064156..ca46ab1f4 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -1,4 +1,22 @@
-[workspace]
+
+# Config for 'cargo dist'
+[workspace.metadata.dist]
+# The preferred cargo-dist version to use in CI (Cargo.toml SemVer syntax)
+cargo-dist-version = "0.14.1"
+# CI backends to support
+ci = "github"
+# The installers to generate for each app
+installers = ["shell", "homebrew"]
+# A GitHub repo to push Homebrew formulas to
+tap = "gnostr-org/homebrew-gnostr-org"
+# Target platforms to build apps for (Rust target-triple syntax)
+targets = ["aarch64-apple-darwin", "x86_64-apple-darwin", "x86_64-unknown-linux-gnu"]
+# Publish jobs to run in CI
+publish-jobs = ["homebrew"]
+# Publish jobs to run in CI
+pr-run-mode = "plan"
+# Whether to install an updater program
+install-updater = true
[package]
name = "gnostr"
version = "0.0.44"
@@ -25,3 +43,8 @@ markdown = { version = "1.0.0-alpha.17", features = ["json", "log", "serde"] }
cc = "1.0.98"
include_dir = { version = "0.7.3", features = ["glob", "metadata"] }
markdown = { version = "1.0.0-alpha.17", features = ["json", "log", "serde"] }
+
+# The profile that 'cargo dist' will build with
+[profile.dist]
+inherits = "release"
+lto = "thin"
diff --git a/build.rs b/build.rs
index a6b75aa09..a94835f24 100644
--- a/build.rs
+++ b/build.rs
@@ -10,6 +10,15 @@ use markdown::to_html;
fn main() -> std::io::Result<()> {
let _out_dir = env::var("OUT_DIR").unwrap();

+ Command::new("git")
+ .args(&[
+ "submodule",
+ "update",
+ "--init",
+ "--recursive",
+ ])
+ .status()
+ .unwrap();
Command::new("git")
.args(&[
"remote",
diff --git a/deps/secp256k1 b/deps/secp256k1
new file mode 160000
index 000000000..05bfab69a
--- /dev/null
+++ b/deps/secp256k1
@@ -0,0 +1 @@
+Subproject commit 05bfab69aef3622f77f754cfb01220108a109c91
Author Public Key
npub143ktfzgc2kdautqyp3vgmgdg0gcwxykvs9525vrd8aj7xx2tllwqd3ckzc