brainfuck interpreter
brainfuck cli rust
5

Configure Feed

Select the types of activity you want to include in your feed.

scripts: extract shared publish logic into publish-artifact.sh

- moved script logic from publish-macos-arm into its own script
- each individual platform has a wrapper script that calls
publish-artifact with appropriate architecture and target vars

digi.rip (Jun 11, 2026, 11:20 AM EDT) 1deaa5f7 3ade95c3

+110 -84
+97
scripts/publish-artifact.sh
··· 1 + #!/usr/bin/env bash 2 + set -euo pipefail 3 + 4 + # --- config (override via env vars) --- 5 + HANDLE="${HANDLE:-digi.rip}" 6 + REPO_NAME="${REPO_NAME:-$(basename "$(git rev-parse --show-toplevel)")}" 7 + DID="${DID:-$(goat account status "$HANDLE" | grep '^DID:' | awk '{print $2}')}" 8 + REPO_URL="at://${DID}/sh.tangled.repo/${REPO_NAME}" 9 + ARCH="${ARCH:-aarch64-apple-darwin}" 10 + TARGET="${TARGET:-}" 11 + 12 + # determine build command & output dir 13 + if [ -n "$TARGET" ]; then 14 + CARGO_CMD="cargo zigbuild" 15 + CARGO_FLAGS="--release --target $TARGET" 16 + TARGET_DIR="${TARGET%%.*}" 17 + BINARY_DIR="target/$TARGET_DIR/release" 18 + else 19 + CARGO_CMD="cargo build" 20 + CARGO_FLAGS="--release" 21 + BINARY_DIR="target/release" 22 + fi 23 + 24 + if [ $# -ge 1 ]; then 25 + TAG="$1" 26 + else 27 + TAG=$(git describe --tags --abbrev=0) 28 + fi 29 + 30 + if [ -z "$TAG" ]; then 31 + echo "error: no tag specified and no tags found in repo" >&2 32 + exit 1 33 + fi 34 + 35 + ARTIFACT_NAME="${ARTIFACT_NAME:-tachyon-${TAG#v}-${ARCH}}" 36 + ARTIFACTS_DIR="${ARTIFACTS_DIR:-target/release/artifacts}" 37 + ARCHIVE_FILENAME="${ARTIFACT_NAME}.tar.gz" 38 + ARCHIVE="${ARTIFACTS_DIR}/${ARCHIVE_FILENAME}" 39 + ARTIFACT_PATH="${ARTIFACT_PATH:-${ARCHIVE}}" 40 + 41 + # --- find goat --- 42 + GOAT="${GOAT:-$(command -v goat || echo './goat')}" 43 + if ! command -v "$GOAT" &>/dev/null && [ ! -x "$GOAT" ]; then 44 + echo "error: goat not found — set GOAT or place it on \$PATH" >&2 45 + exit 1 46 + fi 47 + 48 + # --- build archive --- 49 + if [ -f "$ARTIFACT_PATH" ] && [ ! -s "$ARTIFACT_PATH" ]; then 50 + echo "==> removing stale 0-byte archive..." 51 + rm -f "$ARTIFACT_PATH" 52 + fi 53 + 54 + if [ ! -f "$ARTIFACT_PATH" ]; then 55 + echo "==> building release binary ($ARCH)..." 56 + $CARGO_CMD $CARGO_FLAGS 57 + echo "==> packaging $ARCHIVE..." 58 + mkdir -p "$ARTIFACTS_DIR" 59 + tar czf "$ARCHIVE" -C "$BINARY_DIR" tachyon 60 + fi 61 + 62 + # --- tag hash --- 63 + TAG_HASH=$(git rev-parse "$TAG"^{tag} 2>/dev/null || git rev-parse "$TAG") 64 + TAG_BYTES=$(echo -n "$TAG_HASH" | xxd -r -p | base64 | tr -d '=') 65 + 66 + # --- upload --- 67 + echo "==> uploading artifact: $ARTIFACT_PATH" 68 + BLOB_OUTPUT=$("$GOAT" blob upload "$ARTIFACT_PATH" | sed -n '/^{/,$ p') 69 + echo "$BLOB_OUTPUT" 70 + 71 + # --- build artifact record --- 72 + CREATED=$(date -u +"%Y-%m-%dT%H:%M:%SZ") 73 + 74 + ARTIFACT_JSON=$(echo "$BLOB_OUTPUT" | jq --arg tag "$TAG_BYTES" \ 75 + --arg name "$ARCHIVE_FILENAME" \ 76 + --arg repo "$REPO_URL" \ 77 + --arg created "$CREATED" \ 78 + --arg mime "application/gzip" \ 79 + '{ 80 + "tag": {"$bytes": $tag}, 81 + "name": $name, 82 + "repo": $repo, 83 + "$type": "sh.tangled.repo.artifact", 84 + "artifact": ., 85 + "createdAt": $created, 86 + "mimeType": $mime 87 + }') 88 + 89 + # --- write & publish the record --- 90 + TEMP_FILE=$(mktemp) 91 + trap 'rm -f "$TEMP_FILE"' EXIT 92 + 93 + echo "$ARTIFACT_JSON" > "$TEMP_FILE" 94 + echo "$ARTIFACT_JSON" 95 + 96 + echo "==> creating record..." 97 + "$GOAT" record create "$TEMP_FILE" -n
+6
scripts/publish-linux-arm.sh
··· 1 + #!/usr/bin/env bash 2 + set -euo pipefail 3 + 4 + ARCH=aarch64-linux-gnu \ 5 + TARGET=aarch64-unknown-linux-gnu \ 6 + exec "$(dirname "$0")/publish-artifact.sh" "$@"
+6
scripts/publish-linux-x86.sh
··· 1 + #!/usr/bin/env bash 2 + set -euo pipefail 3 + 4 + ARCH=x86_64-linux-gnu \ 5 + TARGET=x86_64-unknown-linux-gnu.2.17 \ 6 + exec "$(dirname "$0")/publish-artifact.sh" "$@"
+1 -84
scripts/publish-macos-arm.sh
··· 1 1 #!/usr/bin/env bash 2 2 set -euo pipefail 3 3 4 - # --- config --- 5 - HANDLE="${HANDLE:-digi.rip}" 6 - REPO_NAME="${REPO_NAME:-$(basename "$(git rev-parse --show-toplevel)")}" 7 - DID="${DID:-$(goat account status "$HANDLE" | grep '^DID:' | awk '{print $2}')}" 8 - REPO_URL="at://${DID}/sh.tangled.repo/${REPO_NAME}" 9 - ARCH="${ARCH:-aarch64-apple-darwin}" 10 - TARGET="${TARGET:-}" 11 - 12 - if [ -n "$TARGET" ]; then 13 - CARGO_TARGET="--target $TARGET" 14 - BINARY_DIR="target/$TARGET/release" 15 - else 16 - CARGO_TARGET="" 17 - BINARY_DIR="target/release" 18 - fi 19 - if [ $# -ge 1 ]; then 20 - TAG="$1" 21 - else 22 - TAG=$(git describe --tags --abbrev=0) 23 - fi 24 - 25 - if [ -z "$TAG" ]; then 26 - echo "error: no tag specified and no tags found in repo" >&2 27 - exit 1 28 - fi 29 - 30 - ARTIFACT_NAME="${ARTIFACT_NAME:-tachyon-${TAG#v}-${ARCH}}" 31 - ARTIFACTS_DIR="${ARTIFACTS_DIR:-target/release/artifacts}" 32 - ARCHIVE_FILENAME="${ARTIFACT_NAME}.tar.gz" 33 - ARCHIVE="${ARTIFACTS_DIR}/${ARCHIVE_FILENAME}" 34 - ARTIFACT_PATH="${ARTIFACT_PATH:-${ARCHIVE}}" 35 - 36 - # --- find goat --- 37 - GOAT="${GOAT:-$(command -v goat || echo './goat')}" 38 - if ! command -v "$GOAT" &>/dev/null && [ ! -x "$GOAT" ]; then 39 - echo "error: goat not found — set GOAT or place it on \$PATH" >&2 40 - exit 1 41 - fi 42 - 43 - # --- build archive --- 44 - if [ ! -f "$ARTIFACT_PATH" ]; then 45 - echo "==> building release binary ($ARCH)..." 46 - cargo build --release $CARGO_TARGET 47 - echo "==> packaging $ARCHIVE..." 48 - mkdir -p "$ARTIFACTS_DIR" 49 - tar czf "$ARCHIVE" -C "$BINARY_DIR" tachyon 50 - fi 51 - 52 - # --- tag hash (for both annotated and lightweight tags) --- 53 - TAG_HASH=$(git rev-parse "$TAG"^{tag} 2>/dev/null || git rev-parse "$TAG") 54 - TAG_BYTES=$(echo -n "$TAG_HASH" | xxd -r -p | base64 | tr -d '=') 55 - 56 - # --- upload artifact blob --- 57 - echo "==> uploading artifact: $ARTIFACT_PATH" 58 - BLOB_OUTPUT=$("$GOAT" blob upload "$ARTIFACT_PATH") 59 - echo "$BLOB_OUTPUT" 60 - 61 - # --- build artifact record with MIME type --- 62 - CREATED=$(date -u +"%Y-%m-%dT%H:%M:%SZ") 63 - 64 - ARTIFACT_JSON=$(echo "$BLOB_OUTPUT" | jq --arg tag "$TAG_BYTES" \ 65 - --arg name "$ARCHIVE_FILENAME" \ 66 - --arg repo "$REPO_URL" \ 67 - --arg created "$CREATED" \ 68 - --arg mime "application/gzip" \ 69 - '{ 70 - "tag": {"$bytes": $tag}, 71 - "name": $name, 72 - "repo": $repo, 73 - "$type": "sh.tangled.repo.artifact", 74 - "artifact": ., 75 - "createdAt": $created, 76 - "mimeType": $mime 77 - }') 78 - 79 - # --- write & publish the record --- 80 - TEMP_FILE=$(mktemp) 81 - trap 'rm -f "$TEMP_FILE"' EXIT 82 - 83 - echo "$ARTIFACT_JSON" > "$TEMP_FILE" 84 - echo "$ARTIFACT_JSON" 85 - 86 - echo "==> creating record..." 87 - "$GOAT" record create "$TEMP_FILE" -n 4 + exec "$(dirname "$0")/publish-artifact.sh" "$@"