Initial Commit

This commit is contained in:
2024-01-19 20:09:39 -08:00
commit 3dda90298d
29 changed files with 2523 additions and 0 deletions

77
tmpls/about.html Normal file
View File

@@ -0,0 +1,77 @@
#macro("content"):
<nav aria-label="breadcrumb">
<ul>
<li><a href="/">Home</a></li>
<li>About</li>
</ul>
</nav>
<h1>About LURE</h1>
<section class="container">
<hgroup><h2>Why does LURE exist?</h2></hgroup>
<p>
LURE was created because packaging software for multiple Linux distros can be difficult and
error-prone, and installing those packages can be a nightmare for users unless they're available
in their distro's official repositories.
</p>
<p>
Take Discord for example. It only provides a deb file and a tar.gz file, and it's not available
in most official repositories. That means users of RPM distros have to manually install discord
using the tarball or rely on community-maintained repositories that don't always have
up-to-date versions of Discord. That's also made worse by the fact that Discord refuses to run
if there's a newer version available.
</p>
<p>
LURE fixes that by always providing the most up to date version of Discord, which means all that
RPM users have to do is run <code>lure in discord</code> and LURE will get the tarball and
automatically build an RPM package out of it for them. When there's a newer version of Discord
available, users can just run <code>lure up</code> and LURE will automatically download the updated
version of Discord and install it. That also helps users of deb distros because it means they don't
have to manually download packages for software like Discord.
</p>
</section>
<section class="container">
<hgroup><h2>How does LURE work?</h2></hgroup>
<p>
Similar to Arch Linux's AUR, LURE has a repository of shell scripts that tell it how to build a
package. When you run a LURE command, it updates its repository and interprets the shell script
for the package you want to install using its built-in bash implementation. Then, it uses the
code inside the script to build a file structure to be included in the final package. It detects
which distro you're running, resolves dependencies, detects which package manager you have and
which package format it uses, builds metadata for the package from the information in the shell
script, builds the final package, and then runs the install command for your package manager to
install it.
</p>
</section>
<section class="container">
<hgroup><h2>How does LURE keep its packages up to date?</h2></hgroup>
<p>
LURE can automatically update its packages using a bot called
<a href="https://gitea.elara.ws/lure/lure-updater">lure-updater</a>. It accepts plugins that
detect when software is updated upstream and updates the LURE package accordingly. The plugins
that are currently running in my instance of the bot can be found in the
<a href="https://gitea.elara.ws/lure/updater-plugins">updater-plugins</a> repo. The
<code>discord-bin</code> package, for example, checks Discord's API every hour to see if they've
released an updated version, and if they have, it pushes an update to LURE's repo.
</p>
</section>
<section class="container">
<hgroup><h2>How do I add my own package to LURE?</h2></hgroup>
<p>
LURE provides <a href="https://github.com/lure-sh/lure/blob/master/docs/packages">comprehensive documentation</a>
for packagers. If you need help with anything, feel free to ask on LURE's <a href="https://reddit.com/r/linux_user_repository">subreddit</a>.
If you find a bug or would like a feature to be added, please open an issue on LURE's git repo.
</p>
</section>
<section class="container">
<hgroup><h2>Can I use and modify LURE's icons?</h2></hgroup>
<p>
LURE's icons are available on the <a href="/icons">icons page</a> of this site. They're licensed
under CC-BY-NC-SA 4.0, which means you're free to share, modify, and use the icons for non-commercial
purposes as long as you give appropriate credit and indicate any changes made to the original icons.
</p>
</section>
#!macro
#include("base.html", title = "About", desc = "About the Linux User Repository")

35
tmpls/base.html Normal file
View File

