Skip to content

Commit

Permalink
Publish crate bandwhich 0.22.2 from #1462
Browse files Browse the repository at this point in the history
  • Loading branch information
github-actions committed Feb 4, 2024
0 parents commit a835984
Show file tree
Hide file tree
Showing 12 changed files with 666 additions and 0 deletions.
143 changes: 143 additions & 0 deletions .github/workflows/stable-bandwhich.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,143 @@
name: bandwhich stable build

on:
push:
branches: [ trigger/stable ]
workflow_dispatch:

env:
index: https://github.com/cargo-prebuilt/index/releases/download/stable-index/
crate: bandwhich
version: 0.22.2
dl: https://static.crates.io/crates/bandwhich/bandwhich-0.22.2.crate
checksum: c0cd0f4f13f4ac591e9ef9269e5d5809a9577ebaf68021f6d553be070512d633
git: https://github.com/imsnif/bandwhich
bins: bandwhich
file: ./crates/bandwhich.toml
CARGO_TERM_COLOR: always
python-version: "3.12"

jobs:
setup:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Cache
uses: actions/cache@v4
id: cache
with:
path: |
build
key: ${{ env.crate }}-${{ env.version }}-stable-crate
enableCrossOsArchive: true
- name: Create Folder
if: ${{ !steps.cache.outputs.cache-hit }}
run: mkdir -p ./build
- name: Download crate and check hash
if: ${{ !steps.cache.outputs.cache-hit }}
run: |
wget ${{ env.dl }}
echo "${{ env.checksum }} ${{ env.crate }}-${{ env.version }}.crate" | sha256sum -c
tar -xf ${{ env.crate }}-${{ env.version }}.crate
mv ${{ env.crate }}-${{ env.version }}/* ./build
- name: Update Rust
if: ${{ !steps.cache.outputs.cache-hit }}
run: |
rustup update
rustc --version
- name: Generated lockfile if needed
if: ${{ !steps.cache.outputs.cache-hit }}
working-directory: ./build
run: test -f Cargo.lock || cargo +stable generate-lockfile --verbose

t1-aarch64-apple-darwin:
strategy:
fail-fast: false
matrix:
target: [ x86_64-apple-darwin, aarch64-apple-darwin ]
runs-on: macos-14
needs: [ setup ]
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: ${{ env.python-version }}
- name: Get crate from cache
uses: actions/cache@v4
with:
path: |
build
key: ${{ env.crate }}-${{ env.version }}-stable-crate
enableCrossOsArchive: true
fail-on-cache-miss: true
# - uses: Swatinem/rust-cache@v2
# if: ${{ !false }}
# with:
# workspaces: "./build -> target"
# prefix-key: "v0-rust-${{ matrix.target }}-${{ env.crate }}-${{ env.version }}"
- name: Update Rust and Add Target
run: |
rustup update
rustc --version
rustup target add ${{ matrix.target }}
- uses: cargo-prebuilt/cargo-prebuilt-action@v3
with:
pkgs: cargo-auditable
- name: Build crate
working-directory: ./build
run: cargo +stable auditable build --verbose --release --locked --target ${{ matrix.target }}
- name: Collect
run: python ./scripts/collect.py ${{ matrix.target }} ./build/target/${{ matrix.target }}/release ${{ env.bins }}
- name: Artifact
uses: actions/upload-artifact@v4
with:
name: target-${{ matrix.target }}-macos14
path: |
${{ matrix.target }}.tar.gz
${{ matrix.target }}.hashes.json
t1-apple-darwin:
strategy:
fail-fast: false
matrix:
target: [ x86_64-apple-darwin, aarch64-apple-darwin ]
runs-on: macos-latest
needs: [ setup ]
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: ${{ env.python-version }}
- name: Get crate from cache
uses: actions/cache@v4
with:
path: |
build
key: ${{ env.crate }}-${{ env.version }}-stable-crate
enableCrossOsArchive: true
fail-on-cache-miss: true
# - uses: Swatinem/rust-cache@v2
# if: ${{ !false }}
# with:
# workspaces: "./build -> target"
# prefix-key: "v0-rust-${{ matrix.target }}-${{ env.crate }}-${{ env.version }}"
- name: Update Rust and Add Target
run: |
rustup update
rustc --version
rustup target add ${{ matrix.target }}
- uses: cargo-prebuilt/cargo-prebuilt-action@v3
with:
pkgs: cargo-auditable
- name: Build crate
working-directory: ./build
run: cargo +stable auditable build --verbose --release --locked --target ${{ matrix.target }}
- name: Collect
run: python ./scripts/collect.py ${{ matrix.target }} ./build/target/${{ matrix.target }}/release ${{ env.bins }}
- name: Artifact
uses: actions/upload-artifact@v4
with:
name: target-${{ matrix.target }}
path: |
${{ matrix.target }}.tar.gz
${{ matrix.target }}.hashes.json
11 changes: 11 additions & 0 deletions Cross.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
[target.x86_64-unknown-freebsd]
image = "ghcr.io/cargo-prebuilt/cross-openssl:x86_64-unknown-freebsd"

[target.x86_64-unknown-netbsd]
image = "ghcr.io/cargo-prebuilt/cross-openssl:x86_64-unknown-netbsd"

[target.x86_64-unknown-illumos]
image = "ghcr.io/cargo-prebuilt/cross-openssl:x86_64-unknown-illumos"

[target.powerpc64-unknown-linux-gnu]
image = "ghcr.io/cargo-prebuilt/cross-openssl:powerpc64-unknown-linux-gnu"
9 changes: 9 additions & 0 deletions crates/bandwhich.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
[info]
id = "bandwhich"
git = "https://github.com/imsnif/bandwhich"
unsupported = [
"aarch64-pc-windows-msvc",
"x86_64-unknown-netbsd",
"x86_64-unknown-illumos",
]
bins = ["bandwhich"]
2 changes: 2 additions & 0 deletions keys/cargo-prebuilt-index.pub
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
untrusted comment: minisign public key 51FF575479E09402
RWQClOB5VFf/UXuhG+697EOSWlSyIPWjyehJpepjgQ7qsLnZxGQzDnqA
1 change: 1 addition & 0 deletions keys/cargo-prebuilt-index.pub.base64
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
RWQClOB5VFf/UXuhG+697EOSWlSyIPWjyehJpepjgQ7qsLnZxGQzDnqA
140 changes: 140 additions & 0 deletions scripts/check.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,140 @@
import concurrent.futures
import glob
import json
import sys
import tomllib
import urllib.request
from typing import Any, Optional


stable_index: str = "/releases/download/stable-index/"
banned_index: str = "/releases/download/banned-index/"
crates_io_index: str = "https://index.crates.io/"
crates_io_cdn: str = "https://static.crates.io/crates/{CRATE}/{CRATE}-{VERSION}.crate"


def get_index_url(crate: str) -> str:
crate: str = crate.lower()
length: int = len(crate)
url: str = crates_io_index
if 1 <= length <= 2:
url += f"{length}/{crate}"
elif length == 3:
url += f"3/{crate[0]}/{crate}"
else:
url += f"{crate[0:2]}/{crate[2:4]}/{crate}"
return url


def get_newest_crate(versions: list[Any]) -> Any:
latest: Optional[Any] = None
store = (-1, -1, -1)
for v in versions:
if "-" in v["vers"]:
pass
elif not v["yanked"]:
semver = v["vers"].split(".")
semver = (int(semver[0]), int(semver[1]), int(semver[2]))
if semver[0] > store[0]:
store = semver
latest = v
elif semver[0] == store[0]:
if semver[1] > store[1]:
store = semver
latest = v
elif semver[1] == store[1]:
if semver[2] > store[2]:
store = semver
latest = v
return latest


def process(filename: str, pull_request: bool, allow: list[str], server_url: str, repo: str):
with open(filename, "rb") as file:
crate_toml = tomllib.load(file)
crate: str = crate_toml["info"]["id"]

if (not pull_request) or (len(allow) == 0 or crate in allow):
if not pull_request:
try:
res = urllib.request.urlopen(f"{server_url}/{repo}{banned_index}{crate}")
if res.status == 200:
return None
except urllib.error.HTTPError:
pass

version: str = ""
try:
res = urllib.request.urlopen(f"{server_url}/{repo}{stable_index}{crate}")
version = (res.read().decode("utf-8").strip())
except urllib.error.HTTPError:
pass

# Get from index.crates.io
req = urllib.request.Request(
get_index_url(crate),
data=None,
headers={
"User-Agent": f"cargo-prebuilt_bot ({server_url}/{repo})"
}
)
res = urllib.request.urlopen(req)
crate_infos_raw: str = res.read().decode("utf-8") if res and res.status == 200 else sys.exit(3)
crate_infos_raw: list[str] = crate_infos_raw.strip().split("\n")

crate_infos: list[Any] = []
for c in crate_infos_raw:
crate_infos.append(json.loads(c))

latest_crate: Any = get_newest_crate(crate_infos)

if pull_request or version != latest_crate["vers"]:
return {
"crate": crate,
"version": latest_crate["vers"],
"dl": crates_io_cdn.replace("{CRATE}", crate).replace("{VERSION}", latest_crate["vers"]),
"checksum": latest_crate["cksum"],
"file": filename,
}

return None


def main(pull_request: str, duplicate: str, server_url: str, repo: str):
pull_request: bool = True if pull_request.lower() == "true" else False
duplicate: bool = True if duplicate.lower() == "true" else False

if not pull_request and duplicate:
print("{}")
return

if pull_request:
with open("./pr/_allowlist", "r") as file:
allow: str = file.readline()
else:
allow: str = ""
allow: list[str] = allow.split(",")

with concurrent.futures.ThreadPoolExecutor(max_workers=4) as executor:
to_update_raw = executor.map(lambda f: process(f, pull_request, allow, server_url, repo), glob.glob("./crates/*.toml"))

to_update = []
for i in to_update_raw:
if i is not None:
to_update.append(i)

x = {
"include": []
}
for c in to_update:
x["include"].append(c)

if len(x["include"]) == 0:
print("{}")
else:
print(json.dumps(x))


if __name__ == "__main__":
argv = sys.argv
main(argv[1], argv[2], argv[3], argv[4])
63 changes: 63 additions & 0 deletions scripts/collect.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
import hashlib
import json
import os
import stat
import sys
import tarfile


def main(target, build_path, bins):
bins = bins.split(",")

hash_obj = {
"bins": [],
"archive": [],
}

ending = ""
if "windows" in target:
ending = ".exe"

with tarfile.open(target + ".tar.gz", "w:gz") as archive:
for b in bins:
basename = b + ending
path = build_path + "/" + basename

# Permission Fix
if "windows" not in target:
st = os.stat(path)
os.chmod(path, st.st_mode | stat.S_IEXEC)

# Hashes
with open(path, "rb") as file:
file = file.read()
h = hashlib.sha256(file).hexdigest()
hash_obj["bins"].append({"bin": basename, "hash": h, "type": "sha256"})
h = hashlib.sha512(file).hexdigest()
hash_obj["bins"].append({"bin": basename, "hash": h, "type": "sha512"})
h = hashlib.sha3_256(file).hexdigest()
hash_obj["bins"].append({"bin": basename, "hash": h, "type": "sha3_256"})
h = hashlib.sha3_512(file).hexdigest()
hash_obj["bins"].append({"bin": basename, "hash": h, "type": "sha3_512"})

# Add to archive
archive.add(path, basename)

with open(target + ".tar.gz", "rb") as file:
file = file.read()
h = hashlib.sha256(file).hexdigest()
hash_obj["archive"].append({"hash": h, "type": "sha256"})
h = hashlib.sha512(file).hexdigest()
hash_obj["archive"].append({"hash": h, "type": "sha512"})
h = hashlib.sha3_256(file).hexdigest()
hash_obj["archive"].append({"hash": h, "type": "sha3_256"})
h = hashlib.sha3_512(file).hexdigest()
hash_obj["archive"].append({"hash": h, "type": "sha3_512"})

with open(target + ".hashes.json", "w") as file:
file.write(json.dumps(hash_obj))


if __name__ == "__main__":
argv = sys.argv
main(argv[1], argv[2], argv[3])
18 changes: 18 additions & 0 deletions scripts/crate-info.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
import tomllib
import sys


def main(item: str):
with open("Cargo.toml", "rb") as file:
cargo_toml = tomllib.load(file)
package = cargo_toml["package"]

if item in package:
print(package[item].replace("'", "%%SINGLE_QUOTE%%"))
else:
print("")


if __name__ == "__main__":
argv = sys.argv
main(argv[1])
Loading

0 comments on commit a835984

Please sign in to comment.