Skip to content

Commit

Permalink
Publish crate md-tui 0.8.6 from #1966
Browse files Browse the repository at this point in the history
  • Loading branch information
github-actions committed Sep 22, 2024
0 parents commit 290fc88
Show file tree
Hide file tree
Showing 10 changed files with 1,006 additions and 0 deletions.
483 changes: 483 additions & 0 deletions .github/workflows/stable-md-tui.yml

Large diffs are not rendered by default.

5 changes: 5 additions & 0 deletions crates/md-tui.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
[info]
id = "md-tui"
git = "https://github.com/henriklovhaug/md-tui"
unsupported = ["x86_64-pc-windows-msvc", "aarch64-pc-windows-msvc"]
bins = ["mdt"]
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
146 changes: 146 additions & 0 deletions scripts/check.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,146 @@
import concurrent.futures
import glob
import json
import sys
import tomllib
import urllib.request
from typing import Any

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: Any | None = 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 = pull_request.lower() == "true"
duplicate: bool = duplicate.lower() == "true"

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

if pull_request:
with open("./pr/_allowlist") as file:
allow: str = file.readline().strip()
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])
67 changes: 67 additions & 0 deletions scripts/collect.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
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:
file1 = file.read()
h = hashlib.sha256(file1).hexdigest()
hash_obj["bins"].append({"bin": basename, "hash": h, "type": "sha256"})
h = hashlib.sha512(file1).hexdigest()
hash_obj["bins"].append({"bin": basename, "hash": h, "type": "sha512"})
h = hashlib.sha3_256(file1).hexdigest()
hash_obj["bins"].append(
{"bin": basename, "hash": h, "type": "sha3_256"}
)
h = hashlib.sha3_512(file1).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:
file1 = file.read()
h = hashlib.sha256(file1).hexdigest()
hash_obj["archive"].append({"hash": h, "type": "sha256"})
h = hashlib.sha512(file1).hexdigest()
hash_obj["archive"].append({"hash": h, "type": "sha512"})
h = hashlib.sha3_256(file1).hexdigest()
hash_obj["archive"].append({"hash": h, "type": "sha3_256"})
h = hashlib.sha3_512(file1).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 sys
import tomllib


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])
134 changes: 134 additions & 0 deletions scripts/gen.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,134 @@
import sys
import tomllib

import misc

t2_targets: list[str] = [
"riscv64gc-unknown-linux-gnu", # Optional Support (64-bit)
"s390x-unknown-linux-gnu",
"powerpc64le-unknown-linux-gnu",
"armv7-unknown-linux-gnueabihf", # Optional Support (32-bit)
"armv7-unknown-linux-musleabihf",
]

win_targets: list[str] = ["x86_64-pc-windows-msvc", "aarch64-pc-windows-msvc"]

t3_targets: list[str] = [
"x86_64-unknown-freebsd",
"x86_64-unknown-netbsd",
"powerpc64-unknown-linux-gnu",
]


def main(
pull_request: str,
index: str,
crate: str,
version: str,
dl: str,
checksum: str,
filename: str,
):
pull_request: bool = pull_request == "true"

with open(filename, "rb") as file:
crate_toml = tomllib.load(file)
unsupported: str = crate_toml["info"]["unsupported"]
git_url: str = crate_toml["info"]["git"]
bins: str = ",".join(crate_toml["info"]["bins"])

with open("./stable.template.yml") as file:
action_template: str = file.read()

action = action_template.replace("%%INDEX%%", index)
action = action.replace("%%CRATE%%", crate)
action = action.replace("%%VERSION%%", version)
action = action.replace("%%DOWNLOAD%%", dl)
action = action.replace("%%CHECKSUM%%", checksum)
action = action.replace("%%GIT%%", git_url)
action = action.replace("%%BINS%%", bins)
action = action.replace("%%FILE%%", filename)
action = action.replace("%%IF%%", str(not pull_request).lower())

# Flags
flags = misc.gen_flags(crate_toml)

apple_flags = flags["apple"]
final_apple_flags = ""
if apple_flags[0] is not None:
final_apple_flags += f"--features '{apple_flags[0]}' "
if apple_flags[1]:
final_apple_flags += "--no-default-features "
final_apple_flags += apple_flags[2]

linux_flags = flags["linux"]
final_linux_flags = ""
if linux_flags[0] is not None:
final_linux_flags += f"--features '{linux_flags[0]}' "
if linux_flags[1]:
final_linux_flags += "--no-default-features "
final_linux_flags += linux_flags[2]

windows_flags = flags["windows"]
final_windows_flags = ""
if windows_flags[0] is not None:
final_windows_flags += f"--features '{windows_flags[0]}' "
if windows_flags[1]:
final_windows_flags += "--no-default-features "
final_windows_flags += windows_flags[2]

# Write Flags
action = action.replace("%%APPLE_FLAGS%%", final_apple_flags)
action = action.replace("%%LINUX_FLAGS%%", final_linux_flags)
action = action.replace("%%WINDOWS_FLAGS%%", final_windows_flags)

# T2
# Cross
targets = ""
for possible in t2_targets:
if possible not in unsupported:
if len(targets) != 0:
targets += ","
targets += possible
if len(targets) != 0:
action = action.replace("%%T2_CROSS_HAS_TARGETS%%", "true")
action = action.replace("%%T2_CROSS_TARGETS%%", targets)
else:
action = action.replace("%%T2_CROSS_HAS_TARGETS%%", "false")
action = action.replace("%%T2_CROSS_TARGETS%%", "err_no_targets")
# Windows
targets = ""
for possible in win_targets:
if possible not in unsupported:
if len(targets) != 0:
targets += ","
targets += possible
if len(targets) != 0:
action = action.replace("%%T2_WIN_HAS_TARGETS%%", "true")
action = action.replace("%%T2_WIN_TARGETS%%", targets)
else:
action = action.replace("%%T2_WIN_HAS_TARGETS%%", "false")
action = action.replace("%%T2_WIN_TARGETS%%", "err_no_targets")

# T3
# Cross
targets = ""
for possible in t3_targets:
if possible not in unsupported:
if len(targets) != 0:
targets += ","
targets += possible
if len(targets) != 0:
action = action.replace("%%T3_CROSS_HAS_TARGETS%%", "true")
action = action.replace("%%T3_CROSS_TARGETS%%", targets)
else:
action = action.replace("%%T3_CROSS_HAS_TARGETS%%", "false")
action = action.replace("%%T3_CROSS_TARGETS%%", "err_no_targets")

with open("./.github/workflows/stable-" + crate + ".yml", "w") as file:
file.write(action)


if __name__ == "__main__":
argv = sys.argv
main(argv[1], argv[2], argv[3], argv[4], argv[5], argv[6], argv[7])
Loading

0 comments on commit 290fc88

Please sign in to comment.