@@ -0,0 +1,35 @@
<!DOCTYPE html>
<html data-theme="dark">
<head>
<title>#(title) | LURE Web</title>
<meta name="description" content='#(desc | title + " on LURE Web")' />
<meta name="viewport" content="width=device-width, initial-scale=0.8" />
<link rel="stylesheet" href="/static/css/pico.min.css">
<link rel="stylesheet" href="/static/css/lure.css">
<link rel="icon" href="/static/icons/favicon.ico">
</head>
<body>
<nav>
<ul>
<li><a href="/"><img src="/static/icons/lure-text-white.svg" alt="LURE Logo" width="85"></a></li>
</ul>
<ul>
<li><a href="/" class='#(title == "Home" ? "active" : "")'>Home</a></li>
<li><a href="/pkgs" class='#(title == "Package Search" ? "active" : "")'>Packages</a></li>
<li><a href="/about" class='#(title == "About" ? "active" : "")'>About</a></li>
</ul>
</nav>
<main class="container">
#macro("content")
</main>
<footer class="container">
<div class="headings marginless">
<h2>Copyright &copy; #(now().Year()) LURE Web Contributors</h2>
</div>
<a href="https://github.com/lure-sh/lure-web" target="_blank">Source Code</a>
</footer>
</body>
</html>

25
tmpls/error.html Normal file
View File

@@ -0,0 +1,25 @@
#macro("content"):
<nav aria-label="breadcrumb">
<ul>
<li><a href="/">Home</a></li>
<li>Error</li>
</ul>
</nav>
<h1>Error</h1>
<br><br>
<section class="container centered">
<div>
<hgroup>
<h1>Something Went Wrong!</h1>
<h2>Error #(error.StatusCode): #(error.StatusText())</h2>
</hgroup>
<pre><code>#(error.Msg)</code></pre>
<a href="/" role="button">Go Back Home</a>
</div>
</section>
#!macro
#include("base.html", title = sprintf("Error %d", error.StatusCode), desc = sprintf("Error %d: %s", error.StatusCode, error.StatusText()))

32
tmpls/home.html Normal file
View File

@@ -0,0 +1,32 @@
#macro("content"):
<section class="container centered">
<img src="/static/icons/lure-no-text.svg" alt="LURE logo without text" width="200">
<hgroup>
<h1>LURE</h1>
<h2>The community repository missing from your Linux distro</h2>
</hgroup>
</section>
<section class="container">
<hgroup>
<h1>What does LURE do?</h1>
<h2>LURE allows you to:</h2>
</hgroup>
<ul>
<li>Access a wide range of software beyond what's available in official repositories</li>
<li>Get new versions of software as they come out, before official repositories ship them</li>
<li>Install unofficial software without having to deal with a separate package manager</li>
<li>Release software for Linux without having to package it for different distributions</li>
</ul>
</section>
<section class="container">
<hgroup>
<h1>Install LURE</h1>
<h2>Paste this into your Linux terminal and the install script will set everything up for you</h2>
</hgroup>
<pre><code>curl -fsSL lure.sh/install | bash</code></pre>
<p>LURE is also available on the AUR as <code>linux-user-repository-bin</code> and distro packages are provided at the <a href="https://gitea.elara.ws/lure/lure/releases/latest">latest Gitea release</a></p>
</section>
#!macro
#include("base.html", title = "Home", desc = "The community repository missing from your Linux distro")

39
tmpls/icons.html Normal file
View File

@@ -0,0 +1,39 @@
#macro("content"):
<nav aria-label="breadcrumb">
<ul>
<li><a href="/">Home</a></li>
<li>Icons</li>
</ul>
</nav>
<h1>Icons</h1>
<section class="container">
<div class="grid">
<div>
<article class="centered">
<header><strong>Without Text</strong></header>
<img class="icon" src="/static/icons/lure-no-text.svg" alt="LURE icon without text">
<footer><a href="/static/icons/lure-no-text.svg" download>Download</a></footer>
</article>
</div>
<div>
<article class="centered">
<header><strong>With Text</strong></header>
<img class="icon" src="/static/icons/lure-text.svg" alt="LURE icon with text">
<footer><a href="/static/icons/lure-text.svg" download>Download</a></footer>
</article>
</div>
<div>
<article class="centered">
<header><strong>White With Text</strong></header>
<img class="icon" src="/static/icons/lure-text-white.svg" alt="LURE icon with text">
<footer><a href="/static/icons/lure-text-white.svg" download>Download</a></footer>
</article>
</div>
</div>
<strong>Note: The icons on this page are licensed under CC-BY-NC-SA 4.0 unless otherwise specified</strong>
</section>
#!macro
#include("base.html", title = "Icons", desc = "Linux User Repository icons and logos")

