fix: include packagechooser in calamares build, fix calamares-next launcher for sudo -E

feat: reworked package index with tailwind, sorting, category filters, package metadata
chore: remove hal package (arch-specific, not compatible with artix)
This commit is contained in:
2026-06-28 18:13:58 +02:00
parent f6d72adf57
commit 62f4adc05c
10 changed files with 977 additions and 2187 deletions
+182
View File
@@ -0,0 +1,182 @@
#!/usr/bin/env python3
import json, os
pkgs = []
for f in os.listdir('repo'):
if f.endswith('.pkg.tar.zst') and '-debug-' not in f:
size = os.path.getsize(os.path.join('repo', f))
pkgs.append({'name': f, 'size': size})
pkgs.sort(key=lambda p: p['name'])
rows = ''
for p in pkgs:
size_mb = p['size'] / 1024 / 1024
rows += f''' <tr>
<td><a href="{p['name']}">{p['name']}</a></td>
<td>{size_mb:.1f} MB</td>
</tr>
'''
html = f'''<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>antergos-pkgs</title>
<style>
* {{ margin: 0; padding: 0; box-sizing: border-box; }}
body {{
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
background: #080810; color: #c0c0d0;
min-height: 100vh;
}}
.wrap {{ max-width: 960px; margin: 0 auto; padding: 32px 20px; }}
.bar {{
background: linear-gradient(135deg, #0d0d20 0%, #0a0a18 100%);
border: 1px solid #1a1a2e; border-radius: 12px;
}}
h1 {{
font-size: 2em; font-weight: 300; letter-spacing: 0.04em;
padding: 32px 32px 8px; color: #e0e0f0;
}}
h1 span {{ color: #4A9EFF; font-weight: 400; }}
.sub {{
padding: 0 32px 24px; color: #5a5a7a; font-size: 0.9em;
border-bottom: 1px solid #141428;
display: flex; justify-content: space-between; flex-wrap: wrap; gap: 8px;
}}
.hal {{ color: #3a3a5a; font-style: italic; font-size: 0.85em; }}
.setup {{
margin: 24px 0; padding: 20px 24px; cursor: pointer;
}}
.setup summary {{
color: #4A9EFF; font-size: 0.85em; font-weight: 500; cursor: pointer;
outline: none;
}}
.setup summary::-webkit-details-marker {{ color: #4A9EFF; }}
.setup pre {{
background: #060610; border: 1px solid #1a1a2e; border-radius: 8px;
padding: 16px; margin-top: 16px; overflow-x: auto;
font-family: 'SF Mono', 'Fira Code', 'Cascadia Code', monospace; font-size: 0.82em;
color: #9090b0; line-height: 1.6;
}}
.setup .c {{ color: #3a3a5a; }}
.setup .v {{ color: #6aaf6a; }}
.controls {{
display: flex; gap: 12px; align-items: center; margin: 24px 0; flex-wrap: wrap;
}}
.controls input {{
flex: 1; min-width: 200px;
background: #0c0c1e; border: 1px solid #1a1a2e; border-radius: 8px;
padding: 10px 14px; color: #c0c0d0; font-size: 0.9em;
outline: none; transition: border-color 0.2s;
}}
.controls input:focus {{ border-color: #4A9EFF; }}
.controls input::placeholder {{ color: #3a3a5a; }}
.cnt {{ color: #4a4a6a; font-size: 0.85em; }}
table {{ width: 100%; border-collapse: collapse; }}
th {{
text-align: left; padding: 10px 20px;
color: #3a3a5a; font-size: 0.72em; font-weight: 600;
text-transform: uppercase; letter-spacing: 0.12em;
border-bottom: 1px solid #141428;
}}
td {{
padding: 8px 20px; font-size: 0.88em;
border-bottom: 1px solid #0e0e1e; vertical-align: middle;
}}
tr:last-child td {{ border: none; }}
tbody tr:hover td {{ background: #0a0a18; }}
tbody tr:hover {{ border-radius: 8px; }}
td a {{
color: #4A9EFF; text-decoration: none; font-weight: 500;
}}
td a:hover {{ color: #7aBEFF; text-decoration: underline; }}
td.sz {{ color: #5a5a7a; text-align: right; font-variant-numeric: tabular-nums; }}
.hidden {{ display: none !important; }}
.ft {{
text-align: center; padding: 32px 0 16px;
color: #2a2a4a; font-size: 0.78em;
}}
.ft a {{ color: #3a3a6a; text-decoration: none; }}
.ft a:hover {{ color: #4A9EFF; }}
@media (max-width: 600px) {{
.wrap {{ padding: 16px 12px; }}
h1 {{ padding: 24px 20px 4px; font-size: 1.5em; }}
.sub {{ padding: 0 20px 16px; }}
td, th {{ padding: 8px 12px; }}
}}
</style>
</head>
<body>
<div class="wrap">
<div class="bar">
<h1>⟁ antergos<span>-pkgs</span></h1>
<div class="sub">
<span>{len(pkgs)} packages &middot; {sum(p['size'] for p in pkgs) / 1024 / 1024:.0f} MB</span>
<span class="hal">"I am putting myself to the fullest possible use."</span>
</div>
<details class="setup">
<summary>Setup — add this repository to pacman.conf</summary>
<pre><span class="c"># /etc/pacman.conf</span>
[antergos-pkgs]
SigLevel = Optional TrustAll
Server = https://antergos-next.github.io/antergos-packages/<span class="v">$repo</span>/os/<span class="v">$arch</span>
Server = https://antergos-next.github.io/antergos-packages</pre>
</details>
<div class="controls">
<input type="text" id="q" placeholder="Search packages..." oninput="f()" autofocus>
<span class="cnt" id="c">{len(pkgs)} packages</span>
</div>
<table>
<thead>
<tr><th>Package</th><th style="text-align:right">Size</th></tr>
</thead>
<tbody id="l">
{rows} </tbody>
</table>
</div>
<div class="ft">
<a href="https://github.com/Antergos-NeXT/antergos-packages">GitHub</a> &middot;
<a href="https://antergos-next.github.io/antergos-packages/">antergos-next.github.io</a>
</div>
</div>
<script>
function f() {{
const q = document.getElementById('q').value.toLowerCase();
const r = document.querySelectorAll('#l tr');
let v = 0;
for (let i = 0; i < r.length; i++) {{
if (r[i].textContent.toLowerCase().includes(q)) {{
r[i].classList.remove('hidden'); v++;
}} else {{
r[i].classList.add('hidden');
}}
}}
document.getElementById('c').textContent = v + ' / {len(pkgs)} packages';
}}
</script>
</body>
</html>'''
with open('repo/index.html', 'w') as fp:
fp.write(html)
with open('repo/pkglist.json', 'w') as fp:
json.dump([{'name': p['name'], 'size': p['size']} for p in pkgs], fp, indent=2)
fp.write('\n')
+331 -152
View File
@@ -1,182 +1,361 @@
#!/usr/bin/env python3
import json, os
import json, os, re, subprocess
from datetime import datetime, timezone
PKG_DIR = 'packages'
REPO_DIR = 'repo'
def parse_pkgbuild(path):
data = {}
with open(path) as f:
text = f.read()
for key in ('pkgname', 'pkgver', 'pkgrel', 'pkgdesc', 'url', 'license', 'arch'):
m = re.search(rf'^{key}=[\'"]?(.+?)[\'"]?$', text, re.M)
if m:
val = m.group(1).strip("'\"")
if key == 'arch':
val = val.strip('()').replace("'", '').replace('"', '').strip()
data[key] = val
deps = re.search(r'^depends=\((.*?)\)', text, re.DOTALL | re.M)
if deps:
raw = deps.group(1)
data['depends'] = [d.strip("'\" ") for d in raw.strip().split('\n') if d.strip()]
return data
def category_for(pkgname):
if pkgname.startswith('calamares'):
return 'installer'
if pkgname.startswith('antergos-wallpaper') or pkgname.startswith('antergos-next-desktop'):
return 'branding'
if pkgname in ('antergos-live', 'antergos-release', 'antergos-next-keyring', 'antergos-next-mirrorlist'):
return 'core'
if pkgname in ('antergos-welcome', 'antergos-next-memes', 'antergos-grub-theme'):
return 'desktop'
if pkgname == 'hal':
return 'tool'
return 'other'
cat_colors = {
'installer': '#4A9EFF',
'branding': '#9B59B6',
'core': '#2ECC71',
'desktop': '#F39C12',
'tool': '#E74C3C',
'other': '#7F8C8D',
}
pkgs = []
for f in os.listdir('repo'):
if f.endswith('.pkg.tar.zst') and '-debug-' not in f:
size = os.path.getsize(os.path.join('repo', f))
pkgs.append({'name': f, 'size': size})
for f in sorted(os.listdir(REPO_DIR)):
if not f.endswith('.pkg.tar.zst') or '-debug-' in f:
continue
fpath = os.path.join(REPO_DIR, f)
size = os.path.getsize(fpath)
mtime = os.path.getmtime(fpath)
mtime_dt = datetime.fromtimestamp(mtime, tz=timezone.utc)
# strip .pkg.tar.zst and arch to get base name
base = re.sub(r'-[^-]+-x86_64\.pkg\.tar\.zst$', '', f)
base = re.sub(r'-any\.pkg\.tar\.zst$', '', base)
# remove version suffix to match directory
dirname = re.sub(r'-\d+[\d.]*-\d+$', '', base)
if dirname == 'calamares-branding-antergos-next':
dirname = 'calamares-branding-antergos-next'
pkgbuild_path = os.path.join(PKG_DIR, dirname, 'PKGBUILD')
meta = parse_pkgbuild(pkgbuild_path) if os.path.exists(pkgbuild_path) else {}
# extract version from filename: name-ver-rel-arch.pkg.tar.zst
ver_match = re.match(r'.+-(\d+[\d.]*)-(\d+)-(any|x86_64)\.pkg\.tar\.zst', f)
pkgver = ver_match.group(1) if ver_match else (meta.get('pkgver', '?'))
pkgrel = ver_match.group(2) if ver_match else (meta.get('pkgrel', '?'))
arch = ver_match.group(3) if ver_match else (meta.get('arch', '?'))
pkgname = meta.get('pkgname', dirname)
cat = category_for(pkgname)
pkgs.append({
'file': f,
'name': pkgname,
'version': f'{pkgver}-{pkgrel}',
'arch': arch,
'size': size,
'mtime': mtime_dt.isoformat(),
'mtime_display': mtime_dt.strftime('%Y-%m-%d %H:%M UTC'),
'category': cat,
'cat_color': cat_colors.get(cat, '#7F8C8D'),
'description': meta.get('pkgdesc', ''),
'url': meta.get('url', ''),
'license': meta.get('license', ''),
'depends': meta.get('depends', []),
})
pkgs.sort(key=lambda p: p['name'])
rows = ''
for p in pkgs:
size_mb = p['size'] / 1024 / 1024
rows += f''' <tr>
<td><a href="{p['name']}">{p['name']}</a></td>
<td>{size_mb:.1f} MB</td>
</tr>
'''
rows_json = json.dumps(pkgs)
total_size_mb = sum(p['size'] for p in pkgs) / 1024 / 1024
generated = datetime.now(tz=timezone.utc).strftime('%Y-%m-%d %H:%M UTC')
html = f'''<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>antergos-pkgs</title>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>antergos-pkgs</title>
<script src="https://cdn.tailwindcss.com"></script>
<script>
tailwind.config = {{
theme: {{
extend: {{
colors: {{
abyss: '#06060f',
surface: '#0b0b1a',
card: '#0f0f24',
border: '#1a1a35',
muted: '#3a3a5a',
dim: '#5a5a7a',
base: '#c0c0d0',
bright: '#e0e0f0',
accent: '#4A9EFF',
'accent-glow': '#6aBEFF',
}}
}}
}}
}}
</script>
<style>
@import url('https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&family=JetBrains+Mono:wght@400;500&display=swap');
* {{ margin: 0; padding: 0; box-sizing: border-box; }}
body {{
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
background: #080810; color: #c0c0d0;
min-height: 100vh;
font-family: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif;
background: #06060f; color: #c0c0d0; min-height: 100vh;
}}
.wrap {{ max-width: 960px; margin: 0 auto; padding: 32px 20px; }}
.bar {{
background: linear-gradient(135deg, #0d0d20 0%, #0a0a18 100%);
border: 1px solid #1a1a2e; border-radius: 12px;
}}
h1 {{
font-size: 2em; font-weight: 300; letter-spacing: 0.04em;
padding: 32px 32px 8px; color: #e0e0f0;
}}
h1 span {{ color: #4A9EFF; font-weight: 400; }}
.sub {{
padding: 0 32px 24px; color: #5a5a7a; font-size: 0.9em;
border-bottom: 1px solid #141428;
display: flex; justify-content: space-between; flex-wrap: wrap; gap: 8px;
}}
.hal {{ color: #3a3a5a; font-style: italic; font-size: 0.85em; }}
.setup {{
margin: 24px 0; padding: 20px 24px; cursor: pointer;
}}
.setup summary {{
color: #4A9EFF; font-size: 0.85em; font-weight: 500; cursor: pointer;
outline: none;
}}
.setup summary::-webkit-details-marker {{ color: #4A9EFF; }}
.setup pre {{
background: #060610; border: 1px solid #1a1a2e; border-radius: 8px;
padding: 16px; margin-top: 16px; overflow-x: auto;
font-family: 'SF Mono', 'Fira Code', 'Cascadia Code', monospace; font-size: 0.82em;
color: #9090b0; line-height: 1.6;
}}
.setup .c {{ color: #3a3a5a; }}
.setup .v {{ color: #6aaf6a; }}
.controls {{
display: flex; gap: 12px; align-items: center; margin: 24px 0; flex-wrap: wrap;
}}
.controls input {{
flex: 1; min-width: 200px;
background: #0c0c1e; border: 1px solid #1a1a2e; border-radius: 8px;
padding: 10px 14px; color: #c0c0d0; font-size: 0.9em;
outline: none; transition: border-color 0.2s;
}}
.controls input:focus {{ border-color: #4A9EFF; }}
.controls input::placeholder {{ color: #3a3a5a; }}
.cnt {{ color: #4a4a6a; font-size: 0.85em; }}
table {{ width: 100%; border-collapse: collapse; }}
th {{
text-align: left; padding: 10px 20px;
color: #3a3a5a; font-size: 0.72em; font-weight: 600;
text-transform: uppercase; letter-spacing: 0.12em;
border-bottom: 1px solid #141428;
}}
td {{
padding: 8px 20px; font-size: 0.88em;
border-bottom: 1px solid #0e0e1e; vertical-align: middle;
}}
tr:last-child td {{ border: none; }}
tbody tr:hover td {{ background: #0a0a18; }}
tbody tr:hover {{ border-radius: 8px; }}
td a {{
color: #4A9EFF; text-decoration: none; font-weight: 500;
}}
td a:hover {{ color: #7aBEFF; text-decoration: underline; }}
td.sz {{ color: #5a5a7a; text-align: right; font-variant-numeric: tabular-nums; }}
.hidden {{ display: none !important; }}
.ft {{
text-align: center; padding: 32px 0 16px;
color: #2a2a4a; font-size: 0.78em;
}}
.ft a {{ color: #3a3a6a; text-decoration: none; }}
.ft a:hover {{ color: #4A9EFF; }}
@media (max-width: 600px) {{
.wrap {{ padding: 16px 12px; }}
h1 {{ padding: 24px 20px 4px; font-size: 1.5em; }}
.sub {{ padding: 0 20px 16px; }}
td, th {{ padding: 8px 12px; }}
.glow {{ box-shadow: 0 0 40px -12px rgba(74, 158, 255, 0.15); }}
.glow:hover {{ box-shadow: 0 0 60px -8px rgba(74, 158, 255, 0.25); }}
th {{ cursor: pointer; user-select: none; position: sticky; top: 0; z-index: 10; }}
th:hover {{ color: #4A9EFF !important; }}
th .arrow {{ opacity: 0; display: inline-block; transition: all 0.2s; }}
th:hover .arrow, th.asc .arrow, th.desc .arrow {{ opacity: 1; }}
th.asc .arrow {{ transform: rotate(0deg); }}
th.desc .arrow {{ transform: rotate(180deg); }}
tr.row {{ transition: background 0.15s, transform 0.15s; }}
tr.row:hover {{ background: rgba(74, 158, 255, 0.04); }}
tr.row td:first-child {{ border-radius: 8px 0 0 8px; }}
tr.row td:last-child {{ border-radius: 0 8px 8px 0; }}
.badge {{ transition: all 0.2s; }}
.badge:hover {{ filter: brightness(1.2); transform: translateY(-1px); }}
.fade-in {{ animation: fadeIn 0.5s ease-out both; }}
@keyframes fadeIn {{ from {{ opacity: 0; transform: translateY(12px); }} to {{ opacity: 1; transform: translateY(0); }} }}
.pulse-dot {{
display: inline-block; width: 8px; height: 8px; border-radius: 50%;
background: #2ECC71; margin-right: 6px;
animation: pulse 2s ease-in-out infinite;
}}
@keyframes pulse {{ 0%, 100% {{ opacity: 1; }} 50% {{ opacity: 0.3; }} }}
input[type="text"]:focus {{ outline: none; border-color: #4A9EFF !important; box-shadow: 0 0 0 3px rgba(74, 158, 255, 0.1); }}
::-webkit-scrollbar {{ width: 6px; height: 6px; }}
::-webkit-scrollbar-track {{ background: #0b0b1a; }}
::-webkit-scrollbar-thumb {{ background: #1a1a35; border-radius: 3px; }}
::-webkit-scrollbar-thumb:hover {{ background: #3a3a5a; }}
@media (max-width: 640px) {{ .hide-mobile {{ display: none; }} }}
</style>
</head>
<body>
<div class="wrap">
<div class="bar">
<h1>⟁ antergos<span>-pkgs</span></h1>
<div class="sub">
<span>{len(pkgs)} packages &middot; {sum(p['size'] for p in pkgs) / 1024 / 1024:.0f} MB</span>
<span class="hal">"I am putting myself to the fullest possible use."</span>
</div>
<details class="setup">
<summary>Setup — add this repository to pacman.conf</summary>
<pre><span class="c"># /etc/pacman.conf</span>
[antergos-pkgs]
SigLevel = Optional TrustAll
Server = https://antergos-next.github.io/antergos-packages/<span class="v">$repo</span>/os/<span class="v">$arch</span>
Server = https://antergos-next.github.io/antergos-packages</pre>
</details>
<div class="controls">
<input type="text" id="q" placeholder="Search packages..." oninput="f()" autofocus>
<span class="cnt" id="c">{len(pkgs)} packages</span>
</div>
<table>
<thead>
<tr><th>Package</th><th style="text-align:right">Size</th></tr>
</thead>
<tbody id="l">
{rows} </tbody>
</table>
<div class="max-w-6xl mx-auto px-4 sm:px-6 py-8">
<!-- Header -->
<div class="text-center mb-10 fade-in">
<h1 class="text-5xl sm:text-6xl font-light tracking-tight text-bright">
<span class="font-normal text-accent">antergos</span><span class="text-dim font-light">-pkgs</span>
</h1>
<p class="text-dim text-sm mt-3 max-w-xl mx-auto leading-relaxed">
Custom package repository for Antergos NeXT ISO builds.
<br class="sm:hidden">Packages are built automatically via CI.
</p>
</div>
<div class="ft">
<a href="https://github.com/Antergos-NeXT/antergos-packages">GitHub</a> &middot;
<a href="https://antergos-next.github.io/antergos-packages/">antergos-next.github.io</a>
<!-- Stats bar -->
<div class="flex flex-wrap gap-4 justify-center mb-8 text-xs text-dim">
<span class="bg-surface border border-border rounded-full px-4 py-2 flex items-center gap-2">
<span class="pulse-dot"></span> {len(pkgs)} packages
</span>
<span class="bg-surface border border-border rounded-full px-4 py-2">{total_size_mb:.0f} MB total</span>
<span class="bg-surface border border-border rounded-full px-4 py-2">updated {generated}</span>
</div>
<!-- Setup collapsible -->
<details class="bg-card border border-border rounded-xl mb-6 glow transition-all duration-300 group">
<summary class="px-5 py-4 text-accent cursor-pointer text-sm font-medium select-none
list-none flex items-center gap-2 hover:text-accent-glow transition-colors">
<svg class="w-4 h-4 transition-transform duration-200 group-open:rotate-90" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 5l7 7-7 7" />
</svg>
Setup — add this repository to your <code class="text-bright bg-abyss px-1.5 py-0.5 rounded text-xs">pacman.conf</code>
</summary>
<div class="px-5 pb-5">
<pre class="bg-abyss border border-border rounded-lg p-4 text-sm overflow-x-auto font-['JetBrains_Mono'] text-dim leading-relaxed">
<span class="text-muted"># /etc/pacman.conf</span>
<span class="text-accent">[antergos-pkgs]</span>
SigLevel = <span class="text-[#6aaf6a]">Optional TrustAll</span>
Server = <span class="text-[#6aaf6a]">https://antergos-next.github.io/antergos-packages/</span><span class="text-[#e0e0f0]">$repo</span>/os/<span class="text-[#e0e0f0]">$arch</span></pre>
</div>
</details>
<!-- Controls -->
<div class="flex flex-wrap gap-3 items-center mb-5">
<div class="relative flex-1 min-w-[200px]">
<svg class="absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-muted" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z" />
</svg>
<input type="text" id="q" placeholder="Search packages..." autofocus
class="w-full bg-card border border-border rounded-lg pl-10 pr-4 py-2.5 text-sm text-base placeholder:text-muted transition-all" />
</div>
<select id="catFilter"
class="bg-card border border-border rounded-lg px-3 py-2.5 text-sm text-dim cursor-pointer hover:text-base transition-colors">
<option value="all">All categories</option>
<option value="installer">Installer</option>
<option value="branding">Branding</option>
<option value="core">Core</option>
<option value="desktop">Desktop</option>
<option value="tool">Tool</option>
<option value="other">Other</option>
</select>
<span class="text-xs text-dim" id="count">{len(pkgs)} packages</span>
</div>
<!-- Table -->
<div class="bg-card border border-border rounded-xl overflow-hidden glow">
<div class="overflow-x-auto">
<table class="w-full text-sm">
<thead>
<tr class="bg-abyss/50 text-muted text-xs uppercase tracking-wider">
<th class="px-4 py-3.5 text-left font-semibold" data-col="name" onclick="sort('name')">
Package <span class="arrow">▼</span>
</th>
<th class="px-4 py-3.5 text-left font-semibold hide-mobile" data-col="version" onclick="sort('version')">
Version <span class="arrow">▼</span>
</th>
<th class="px-4 py-3.5 text-left font-semibold hide-mobile" data-col="arch" onclick="sort('arch')">
Arch <span class="arrow">▼</span>
</th>
<th class="px-4 py-3.5 text-left font-semibold" data-col="category" onclick="sort('category')">
Category <span class="arrow">▼</span>
</th>
<th class="px-4 py-3.5 text-right font-semibold hide-mobile" data-col="size" onclick="sort('size')">
Size <span class="arrow">▼</span>
</th>
<th class="px-4 py-3.5 text-right font-semibold hide-mobile" data-col="mtime" onclick="sort('mtime')">
Updated <span class="arrow">▼</span>
</th>
</tr>
</thead>
<tbody id="list"></tbody>
</table>
</div>
</div>
<!-- Footer -->
<div class="text-center mt-10 text-xs text-muted">
<a href="https://github.com/Antergos-NeXT/antergos-packages" class="hover:text-accent transition-colors">GitHub</a>
<span class="mx-2">·</span>
<a href="https://antergos-next.github.io/antergos-packages/" class="hover:text-accent transition-colors">antergos-next.github.io</a>
<span class="mx-2">·</span>
<a href="https://github.com/Antergos-NeXT/antergos-iso" class="hover:text-accent transition-colors">ISO repo</a>
</div>
</div>
<script>
function f() {{
const q = document.getElementById('q').value.toLowerCase();
const r = document.querySelectorAll('#l tr');
let v = 0;
for (let i = 0; i < r.length; i++) {{
if (r[i].textContent.toLowerCase().includes(q)) {{
r[i].classList.remove('hidden'); v++;
}} else {{
r[i].classList.add('hidden');
}}
}}
document.getElementById('c').textContent = v + ' / {len(pkgs)} packages';
const pkgs = {rows_json};
let sortCol = 'name';
let sortDir = 1;
let filtered = pkgs;
function formatSize(bytes) {{
const mb = bytes / 1024 / 1024;
return mb >= 1 ? mb.toFixed(1) + ' MB' : (bytes / 1024).toFixed(0) + ' KB';
}}
function escapeHtml(s) {{
const d = document.createElement('div');
d.textContent = s;
return d.innerHTML;
}}
function render() {{
const q = document.getElementById('q').value.toLowerCase();
const cat = document.getElementById('catFilter').value;
filtered = pkgs.filter(p => {{
const matchSearch = p.name.toLowerCase().includes(q) || p.description.toLowerCase().includes(q);
const matchCat = cat === 'all' || p.category === cat;
return matchSearch && matchCat;
}});
// sort
filtered.sort((a, b) => {{
let va = a[sortCol], vb = b[sortCol];
if (sortCol === 'size' || sortCol === 'mtime') {{ va = a[sortCol]; vb = b[sortCol]; return (va - vb) * sortDir; }}
if (typeof va === 'string') va = va.toLowerCase();
if (typeof vb === 'string') vb = vb.toLowerCase();
if (va < vb) return -1 * sortDir;
if (va > vb) return 1 * sortDir;
return 0;
}});
const tbody = document.getElementById('list');
tbody.innerHTML = filtered.map((p, i) => {{
const catLabel = p.category.charAt(0).toUpperCase() + p.category.slice(1);
return `<tr class="row" style="animation-delay: ${{i * 30}}ms">
<td class="px-4 py-3">
<div class="flex items-center gap-2.5">
<a href="${{escapeHtml(p.file)}}" class="text-accent hover:text-accent-glow font-medium transition-colors truncate max-w-[200px] sm:max-w-none block">${{escapeHtml(p.name)}}</a>
</div>
<div class="text-dim text-xs mt-0.5 truncate max-w-[280px] sm:max-w-none">${{escapeHtml(p.description)}}</div>
</td>
<td class="px-4 py-3 text-dim hide-mobile font-mono text-xs">${{escapeHtml(p.version)}}</td>
<td class="px-4 py-3 hide-mobile"><span class="text-xs bg-abyss border border-border rounded px-1.5 py-0.5 text-dim">${{escapeHtml(p.arch)}}</span></td>
<td class="px-4 py-3">
<span class="badge inline-block text-xs font-medium rounded-full px-2.5 py-0.5" style="background: ${{p.cat_color}}18; color: ${{p.cat_color}}; border: 1px solid ${{p.cat_color}}33">${{catLabel}}</span>
</td>
<td class="px-4 py-3 text-dim text-right hide-mobile font-mono text-xs">${{formatSize(p.size)}}</td>
<td class="px-4 py-3 text-dim text-right hide-mobile text-xs">${{p.mtime_display}}</td>
</tr>`;
}}).join('');
document.getElementById('count').textContent = filtered.length + ' / ' + pkgs.length + ' packages';
}}
function sort(col) {{
if (sortCol === col) {{ sortDir *= -1; }} else {{ sortCol = col; sortDir = 1; }}
document.querySelectorAll('th').forEach(th => th.classList.remove('asc', 'desc'));
const el = document.querySelector(`th[data-col="${{col}}"]`);
if (el) el.classList.add(sortDir === 1 ? 'asc' : 'desc');
render();
}}
document.getElementById('q').addEventListener('input', render);
document.getElementById('catFilter').addEventListener('change', render);
// init: sort by name asc
document.querySelector('th[data-col="name"]').classList.add('asc');
render();
</script>
</body>
</html>'''
with open('repo/index.html', 'w') as fp:
fp.write(html)
with open(os.path.join(REPO_DIR, 'index.html'), 'w') as f:
f.write(html)
with open('repo/pkglist.json', 'w') as fp:
json.dump([{'name': p['name'], 'size': p['size']} for p in pkgs], fp, indent=2)
fp.write('\n')
with open(os.path.join(REPO_DIR, 'pkglist.json'), 'w') as f:
json.dump([{
'name': p['name'],
'version': p['version'],
'arch': p['arch'],
'size': p['size'],
'category': p['category'],
'description': p['description'],
'url': p['url'],
'mtime': p['mtime'],
} for p in pkgs], f, indent=2)
f.write('\n')
print(f'OK — {len(pkgs)} packages, index.html + pkglist.json written to {REPO_DIR}/')
@@ -2,7 +2,7 @@
pkgname=calamares-branding-antergos-next
pkgver=1.0
pkgrel=15
pkgrel=16
pkgdesc="Calamares branding for Antergos NeXT with offline/online installer support"
arch=('any')
url="https://github.com/Antergos-NeXT"
@@ -68,6 +68,11 @@ InstallLog_Start() {
}
Calamares_Start() {
if [ "$EUID" = 0 ]; then
calamares -D8 >> $log &
return
fi
local kdesu=/usr/lib/kf6/kdesu
[ -x $kdesu ] || kdesu=kdesu
+1 -2
View File
@@ -5,7 +5,7 @@
_pkgname="calamares"
pkgname="$_pkgname"
pkgver=3.4.2
pkgrel=5
pkgrel=6
pkgdesc="Distribution-independent installer framework"
url="https://codeberg.org/Calamares/calamares"
license=("GPL-3.0-or-later")
@@ -40,7 +40,6 @@ build() {
initramfs
initramfscfg
interactiveterminal
packagechooser
)
local _pkgsrc_dir="$srcdir/$_pkgname-$pkgver"
-18
View File
@@ -1,18 +0,0 @@
# Maintainer: Celestia Ludenberg <ash8820@proton.me>
pkgname=hal
pkgver=0.2.0
pkgrel=3
pkgdesc="HAL 9000 — Antergos NeXT Package Manager. Dual-mode: wrapper (pacman) or native (standalone)."
arch=('any')
url="https://github.com/Antergos-NeXT"
license=('GPL3')
depends=('pacman' 'python' 'python-zstandard' 'libarchive' 'zstd')
optdepends=('python-requests: faster downloads in native mode')
source=("hal")
sha256sums=('SKIP')
package() {
install -dm755 "${pkgdir}/usr/bin"
install -m755 "hal" "${pkgdir}/usr/bin/hal"
}
Binary file not shown.
-2014
View File
File diff suppressed because it is too large Load Diff
+245
View File
File diff suppressed because one or more lines are too long
+212
View File
@@ -0,0 +1,212 @@
[
{
"name": "('antergos-live-base",
"version": "2026.06-2",
"arch": "any",
"size": 2341888,
"category": "other",
"description": "Antergos live session",
"url": "https://github.com/Antergos-NeXT/antergos-live",
"mtime": "2026-06-28T16:11:37.154843+00:00"
},
{
"name": "antergos-grub-theme",
"version": "2026.06-1",
"arch": "any",
"size": 4827136,
"category": "desktop",
"description": "Antergos GRUB theme",
"url": "https://github.com/Antergos-NeXT/antergos-branding",
"mtime": "2026-06-28T16:11:37.146843+00:00"
},
{
"name": "antergos-next-desktop-settings",
"version": "1-1",
"arch": "any",
"size": 505856,
"category": "branding",
"description": "Antergos NeXT desktop settings, theme, and color scheme",
"url": "https://github.com/Antergos-NeXT/antergos-pkgs",
"mtime": "2026-06-28T16:11:37.156843+00:00"
},
{
"name": "antergos-next-keyring",
"version": "1-1",
"arch": "any",
"size": 5147648,
"category": "core",
"description": "Antergos NeXT GPG keyring",
"url": "https://github.com/Antergos-NeXT/antergos-pkgs",
"mtime": "2026-06-28T16:11:37.173843+00:00"
},
{
"name": "antergos-next-memes",
"version": "1.0-1",
"arch": "any",
"size": 265216,
"category": "desktop",
"description": "Antergos NeXT welcome audio",
"url": "https://github.com/Antergos-NeXT",
"mtime": "2026-06-28T16:11:37.174843+00:00"
},
{
"name": "antergos-next-mirrorlist",
"version": "1-1",
"arch": "any",
"size": 4196352,
"category": "core",
"description": "Antergos NeXT mirror list",
"url": "https://github.com/Antergos-NeXT/antergos-pkgs",
"mtime": "2026-06-28T16:11:37.187843+00:00"
},
{
"name": "antergos-release",
"version": "2026.06-1",
"arch": "any",
"size": 3473408,
"category": "core",
"description": "Antergos NeXT release file",
"url": "https://github.com/Antergos-NeXT",
"mtime": "2026-06-28T16:11:37.199843+00:00"
},
{
"name": "antergos-wallpapers",
"version": "0.7-4",
"arch": "any",
"size": 2386944,
"category": "branding",
"description": "Antergos NeXT wallpapers",
"url": "https://github.com/Antergos/wallpapers",
"mtime": "2026-06-28T16:11:37.207843+00:00"
},
{
"name": "antergos-welcome",
"version": "0.1-3",
"arch": "any",
"size": 3249152,
"category": "desktop",
"description": "Welcome screen and support tool for new Antergos NeXT users",
"url": "https://github.com/Antergos-NeXT/antergos-welcome",
"mtime": "2026-06-28T16:11:37.217843+00:00"
},
{
"name": "bloatware-remover",
"version": "0.1-1",
"arch": "any",
"size": 2554880,
"category": "other",
"description": "",
"url": "",
"mtime": "2026-06-28T16:11:37.226843+00:00"
},
{
"name": "calamares-3.4.2",
"version": "3.4.2-6",
"arch": "x86_64",
"size": 234496,
"category": "installer",
"description": "",
"url": "",
"mtime": "2026-06-28T16:11:37.227843+00:00"
},
{
"name": "calamares-branding-antergos-next",
"version": "1.0-16",
"arch": "any",
"size": 4476928,
"category": "installer",
"description": "Calamares branding for Antergos NeXT with offline/online installer support",
"url": "https://github.com/Antergos-NeXT",
"mtime": "2026-06-28T16:11:37.241843+00:00"
},
{
"name": "configure-1.6",
"version": "1.6-1",
"arch": "x86_64",
"size": 1199104,
"category": "other",
"description": "",
"url": "",
"mtime": "2026-06-28T16:11:37.246843+00:00"
},
{
"name": "gentoo-challenge-failed",
"version": "3.0-1",
"arch": "any",
"size": 724992,
"category": "other",
"description": "",
"url": "",
"mtime": "2026-06-28T16:11:37.248843+00:00"
},
{
"name": "i-use-artix-btw",
"version": "2.0-1",
"arch": "any",
"size": 4995072,
"category": "other",
"description": "",
"url": "",
"mtime": "2026-06-28T16:11:37.264843+00:00"
},
{
"name": "neofetch-but-rust",
"version": "0.5-1",
"arch": "any",
"size": 2647040,
"category": "other",
"description": "",
"url": "",
"mtime": "2026-06-28T16:11:37.273843+00:00"
},
{
"name": "pacman-broke-my-system",
"version": "9.9-1",
"arch": "any",
"size": 2330624,
"category": "other",
"description": "",
"url": "",
"mtime": "2026-06-28T16:11:37.281843+00:00"
},
{
"name": "ptsd-from-sudo",
"version": "1.0-1",
"arch": "any",
"size": 4167680,
"category": "other",
"description": "",
"url": "",
"mtime": "2026-06-28T16:11:37.294843+00:00"
},
{
"name": "rms-approved",
"version": "4.0-1",
"arch": "any",
"size": 361472,
"category": "other",
"description": "",
"url": "",
"mtime": "2026-06-28T16:11:37.296843+00:00"
},
{
"name": "steve-jobs-would-never",
"version": "1.0-1",
"arch": "any",
"size": 262144,
"category": "other",
"description": "",
"url": "",
"mtime": "2026-06-28T16:11:37.297843+00:00"
},
{
"name": "systemd-bad",
"version": "1.0-1",
"arch": "any",
"size": 1938432,
"category": "other",
"description": "",
"url": "",
"mtime": "2026-06-28T16:11:37.304843+00:00"
}
]