aboutsummaryrefslogtreecommitdiff
path: root/scripts/generate_badges.d
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/generate_badges.d')
-rwxr-xr-x[-rw-r--r--]scripts/generate_badges.d107
1 files changed, 61 insertions, 46 deletions
diff --git a/scripts/generate_badges.d b/scripts/generate_badges.d
index bf5aa54..e5037ef 100644..100755
--- a/scripts/generate_badges.d
+++ b/scripts/generate_badges.d
@@ -1,11 +1,23 @@
+#!/usr/bin/env -S docker run --rm -v ${PWD}/scripts:/scripts -v ${PWD}/.github/workflows:/.github/workflows dlanguage/dmd dmd -run /scripts/generate_badges.d
+
+// To run this script:
+// cd /path/to/cpu_features
+// ./scripts/generate_badges.d
+
import std.algorithm : each, map, cartesianProduct, filter, joiner, sort, uniq;
-import std.array : array;
+import std.array;
+import std.base64 : Base64;
import std.conv : to;
+import std.file : exists;
import std.format;
import std.range : chain, only;
import std.stdio;
+import std.string : representation;
import std.traits : EnumMembers;
+immutable string bazel_svg = `<svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M6 .16l5.786 5.786L6 11.732.214 5.946 6 .161zM0 6.214V12l5.786 5.786V12L0 6.214zM18 .16l5.786 5.786L18 11.732l-5.786-5.786L18 .161zM24 6.214V12l-5.786 5.786V12L24 6.214zM12 6.16l5.786 5.786L12 17.732l-5.786-5.786L12 6.161zM11.84 18.054v5.785l-5.786-5.785v-5.786l5.785 5.786zM12.16 18.054l5.786-5.786v5.786l-5.785 5.785v-5.785z" stroke="transparent" fill="white"/></svg>`;
+const string bazel_svg_base64 = Base64.encode(representation(bazel_svg));
+
enum BuildSystem
{
CMake,
@@ -20,6 +32,7 @@ enum Cpu
MIPS,
POWER,
RISCV,
+ LOONGARCH,
s390x,
}
@@ -39,14 +52,11 @@ const:
Os os;
BuildSystem build_system;
+private:
string id()
{
- return format("%d%c%d", cast(uint)(os) + 1, cast(char)('a' + cpu), cast(uint)(build_system));
- }
-
- string disabled_image_ref()
- {
- return format("[d%d]", cast(uint)(build_system));
+ return format("%d%c%d", cast(uint)(os) + 1, cast(char)('a' + cpu),
+ cast(uint)(build_system));
}
string link_ref()
@@ -59,80 +69,94 @@ const:
return format("[i%s]", id());
}
+ string filename()
+ {
+ import std.uni : toLower;
+
+ return toLower(format("%s_%s_%s.yml", cpu, os, build_system));
+ }
+
bool enabled()
{
+ return exists("../.github/workflows/" ~ filename());
+ }
+
+ string append_logo(string url)
+ {
final switch (build_system)
{
case BuildSystem.CMake:
- return os == Os.Linux || cpu == Cpu.amd64;
+ return url ~ "&logo=cmake";
case BuildSystem.Bazel:
- return os == Os.Linux && cpu == Cpu.amd64;
+ return url ~ "&logo=data:image/svg%2bxml;base64," ~ bazel_svg_base64;
}
}
- string text()
+public:
+
+ string disabled_image_ref()
{
- if (enabled())
- return format("[![]%s]%s", image_ref, link_ref);
- return format("![]%s", disabled_image_ref);
+ return format("[d%d]", cast(uint)(build_system));
}
- string disabled_image_link()
+ string text()
{
- return format("%s: https://img.shields.io/badge/%s-N%%2FA-lightgrey", disabled_image_ref, build_system);
+ if (enabled())
+ return format("[![%s]%s]%s", build_system, image_ref, link_ref);
+ return format("![%s]%s", build_system, disabled_image_ref);
}
- string filename()
+ string disabled_image_link()
{
- import std.uni : toLower;
-
- return toLower(format("%s_%s_%s.yml", cpu, os, build_system));
+ return append_logo(format("%s: https://img.shields.io/badge/n%%2Fa-lightgrey?",
+ disabled_image_ref));
}
string link_decl()
{
- return format("%s: https://github.com/google/cpu_features/actions/workflows/%s", link_ref, filename());
+ return format("%s: https://github.com/google/cpu_features/actions/workflows/%s",
+ link_ref, filename());
}
string image_decl()
{
- return format(
- "%s: https://img.shields.io/github/actions/workflow/status/google/cpu_features/%s?branch=main&label=%s", image_ref, filename(), build_system);
+ return append_logo(format("%s: https://img.shields.io/github/actions/workflow/status/google/cpu_features/%s?branch=main&event=push&label=",
+ image_ref, filename()));
}
+
}
-auto tableHeader(in Cpu[] cpus)
+auto tableHeader(in Os[] oses)
{
- return chain(only("Os"), cpus.map!(to!string)).array;
+ return chain(only(""), oses.map!(to!string)).array;
}
-auto tableAlignment(in Cpu[] cpus)
+auto tableAlignment(in Os[] oses)
{
- return chain(only(":--"), cpus.map!(v => "--:")).array;
+ return chain(only(":--"), oses.map!(v => "--:")).array;
}
auto tableCell(Range)(in Os os, in Cpu cpu, Range badges)
{
- return badges
- .filter!(b => b.cpu == cpu && b.os == os)
+ return badges.filter!(b => b.cpu == cpu && b.os == os)
.map!(b => b.text())
- .joiner("<br/>")
- .to!string;
+ .joiner("<br/>").to!string;
}
-auto tableRow(Range)(in Os os, in Cpu[] cpus, Range badges)
+auto tableRow(Range)(in Cpu cpu, in Os[] oses, Range badges)
{
- return chain(only(os.to!string), cpus.map!(cpu => tableCell(os, cpu, badges))).array;
+ return chain(only(cpu.to!string), oses.map!(os => tableCell(os, cpu, badges))).array;
}
auto tableRows(Range)(in Os[] oses, in Cpu[] cpus, Range badges)
{
- return oses.map!(os => tableRow(os, cpus, badges)).array;
+ return cpus.map!(cpu => tableRow(cpu, oses, badges)).array;
}
auto table(Range)(in Os[] oses, in Cpu[] cpus, Range badges)
{
- return chain(only(tableHeader(cpus)), only(tableAlignment(cpus)), tableRows(oses, cpus, badges));
+ return chain(only(tableHeader(oses)), only(tableAlignment(oses)),
+ tableRows(oses, cpus, badges));
}
void main()
@@ -140,26 +164,17 @@ void main()
immutable allCpus = [EnumMembers!Cpu];
immutable allOses = [EnumMembers!Os];
immutable allBuildSystems = [EnumMembers!BuildSystem];
-
auto badges = cartesianProduct(allCpus, allOses, allBuildSystems).map!(
t => Badge(t[0], t[1], t[2]));
-
writefln("%(|%-( %s |%) |\n%) |", table(allOses, allCpus, badges));
writeln();
- badges
- .filter!(b => !b.enabled)
+ badges.filter!(b => !b.enabled)
.map!(b => b.disabled_image_link())
.array
.sort
.uniq
.each!writeln;
-
- badges
- .filter!(b => b.enabled)
+ badges.filter!(b => b.enabled)
.map!(b => [b.link_decl(), b.image_decl()])
- .joiner()
- .array
- .sort
- .uniq
- .each!writeln;
+ .joiner().array.sort.uniq.each!writeln;
}