142
tmpls/pkg.html Normal file
View File

@@ -0,0 +1,142 @@
#macro("content"):
<nav aria-label="breadcrumb">
<ul>
<li><a href="/">Home</a></li>
<li><a href="/pkgs">Packages</a></li>
<li>#(pkg.Name)</li>
</ul>
</nav>
<hgroup>
<h1>#(pkg.Name)</h1>
<h2>#(pkg.FullVersion())</h2>
</hgroup>
<a href="/pkg/#(pkg.Repository)/#(pkg.Name)/script" role="button">View script</a>
<a href="javascript:openModal()" role="button" class="secondary">View badge</a>
<br>
<article>
<h3 >Package Information</h3>
<table>
<tbody>
#if(pkg.Description != ""):
<tr>
<th>Description:</th>
<td>#(pkg.Description)</td>
</tr>
#!if
#if(pkg.Homepage != ""):
<tr>
<th>Homepage:</th>
<td><a href="#(pkg.Homepage)" target="_blank">#(pkg.Homepage)</a></td>
</tr>
#!if
#if(pkg.Maintainer != ""):
<tr>
<th>Maintainer:</th>
<td>#(pkg.Maintainer)</td>
</tr>
#!if
#if(len(pkg.Licenses) != 0):
<tr>
<th>Licenses:</th>
<td>
#for(i, license in pkg.Licenses):
#if(hasPrefix(license, "custom")):
#(license)#if(i != len(pkg.Licenses) - 1):,&nbsp;#!if
#else:
<a href="https://spdx.org/licenses/#(license).html" target="_blank">#(license)</a>#if(i != len(pkg.Licenses) - 1):,&nbsp;#!if
#!if
#!for
</td>
</tr>
#!if
#if(len(pkg.Architectures) != 0):
<tr>
<th>Architectures:</th>
<td>#(join(pkg.Architectures, ", "))</td>
</tr>
#!if
#if(len(pkg.Conflicts) != 0):
<tr>
<th>Conflicts:</th>
<td>#(join(pkg.Conflicts, ", "))</td>
</tr>
#!if
#if(len(pkg.Provides) != 0):
<tr>
<th>Provides:</th>
<td>#(join(pkg.Provides, ", "))</td>
</tr>
#!if
<tr>
<th>Repository:</th>
<td>#(pkg.Repository)</td>
</tr>
</tbody>
</table>
</article>
#if(len(pkg.Depends) > 0):
<article>
<h3 >Runtime Dependencies</h3>
<table>
<tbody>
#for(override, pkgList in pkg.Depends):
<tr>
<th>#(override == "" ? "default" : override):</th>
<td>#(join(pkgList, ", "))</td>
</tr>
#!for
</tbody>
</table>
</article>
#!if
#if(len(pkg.BuildDepends) > 0):
<article>
<h3 >Build Dependencies</h3>
<table>
<tbody>
#for(override, pkgList in pkg.BuildDepends):
<tr>
<th>#(override == "" ? "default" : override):</th>
<td>#(join(pkgList, ", "))</td>
</tr>
#!for
</tbody>
</table>
</article>
#!if
<dialog id="badgeModal">
<article style="min-width: 60%">
<header>
<strong>Badge</strong>
<a aria-label="Close" class="close" href="javascript:closeModal()"></a>
</header>
<p class="centered">
<img src="#(url)/badge.svg" alt="LURE badge for #(pkg.Name)">
<hr>
</p>
<label for="badgeMarkdown">Markdown</label>
<input id="badgeMarkdown" value="[![LURE badge for #(pkg.Name)](#(url)/badge.svg)](#(url))" readonly />
<label for="badgeHTML">HTML</label>
<input id="badgeHTML" value='<a href="#(url)"><img src="#(url)/badge.svg" alt="LURE badge for #(pkg.Name)">' readonly />
</article>
</dialog>
<script>
function openModal() {
let modal = document.getElementById("badgeModal");
document.documentElement.classList.add('modal-is-open');
modal.setAttribute('open', true);
}
function closeModal() {
let modal = document.getElementById("badgeModal");
document.documentElement.classList.remove('modal-is-open');
modal.removeAttribute('open');
}
</script>
#!macro
#include("base.html", title = pkg.Name + " Package", desc = sprintf("%s %s - %s", pkg.Name, pkg.FullVersion(), pkg.Description))

62
tmpls/pkgs.html Normal file
View File

@@ -0,0 +1,62 @@
#macro("content"):
<nav aria-label="breadcrumb">
<ul>
<li><a href="/">Home</a></li>
<li>Packages</li>
</ul>
</nav>
<h1>Package Search</h1>
<form action="/pkgs">
<input type="text" id="query" name="q" value='#(query.Get("q"))' placeholder="Query"/>
<div class="grid">
<div>
<select name="sort">
<option value="">Unsorted</option>
<option value="name" #(query.Get("sort") == "name" ? "selected" : "")>Sort by Name</option>
<option value="version" #(query.Get("sort") == "version" ? "selected" : "")>Sort by Version</option>
<option value="repo" #(query.Get("sort") == "repo" ? "selected" : "")>Sort by Repository</option>
</select>
</div>
<div>
<select name="filter" onchange="onFilterChange(event)">
<option value="">No Filter</option>
<option value="inrepo" #(query.Get("filter") == "inrepo" ? "selected" : "")>In Repo</option>
<option value="arch" #(query.Get("filter") == "arch" ? "selected" : "")>Supports Architecture</option>
</select>
</div>
</div>
<input class='#(query.Get("filter") == "" ? "hidden" : "")' type="text" id="filterValue" name="fv" value='#(query.Get("fv"))' placeholder="Filter Value"/>
<button type="submit">Search</button>
</form>
<hr>
#for(pkg in pkgs):
<article>
<header>
<div class="justify-space-between">
<span class="left"><strong>#(pkg.Repository) / #(pkg.Name)</strong></span>
<span class="right">#(pkg.Version)</span>
</div>
</header>
<p>#(pkg.Description)</p>
<footer class="centered">
<a href="/pkg/#(pkg.Repository)/#(pkg.Name)">More Info &rarr;</a>
</footer>
</article>
#!for
<script>
function onFilterChange(e) {
let filterValue = document.getElementById('filterValue');
if (e.srcElement.value == '') {
filterValue.classList.add('hidden');
} else {
filterValue.classList.remove('hidden');
}
}
</script>
#!macro
#include("base.html", title = "Package Search", desc = "Search for LURE packages")

19
tmpls/script.html Normal file
View File

@@ -0,0 +1,19 @@
#macro("content"):
<nav aria-label="breadcrumb">
<ul>
<li><a href="/">Home</a></li>
<li><a href="/pkgs">Packages</a></li>
<li><a href="/pkg/#(repoName)/#(pkgName)">#(pkgName)</a></li>
<li>Script</li>
</ul>
</nav>
<hgroup>
<h1>Build Script</h1>
<h2>#(repoName) / #(pkgName)</h2>
</hgroup>
#(script)
#!macro
#include("base.html", title = pkgName + " Build Script", desc = sprintf("Build script for the %s package", pkgName))