Compare commits
7 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| b255f07b0f | |||
| dec4cdd068 | |||
| 73c620ecd5 | |||
| 69467a1542 | |||
| 1ae6a35bc8 | |||
| 9ef5b52b85 | |||
| f93158cb3c |
241
cmd/mbf/main.go
241
cmd/mbf/main.go
@@ -10,10 +10,6 @@ import (
|
|||||||
"os/signal"
|
"os/signal"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"runtime"
|
"runtime"
|
||||||
"strconv"
|
|
||||||
"strings"
|
|
||||||
"sync"
|
|
||||||
"sync/atomic"
|
|
||||||
"syscall"
|
"syscall"
|
||||||
"time"
|
"time"
|
||||||
"unique"
|
"unique"
|
||||||
@@ -133,207 +129,6 @@ func main() {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
|
||||||
var (
|
|
||||||
flagStatus bool
|
|
||||||
flagReport string
|
|
||||||
)
|
|
||||||
c.NewCommand(
|
|
||||||
"info",
|
|
||||||
"Display out-of-band metadata of an artifact",
|
|
||||||
func(args []string) (err error) {
|
|
||||||
if len(args) == 0 {
|
|
||||||
return errors.New("info requires at least 1 argument")
|
|
||||||
}
|
|
||||||
|
|
||||||
var r *rosa.Report
|
|
||||||
if flagReport != "" {
|
|
||||||
if r, err = rosa.OpenReport(flagReport); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
defer func() {
|
|
||||||
if closeErr := r.Close(); err == nil {
|
|
||||||
err = closeErr
|
|
||||||
}
|
|
||||||
}()
|
|
||||||
defer r.HandleAccess(&err)()
|
|
||||||
}
|
|
||||||
|
|
||||||
for i, name := range args {
|
|
||||||
if p, ok := rosa.ResolveName(name); !ok {
|
|
||||||
return fmt.Errorf("unknown artifact %q", name)
|
|
||||||
} else {
|
|
||||||
var suffix string
|
|
||||||
if version := rosa.Std.Version(p); version != rosa.Unversioned {
|
|
||||||
suffix += "-" + version
|
|
||||||
}
|
|
||||||
fmt.Println("name : " + name + suffix)
|
|
||||||
|
|
||||||
meta := rosa.GetMetadata(p)
|
|
||||||
fmt.Println("description : " + meta.Description)
|
|
||||||
if meta.Website != "" {
|
|
||||||
fmt.Println("website : " +
|
|
||||||
strings.TrimSuffix(meta.Website, "/"))
|
|
||||||
}
|
|
||||||
|
|
||||||
const statusPrefix = "status : "
|
|
||||||
if flagStatus {
|
|
||||||
if r == nil {
|
|
||||||
var f io.ReadSeekCloser
|
|
||||||
f, err = cache.OpenStatus(rosa.Std.Load(p))
|
|
||||||
if err != nil {
|
|
||||||
if errors.Is(err, os.ErrNotExist) {
|
|
||||||
fmt.Println(
|
|
||||||
statusPrefix + "not yet cured",
|
|
||||||
)
|
|
||||||
} else {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
fmt.Print(statusPrefix)
|
|
||||||
_, err = io.Copy(os.Stdout, f)
|
|
||||||
if err = errors.Join(err, f.Close()); err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
status, n := r.ArtifactOf(cache.Ident(rosa.Std.Load(p)))
|
|
||||||
if status == nil {
|
|
||||||
fmt.Println(
|
|
||||||
statusPrefix + "not in report",
|
|
||||||
)
|
|
||||||
} else {
|
|
||||||
fmt.Println("size :", n)
|
|
||||||
fmt.Print(statusPrefix)
|
|
||||||
if _, err = os.Stdout.Write(status); err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if i != len(args)-1 {
|
|
||||||
fmt.Println()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
},
|
|
||||||
).
|
|
||||||
Flag(
|
|
||||||
&flagStatus,
|
|
||||||
"status", command.BoolFlag(false),
|
|
||||||
"Display cure status if available",
|
|
||||||
).
|
|
||||||
Flag(
|
|
||||||
&flagReport,
|
|
||||||
"report", command.StringFlag(""),
|
|
||||||
"Load cure status from this report file instead of cache",
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
c.NewCommand(
|
|
||||||
"report",
|
|
||||||
"Generate an artifact cure report for the current cache",
|
|
||||||
func(args []string) (err error) {
|
|
||||||
var w *os.File
|
|
||||||
switch len(args) {
|
|
||||||
case 0:
|
|
||||||
w = os.Stdout
|
|
||||||
|
|
||||||
case 1:
|
|
||||||
if w, err = os.OpenFile(
|
|
||||||
args[0],
|
|
||||||
os.O_CREATE|os.O_EXCL|syscall.O_WRONLY,
|
|
||||||
0400,
|
|
||||||
); err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
defer func() {
|
|
||||||
closeErr := w.Close()
|
|
||||||
if err == nil {
|
|
||||||
err = closeErr
|
|
||||||
}
|
|
||||||
}()
|
|
||||||
|
|
||||||
default:
|
|
||||||
return errors.New("report requires 1 argument")
|
|
||||||
}
|
|
||||||
|
|
||||||
if container.Isatty(int(w.Fd())) {
|
|
||||||
return errors.New("output appears to be a terminal")
|
|
||||||
}
|
|
||||||
return rosa.WriteReport(msg, w, cache)
|
|
||||||
},
|
|
||||||
)
|
|
||||||
|
|
||||||
{
|
|
||||||
var flagJobs int
|
|
||||||
c.NewCommand("updates", command.UsageInternal, func([]string) error {
|
|
||||||
var (
|
|
||||||
errsMu sync.Mutex
|
|
||||||
errs []error
|
|
||||||
|
|
||||||
n atomic.Uint64
|
|
||||||
)
|
|
||||||
|
|
||||||
w := make(chan rosa.PArtifact)
|
|
||||||
var wg sync.WaitGroup
|
|
||||||
for range max(flagJobs, 1) {
|
|
||||||
wg.Go(func() {
|
|
||||||
for p := range w {
|
|
||||||
meta := rosa.GetMetadata(p)
|
|
||||||
if meta.ID == 0 {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
v, err := meta.GetVersions(ctx)
|
|
||||||
if err != nil {
|
|
||||||
errsMu.Lock()
|
|
||||||
errs = append(errs, err)
|
|
||||||
errsMu.Unlock()
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
if current, latest :=
|
|
||||||
rosa.Std.Version(p),
|
|
||||||
meta.GetLatest(v); current != latest {
|
|
||||||
|
|
||||||
n.Add(1)
|
|
||||||
log.Printf("%s %s < %s", meta.Name, current, latest)
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
msg.Verbosef("%s is up to date", meta.Name)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
done:
|
|
||||||
for i := range rosa.PresetEnd {
|
|
||||||
select {
|
|
||||||
case w <- rosa.PArtifact(i):
|
|
||||||
break
|
|
||||||
case <-ctx.Done():
|
|
||||||
break done
|
|
||||||
}
|
|
||||||
}
|
|
||||||
close(w)
|
|
||||||
wg.Wait()
|
|
||||||
|
|
||||||
if v := n.Load(); v > 0 {
|
|
||||||
errs = append(errs, errors.New(strconv.Itoa(int(v))+
|
|
||||||
" package(s) are out of date"))
|
|
||||||
}
|
|
||||||
return errors.Join(errs...)
|
|
||||||
}).
|
|
||||||
Flag(
|
|
||||||
&flagJobs,
|
|
||||||
"j", command.IntFlag(32),
|
|
||||||
"Maximum number of simultaneous connections",
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
{
|
{
|
||||||
var (
|
var (
|
||||||
flagGentoo string
|
flagGentoo string
|
||||||
@@ -466,6 +261,30 @@ func main() {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
c.NewCommand(
|
||||||
|
"status",
|
||||||
|
"Display the status file of an artifact",
|
||||||
|
func(args []string) error {
|
||||||
|
if len(args) != 1 {
|
||||||
|
return errors.New("status requires 1 argument")
|
||||||
|
}
|
||||||
|
if p, ok := rosa.ResolveName(args[0]); !ok {
|
||||||
|
return fmt.Errorf("unknown artifact %q", args[0])
|
||||||
|
} else {
|
||||||
|
r, err := cache.OpenStatus(rosa.Std.Load(p))
|
||||||
|
if err != nil {
|
||||||
|
if errors.Is(err, os.ErrNotExist) {
|
||||||
|
return errors.New(args[0] + " was never cured")
|
||||||
|
}
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
_, err = io.Copy(os.Stdout, r)
|
||||||
|
return errors.Join(err, r.Close())
|
||||||
|
}
|
||||||
|
},
|
||||||
|
)
|
||||||
|
|
||||||
{
|
{
|
||||||
var (
|
var (
|
||||||
flagNet bool
|
flagNet bool
|
||||||
@@ -607,16 +426,6 @@ func main() {
|
|||||||
if cache != nil {
|
if cache != nil {
|
||||||
cache.Close()
|
cache.Close()
|
||||||
}
|
}
|
||||||
if w, ok := err.(interface{ Unwrap() []error }); !ok {
|
log.Fatal(err)
|
||||||
log.Fatal(err)
|
|
||||||
} else {
|
|
||||||
errs := w.Unwrap()
|
|
||||||
for i, e := range errs {
|
|
||||||
if i == len(errs)-1 {
|
|
||||||
log.Fatal(e)
|
|
||||||
}
|
|
||||||
log.Println(e)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|||||||
55
cmd/pkgserver/main.go
Normal file
55
cmd/pkgserver/main.go
Normal file
@@ -0,0 +1,55 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"embed"
|
||||||
|
"fmt"
|
||||||
|
"net/http"
|
||||||
|
)
|
||||||
|
|
||||||
|
//go:generate sh -c "sass ui/static/dark.scss ui/static/dark.css && sass ui/static/light.scss ui/static/light.css && tsc ui/static/index.ts"
|
||||||
|
//go:embed ui/*
|
||||||
|
var content embed.FS
|
||||||
|
|
||||||
|
func serveWebUI(w http.ResponseWriter, r *http.Request) {
|
||||||
|
fmt.Printf("serveWebUI: %s\n", r.URL.Path)
|
||||||
|
w.Header().Set("Cache-Control", "no-cache, no-store, must-revalidate")
|
||||||
|
w.Header().Set("Pragma", "no-cache")
|
||||||
|
w.Header().Set("Expires", "0")
|
||||||
|
w.Header().Set("X-Content-Type-Options", "nosniff")
|
||||||
|
w.Header().Set("X-XSS-Protection", "1")
|
||||||
|
w.Header().Set("X-Frame-Options", "DENY")
|
||||||
|
|
||||||
|
http.ServeFileFS(w, r, content, "ui/index.html")
|
||||||
|
}
|
||||||
|
func serveStaticContent(w http.ResponseWriter, r *http.Request) {
|
||||||
|
fmt.Printf("serveStaticContent: %s\n", r.URL.Path)
|
||||||
|
switch r.URL.Path {
|
||||||
|
case "/static/style.css":
|
||||||
|
darkTheme := r.CookiesNamed("dark_theme")
|
||||||
|
if len(darkTheme) > 0 && darkTheme[0].Value == "true" {
|
||||||
|
http.ServeFileFS(w, r, content, "ui/static/dark.css")
|
||||||
|
} else {
|
||||||
|
http.ServeFileFS(w, r, content, "ui/static/light.css")
|
||||||
|
}
|
||||||
|
break
|
||||||
|
case "/favicon.ico":
|
||||||
|
http.ServeFileFS(w, r, content, "ui/static/favicon.ico")
|
||||||
|
break
|
||||||
|
case "/static/index.js":
|
||||||
|
http.ServeFileFS(w, r, content, "ui/static/index.js")
|
||||||
|
break
|
||||||
|
default:
|
||||||
|
http.NotFound(w, r)
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
func serveAPI(w http.ResponseWriter, r *http.Request) {
|
||||||
|
|
||||||
|
}
|
||||||
|
func main() {
|
||||||
|
http.HandleFunc("GET /{$}", serveWebUI)
|
||||||
|
http.HandleFunc("GET /favicon.ico", serveStaticContent)
|
||||||
|
http.HandleFunc("GET /static/", serveStaticContent)
|
||||||
|
http.HandleFunc("GET /api/", serveAPI)
|
||||||
|
http.ListenAndServe(":8067", nil)
|
||||||
|
}
|
||||||
26
cmd/pkgserver/ui/index.html
Normal file
26
cmd/pkgserver/ui/index.html
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<link rel="stylesheet" href="static/style.css">
|
||||||
|
<title>Hakurei PkgServer</title>
|
||||||
|
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.7.1/jquery.min.js"></script>
|
||||||
|
<script src="static/index.js"></script>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<h1>Hakurei PkgServer</h1>
|
||||||
|
|
||||||
|
<table id="pkg-list">
|
||||||
|
<tr><th>Status</th><th>Name</th><th>Version</th></tr>
|
||||||
|
</table>
|
||||||
|
<p>Showing entries <span id="entry-counter"></span>.</p>
|
||||||
|
<span class="bottom-nav"><a href="javascript:prevPage()">« Previous</a> <span id="page-number">1</span> <a href="javascript:nextPage()">Next »</a></span>
|
||||||
|
<span><label for="count">Entries per page:</label><select name="count" id="count">
|
||||||
|
<option value="10">10</option>
|
||||||
|
<option value="25">25</option>
|
||||||
|
<option value="50">50</option>
|
||||||
|
<option value="100">100</option>
|
||||||
|
</select></span>
|
||||||
|
</body>
|
||||||
|
<footer>© <a href="https://hakurei.app/">Hakurei</a>. Licensed under the MIT license.</footer>
|
||||||
|
</html>
|
||||||
0
cmd/pkgserver/ui/static/_common.scss
Normal file
0
cmd/pkgserver/ui/static/_common.scss
Normal file
6
cmd/pkgserver/ui/static/dark.css
Normal file
6
cmd/pkgserver/ui/static/dark.css
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
@use 'common';
|
||||||
|
html {
|
||||||
|
background-color: #2c2c2c;
|
||||||
|
color: ghostwhite; }
|
||||||
|
|
||||||
|
/*# sourceMappingURL=dark.css.map */
|
||||||
7
cmd/pkgserver/ui/static/dark.css.map
Normal file
7
cmd/pkgserver/ui/static/dark.css.map
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
{
|
||||||
|
"version": 3,
|
||||||
|
"mappings": "AAAA,aAAa;AAEb,IAAK;EACH,gBAAgB,EAAE,OAAO;EACzB,KAAK,EAAE,UAAU",
|
||||||
|
"sources": ["dark.scss"],
|
||||||
|
"names": [],
|
||||||
|
"file": "dark.css"
|
||||||
|
}
|
||||||
6
cmd/pkgserver/ui/static/dark.scss
Normal file
6
cmd/pkgserver/ui/static/dark.scss
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
@use 'common';
|
||||||
|
|
||||||
|
html {
|
||||||
|
background-color: #2c2c2c;
|
||||||
|
color: ghostwhite;
|
||||||
|
}
|
||||||
BIN
cmd/pkgserver/ui/static/favicon.ico
Normal file
BIN
cmd/pkgserver/ui/static/favicon.ico
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 17 KiB |
67
cmd/pkgserver/ui/static/index.js
Normal file
67
cmd/pkgserver/ui/static/index.js
Normal file
@@ -0,0 +1,67 @@
|
|||||||
|
"use strict";
|
||||||
|
var PackageEntry = /** @class */ (function () {
|
||||||
|
function PackageEntry() {
|
||||||
|
}
|
||||||
|
return PackageEntry;
|
||||||
|
}());
|
||||||
|
var State = /** @class */ (function () {
|
||||||
|
function State() {
|
||||||
|
this.entriesPerPage = 10;
|
||||||
|
this.currentPage = 1;
|
||||||
|
this.entryIndex = 0;
|
||||||
|
this.loadedEntries = [];
|
||||||
|
}
|
||||||
|
State.prototype.getEntriesPerPage = function () {
|
||||||
|
return this.entriesPerPage;
|
||||||
|
};
|
||||||
|
State.prototype.setEntriesPerPage = function (entriesPerPage) {
|
||||||
|
this.entriesPerPage = entriesPerPage;
|
||||||
|
this.updateRange();
|
||||||
|
};
|
||||||
|
State.prototype.getCurrentPage = function () {
|
||||||
|
return this.currentPage;
|
||||||
|
};
|
||||||
|
State.prototype.setCurrentPage = function (page) {
|
||||||
|
this.currentPage = page;
|
||||||
|
document.getElementById("page-number").innerText = String(this.currentPage);
|
||||||
|
this.updateRange();
|
||||||
|
};
|
||||||
|
State.prototype.getEntryIndex = function () {
|
||||||
|
return this.entryIndex;
|
||||||
|
};
|
||||||
|
State.prototype.setEntryIndex = function (entryIndex) {
|
||||||
|
this.entryIndex = entryIndex;
|
||||||
|
this.updateRange();
|
||||||
|
};
|
||||||
|
State.prototype.getLoadedEntries = function () {
|
||||||
|
return this.loadedEntries;
|
||||||
|
};
|
||||||
|
State.prototype.getMaxPage = function () {
|
||||||
|
return this.loadedEntries.length / this.entriesPerPage;
|
||||||
|
};
|
||||||
|
State.prototype.updateRange = function () {
|
||||||
|
var max = Math.min(this.entryIndex + this.entriesPerPage, this.loadedEntries.length);
|
||||||
|
document.getElementById("entry-counter").innerText = "".concat(this.entryIndex, "-").concat(max, " of ").concat(this.loadedEntries.length);
|
||||||
|
};
|
||||||
|
return State;
|
||||||
|
}());
|
||||||
|
var STATE;
|
||||||
|
function prevPage() {
|
||||||
|
var current = STATE.getCurrentPage();
|
||||||
|
if (current > 1) {
|
||||||
|
STATE.setCurrentPage(STATE.getCurrentPage() - 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function nextPage() {
|
||||||
|
var current = STATE.getCurrentPage();
|
||||||
|
if (current < STATE.getMaxPage()) {
|
||||||
|
STATE.setCurrentPage(STATE.getCurrentPage() + 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
document.addEventListener("DOMContentLoaded", function () {
|
||||||
|
STATE = new State();
|
||||||
|
STATE.updateRange();
|
||||||
|
document.getElementById("count").addEventListener("change", function (event) {
|
||||||
|
STATE.setEntriesPerPage(parseInt(event.target.value));
|
||||||
|
});
|
||||||
|
});
|
||||||
66
cmd/pkgserver/ui/static/index.ts
Normal file
66
cmd/pkgserver/ui/static/index.ts
Normal file
@@ -0,0 +1,66 @@
|
|||||||
|
"use strict"
|
||||||
|
|
||||||
|
class PackageEntry {
|
||||||
|
|
||||||
|
}
|
||||||
|
class State {
|
||||||
|
entriesPerPage: number = 10
|
||||||
|
currentPage: number = 1
|
||||||
|
entryIndex: number = 0
|
||||||
|
loadedEntries: PackageEntry[] = []
|
||||||
|
getEntriesPerPage(): number {
|
||||||
|
return this.entriesPerPage
|
||||||
|
}
|
||||||
|
setEntriesPerPage(entriesPerPage: number) {
|
||||||
|
this.entriesPerPage = entriesPerPage
|
||||||
|
this.updateRange()
|
||||||
|
}
|
||||||
|
getCurrentPage(): number {
|
||||||
|
return this.currentPage
|
||||||
|
}
|
||||||
|
setCurrentPage(page: number) {
|
||||||
|
this.currentPage = page
|
||||||
|
document.getElementById("page-number").innerText = String(this.currentPage)
|
||||||
|
this.updateRange()
|
||||||
|
}
|
||||||
|
getEntryIndex(): number {
|
||||||
|
return this.entryIndex
|
||||||
|
}
|
||||||
|
setEntryIndex(entryIndex: number) {
|
||||||
|
this.entryIndex = entryIndex
|
||||||
|
this.updateRange()
|
||||||
|
}
|
||||||
|
getLoadedEntries(): PackageEntry[] {
|
||||||
|
return this.loadedEntries
|
||||||
|
}
|
||||||
|
getMaxPage(): number {
|
||||||
|
return this.loadedEntries.length / this.entriesPerPage
|
||||||
|
}
|
||||||
|
updateRange() {
|
||||||
|
let max = Math.min(this.entryIndex + this.entriesPerPage, this.loadedEntries.length)
|
||||||
|
document.getElementById("entry-counter").innerText = `${this.entryIndex}-${max} of ${this.loadedEntries.length}`
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let STATE: State
|
||||||
|
|
||||||
|
function prevPage() {
|
||||||
|
let current = STATE.getCurrentPage()
|
||||||
|
if (current > 1) {
|
||||||
|
STATE.setCurrentPage(STATE.getCurrentPage() - 1)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function nextPage() {
|
||||||
|
let current = STATE.getCurrentPage()
|
||||||
|
if (current < STATE.getMaxPage()) {
|
||||||
|
STATE.setCurrentPage(STATE.getCurrentPage() + 1)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
document.addEventListener("DOMContentLoaded", () => {
|
||||||
|
STATE = new State()
|
||||||
|
STATE.updateRange()
|
||||||
|
document.getElementById("count").addEventListener("change", (event) => {
|
||||||
|
STATE.setEntriesPerPage(parseInt((event.target as HTMLSelectElement).value))
|
||||||
|
})
|
||||||
|
})
|
||||||
6
cmd/pkgserver/ui/static/light.css
Normal file
6
cmd/pkgserver/ui/static/light.css
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
@use 'common';
|
||||||
|
html {
|
||||||
|
background-color: #d3d3d3;
|
||||||
|
color: black; }
|
||||||
|
|
||||||
|
/*# sourceMappingURL=light.css.map */
|
||||||
7
cmd/pkgserver/ui/static/light.css.map
Normal file
7
cmd/pkgserver/ui/static/light.css.map
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
{
|
||||||
|
"version": 3,
|
||||||
|
"mappings": "AAAA,aAAa;AAEb,IAAK;EACH,gBAAgB,EAAE,OAAO;EACzB,KAAK,EAAE,KAAK",
|
||||||
|
"sources": ["light.scss"],
|
||||||
|
"names": [],
|
||||||
|
"file": "light.css"
|
||||||
|
}
|
||||||
6
cmd/pkgserver/ui/static/light.scss
Normal file
6
cmd/pkgserver/ui/static/light.scss
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
@use 'common';
|
||||||
|
|
||||||
|
html {
|
||||||
|
background-color: #d3d3d3;
|
||||||
|
color: black;
|
||||||
|
}
|
||||||
0
internal/azalea/azalea.bnf
Normal file
0
internal/azalea/azalea.bnf
Normal file
69
internal/azalea/azalea.go
Normal file
69
internal/azalea/azalea.go
Normal file
@@ -0,0 +1,69 @@
|
|||||||
|
//go:generate gocc -a azalea.bnf
|
||||||
|
package azalea
|
||||||
|
|
||||||
|
import (
|
||||||
|
"io"
|
||||||
|
"io/fs"
|
||||||
|
"os"
|
||||||
|
"path/filepath"
|
||||||
|
"strconv"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"hakurei.app/container/check"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Parser struct {
|
||||||
|
Generator
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewParser(gen Generator) *Parser {
|
||||||
|
return &Parser{
|
||||||
|
Generator: gen,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
func (p Parser) Initialise() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p Parser) Consume(ns string, file io.Reader) error {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// ConsumeDir walks a directory and consumes all Azalea source files within it and all its subdirectories, as long as they end with the .az extension.
|
||||||
|
func (p Parser) ConsumeDir(dir *check.Absolute) error {
|
||||||
|
ds := dir.String()
|
||||||
|
return filepath.WalkDir(ds, func(path string, d fs.DirEntry, err error) (e error) {
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if d.IsDir() || !strings.HasSuffix(d.Name(), ".az") {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
rel, e := filepath.Rel(ds, path)
|
||||||
|
ns := strings.TrimSuffix(rel, ".az")
|
||||||
|
f, e := os.Open(path)
|
||||||
|
return p.Consume(ns, f)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// ConsumeAll consumes all provided readers as Azalea source code, each given the namespace `r%d` where `%d` is the index of the reader in the provided arguments.
|
||||||
|
func (p Parser) ConsumeAll(in ...io.Reader) error {
|
||||||
|
for i, r := range in {
|
||||||
|
err := p.Consume("r"+strconv.FormatInt(int64(i), 10), r)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// ConsumeStrings consumes all provided strings as Azalea source code, each given the namespace `s%d` where `%d` is the index of the string in the provided arugments.
|
||||||
|
func (p Parser) ConsumeStrings(in ...string) error {
|
||||||
|
for i, s := range in {
|
||||||
|
err := p.Consume("s"+strconv.FormatInt(int64(i), 10), strings.NewReader(s))
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
36
internal/azalea/generator.go
Normal file
36
internal/azalea/generator.go
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
package azalea
|
||||||
|
|
||||||
|
import (
|
||||||
|
"io"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Generator interface {
|
||||||
|
Finalise() (error, io.Writer)
|
||||||
|
}
|
||||||
|
|
||||||
|
type JsonGenerator struct {
|
||||||
|
t any
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewJsonGenerator[T any]() JsonGenerator {
|
||||||
|
t := new(T)
|
||||||
|
|
||||||
|
return JsonGenerator{
|
||||||
|
t,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (j *JsonGenerator) Finalise() (error, io.Writer) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
type PkgIRGenerator struct {
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewPkgIRGenerator() PkgIRGenerator {
|
||||||
|
return PkgIRGenerator{}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *PkgIRGenerator) Finalise() (error, io.Writer) {
|
||||||
|
|
||||||
|
}
|
||||||
@@ -440,23 +440,28 @@ func (a *execArtifact) cure(f *FContext, hostNet bool) (err error) {
|
|||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
|
|
||||||
brStdout, brStderr := f.cache.getReader(stdout), f.cache.getReader(stderr)
|
bw := f.cache.getWriter(status)
|
||||||
stdoutDone, stderrDone := make(chan struct{}), make(chan struct{})
|
stdoutDone, stderrDone := make(chan struct{}), make(chan struct{})
|
||||||
go scanVerbose(
|
go scanVerbose(
|
||||||
msg, cancel, stdoutDone,
|
msg, cancel, stdoutDone,
|
||||||
"("+a.name+":1)",
|
"("+a.name+":1)",
|
||||||
io.TeeReader(brStdout, status),
|
io.TeeReader(stdout, bw),
|
||||||
)
|
)
|
||||||
go scanVerbose(
|
go scanVerbose(
|
||||||
msg, cancel, stderrDone,
|
msg, cancel, stderrDone,
|
||||||
"("+a.name+":2)",
|
"("+a.name+":2)",
|
||||||
io.TeeReader(brStderr, status),
|
io.TeeReader(stderr, bw),
|
||||||
)
|
)
|
||||||
defer func() {
|
defer func() {
|
||||||
<-stdoutDone
|
<-stdoutDone
|
||||||
<-stderrDone
|
<-stderrDone
|
||||||
f.cache.putReader(brStdout)
|
|
||||||
f.cache.putReader(brStderr)
|
flushErr := bw.Flush()
|
||||||
|
if err == nil {
|
||||||
|
err = flushErr
|
||||||
|
}
|
||||||
|
f.cache.putWriter(bw)
|
||||||
|
|
||||||
}()
|
}()
|
||||||
} else {
|
} else {
|
||||||
z.Stdout, z.Stderr = status, status
|
z.Stdout, z.Stderr = status, status
|
||||||
|
|||||||
@@ -71,8 +71,6 @@ func init() {
|
|||||||
Name: "attr",
|
Name: "attr",
|
||||||
Description: "Commands for Manipulating Filesystem Extended Attributes",
|
Description: "Commands for Manipulating Filesystem Extended Attributes",
|
||||||
Website: "https://savannah.nongnu.org/projects/attr/",
|
Website: "https://savannah.nongnu.org/projects/attr/",
|
||||||
|
|
||||||
ID: 137,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -100,7 +98,5 @@ func init() {
|
|||||||
Name: "acl",
|
Name: "acl",
|
||||||
Description: "Commands for Manipulating POSIX Access Control Lists",
|
Description: "Commands for Manipulating POSIX Access Control Lists",
|
||||||
Website: "https://savannah.nongnu.org/projects/acl/",
|
Website: "https://savannah.nongnu.org/projects/acl/",
|
||||||
|
|
||||||
ID: 16,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,11 +1,6 @@
|
|||||||
package rosa
|
package rosa
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
|
||||||
"encoding/json"
|
|
||||||
"errors"
|
|
||||||
"net/http"
|
|
||||||
"strconv"
|
|
||||||
"sync"
|
"sync"
|
||||||
|
|
||||||
"hakurei.app/internal/pkg"
|
"hakurei.app/internal/pkg"
|
||||||
@@ -15,12 +10,8 @@ import (
|
|||||||
type PArtifact int
|
type PArtifact int
|
||||||
|
|
||||||
const (
|
const (
|
||||||
LLVMCompilerRT PArtifact = iota
|
|
||||||
LLVMRuntimes
|
|
||||||
LLVMClang
|
|
||||||
|
|
||||||
// ImageInitramfs is the Rosa OS initramfs archive.
|
// ImageInitramfs is the Rosa OS initramfs archive.
|
||||||
ImageInitramfs
|
ImageInitramfs PArtifact = iota
|
||||||
|
|
||||||
// Kernel is the generic Rosa OS Linux kernel.
|
// Kernel is the generic Rosa OS Linux kernel.
|
||||||
Kernel
|
Kernel
|
||||||
@@ -61,6 +52,7 @@ const (
|
|||||||
Gzip
|
Gzip
|
||||||
Hakurei
|
Hakurei
|
||||||
HakureiDist
|
HakureiDist
|
||||||
|
IniConfig
|
||||||
Kmod
|
Kmod
|
||||||
LibXau
|
LibXau
|
||||||
Libcap
|
Libcap
|
||||||
@@ -88,6 +80,7 @@ const (
|
|||||||
Ninja
|
Ninja
|
||||||
OpenSSL
|
OpenSSL
|
||||||
PCRE2
|
PCRE2
|
||||||
|
Packaging
|
||||||
Patch
|
Patch
|
||||||
Perl
|
Perl
|
||||||
PerlLocaleGettext
|
PerlLocaleGettext
|
||||||
@@ -101,13 +94,11 @@ const (
|
|||||||
PerlUnicodeGCString
|
PerlUnicodeGCString
|
||||||
PerlYAMLTiny
|
PerlYAMLTiny
|
||||||
PkgConfig
|
PkgConfig
|
||||||
|
Pluggy
|
||||||
Procps
|
Procps
|
||||||
|
PyTest
|
||||||
|
Pygments
|
||||||
Python
|
Python
|
||||||
PythonIniConfig
|
|
||||||
PythonPackaging
|
|
||||||
PythonPluggy
|
|
||||||
PythonPyTest
|
|
||||||
PythonPygments
|
|
||||||
QEMU
|
QEMU
|
||||||
Rsync
|
Rsync
|
||||||
Sed
|
Sed
|
||||||
@@ -161,79 +152,11 @@ type Metadata struct {
|
|||||||
Description string `json:"description"`
|
Description string `json:"description"`
|
||||||
// Project home page.
|
// Project home page.
|
||||||
Website string `json:"website,omitempty"`
|
Website string `json:"website,omitempty"`
|
||||||
|
|
||||||
// Project identifier on [Anitya].
|
|
||||||
//
|
|
||||||
// [Anitya]: https://release-monitoring.org/
|
|
||||||
ID int `json:"-"`
|
|
||||||
|
|
||||||
// Optional custom version checking behaviour.
|
|
||||||
latest func(v *Versions) string
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetLatest returns the latest version described by v.
|
|
||||||
func (meta *Metadata) GetLatest(v *Versions) string {
|
|
||||||
if meta.latest != nil {
|
|
||||||
return meta.latest(v)
|
|
||||||
}
|
|
||||||
return v.Latest
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Unversioned denotes an unversioned [PArtifact].
|
// Unversioned denotes an unversioned [PArtifact].
|
||||||
const Unversioned = "\x00"
|
const Unversioned = "\x00"
|
||||||
|
|
||||||
// UnpopulatedIDError is returned by [Metadata.GetLatest] for an instance of
|
|
||||||
// [Metadata] where ID is not populated.
|
|
||||||
type UnpopulatedIDError struct{}
|
|
||||||
|
|
||||||
func (UnpopulatedIDError) Unwrap() error { return errors.ErrUnsupported }
|
|
||||||
func (UnpopulatedIDError) Error() string { return "Anitya ID is not populated" }
|
|
||||||
|
|
||||||
// Versions are package versions returned by Anitya.
|
|
||||||
type Versions struct {
|
|
||||||
// The latest version for the project, as determined by the version sorting algorithm.
|
|
||||||
Latest string `json:"latest_version"`
|
|
||||||
// List of all versions that aren’t flagged as pre-release.
|
|
||||||
Stable []string `json:"stable_versions"`
|
|
||||||
// List of all versions stored, sorted from newest to oldest.
|
|
||||||
All []string `json:"versions"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// getStable returns the first Stable version, or Latest if that is unavailable.
|
|
||||||
func (v *Versions) getStable() string {
|
|
||||||
if len(v.Stable) == 0 {
|
|
||||||
return v.Latest
|
|
||||||
}
|
|
||||||
return v.Stable[0]
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetVersions returns versions fetched from Anitya.
|
|
||||||
func (meta *Metadata) GetVersions(ctx context.Context) (*Versions, error) {
|
|
||||||
if meta.ID == 0 {
|
|
||||||
return nil, UnpopulatedIDError{}
|
|
||||||
}
|
|
||||||
|
|
||||||
var resp *http.Response
|
|
||||||
if req, err := http.NewRequestWithContext(
|
|
||||||
ctx,
|
|
||||||
http.MethodGet,
|
|
||||||
"https://release-monitoring.org/api/v2/versions/?project_id="+
|
|
||||||
strconv.Itoa(meta.ID),
|
|
||||||
nil,
|
|
||||||
); err != nil {
|
|
||||||
return nil, err
|
|
||||||
} else {
|
|
||||||
req.Header.Set("User-Agent", "Rosa/1.1")
|
|
||||||
if resp, err = http.DefaultClient.Do(req); err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
var v Versions
|
|
||||||
err := json.NewDecoder(resp.Body).Decode(&v)
|
|
||||||
return &v, errors.Join(err, resp.Body.Close())
|
|
||||||
}
|
|
||||||
|
|
||||||
var (
|
var (
|
||||||
// artifactsM is an array of [PArtifact] metadata.
|
// artifactsM is an array of [PArtifact] metadata.
|
||||||
artifactsM [PresetEnd]Metadata
|
artifactsM [PresetEnd]Metadata
|
||||||
|
|||||||
@@ -51,16 +51,3 @@ func TestResolveNameUnexported(t *testing.T) {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestUnique(t *testing.T) {
|
|
||||||
t.Parallel()
|
|
||||||
|
|
||||||
names := make(map[string]struct{})
|
|
||||||
for i := range rosa.PresetEnd {
|
|
||||||
name := rosa.GetMetadata(rosa.PArtifact(i)).Name
|
|
||||||
if _, ok := names[name]; ok {
|
|
||||||
t.Fatalf("name %s is not unique", name)
|
|
||||||
}
|
|
||||||
names[name] = struct{}{}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -32,7 +32,5 @@ func init() {
|
|||||||
Name: "bzip2",
|
Name: "bzip2",
|
||||||
Description: "a freely available, patent free, high-quality data compressor",
|
Description: "a freely available, patent free, high-quality data compressor",
|
||||||
Website: "https://sourceware.org/bzip2/",
|
Website: "https://sourceware.org/bzip2/",
|
||||||
|
|
||||||
ID: 237,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -111,8 +111,6 @@ func init() {
|
|||||||
Name: "cmake",
|
Name: "cmake",
|
||||||
Description: "cross-platform, open-source build system",
|
Description: "cross-platform, open-source build system",
|
||||||
Website: "https://cmake.org/",
|
Website: "https://cmake.org/",
|
||||||
|
|
||||||
ID: 306,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -34,7 +34,5 @@ func init() {
|
|||||||
Name: "curl",
|
Name: "curl",
|
||||||
Description: "command line tool and library for transferring data with URLs",
|
Description: "command line tool and library for transferring data with URLs",
|
||||||
Website: "https://curl.se/",
|
Website: "https://curl.se/",
|
||||||
|
|
||||||
ID: 381,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -37,7 +37,5 @@ func init() {
|
|||||||
Name: "dtc",
|
Name: "dtc",
|
||||||
Description: "The Device Tree Compiler",
|
Description: "The Device Tree Compiler",
|
||||||
Website: "https://git.kernel.org/pub/scm/utils/dtc/dtc.git/",
|
Website: "https://git.kernel.org/pub/scm/utils/dtc/dtc.git/",
|
||||||
|
|
||||||
ID: 16911,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -45,7 +45,5 @@ func init() {
|
|||||||
Name: "elfutils",
|
Name: "elfutils",
|
||||||
Description: "utilities and libraries to handle ELF files and DWARF data",
|
Description: "utilities and libraries to handle ELF files and DWARF data",
|
||||||
Website: "https://sourceware.org/elfutils/",
|
Website: "https://sourceware.org/elfutils/",
|
||||||
|
|
||||||
ID: 5679,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -55,7 +55,5 @@ func init() {
|
|||||||
Name: "fakeroot",
|
Name: "fakeroot",
|
||||||
Description: "tool for simulating superuser privileges",
|
Description: "tool for simulating superuser privileges",
|
||||||
Website: "https://salsa.debian.org/clint/fakeroot",
|
Website: "https://salsa.debian.org/clint/fakeroot",
|
||||||
|
|
||||||
ID: 12048,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -25,7 +25,5 @@ func init() {
|
|||||||
Name: "flex",
|
Name: "flex",
|
||||||
Description: "scanner generator for lexing in C and C++",
|
Description: "scanner generator for lexing in C and C++",
|
||||||
Website: "https://github.com/westes/flex/",
|
Website: "https://github.com/westes/flex/",
|
||||||
|
|
||||||
ID: 819,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -24,11 +24,11 @@ func (t Toolchain) newFuse() (pkg.Artifact, string) {
|
|||||||
// this project uses pytest
|
// this project uses pytest
|
||||||
SkipTest: true,
|
SkipTest: true,
|
||||||
},
|
},
|
||||||
PythonIniConfig,
|
IniConfig,
|
||||||
PythonPackaging,
|
Packaging,
|
||||||
PythonPluggy,
|
Pluggy,
|
||||||
PythonPygments,
|
Pygments,
|
||||||
PythonPyTest,
|
PyTest,
|
||||||
|
|
||||||
KernelHeaders,
|
KernelHeaders,
|
||||||
), version
|
), version
|
||||||
@@ -40,7 +40,5 @@ func init() {
|
|||||||
Name: "fuse",
|
Name: "fuse",
|
||||||
Description: "the reference implementation of the Linux FUSE interface",
|
Description: "the reference implementation of the Linux FUSE interface",
|
||||||
Website: "https://github.com/libfuse/libfuse/",
|
Website: "https://github.com/libfuse/libfuse/",
|
||||||
|
|
||||||
ID: 861,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,8 +4,8 @@ import "hakurei.app/internal/pkg"
|
|||||||
|
|
||||||
func (t Toolchain) newGit() (pkg.Artifact, string) {
|
func (t Toolchain) newGit() (pkg.Artifact, string) {
|
||||||
const (
|
const (
|
||||||
version = "2.53.0"
|
version = "2.52.0"
|
||||||
checksum = "rlqSTeNgSeVKJA7nvzGqddFH8q3eFEPB4qRZft-4zth8wTHnbTbm7J90kp_obHGm"
|
checksum = "uH3J1HAN_c6PfGNJd2OBwW4zo36n71wmkdvityYnrh8Ak0D1IifiAvEWz9Vi9DmS"
|
||||||
)
|
)
|
||||||
return t.NewPackage("git", version, pkg.NewHTTPGetTar(
|
return t.NewPackage("git", version, pkg.NewHTTPGetTar(
|
||||||
nil, "https://www.kernel.org/pub/software/scm/git/"+
|
nil, "https://www.kernel.org/pub/software/scm/git/"+
|
||||||
@@ -72,8 +72,6 @@ func init() {
|
|||||||
Name: "git",
|
Name: "git",
|
||||||
Description: "distributed version control system",
|
Description: "distributed version control system",
|
||||||
Website: "https://www.git-scm.com/",
|
Website: "https://www.git-scm.com/",
|
||||||
|
|
||||||
ID: 5350,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -4,8 +4,8 @@ import "hakurei.app/internal/pkg"
|
|||||||
|
|
||||||
func (t Toolchain) newM4() (pkg.Artifact, string) {
|
func (t Toolchain) newM4() (pkg.Artifact, string) {
|
||||||
const (
|
const (
|
||||||
version = "1.4.21"
|
version = "1.4.20"
|
||||||
checksum = "pPa6YOo722Jw80l1OsH1tnUaklnPFjFT-bxGw5iAVrZTm1P8FQaWao_NXop46-pm"
|
checksum = "RT0_L3m4Co86bVBY3lCFAEs040yI1WdeNmRylFpah8IZovTm6O4wI7qiHJN3qsW9"
|
||||||
)
|
)
|
||||||
return t.NewPackage("m4", version, pkg.NewHTTPGetTar(
|
return t.NewPackage("m4", version, pkg.NewHTTPGetTar(
|
||||||
nil, "https://ftpmirror.gnu.org/gnu/m4/m4-"+version+".tar.bz2",
|
nil, "https://ftpmirror.gnu.org/gnu/m4/m4-"+version+".tar.bz2",
|
||||||
@@ -18,8 +18,6 @@ chmod +w tests/test-c32ispunct.sh && echo '#!/bin/sh' > tests/test-c32ispunct.sh
|
|||||||
`,
|
`,
|
||||||
}, (*MakeHelper)(nil),
|
}, (*MakeHelper)(nil),
|
||||||
Diffutils,
|
Diffutils,
|
||||||
|
|
||||||
KernelHeaders,
|
|
||||||
), version
|
), version
|
||||||
}
|
}
|
||||||
func init() {
|
func init() {
|
||||||
@@ -29,8 +27,6 @@ func init() {
|
|||||||
Name: "m4",
|
Name: "m4",
|
||||||
Description: "a macro processor with GNU extensions",
|
Description: "a macro processor with GNU extensions",
|
||||||
Website: "https://www.gnu.org/software/m4/",
|
Website: "https://www.gnu.org/software/m4/",
|
||||||
|
|
||||||
ID: 1871,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -56,8 +52,6 @@ func init() {
|
|||||||
Name: "bison",
|
Name: "bison",
|
||||||
Description: "a general-purpose parser generator",
|
Description: "a general-purpose parser generator",
|
||||||
Website: "https://www.gnu.org/software/bison/",
|
Website: "https://www.gnu.org/software/bison/",
|
||||||
|
|
||||||
ID: 193,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -81,8 +75,6 @@ func init() {
|
|||||||
Name: "sed",
|
Name: "sed",
|
||||||
Description: "a non-interactive command-line text editor",
|
Description: "a non-interactive command-line text editor",
|
||||||
Website: "https://www.gnu.org/software/sed/",
|
Website: "https://www.gnu.org/software/sed/",
|
||||||
|
|
||||||
ID: 4789,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -116,8 +108,6 @@ func init() {
|
|||||||
Name: "autoconf",
|
Name: "autoconf",
|
||||||
Description: "M4 macros to produce self-contained configure script",
|
Description: "M4 macros to produce self-contained configure script",
|
||||||
Website: "https://www.gnu.org/software/autoconf/",
|
Website: "https://www.gnu.org/software/autoconf/",
|
||||||
|
|
||||||
ID: 141,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -158,8 +148,6 @@ func init() {
|
|||||||
Name: "automake",
|
Name: "automake",
|
||||||
Description: "a tool for automatically generating Makefile.in files",
|
Description: "a tool for automatically generating Makefile.in files",
|
||||||
Website: "https://www.gnu.org/software/automake/",
|
Website: "https://www.gnu.org/software/automake/",
|
||||||
|
|
||||||
ID: 144,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -189,8 +177,6 @@ func init() {
|
|||||||
Name: "libtool",
|
Name: "libtool",
|
||||||
Description: "a generic library support script",
|
Description: "a generic library support script",
|
||||||
Website: "https://www.gnu.org/software/libtool/",
|
Website: "https://www.gnu.org/software/libtool/",
|
||||||
|
|
||||||
ID: 1741,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -215,8 +201,6 @@ func init() {
|
|||||||
Name: "gzip",
|
Name: "gzip",
|
||||||
Description: "a popular data compression program",
|
Description: "a popular data compression program",
|
||||||
Website: "https://www.gnu.org/software/gzip/",
|
Website: "https://www.gnu.org/software/gzip/",
|
||||||
|
|
||||||
ID: 1290,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -261,8 +245,6 @@ func init() {
|
|||||||
Name: "gettext",
|
Name: "gettext",
|
||||||
Description: "tools for producing multi-lingual messages",
|
Description: "tools for producing multi-lingual messages",
|
||||||
Website: "https://www.gnu.org/software/gettext/",
|
Website: "https://www.gnu.org/software/gettext/",
|
||||||
|
|
||||||
ID: 898,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -294,8 +276,6 @@ func init() {
|
|||||||
Name: "diffutils",
|
Name: "diffutils",
|
||||||
Description: "several programs related to finding differences between files",
|
Description: "several programs related to finding differences between files",
|
||||||
Website: "https://www.gnu.org/software/diffutils/",
|
Website: "https://www.gnu.org/software/diffutils/",
|
||||||
|
|
||||||
ID: 436,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -326,8 +306,6 @@ func init() {
|
|||||||
Name: "patch",
|
Name: "patch",
|
||||||
Description: "a program to apply diff output to files",
|
Description: "a program to apply diff output to files",
|
||||||
Website: "https://savannah.gnu.org/projects/patch/",
|
Website: "https://savannah.gnu.org/projects/patch/",
|
||||||
|
|
||||||
ID: 2597,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -356,15 +334,13 @@ func init() {
|
|||||||
Name: "bash",
|
Name: "bash",
|
||||||
Description: "the Bourne Again SHell",
|
Description: "the Bourne Again SHell",
|
||||||
Website: "https://www.gnu.org/software/bash/",
|
Website: "https://www.gnu.org/software/bash/",
|
||||||
|
|
||||||
ID: 166,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t Toolchain) newCoreutils() (pkg.Artifact, string) {
|
func (t Toolchain) newCoreutils() (pkg.Artifact, string) {
|
||||||
const (
|
const (
|
||||||
version = "9.10"
|
version = "9.9"
|
||||||
checksum = "o-B9wssRnZySzJUI1ZJAgw-bZtj1RC67R9po2AcM2OjjS8FQIl16IRHpC6IwO30i"
|
checksum = "B1_TaXj1j5aiVIcazLWu8Ix03wDV54uo2_iBry4qHG6Y-9bjDpUPlkNLmU_3Nvw6"
|
||||||
)
|
)
|
||||||
return t.NewPackage("coreutils", version, pkg.NewHTTPGetTar(
|
return t.NewPackage("coreutils", version, pkg.NewHTTPGetTar(
|
||||||
nil, "https://ftpmirror.gnu.org/gnu/coreutils/coreutils-"+version+".tar.gz",
|
nil, "https://ftpmirror.gnu.org/gnu/coreutils/coreutils-"+version+".tar.gz",
|
||||||
@@ -377,105 +353,12 @@ test_disable() { chmod +w "$2" && echo "$1" > "$2"; }
|
|||||||
|
|
||||||
test_disable '#!/bin/sh' gnulib-tests/test-c32ispunct.sh
|
test_disable '#!/bin/sh' gnulib-tests/test-c32ispunct.sh
|
||||||
test_disable '#!/bin/sh' tests/split/line-bytes.sh
|
test_disable '#!/bin/sh' tests/split/line-bytes.sh
|
||||||
test_disable '#!/bin/sh' tests/ls/hyperlink.sh
|
test_disable '#!/bin/sh' tests/dd/no-allocate.sh
|
||||||
|
test_disable '#!/bin/sh' tests/env/env.sh
|
||||||
test_disable 'int main(){return 0;}' gnulib-tests/test-chown.c
|
test_disable 'int main(){return 0;}' gnulib-tests/test-chown.c
|
||||||
test_disable 'int main(){return 0;}' gnulib-tests/test-fchownat.c
|
test_disable 'int main(){return 0;}' gnulib-tests/test-fchownat.c
|
||||||
test_disable 'int main(){return 0;}' gnulib-tests/test-lchown.c
|
test_disable 'int main(){return 0;}' gnulib-tests/test-lchown.c
|
||||||
`,
|
`,
|
||||||
|
|
||||||
Patches: [][2]string{
|
|
||||||
{"tests-fix-job-control", `From 21d287324aa43aa3a31f39619ade0deac7fd6013 Mon Sep 17 00:00:00 2001
|
|
||||||
From: =?UTF-8?q?P=C3=A1draig=20Brady?= <P@draigBrady.com>
|
|
||||||
Date: Tue, 24 Feb 2026 15:44:41 +0000
|
|
||||||
Subject: [PATCH] tests: fix job control triggering test termination
|
|
||||||
|
|
||||||
This avoids the test harness being terminated like:
|
|
||||||
make[1]: *** [Makefile:24419: check-recursive] Hangup
|
|
||||||
make[3]: *** [Makefile:24668: check-TESTS] Hangup
|
|
||||||
make: *** [Makefile:24922: check] Hangup
|
|
||||||
make[2]: *** [Makefile:24920: check-am] Hangup
|
|
||||||
make[4]: *** [Makefile:24685: tests/misc/usage_vs_refs.log] Error 129
|
|
||||||
...
|
|
||||||
|
|
||||||
This happened sometimes when the tests were being run non interactively.
|
|
||||||
For example when run like:
|
|
||||||
|
|
||||||
setsid make TESTS="tests/timeout/timeout.sh \
|
|
||||||
tests/tail/overlay-headers.sh" SUBDIRS=. -j2 check
|
|
||||||
|
|
||||||
Note the race window can be made bigger by adding a sleep
|
|
||||||
after tail is stopped in overlay-headers.sh
|
|
||||||
|
|
||||||
The race can trigger the kernel to induce its job control
|
|
||||||
mechanism to prevent stuck processes.
|
|
||||||
I.e. where it sends SIGHUP + SIGCONT to a process group
|
|
||||||
when it determines that group may become orphaned,
|
|
||||||
and there are stopped processes in that group.
|
|
||||||
|
|
||||||
* tests/tail/overlay-headers.sh: Use setsid(1) to keep the stopped
|
|
||||||
tail process in a separate process group, thus avoiding any kernel
|
|
||||||
job control protection mechanism.
|
|
||||||
* tests/timeout/timeout.sh: Use setsid(1) to avoid the kernel
|
|
||||||
checking the main process group when sleep(1) is reparented.
|
|
||||||
Fixes https://bugs.gnu.org/80477
|
|
||||||
---
|
|
||||||
tests/tail/overlay-headers.sh | 8 +++++++-
|
|
||||||
tests/timeout/timeout.sh | 11 ++++++++---
|
|
||||||
2 files changed, 15 insertions(+), 4 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/tests/tail/overlay-headers.sh b/tests/tail/overlay-headers.sh
|
|
||||||
index be9b6a7df..1e6da0a3f 100755
|
|
||||||
--- a/tests/tail/overlay-headers.sh
|
|
||||||
+++ b/tests/tail/overlay-headers.sh
|
|
||||||
@@ -20,6 +20,8 @@
|
|
||||||
. "${srcdir=.}/tests/init.sh"; path_prepend_ ./src
|
|
||||||
print_ver_ tail sleep
|
|
||||||
|
|
||||||
+setsid true || skip_ 'setsid required to control groups'
|
|
||||||
+
|
|
||||||
# Function to count number of lines from tail
|
|
||||||
# while ignoring transient errors due to resource limits
|
|
||||||
countlines_ ()
|
|
||||||
@@ -54,7 +56,11 @@ echo start > file2 || framework_failure_
|
|
||||||
env sleep 60 & sleep=$!
|
|
||||||
|
|
||||||
# Note don't use timeout(1) here as it currently
|
|
||||||
-# does not propagate SIGCONT
|
|
||||||
+# does not propagate SIGCONT.
|
|
||||||
+# Note use setsid here to ensure we're in a separate process group
|
|
||||||
+# as we're going to STOP this tail process, and this can trigger
|
|
||||||
+# the kernel to send SIGHUP to a group if other tests have
|
|
||||||
+# processes that are reparented. (See tests/timeout/timeout.sh).
|
|
||||||
tail $fastpoll --pid=$sleep -f file1 file2 > out & pid=$!
|
|
||||||
|
|
||||||
# Ensure tail is running
|
|
||||||
diff --git a/tests/timeout/timeout.sh b/tests/timeout/timeout.sh
|
|
||||||
index 9a395416b..fbb043312 100755
|
|
||||||
--- a/tests/timeout/timeout.sh
|
|
||||||
+++ b/tests/timeout/timeout.sh
|
|
||||||
@@ -56,9 +56,14 @@ returns_ 124 timeout --foreground -s0 -k1 .1 sleep 10 && fail=1
|
|
||||||
) || fail=1
|
|
||||||
|
|
||||||
# Don't be confused when starting off with a child (Bug#9098).
|
|
||||||
-out=$(sleep .1 & exec timeout .5 sh -c 'sleep 2; echo foo')
|
|
||||||
-status=$?
|
|
||||||
-test "$out" = "" && test $status = 124 || fail=1
|
|
||||||
+# Use setsid to avoid sleep being in the test's process group, as
|
|
||||||
+# upon reparenting it can trigger an orphaned process group SIGHUP
|
|
||||||
+# (if there were stopped processes in other tests).
|
|
||||||
+if setsid true; then
|
|
||||||
+ out=$(setsid sleep .1 & exec timeout .5 sh -c 'sleep 2; echo foo')
|
|
||||||
+ status=$?
|
|
||||||
+ test "$out" = "" && test $status = 124 || fail=1
|
|
||||||
+fi
|
|
||||||
|
|
||||||
# Verify --verbose output
|
|
||||||
cat > exp <<\EOF
|
|
||||||
--
|
|
||||||
2.53.0
|
|
||||||
`},
|
|
||||||
},
|
|
||||||
|
|
||||||
Flag: TEarly,
|
Flag: TEarly,
|
||||||
}, &MakeHelper{
|
}, &MakeHelper{
|
||||||
Configure: [][2]string{
|
Configure: [][2]string{
|
||||||
@@ -495,15 +378,13 @@ func init() {
|
|||||||
Name: "coreutils",
|
Name: "coreutils",
|
||||||
Description: "the basic file, shell and text manipulation utilities",
|
Description: "the basic file, shell and text manipulation utilities",
|
||||||
Website: "https://www.gnu.org/software/coreutils/",
|
Website: "https://www.gnu.org/software/coreutils/",
|
||||||
|
|
||||||
ID: 343,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t Toolchain) newTexinfo() (pkg.Artifact, string) {
|
func (t Toolchain) newTexinfo() (pkg.Artifact, string) {
|
||||||
const (
|
const (
|
||||||
version = "7.3"
|
version = "7.2"
|
||||||
checksum = "RRmC8Xwdof7JuZJeWGAQ_GeASIHAuJFQMbNONXBz5InooKIQGmqmWRjGNGEr5n4-"
|
checksum = "9EelM5b7QGMAY5DKrAm_El8lofBGuFWlaBPSBhh7l_VQE8054MBmC0KBvGrABqjv"
|
||||||
)
|
)
|
||||||
return t.NewPackage("texinfo", version, pkg.NewHTTPGetTar(
|
return t.NewPackage("texinfo", version, pkg.NewHTTPGetTar(
|
||||||
nil, "https://ftpmirror.gnu.org/gnu/texinfo/texinfo-"+version+".tar.gz",
|
nil, "https://ftpmirror.gnu.org/gnu/texinfo/texinfo-"+version+".tar.gz",
|
||||||
@@ -523,8 +404,6 @@ func init() {
|
|||||||
Name: "texinfo",
|
Name: "texinfo",
|
||||||
Description: "the GNU square-wheel-reinvension of man pages",
|
Description: "the GNU square-wheel-reinvension of man pages",
|
||||||
Website: "https://www.gnu.org/software/texinfo/",
|
Website: "https://www.gnu.org/software/texinfo/",
|
||||||
|
|
||||||
ID: 4958,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -548,15 +427,13 @@ func init() {
|
|||||||
Name: "gperf",
|
Name: "gperf",
|
||||||
Description: "a perfect hash function generator",
|
Description: "a perfect hash function generator",
|
||||||
Website: "https://www.gnu.org/software/gperf/",
|
Website: "https://www.gnu.org/software/gperf/",
|
||||||
|
|
||||||
ID: 1237,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t Toolchain) newGawk() (pkg.Artifact, string) {
|
func (t Toolchain) newGawk() (pkg.Artifact, string) {
|
||||||
const (
|
const (
|
||||||
version = "5.4.0"
|
version = "5.3.2"
|
||||||
checksum = "m0RkIolC-PI7EY5q8pcx5Y-0twlIW0Yp3wXXmV-QaHorSdf8BhZ7kW9F8iWomz0C"
|
checksum = "uIs0d14h_d2DgMGYwrPtegGNyt_bxzG3D6Fe-MmExx_pVoVkQaHzrtmiXVr6NHKk"
|
||||||
)
|
)
|
||||||
return t.NewPackage("gawk", version, pkg.NewHTTPGetTar(
|
return t.NewPackage("gawk", version, pkg.NewHTTPGetTar(
|
||||||
nil, "https://ftpmirror.gnu.org/gnu/gawk/gawk-"+version+".tar.gz",
|
nil, "https://ftpmirror.gnu.org/gnu/gawk/gawk-"+version+".tar.gz",
|
||||||
@@ -576,8 +453,6 @@ func init() {
|
|||||||
Name: "gawk",
|
Name: "gawk",
|
||||||
Description: "an implementation of awk with GNU extensions",
|
Description: "an implementation of awk with GNU extensions",
|
||||||
Website: "https://www.gnu.org/software/gawk/",
|
Website: "https://www.gnu.org/software/gawk/",
|
||||||
|
|
||||||
ID: 868,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -609,8 +484,6 @@ func init() {
|
|||||||
Name: "grep",
|
Name: "grep",
|
||||||
Description: "searches input for lines containing a match to a pattern",
|
Description: "searches input for lines containing a match to a pattern",
|
||||||
Website: "https://www.gnu.org/software/grep/",
|
Website: "https://www.gnu.org/software/grep/",
|
||||||
|
|
||||||
ID: 1251,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -641,8 +514,6 @@ func init() {
|
|||||||
Name: "findutils",
|
Name: "findutils",
|
||||||
Description: "the basic directory searching utilities",
|
Description: "the basic directory searching utilities",
|
||||||
Website: "https://www.gnu.org/software/findutils/",
|
Website: "https://www.gnu.org/software/findutils/",
|
||||||
|
|
||||||
ID: 812,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -671,8 +542,6 @@ func init() {
|
|||||||
Name: "bc",
|
Name: "bc",
|
||||||
Description: "an arbitrary precision numeric processing language",
|
Description: "an arbitrary precision numeric processing language",
|
||||||
Website: "https://www.gnu.org/software/bc/",
|
Website: "https://www.gnu.org/software/bc/",
|
||||||
|
|
||||||
ID: 170,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -694,8 +563,6 @@ func init() {
|
|||||||
Name: "libiconv",
|
Name: "libiconv",
|
||||||
Description: "iconv implementation independent of glibc",
|
Description: "iconv implementation independent of glibc",
|
||||||
Website: "https://www.gnu.org/software/libiconv/",
|
Website: "https://www.gnu.org/software/libiconv/",
|
||||||
|
|
||||||
ID: 10656,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -736,15 +603,13 @@ func init() {
|
|||||||
Name: "tar",
|
Name: "tar",
|
||||||
Description: "provides the ability to create tar archives",
|
Description: "provides the ability to create tar archives",
|
||||||
Website: "https://www.gnu.org/software/tar/",
|
Website: "https://www.gnu.org/software/tar/",
|
||||||
|
|
||||||
ID: 4939,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t Toolchain) newBinutils() (pkg.Artifact, string) {
|
func (t Toolchain) newBinutils() (pkg.Artifact, string) {
|
||||||
const (
|
const (
|
||||||
version = "2.46.0"
|
version = "2.45"
|
||||||
checksum = "4kK1_EXQipxSqqyvwD4LbiMLFKCUApjq6PeG4XJP4dzxYGqDeqXfh8zLuTyOuOVR"
|
checksum = "hlLtqqHDmzAT2OQVHaKEd_io2DGFvJkaeS-igBuK8bRRir7LUKGHgHYNkDVKaHTT"
|
||||||
)
|
)
|
||||||
return t.NewPackage("binutils", version, pkg.NewHTTPGetTar(
|
return t.NewPackage("binutils", version, pkg.NewHTTPGetTar(
|
||||||
nil, "https://ftpmirror.gnu.org/gnu/binutils/binutils-"+version+".tar.bz2",
|
nil, "https://ftpmirror.gnu.org/gnu/binutils/binutils-"+version+".tar.bz2",
|
||||||
@@ -761,8 +626,6 @@ func init() {
|
|||||||
Name: "binutils",
|
Name: "binutils",
|
||||||
Description: "a collection of binary tools",
|
Description: "a collection of binary tools",
|
||||||
Website: "https://www.gnu.org/software/binutils/",
|
Website: "https://www.gnu.org/software/binutils/",
|
||||||
|
|
||||||
ID: 7981,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -787,8 +650,6 @@ func init() {
|
|||||||
Name: "gmp",
|
Name: "gmp",
|
||||||
Description: "a free library for arbitrary precision arithmetic",
|
Description: "a free library for arbitrary precision arithmetic",
|
||||||
Website: "https://gmplib.org/",
|
Website: "https://gmplib.org/",
|
||||||
|
|
||||||
ID: 1186,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -813,8 +674,6 @@ func init() {
|
|||||||
Name: "mpfr",
|
Name: "mpfr",
|
||||||
Description: "a C library for multiple-precision floating-point computations",
|
Description: "a C library for multiple-precision floating-point computations",
|
||||||
Website: "https://www.mpfr.org/",
|
Website: "https://www.mpfr.org/",
|
||||||
|
|
||||||
ID: 2019,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -840,8 +699,6 @@ func init() {
|
|||||||
Name: "mpc",
|
Name: "mpc",
|
||||||
Description: "a C library for the arithmetic of complex numbers",
|
Description: "a C library for the arithmetic of complex numbers",
|
||||||
Website: "https://www.multiprecision.org/",
|
Website: "https://www.multiprecision.org/",
|
||||||
|
|
||||||
ID: 1667,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1054,7 +911,5 @@ func init() {
|
|||||||
Name: "gcc",
|
Name: "gcc",
|
||||||
Description: "The GNU Compiler Collection",
|
Description: "The GNU Compiler Collection",
|
||||||
Website: "https://www.gnu.org/software/gcc/",
|
Website: "https://www.gnu.org/software/gcc/",
|
||||||
|
|
||||||
ID: 6502,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -154,8 +154,8 @@ rm \
|
|||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
version = "1.26.1"
|
version = "1.26.0"
|
||||||
checksum = "DdC5Ea-aCYPUHNObQh_09uWU0vn4e-8Ben850Vq-5OoamDRrXhuYI4YQ_BOFgaT0"
|
checksum = "uHLcrgBc0NMcyTMDLRNAZIcOx0RyQlyekSl9xbWSwj3esEFWJysYLfLa3S8p39Nh"
|
||||||
)
|
)
|
||||||
return t.newGo(
|
return t.newGo(
|
||||||
version,
|
version,
|
||||||
@@ -177,7 +177,5 @@ func init() {
|
|||||||
Name: "go",
|
Name: "go",
|
||||||
Description: "the Go programming language toolchain",
|
Description: "the Go programming language toolchain",
|
||||||
Website: "https://go.dev/",
|
Website: "https://go.dev/",
|
||||||
|
|
||||||
ID: 1227,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,8 +9,8 @@ import (
|
|||||||
|
|
||||||
func (t Toolchain) newGLib() (pkg.Artifact, string) {
|
func (t Toolchain) newGLib() (pkg.Artifact, string) {
|
||||||
const (
|
const (
|
||||||
version = "2.87.3"
|
version = "2.86.4"
|
||||||
checksum = "iKSLpzZZVfmAZZmqfO1y6uHdlIks4hzPWrqeUCp4ZeQjrPFA3aAa4OmrBYMNS-Si"
|
checksum = "AfTjBrrxtXXPL6dFa1LfTe40PyPSth62CoIkM5m_VJTUngGLOFHw6I4XE7RGQE8G"
|
||||||
)
|
)
|
||||||
return t.NewPackage("glib", version, pkg.NewHTTPGet(
|
return t.NewPackage("glib", version, pkg.NewHTTPGet(
|
||||||
nil, "https://download.gnome.org/sources/glib/"+
|
nil, "https://download.gnome.org/sources/glib/"+
|
||||||
@@ -40,7 +40,7 @@ func (t Toolchain) newGLib() (pkg.Artifact, string) {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
XZ,
|
XZ,
|
||||||
PythonPackaging,
|
Packaging,
|
||||||
Bash,
|
Bash,
|
||||||
|
|
||||||
PCRE2,
|
PCRE2,
|
||||||
@@ -54,8 +54,6 @@ func init() {
|
|||||||
|
|
||||||
Name: "glib",
|
Name: "glib",
|
||||||
Description: "the GNU library of miscellaneous stuff",
|
Description: "the GNU library of miscellaneous stuff",
|
||||||
Website: "https://developer.gnome.org/glib/",
|
Website: "https://gitlab.gnome.org/GNOME/glib/",
|
||||||
|
|
||||||
ID: 10024,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -90,8 +90,6 @@ mkdir -p /work/system/bin/
|
|||||||
Name: "hakurei",
|
Name: "hakurei",
|
||||||
Description: "low-level userspace tooling for Rosa OS",
|
Description: "low-level userspace tooling for Rosa OS",
|
||||||
Website: "https://hakurei.app/",
|
Website: "https://hakurei.app/",
|
||||||
|
|
||||||
ID: 388834,
|
|
||||||
}
|
}
|
||||||
artifactsM[HakureiDist] = Metadata{
|
artifactsM[HakureiDist] = Metadata{
|
||||||
f: func(t Toolchain) (pkg.Artifact, string) {
|
f: func(t Toolchain) (pkg.Artifact, string) {
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -1,16 +1,16 @@
|
|||||||
#
|
#
|
||||||
# Automatically generated file; DO NOT EDIT.
|
# Automatically generated file; DO NOT EDIT.
|
||||||
# Linux/x86 6.12.76 Kernel Configuration
|
# Linux/x86 6.12.73 Kernel Configuration
|
||||||
#
|
#
|
||||||
CONFIG_CC_VERSION_TEXT="clang version 22.1.0"
|
CONFIG_CC_VERSION_TEXT="clang version 21.1.8"
|
||||||
CONFIG_GCC_VERSION=0
|
CONFIG_GCC_VERSION=0
|
||||||
CONFIG_CC_IS_CLANG=y
|
CONFIG_CC_IS_CLANG=y
|
||||||
CONFIG_CLANG_VERSION=220100
|
CONFIG_CLANG_VERSION=210108
|
||||||
CONFIG_AS_IS_LLVM=y
|
CONFIG_AS_IS_LLVM=y
|
||||||
CONFIG_AS_VERSION=220100
|
CONFIG_AS_VERSION=210108
|
||||||
CONFIG_LD_VERSION=0
|
CONFIG_LD_VERSION=0
|
||||||
CONFIG_LD_IS_LLD=y
|
CONFIG_LD_IS_LLD=y
|
||||||
CONFIG_LLD_VERSION=220100
|
CONFIG_LLD_VERSION=210108
|
||||||
CONFIG_RUSTC_VERSION=0
|
CONFIG_RUSTC_VERSION=0
|
||||||
CONFIG_RUSTC_LLVM_VERSION=0
|
CONFIG_RUSTC_LLVM_VERSION=0
|
||||||
CONFIG_CC_HAS_ASM_GOTO_OUTPUT=y
|
CONFIG_CC_HAS_ASM_GOTO_OUTPUT=y
|
||||||
@@ -12308,6 +12308,7 @@ CONFIG_LOCK_DEBUGGING_SUPPORT=y
|
|||||||
# CONFIG_NMI_CHECK_CPU is not set
|
# CONFIG_NMI_CHECK_CPU is not set
|
||||||
# CONFIG_DEBUG_IRQFLAGS is not set
|
# CONFIG_DEBUG_IRQFLAGS is not set
|
||||||
CONFIG_STACKTRACE=y
|
CONFIG_STACKTRACE=y
|
||||||
|
# CONFIG_WARN_ALL_UNSEEDED_RANDOM is not set
|
||||||
# CONFIG_DEBUG_KOBJECT is not set
|
# CONFIG_DEBUG_KOBJECT is not set
|
||||||
|
|
||||||
#
|
#
|
||||||
@@ -12344,7 +12345,7 @@ CONFIG_HAVE_RETHOOK=y
|
|||||||
CONFIG_RETHOOK=y
|
CONFIG_RETHOOK=y
|
||||||
CONFIG_HAVE_FUNCTION_TRACER=y
|
CONFIG_HAVE_FUNCTION_TRACER=y
|
||||||
CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y
|
CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y
|
||||||
CONFIG_HAVE_FUNCTION_GRAPH_FREGS=y
|
CONFIG_HAVE_FUNCTION_GRAPH_RETVAL=y
|
||||||
CONFIG_HAVE_DYNAMIC_FTRACE=y
|
CONFIG_HAVE_DYNAMIC_FTRACE=y
|
||||||
CONFIG_HAVE_DYNAMIC_FTRACE_WITH_REGS=y
|
CONFIG_HAVE_DYNAMIC_FTRACE_WITH_REGS=y
|
||||||
CONFIG_HAVE_DYNAMIC_FTRACE_WITH_DIRECT_CALLS=y
|
CONFIG_HAVE_DYNAMIC_FTRACE_WITH_DIRECT_CALLS=y
|
||||||
|
|||||||
@@ -37,7 +37,5 @@ func init() {
|
|||||||
Name: "kmod",
|
Name: "kmod",
|
||||||
Description: "a set of tools to handle common tasks with Linux kernel modules",
|
Description: "a set of tools to handle common tasks with Linux kernel modules",
|
||||||
Website: "https://git.kernel.org/pub/scm/utils/kernel/kmod/kmod.git",
|
Website: "https://git.kernel.org/pub/scm/utils/kernel/kmod/kmod.git",
|
||||||
|
|
||||||
ID: 1517,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -48,7 +48,5 @@ func init() {
|
|||||||
Name: "libcap",
|
Name: "libcap",
|
||||||
Description: "a library for getting and setting POSIX.1e draft 15 capabilities",
|
Description: "a library for getting and setting POSIX.1e draft 15 capabilities",
|
||||||
Website: "https://sites.google.com/site/fullycapable/",
|
Website: "https://sites.google.com/site/fullycapable/",
|
||||||
|
|
||||||
ID: 1569,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,8 +8,8 @@ import (
|
|||||||
|
|
||||||
func (t Toolchain) newLibexpat() (pkg.Artifact, string) {
|
func (t Toolchain) newLibexpat() (pkg.Artifact, string) {
|
||||||
const (
|
const (
|
||||||
version = "2.7.4"
|
version = "2.7.3"
|
||||||
checksum = "W6NI2FESBjrTqRPcvs15fK5c3nwF6f9RT8U-XHKQKblXVzJB3nt_ez5B5jO0ZVDG"
|
checksum = "GmkoD23nRi9cMT0cgG1XRMrZWD82UcOMzkkvP1gkwSFWCBgeSXMuoLpa8-v8kxW-"
|
||||||
)
|
)
|
||||||
return t.NewPackage("libexpat", version, pkg.NewHTTPGetTar(
|
return t.NewPackage("libexpat", version, pkg.NewHTTPGetTar(
|
||||||
nil, "https://github.com/libexpat/libexpat/releases/download/"+
|
nil, "https://github.com/libexpat/libexpat/releases/download/"+
|
||||||
@@ -28,7 +28,5 @@ func init() {
|
|||||||
Name: "libexpat",
|
Name: "libexpat",
|
||||||
Description: "a stream-oriented XML parser library",
|
Description: "a stream-oriented XML parser library",
|
||||||
Website: "https://libexpat.github.io/",
|
Website: "https://libexpat.github.io/",
|
||||||
|
|
||||||
ID: 770,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,8 +4,8 @@ import "hakurei.app/internal/pkg"
|
|||||||
|
|
||||||
func (t Toolchain) newLibffi() (pkg.Artifact, string) {
|
func (t Toolchain) newLibffi() (pkg.Artifact, string) {
|
||||||
const (
|
const (
|
||||||
version = "3.5.2"
|
version = "3.4.5"
|
||||||
checksum = "2_Q-ZNBBbVhltfL5zEr0wljxPegUimTK4VeMSiwJEGksls3n4gj3lV0Ly3vviSFH"
|
checksum = "apIJzypF4rDudeRoI_n3K7N-zCeBLTbQlHRn9NSAZqdLAWA80mR0gXPTpHsL7oMl"
|
||||||
)
|
)
|
||||||
return t.NewPackage("libffi", version, pkg.NewHTTPGetTar(
|
return t.NewPackage("libffi", version, pkg.NewHTTPGetTar(
|
||||||
nil, "https://github.com/libffi/libffi/releases/download/"+
|
nil, "https://github.com/libffi/libffi/releases/download/"+
|
||||||
@@ -23,7 +23,5 @@ func init() {
|
|||||||
Name: "libffi",
|
Name: "libffi",
|
||||||
Description: "a portable, high level programming interface to various calling conventions",
|
Description: "a portable, high level programming interface to various calling conventions",
|
||||||
Website: "https://sourceware.org/libffi/",
|
Website: "https://sourceware.org/libffi/",
|
||||||
|
|
||||||
ID: 1611,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -30,7 +30,5 @@ func init() {
|
|||||||
Name: "libgd",
|
Name: "libgd",
|
||||||
Description: "an open source code library for the dynamic creation of images",
|
Description: "an open source code library for the dynamic creation of images",
|
||||||
Website: "https://libgd.github.io/",
|
Website: "https://libgd.github.io/",
|
||||||
|
|
||||||
ID: 880,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -30,7 +30,5 @@ func init() {
|
|||||||
Name: "libpsl",
|
Name: "libpsl",
|
||||||
Description: "provides functions to work with the Mozilla Public Suffix List",
|
Description: "provides functions to work with the Mozilla Public Suffix List",
|
||||||
Website: "https://rockdaboot.github.io/libpsl/",
|
Website: "https://rockdaboot.github.io/libpsl/",
|
||||||
|
|
||||||
ID: 7305,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -31,7 +31,5 @@ func init() {
|
|||||||
Name: "libseccomp",
|
Name: "libseccomp",
|
||||||
Description: "an interface to the Linux Kernel's syscall filtering mechanism",
|
Description: "an interface to the Linux Kernel's syscall filtering mechanism",
|
||||||
Website: "https://github.com/seccomp/libseccomp/",
|
Website: "https://github.com/seccomp/libseccomp/",
|
||||||
|
|
||||||
ID: 13823,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -34,7 +34,5 @@ func init() {
|
|||||||
Name: "libucontext",
|
Name: "libucontext",
|
||||||
Description: "ucontext implementation featuring glibc-compatible ABI",
|
Description: "ucontext implementation featuring glibc-compatible ABI",
|
||||||
Website: "https://github.com/kaniini/libucontext/",
|
Website: "https://github.com/kaniini/libucontext/",
|
||||||
|
|
||||||
ID: 17085,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,8 +8,8 @@ import (
|
|||||||
|
|
||||||
func (t Toolchain) newLibxml2() (pkg.Artifact, string) {
|
func (t Toolchain) newLibxml2() (pkg.Artifact, string) {
|
||||||
const (
|
const (
|
||||||
version = "2.15.2"
|
version = "2.15.1"
|
||||||
checksum = "xba8VCofMsbWmQypA2__M9_RXNq9HDEuccjib6-tOni6OPngplRoAsYdY3NdYf8o"
|
checksum = "pYzAR3cNrEHezhEMirgiq7jbboLzwMj5GD7SQp0jhSIMdgoU4G9oU9Gxun3zzUIU"
|
||||||
)
|
)
|
||||||
return t.NewPackage("libxml2", version, pkg.NewHTTPGet(
|
return t.NewPackage("libxml2", version, pkg.NewHTTPGet(
|
||||||
nil, "https://download.gnome.org/sources/libxml2/"+
|
nil, "https://download.gnome.org/sources/libxml2/"+
|
||||||
@@ -30,7 +30,5 @@ func init() {
|
|||||||
Name: "libxml2",
|
Name: "libxml2",
|
||||||
Description: "an XML toolkit implemented in C",
|
Description: "an XML toolkit implemented in C",
|
||||||
Website: "https://gitlab.gnome.org/GNOME/libxml2/",
|
Website: "https://gitlab.gnome.org/GNOME/libxml2/",
|
||||||
|
|
||||||
ID: 1783,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -36,7 +36,5 @@ func init() {
|
|||||||
Name: "libxslt",
|
Name: "libxslt",
|
||||||
Description: "an XSLT processor based on libxml2",
|
Description: "an XSLT processor based on libxml2",
|
||||||
Website: "https://gitlab.gnome.org/GNOME/libxslt/",
|
Website: "https://gitlab.gnome.org/GNOME/libxslt/",
|
||||||
|
|
||||||
ID: 13301,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -73,15 +73,12 @@ func llvmFlagName(flag int) string {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const (
|
|
||||||
llvmVersionMajor = "22"
|
|
||||||
llvmVersion = llvmVersionMajor + ".1.0"
|
|
||||||
)
|
|
||||||
|
|
||||||
// newLLVMVariant returns a [pkg.Artifact] containing a LLVM variant.
|
// newLLVMVariant returns a [pkg.Artifact] containing a LLVM variant.
|
||||||
func (t Toolchain) newLLVMVariant(variant string, attr *llvmAttr) pkg.Artifact {
|
func (t Toolchain) newLLVMVariant(variant string, attr *llvmAttr) pkg.Artifact {
|
||||||
const checksum = "-_Tu5Lt8xkWoxm2VDVV7crh0WqZQbbblN3fYamMdPTDSy_54FAkD2ii7afSymPVV"
|
const (
|
||||||
|
version = "21.1.8"
|
||||||
|
checksum = "8SUpqDkcgwOPsqHVtmf9kXfFeVmjVxl4LMn-qSE1AI_Xoeju-9HaoPNGtidyxyka"
|
||||||
|
)
|
||||||
if attr == nil {
|
if attr == nil {
|
||||||
panic("LLVM attr must be non-nil")
|
panic("LLVM attr must be non-nil")
|
||||||
}
|
}
|
||||||
@@ -164,9 +161,9 @@ ln -s ld.lld /work/system/bin/ld
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
return t.NewPackage("llvm", llvmVersion, pkg.NewHTTPGetTar(
|
return t.NewPackage("llvm", version, pkg.NewHTTPGetTar(
|
||||||
nil, "https://github.com/llvm/llvm-project/archive/refs/tags/"+
|
nil, "https://github.com/llvm/llvm-project/archive/refs/tags/"+
|
||||||
"llvmorg-"+llvmVersion+".tar.gz",
|
"llvmorg-"+version+".tar.gz",
|
||||||
mustDecode(checksum),
|
mustDecode(checksum),
|
||||||
pkg.TarGzip,
|
pkg.TarGzip,
|
||||||
), &PackageAttr{
|
), &PackageAttr{
|
||||||
@@ -248,10 +245,10 @@ func (t Toolchain) newLLVM() (musl, compilerRT, runtimes, clang pkg.Artifact) {
|
|||||||
muslHeaders,
|
muslHeaders,
|
||||||
},
|
},
|
||||||
script: `
|
script: `
|
||||||
mkdir -p "/work/system/lib/clang/` + llvmVersionMajor + `/lib/"
|
mkdir -p "/work/system/lib/clang/21/lib/"
|
||||||
ln -s \
|
ln -s \
|
||||||
"../../../${ROSA_TRIPLE}" \
|
"../../../${ROSA_TRIPLE}" \
|
||||||
"/work/system/lib/clang/` + llvmVersionMajor + `/lib/"
|
"/work/system/lib/clang/21/lib/"
|
||||||
|
|
||||||
ln -s \
|
ln -s \
|
||||||
"clang_rt.crtbegin-` + linuxArch() + `.o" \
|
"clang_rt.crtbegin-` + linuxArch() + `.o" \
|
||||||
@@ -264,7 +261,7 @@ ln -s \
|
|||||||
|
|
||||||
musl, _ = t.newMusl(false, stage0ExclConcat(t, []string{
|
musl, _ = t.newMusl(false, stage0ExclConcat(t, []string{
|
||||||
"CC=clang",
|
"CC=clang",
|
||||||
"LIBCC=/system/lib/clang/" + llvmVersionMajor + "/lib/" +
|
"LIBCC=/system/lib/clang/21/lib/" +
|
||||||
triplet() + "/libclang_rt.builtins.a",
|
triplet() + "/libclang_rt.builtins.a",
|
||||||
"AR=ar",
|
"AR=ar",
|
||||||
"RANLIB=ranlib",
|
"RANLIB=ranlib",
|
||||||
@@ -317,10 +314,10 @@ ninja check-all
|
|||||||
|
|
||||||
patches: [][2]string{
|
patches: [][2]string{
|
||||||
{"add-rosa-vendor", `diff --git a/llvm/include/llvm/TargetParser/Triple.h b/llvm/include/llvm/TargetParser/Triple.h
|
{"add-rosa-vendor", `diff --git a/llvm/include/llvm/TargetParser/Triple.h b/llvm/include/llvm/TargetParser/Triple.h
|
||||||
index 9c83abeeb3b1..5acfe5836a23 100644
|
index 657f4230379e..12c305756184 100644
|
||||||
--- a/llvm/include/llvm/TargetParser/Triple.h
|
--- a/llvm/include/llvm/TargetParser/Triple.h
|
||||||
+++ b/llvm/include/llvm/TargetParser/Triple.h
|
+++ b/llvm/include/llvm/TargetParser/Triple.h
|
||||||
@@ -190,6 +190,7 @@ public:
|
@@ -185,6 +185,7 @@ public:
|
||||||
|
|
||||||
Apple,
|
Apple,
|
||||||
PC,
|
PC,
|
||||||
@@ -329,25 +326,25 @@ index 9c83abeeb3b1..5acfe5836a23 100644
|
|||||||
Freescale,
|
Freescale,
|
||||||
IBM,
|
IBM,
|
||||||
diff --git a/llvm/lib/TargetParser/Triple.cpp b/llvm/lib/TargetParser/Triple.cpp
|
diff --git a/llvm/lib/TargetParser/Triple.cpp b/llvm/lib/TargetParser/Triple.cpp
|
||||||
index a4f9dd42c0fe..cb5a12387034 100644
|
index 0584c941d2e6..e4d6ef963cc7 100644
|
||||||
--- a/llvm/lib/TargetParser/Triple.cpp
|
--- a/llvm/lib/TargetParser/Triple.cpp
|
||||||
+++ b/llvm/lib/TargetParser/Triple.cpp
|
+++ b/llvm/lib/TargetParser/Triple.cpp
|
||||||
@@ -279,6 +279,7 @@ StringRef Triple::getVendorTypeName(VendorType Kind) {
|
@@ -269,6 +269,7 @@ StringRef Triple::getVendorTypeName(VendorType Kind) {
|
||||||
case NVIDIA: return "nvidia";
|
case NVIDIA: return "nvidia";
|
||||||
case OpenEmbedded: return "oe";
|
case OpenEmbedded: return "oe";
|
||||||
case PC: return "pc";
|
case PC: return "pc";
|
||||||
+ case Rosa: return "rosa";
|
+ case Rosa: return "rosa";
|
||||||
case SCEI: return "scei";
|
case SCEI: return "scei";
|
||||||
case SUSE: return "suse";
|
case SUSE: return "suse";
|
||||||
case Meta:
|
}
|
||||||
@@ -689,6 +690,7 @@ static Triple::VendorType parseVendor(StringRef VendorName) {
|
@@ -669,6 +670,7 @@ static Triple::VendorType parseVendor(StringRef VendorName) {
|
||||||
return StringSwitch<Triple::VendorType>(VendorName)
|
.Case("suse", Triple::SUSE)
|
||||||
.Case("apple", Triple::Apple)
|
.Case("oe", Triple::OpenEmbedded)
|
||||||
.Case("pc", Triple::PC)
|
.Case("intel", Triple::Intel)
|
||||||
+ .Case("rosa", Triple::Rosa)
|
+ .Case("rosa", Triple::Rosa)
|
||||||
.Case("scei", Triple::SCEI)
|
.Default(Triple::UnknownVendor);
|
||||||
.Case("sie", Triple::SCEI)
|
}
|
||||||
.Case("fsl", Triple::Freescale)
|
|
||||||
`},
|
`},
|
||||||
|
|
||||||
{"xfail-broken-tests", `diff --git a/clang/test/Modules/timestamps.c b/clang/test/Modules/timestamps.c
|
{"xfail-broken-tests", `diff --git a/clang/test/Modules/timestamps.c b/clang/test/Modules/timestamps.c
|
||||||
@@ -492,42 +489,6 @@ index 64324a3f8b01..15ce70b68217 100644
|
|||||||
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
func init() {
|
|
||||||
artifactsM[LLVMCompilerRT] = Metadata{
|
|
||||||
f: func(t Toolchain) (pkg.Artifact, string) {
|
|
||||||
_, compilerRT, _, _ := t.newLLVM()
|
|
||||||
return compilerRT, llvmVersion
|
|
||||||
},
|
|
||||||
|
|
||||||
Name: "llvm-compiler-rt",
|
|
||||||
Description: "LLVM runtime: compiler-rt",
|
|
||||||
Website: "https://llvm.org/",
|
|
||||||
}
|
|
||||||
|
|
||||||
artifactsM[LLVMRuntimes] = Metadata{
|
|
||||||
f: func(t Toolchain) (pkg.Artifact, string) {
|
|
||||||
_, _, runtimes, _ := t.newLLVM()
|
|
||||||
return runtimes, llvmVersion
|
|
||||||
},
|
|
||||||
|
|
||||||
Name: "llvm-runtimes",
|
|
||||||
Description: "LLVM runtimes: libunwind, libcxx, libcxxabi",
|
|
||||||
Website: "https://llvm.org/",
|
|
||||||
}
|
|
||||||
|
|
||||||
artifactsM[LLVMClang] = Metadata{
|
|
||||||
f: func(t Toolchain) (pkg.Artifact, string) {
|
|
||||||
_, _, _, clang := t.newLLVM()
|
|
||||||
return clang, llvmVersion
|
|
||||||
},
|
|
||||||
|
|
||||||
Name: "clang",
|
|
||||||
Description: `an "LLVM native" C/C++/Objective-C compiler`,
|
|
||||||
Website: "https://llvm.org/",
|
|
||||||
|
|
||||||
ID: 1830,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
var (
|
var (
|
||||||
// llvm stores the result of Toolchain.newLLVM.
|
// llvm stores the result of Toolchain.newLLVM.
|
||||||
|
|||||||
@@ -33,8 +33,6 @@ func init() {
|
|||||||
Name: "make",
|
Name: "make",
|
||||||
Description: "a tool which controls the generation of executables and other non-source files",
|
Description: "a tool which controls the generation of executables and other non-source files",
|
||||||
Website: "https://www.gnu.org/software/make/",
|
Website: "https://www.gnu.org/software/make/",
|
||||||
|
|
||||||
ID: 1877,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -36,8 +36,6 @@ func init() {
|
|||||||
Name: "meson",
|
Name: "meson",
|
||||||
Description: "an open source build system",
|
Description: "an open source build system",
|
||||||
Website: "https://mesonbuild.com/",
|
Website: "https://mesonbuild.com/",
|
||||||
|
|
||||||
ID: 6472,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -40,7 +40,5 @@ func init() {
|
|||||||
Name: "mksh",
|
Name: "mksh",
|
||||||
Description: "MirBSD Korn Shell",
|
Description: "MirBSD Korn Shell",
|
||||||
Website: "https://www.mirbsd.org/mksh",
|
Website: "https://www.mirbsd.org/mksh",
|
||||||
|
|
||||||
ID: 5590,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -34,7 +34,5 @@ func init() {
|
|||||||
Name: "musl-fts",
|
Name: "musl-fts",
|
||||||
Description: "implementation of fts(3) functions which are missing in musl libc",
|
Description: "implementation of fts(3) functions which are missing in musl libc",
|
||||||
Website: "https://github.com/void-linux/musl-fts",
|
Website: "https://github.com/void-linux/musl-fts",
|
||||||
|
|
||||||
ID: 26980,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -34,7 +34,5 @@ func init() {
|
|||||||
Name: "musl-obstack",
|
Name: "musl-obstack",
|
||||||
Description: "obstack functions and macros separated from glibc",
|
Description: "obstack functions and macros separated from glibc",
|
||||||
Website: "https://github.com/void-linux/musl-obstack",
|
Website: "https://github.com/void-linux/musl-obstack",
|
||||||
|
|
||||||
ID: 146206,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -61,7 +61,5 @@ func init() {
|
|||||||
Name: "musl",
|
Name: "musl",
|
||||||
Description: "an implementation of the C standard library",
|
Description: "an implementation of the C standard library",
|
||||||
Website: "https://musl.libc.org/",
|
Website: "https://musl.libc.org/",
|
||||||
|
|
||||||
ID: 11688,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -30,7 +30,5 @@ func init() {
|
|||||||
Name: "ncurses",
|
Name: "ncurses",
|
||||||
Description: "a free software emulation of curses in System V Release 4.0 (SVr4)",
|
Description: "a free software emulation of curses in System V Release 4.0 (SVr4)",
|
||||||
Website: "https://invisible-island.net/ncurses/",
|
Website: "https://invisible-island.net/ncurses/",
|
||||||
|
|
||||||
ID: 373226,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -42,7 +42,5 @@ func init() {
|
|||||||
Name: "ninja",
|
Name: "ninja",
|
||||||
Description: "a small build system with a focus on speed",
|
Description: "a small build system with a focus on speed",
|
||||||
Website: "https://ninja-build.org/",
|
Website: "https://ninja-build.org/",
|
||||||
|
|
||||||
ID: 2089,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,8 +4,8 @@ import "hakurei.app/internal/pkg"
|
|||||||
|
|
||||||
func (t Toolchain) newOpenSSL() (pkg.Artifact, string) {
|
func (t Toolchain) newOpenSSL() (pkg.Artifact, string) {
|
||||||
const (
|
const (
|
||||||
version = "3.6.1"
|
version = "3.5.5"
|
||||||
checksum = "boMAj2SIVIFXHswZva3qHJuFEpc32rxCCu07wjMPsVe9nn_976BGMmW_5P1zthgg"
|
checksum = "I2Hp1LxcTR8j4G6LFEQMVy6EJH-Na1byI9Ti-ThBot6EMLNRnjGXGq-WXrim3Fkz"
|
||||||
)
|
)
|
||||||
return t.NewPackage("openssl", version, pkg.NewHTTPGetTar(
|
return t.NewPackage("openssl", version, pkg.NewHTTPGetTar(
|
||||||
nil, "https://github.com/openssl/openssl/releases/download/"+
|
nil, "https://github.com/openssl/openssl/releases/download/"+
|
||||||
@@ -44,10 +44,5 @@ func init() {
|
|||||||
Name: "openssl",
|
Name: "openssl",
|
||||||
Description: "TLS/SSL and crypto library",
|
Description: "TLS/SSL and crypto library",
|
||||||
Website: "https://www.openssl.org/",
|
Website: "https://www.openssl.org/",
|
||||||
|
|
||||||
ID: 2566,
|
|
||||||
|
|
||||||
// strange malformed tags treated as pre-releases in Anitya
|
|
||||||
latest: (*Versions).getStable,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,8 +6,8 @@ import (
|
|||||||
|
|
||||||
func (t Toolchain) newPCRE2() (pkg.Artifact, string) {
|
func (t Toolchain) newPCRE2() (pkg.Artifact, string) {
|
||||||
const (
|
const (
|
||||||
version = "10.47"
|
version = "10.43"
|
||||||
checksum = "IbC24vVayju6nB9EhrBPSDexk22wDecdpyrjgC3nCZXkwTnUjq4CD2q5sopqu6CW"
|
checksum = "iyNw-POPSJwiZVJfUK5qACA6q2uMzP-84WieimN_CskaEkuw5fRnRTZhEv6ry2Yo"
|
||||||
)
|
)
|
||||||
return t.NewPackage("pcre2", version, pkg.NewHTTPGetTar(
|
return t.NewPackage("pcre2", version, pkg.NewHTTPGetTar(
|
||||||
nil, "https://github.com/PCRE2Project/pcre2/releases/download/"+
|
nil, "https://github.com/PCRE2Project/pcre2/releases/download/"+
|
||||||
@@ -37,7 +37,5 @@ func init() {
|
|||||||
Name: "pcre2",
|
Name: "pcre2",
|
||||||
Description: "a set of C functions that implement regular expression pattern matching",
|
Description: "a set of C functions that implement regular expression pattern matching",
|
||||||
Website: "https://pcre2project.github.io/pcre2/",
|
Website: "https://pcre2project.github.io/pcre2/",
|
||||||
|
|
||||||
ID: 5832,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -39,13 +39,12 @@ rm -f /system/bin/ps # perl does not like toybox ps
|
|||||||
{"Dldflags", `"${LDFLAGS:-''}"`},
|
{"Dldflags", `"${LDFLAGS:-''}"`},
|
||||||
{"Doptimize", "'-O2 -fno-strict-aliasing'"},
|
{"Doptimize", "'-O2 -fno-strict-aliasing'"},
|
||||||
{"Duseithreads"},
|
{"Duseithreads"},
|
||||||
{"Duseshrplib"},
|
|
||||||
},
|
},
|
||||||
Check: []string{
|
Check: []string{
|
||||||
"TEST_JOBS=256",
|
"TEST_JOBS=256",
|
||||||
"test_harness",
|
"test_harness",
|
||||||
},
|
},
|
||||||
Install: `LD_LIBRARY_PATH="$PWD" ./perl -Ilib -I. installperl --destdir=/work`,
|
Install: "./perl -Ilib -I. installperl --destdir=/work",
|
||||||
}), version
|
}), version
|
||||||
}
|
}
|
||||||
func init() {
|
func init() {
|
||||||
@@ -55,11 +54,6 @@ func init() {
|
|||||||
Name: "perl",
|
Name: "perl",
|
||||||
Description: "The Perl Programming language",
|
Description: "The Perl Programming language",
|
||||||
Website: "https://www.perl.org/",
|
Website: "https://www.perl.org/",
|
||||||
|
|
||||||
ID: 13599,
|
|
||||||
|
|
||||||
// odd-even versioning
|
|
||||||
latest: (*Versions).getStable,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -26,7 +26,5 @@ func init() {
|
|||||||
Name: "pkg-config",
|
Name: "pkg-config",
|
||||||
Description: "a helper tool used when compiling applications and libraries",
|
Description: "a helper tool used when compiling applications and libraries",
|
||||||
Website: "https://pkgconfig.freedesktop.org/",
|
Website: "https://pkgconfig.freedesktop.org/",
|
||||||
|
|
||||||
ID: 3649,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -36,7 +36,5 @@ func init() {
|
|||||||
Name: "procps",
|
Name: "procps",
|
||||||
Description: "command line and full screen utilities for browsing procfs",
|
Description: "command line and full screen utilities for browsing procfs",
|
||||||
Website: "https://gitlab.com/procps-ng/procps",
|
Website: "https://gitlab.com/procps-ng/procps",
|
||||||
|
|
||||||
ID: 3708,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,8 +9,8 @@ import (
|
|||||||
|
|
||||||
func (t Toolchain) newPython() (pkg.Artifact, string) {
|
func (t Toolchain) newPython() (pkg.Artifact, string) {
|
||||||
const (
|
const (
|
||||||
version = "3.14.3"
|
version = "3.14.2"
|
||||||
checksum = "ajEC32WPmn9Jvll0n4gGvlTvhMPUHb2H_j5_h9jf_esHmkZBRfAumDcKY7nTTsCH"
|
checksum = "7nZunVMGj0viB-CnxpcRego2C90X5wFsMTgsoewd5z-KSZY2zLuqaBwG-14zmKys"
|
||||||
)
|
)
|
||||||
return t.NewPackage("python", version, pkg.NewHTTPGetTar(
|
return t.NewPackage("python", version, pkg.NewHTTPGetTar(
|
||||||
nil, "https://www.python.org/ftp/python/"+version+
|
nil, "https://www.python.org/ftp/python/"+version+
|
||||||
@@ -68,8 +68,6 @@ func init() {
|
|||||||
Name: "python",
|
Name: "python",
|
||||||
Description: "the Python programming language interpreter",
|
Description: "the Python programming language interpreter",
|
||||||
Website: "https://www.python.org/",
|
Website: "https://www.python.org/",
|
||||||
|
|
||||||
ID: 13254,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -108,8 +106,8 @@ pip3 install \
|
|||||||
|
|
||||||
func (t Toolchain) newSetuptools() (pkg.Artifact, string) {
|
func (t Toolchain) newSetuptools() (pkg.Artifact, string) {
|
||||||
const (
|
const (
|
||||||
version = "82.0.0"
|
version = "80.10.1"
|
||||||
checksum = "K9f8Yi7Gg95zjmQsE1LLw9UBb8NglI6EY6pQpdD6DM0Pmc_Td5w2qs1SMngTI6Jp"
|
checksum = "p3rlwEmy1krcUH1KabprQz1TCYjJ8ZUjOQknQsWh3q-XEqLGEd3P4VrCc7ouHGXU"
|
||||||
)
|
)
|
||||||
return t.New("setuptools-"+version, 0, []pkg.Artifact{
|
return t.New("setuptools-"+version, 0, []pkg.Artifact{
|
||||||
t.Load(Python),
|
t.Load(Python),
|
||||||
@@ -133,13 +131,11 @@ func init() {
|
|||||||
Name: "setuptools",
|
Name: "setuptools",
|
||||||
Description: "the autotools of the Python ecosystem",
|
Description: "the autotools of the Python ecosystem",
|
||||||
Website: "https://pypi.org/project/setuptools/",
|
Website: "https://pypi.org/project/setuptools/",
|
||||||
|
|
||||||
ID: 4021,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
artifactsM[PythonPygments] = newViaPip(
|
artifactsM[Pygments] = newViaPip(
|
||||||
"pygments",
|
"pygments",
|
||||||
" a syntax highlighting package written in Python",
|
" a syntax highlighting package written in Python",
|
||||||
"2.19.2", "none", "any",
|
"2.19.2", "none", "any",
|
||||||
@@ -148,7 +144,7 @@ func init() {
|
|||||||
"c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/",
|
"c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/",
|
||||||
)
|
)
|
||||||
|
|
||||||
artifactsM[PythonPluggy] = newViaPip(
|
artifactsM[Pluggy] = newViaPip(
|
||||||
"pluggy",
|
"pluggy",
|
||||||
"the core framework used by the pytest, tox, and devpi projects",
|
"the core framework used by the pytest, tox, and devpi projects",
|
||||||
"1.6.0", "none", "any",
|
"1.6.0", "none", "any",
|
||||||
@@ -157,7 +153,7 @@ func init() {
|
|||||||
"54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/",
|
"54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/",
|
||||||
)
|
)
|
||||||
|
|
||||||
artifactsM[PythonPackaging] = newViaPip(
|
artifactsM[Packaging] = newViaPip(
|
||||||
"packaging",
|
"packaging",
|
||||||
"reusable core utilities for various Python Packaging interoperability specifications",
|
"reusable core utilities for various Python Packaging interoperability specifications",
|
||||||
"26.0", "none", "any",
|
"26.0", "none", "any",
|
||||||
@@ -166,7 +162,7 @@ func init() {
|
|||||||
"b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/",
|
"b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/",
|
||||||
)
|
)
|
||||||
|
|
||||||
artifactsM[PythonIniConfig] = newViaPip(
|
artifactsM[IniConfig] = newViaPip(
|
||||||
"iniconfig",
|
"iniconfig",
|
||||||
"a small and simple INI-file parser module",
|
"a small and simple INI-file parser module",
|
||||||
"2.3.0", "none", "any",
|
"2.3.0", "none", "any",
|
||||||
@@ -174,16 +170,16 @@ func init() {
|
|||||||
"https://files.pythonhosted.org/packages/"+
|
"https://files.pythonhosted.org/packages/"+
|
||||||
"cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/",
|
"cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/",
|
||||||
)
|
)
|
||||||
artifactsM[PythonPyTest] = newViaPip(
|
artifactsM[PyTest] = newViaPip(
|
||||||
"pytest",
|
"pytest",
|
||||||
"the pytest framework",
|
"the pytest framework",
|
||||||
"9.0.2", "none", "any",
|
"9.0.2", "none", "any",
|
||||||
"IM2wDbLke1EtZhF92zvAjUl_Hms1uKDtM7U8Dt4acOaChMnDg1pW7ib8U0wYGDLH",
|
"IM2wDbLke1EtZhF92zvAjUl_Hms1uKDtM7U8Dt4acOaChMnDg1pW7ib8U0wYGDLH",
|
||||||
"https://files.pythonhosted.org/packages/"+
|
"https://files.pythonhosted.org/packages/"+
|
||||||
"3b/ab/b3226f0bd7cdcf710fbede2b3548584366da3b19b5021e74f5bde2a8fa3f/",
|
"3b/ab/b3226f0bd7cdcf710fbede2b3548584366da3b19b5021e74f5bde2a8fa3f/",
|
||||||
PythonIniConfig,
|
IniConfig,
|
||||||
PythonPackaging,
|
Packaging,
|
||||||
PythonPluggy,
|
Pluggy,
|
||||||
PythonPygments,
|
Pygments,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -102,7 +102,5 @@ func init() {
|
|||||||
Name: "qemu",
|
Name: "qemu",
|
||||||
Description: "a generic and open source machine emulator and virtualizer",
|
Description: "a generic and open source machine emulator and virtualizer",
|
||||||
Website: "https://www.qemu.org/",
|
Website: "https://www.qemu.org/",
|
||||||
|
|
||||||
ID: 13607,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,235 +0,0 @@
|
|||||||
package rosa
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/binary"
|
|
||||||
"errors"
|
|
||||||
"fmt"
|
|
||||||
"io"
|
|
||||||
"os"
|
|
||||||
"runtime"
|
|
||||||
"runtime/debug"
|
|
||||||
"strconv"
|
|
||||||
"sync"
|
|
||||||
"syscall"
|
|
||||||
"unique"
|
|
||||||
"unsafe"
|
|
||||||
|
|
||||||
"hakurei.app/internal/pkg"
|
|
||||||
"hakurei.app/message"
|
|
||||||
)
|
|
||||||
|
|
||||||
// wordSize is the boundary which binary segments are always aligned to.
|
|
||||||
const wordSize = 8
|
|
||||||
|
|
||||||
// padSize returns the padding size for aligning sz.
|
|
||||||
func padSize[T int | int64](sz T) T {
|
|
||||||
return (wordSize - (sz)%wordSize) % wordSize
|
|
||||||
}
|
|
||||||
|
|
||||||
// WriteReport writes a report of all available [PArtifact] to w.
|
|
||||||
func WriteReport(msg message.Msg, w io.Writer, c *pkg.Cache) error {
|
|
||||||
var (
|
|
||||||
zero [wordSize]byte
|
|
||||||
buf [len(pkg.ID{}) + wordSize]byte
|
|
||||||
)
|
|
||||||
for i := range PresetEnd {
|
|
||||||
a := Std.Load(PArtifact(i))
|
|
||||||
if _, ok := a.(pkg.FileArtifact); ok {
|
|
||||||
msg.Verbosef("skipping file artifact %s", artifactsM[i].Name)
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
id := c.Ident(a)
|
|
||||||
|
|
||||||
var f *os.File
|
|
||||||
if r, err := c.OpenStatus(a); err != nil {
|
|
||||||
if errors.Is(err, os.ErrNotExist) {
|
|
||||||
msg.Verbosef("artifact %s unavailable", artifactsM[i].Name)
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
return err
|
|
||||||
} else {
|
|
||||||
f = r.(*os.File)
|
|
||||||
}
|
|
||||||
|
|
||||||
msg.Verbosef("writing artifact %s...", artifactsM[i].Name)
|
|
||||||
|
|
||||||
var sz int64
|
|
||||||
if fi, err := f.Stat(); err != nil {
|
|
||||||
_ = f.Close()
|
|
||||||
return err
|
|
||||||
} else {
|
|
||||||
sz = fi.Size()
|
|
||||||
}
|
|
||||||
|
|
||||||
*(*pkg.ID)(buf[:]) = id.Value()
|
|
||||||
binary.LittleEndian.PutUint64(buf[len(pkg.ID{}):], uint64(sz))
|
|
||||||
if _, err := w.Write(buf[:]); err != nil {
|
|
||||||
_ = f.Close()
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
if n, err := io.Copy(w, f); err != nil {
|
|
||||||
_ = f.Close()
|
|
||||||
return err
|
|
||||||
} else if n != sz {
|
|
||||||
_ = f.Close()
|
|
||||||
return fmt.Errorf("strange status file copy: %d != %d", n, sz)
|
|
||||||
} else if err = f.Close(); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
if psz := padSize(sz); psz > 0 {
|
|
||||||
if _, err := w.Write(zero[:psz]); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// existence of status implies cured artifact
|
|
||||||
var n int
|
|
||||||
if pathname, _, err := c.Cure(a); err != nil {
|
|
||||||
return err
|
|
||||||
} else if n, err = pkg.Flatten(
|
|
||||||
os.DirFS(pathname.String()), ".",
|
|
||||||
io.Discard,
|
|
||||||
); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
binary.LittleEndian.PutUint64(buf[:], uint64(n))
|
|
||||||
if _, err := w.Write(buf[:wordSize]); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Report provides efficient access to a report file populated by [WriteReport].
|
|
||||||
type Report struct {
|
|
||||||
// Slice backed by the underlying file.
|
|
||||||
//
|
|
||||||
// Access must be prepared by HandleAccess.
|
|
||||||
data []byte
|
|
||||||
|
|
||||||
// Offsets into data for each identifier.
|
|
||||||
offsets map[unique.Handle[pkg.ID]]int
|
|
||||||
|
|
||||||
// Outcome of a call to Close.
|
|
||||||
closeErr error
|
|
||||||
// Synchronises calls to Close.
|
|
||||||
closeOnce sync.Once
|
|
||||||
}
|
|
||||||
|
|
||||||
// OpenReport opens a file populated by [WriteReport]
|
|
||||||
func OpenReport(pathname string) (rp *Report, err error) {
|
|
||||||
var f *os.File
|
|
||||||
if f, err = os.Open(pathname); err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
var fi os.FileInfo
|
|
||||||
if fi, err = f.Stat(); err != nil {
|
|
||||||
_ = f.Close()
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
var r Report
|
|
||||||
if r.data, err = syscall.Mmap(
|
|
||||||
int(f.Fd()),
|
|
||||||
0,
|
|
||||||
int(fi.Size()),
|
|
||||||
syscall.PROT_READ,
|
|
||||||
syscall.MAP_PRIVATE,
|
|
||||||
); err != nil {
|
|
||||||
_ = f.Close()
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
if err = f.Close(); err != nil {
|
|
||||||
_ = r.Close()
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
defer r.HandleAccess(&err)()
|
|
||||||
|
|
||||||
var offset int
|
|
||||||
r.offsets = make(map[unique.Handle[pkg.ID]]int)
|
|
||||||
for offset < len(r.data) {
|
|
||||||
id := unique.Make((pkg.ID)(r.data[offset:]))
|
|
||||||
offset += len(pkg.ID{})
|
|
||||||
r.offsets[id] = offset
|
|
||||||
offset += int(binary.LittleEndian.Uint64(r.data[offset:])) + wordSize
|
|
||||||
offset += padSize(offset)
|
|
||||||
offset += wordSize
|
|
||||||
}
|
|
||||||
return &r, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// ReportIOError describes an I/O error while accessing a [Report].
|
|
||||||
type ReportIOError struct {
|
|
||||||
Offset int
|
|
||||||
Err error
|
|
||||||
}
|
|
||||||
|
|
||||||
// Unwrap returns the underlying runtime error.
|
|
||||||
func (e *ReportIOError) Unwrap() error { return e.Err }
|
|
||||||
|
|
||||||
// Error returns a description of the error offset.
|
|
||||||
func (e *ReportIOError) Error() string {
|
|
||||||
return "report I/O error at offset " + strconv.Itoa(e.Offset)
|
|
||||||
}
|
|
||||||
|
|
||||||
// HandleAccess prepares for accessing memory returned by a method of [Report]
|
|
||||||
// and returns a function that must be deferred by the caller.
|
|
||||||
func (r *Report) HandleAccess(errP *error) func() {
|
|
||||||
pof := debug.SetPanicOnFault(true)
|
|
||||||
return func() {
|
|
||||||
debug.SetPanicOnFault(pof)
|
|
||||||
|
|
||||||
v := recover()
|
|
||||||
if v == nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
if err, ok := v.(error); !ok {
|
|
||||||
panic(v)
|
|
||||||
} else if *errP != nil {
|
|
||||||
return
|
|
||||||
} else {
|
|
||||||
*errP = err
|
|
||||||
}
|
|
||||||
|
|
||||||
var runtimeError interface {
|
|
||||||
Addr() uintptr
|
|
||||||
runtime.Error
|
|
||||||
}
|
|
||||||
if errors.As(*errP, &runtimeError) {
|
|
||||||
offset := int(runtimeError.Addr() - uintptr(unsafe.Pointer(unsafe.SliceData(r.data))))
|
|
||||||
// best effort for fragile uintptr
|
|
||||||
if offset >= 0 {
|
|
||||||
*errP = &ReportIOError{offset, *errP}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// ArtifactOf returns information of a [pkg.Artifact] corresponding to id.
|
|
||||||
func (r *Report) ArtifactOf(id unique.Handle[pkg.ID]) (status []byte, n int64) {
|
|
||||||
if offset, ok := r.offsets[id]; !ok {
|
|
||||||
n = -1
|
|
||||||
} else {
|
|
||||||
sz := int(binary.LittleEndian.Uint64(r.data[offset:]))
|
|
||||||
offset += wordSize
|
|
||||||
|
|
||||||
status = r.data[offset : offset+sz]
|
|
||||||
offset += sz + padSize(sz)
|
|
||||||
|
|
||||||
n = int64(binary.LittleEndian.Uint64(r.data[offset:]))
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// Close closes the underlying file and releases all associated resources.
|
|
||||||
func (r *Report) Close() error {
|
|
||||||
r.closeOnce.Do(func() { r.closeErr = syscall.Munmap(r.data) })
|
|
||||||
return r.closeErr
|
|
||||||
}
|
|
||||||
@@ -1,57 +0,0 @@
|
|||||||
package rosa_test
|
|
||||||
|
|
||||||
import (
|
|
||||||
"errors"
|
|
||||||
"os"
|
|
||||||
"path"
|
|
||||||
"syscall"
|
|
||||||
"testing"
|
|
||||||
"unique"
|
|
||||||
|
|
||||||
"hakurei.app/internal/pkg"
|
|
||||||
"hakurei.app/internal/rosa"
|
|
||||||
)
|
|
||||||
|
|
||||||
func TestReportZeroLength(t *testing.T) {
|
|
||||||
report := path.Join(t.TempDir(), "report")
|
|
||||||
if err := os.WriteFile(report, nil, 0400); err != nil {
|
|
||||||
t.Fatal(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
if _, err := rosa.OpenReport(report); !errors.Is(err, syscall.EINVAL) {
|
|
||||||
t.Fatalf("OpenReport: error = %v", err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestReportSIGSEGV(t *testing.T) {
|
|
||||||
report := path.Join(t.TempDir(), "report")
|
|
||||||
if err := os.WriteFile(report, make([]byte, 64), 0400); err != nil {
|
|
||||||
t.Fatal(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
if r, err := rosa.OpenReport(report); err != nil {
|
|
||||||
t.Fatalf("OpenReport: error = %v", err)
|
|
||||||
} else {
|
|
||||||
status, n := r.ArtifactOf(unique.Make(pkg.ID{}))
|
|
||||||
if len(status) != 0 {
|
|
||||||
t.Errorf("ArtifactsOf: status = %#v", status)
|
|
||||||
}
|
|
||||||
if n != 0 {
|
|
||||||
t.Errorf("ArtifactsOf: n = %d", n)
|
|
||||||
}
|
|
||||||
|
|
||||||
if err = r.Close(); err != nil {
|
|
||||||
t.Fatalf("Close: error = %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
defer func() {
|
|
||||||
ioErr := err.(*rosa.ReportIOError)
|
|
||||||
if ioErr.Offset != 48 {
|
|
||||||
panic(ioErr)
|
|
||||||
}
|
|
||||||
}()
|
|
||||||
defer r.HandleAccess(&err)()
|
|
||||||
r.ArtifactOf(unique.Make(pkg.ID{}))
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -329,7 +329,7 @@ mkdir -vp /work/system/bin
|
|||||||
|
|
||||||
"AR=ar",
|
"AR=ar",
|
||||||
"RANLIB=ranlib",
|
"RANLIB=ranlib",
|
||||||
"LIBCC=/system/lib/clang/" + llvmVersionMajor + "/lib/" + triplet() +
|
"LIBCC=/system/lib/clang/21/lib/" + triplet() +
|
||||||
"/libclang_rt.builtins.a",
|
"/libclang_rt.builtins.a",
|
||||||
}, "/system/bin", "/bin")
|
}, "/system/bin", "/bin")
|
||||||
|
|
||||||
|
|||||||
@@ -33,7 +33,5 @@ func init() {
|
|||||||
Name: "rsync",
|
Name: "rsync",
|
||||||
Description: "an open source utility that provides fast incremental file transfer",
|
Description: "an open source utility that provides fast incremental file transfer",
|
||||||
Website: "https://rsync.samba.org/",
|
Website: "https://rsync.samba.org/",
|
||||||
|
|
||||||
ID: 4217,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,8 +4,8 @@ import "hakurei.app/internal/pkg"
|
|||||||
|
|
||||||
func (t Toolchain) newSquashfsTools() (pkg.Artifact, string) {
|
func (t Toolchain) newSquashfsTools() (pkg.Artifact, string) {
|
||||||
const (
|
const (
|
||||||
version = "4.7.5"
|
version = "4.7.4"
|
||||||
checksum = "rF52wLQP-jeAmcD-48wqJcck8ZWRFwkax3T-7snaRf5EBnCQQh0YypMY9lwcivLz"
|
checksum = "pG0E_wkRJFS6bvPYF-hTKZT-cWnvo5BbIzCDZrJZVQDgJOx2Vc3ZfNSEV7Di7cSW"
|
||||||
)
|
)
|
||||||
return t.NewPackage("squashfs-tools", version, pkg.NewHTTPGetTar(
|
return t.NewPackage("squashfs-tools", version, pkg.NewHTTPGetTar(
|
||||||
nil, "https://github.com/plougher/squashfs-tools/releases/"+
|
nil, "https://github.com/plougher/squashfs-tools/releases/"+
|
||||||
@@ -47,7 +47,5 @@ func init() {
|
|||||||
Name: "squashfs-tools",
|
Name: "squashfs-tools",
|
||||||
Description: "tools to create and extract Squashfs filesystems",
|
Description: "tools to create and extract Squashfs filesystems",
|
||||||
Website: "https://github.com/plougher/squashfs-tools",
|
Website: "https://github.com/plougher/squashfs-tools",
|
||||||
|
|
||||||
ID: 4879,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,22 +1,20 @@
|
|||||||
package rosa
|
package rosa
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"strings"
|
|
||||||
|
|
||||||
"hakurei.app/internal/pkg"
|
"hakurei.app/internal/pkg"
|
||||||
)
|
)
|
||||||
|
|
||||||
func (t Toolchain) newNSS() (pkg.Artifact, string) {
|
func (t Toolchain) newNSS() (pkg.Artifact, string) {
|
||||||
const (
|
const (
|
||||||
version = "3.121"
|
version = "3_120"
|
||||||
checksum = "MTS4Eg-1vBN3T7gdUAdNO0y_e9x9BE3f_k_DHdM_BIovc7y57vhsZTfB5f6BeQfi"
|
checksum = "9M0SNMrj9BJp6RH2rQnMm6bZWtP0Kgj64D5JNPHF7Cxr2_8kfy3msubIcvEPwC35"
|
||||||
|
|
||||||
version0 = "4_38_2"
|
version0 = "4_38_2"
|
||||||
checksum0 = "25x2uJeQnOHIiq_zj17b4sYqKgeoU8-IsySUptoPcdHZ52PohFZfGuIisBreWzx0"
|
checksum0 = "25x2uJeQnOHIiq_zj17b4sYqKgeoU8-IsySUptoPcdHZ52PohFZfGuIisBreWzx0"
|
||||||
)
|
)
|
||||||
return t.NewPackage("nss", version, pkg.NewHTTPGetTar(
|
return t.NewPackage("nss", version, pkg.NewHTTPGetTar(
|
||||||
nil, "https://github.com/nss-dev/nss/archive/refs/tags/"+
|
nil, "https://github.com/nss-dev/nss/archive/refs/tags/"+
|
||||||
"NSS_"+strings.Join(strings.SplitN(version, ".", 2), "_")+"_RTM.tar.gz",
|
"NSS_"+version+"_RTM.tar.gz",
|
||||||
mustDecode(checksum),
|
mustDecode(checksum),
|
||||||
pkg.TarGzip,
|
pkg.TarGzip,
|
||||||
), &PackageAttr{
|
), &PackageAttr{
|
||||||
@@ -74,8 +72,6 @@ func init() {
|
|||||||
Name: "nss",
|
Name: "nss",
|
||||||
Description: "Network Security Services",
|
Description: "Network Security Services",
|
||||||
Website: "https://firefox-source-docs.mozilla.org/security/nss/index.html",
|
Website: "https://firefox-source-docs.mozilla.org/security/nss/index.html",
|
||||||
|
|
||||||
ID: 2503,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -67,8 +67,6 @@ func init() {
|
|||||||
Name: "toybox",
|
Name: "toybox",
|
||||||
Description: "many common Linux command line utilities",
|
Description: "many common Linux command line utilities",
|
||||||
Website: "https://landley.net/toybox/",
|
Website: "https://landley.net/toybox/",
|
||||||
|
|
||||||
ID: 13818,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
artifactsM[toyboxEarly] = Metadata{
|
artifactsM[toyboxEarly] = Metadata{
|
||||||
|
|||||||
@@ -38,7 +38,5 @@ func init() {
|
|||||||
Name: "unzip",
|
Name: "unzip",
|
||||||
Description: "portable compression/archiver utilities",
|
Description: "portable compression/archiver utilities",
|
||||||
Website: "https://infozip.sourceforge.net/",
|
Website: "https://infozip.sourceforge.net/",
|
||||||
|
|
||||||
ID: 8684,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -53,10 +53,5 @@ func init() {
|
|||||||
Name: "util-linux",
|
Name: "util-linux",
|
||||||
Description: "a random collection of Linux utilities",
|
Description: "a random collection of Linux utilities",
|
||||||
Website: "https://git.kernel.org/pub/scm/utils/util-linux/util-linux.git",
|
Website: "https://git.kernel.org/pub/scm/utils/util-linux/util-linux.git",
|
||||||
|
|
||||||
ID: 8179,
|
|
||||||
|
|
||||||
// release candidates confuse Anitya
|
|
||||||
latest: (*Versions).getStable,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,8 +4,8 @@ import "hakurei.app/internal/pkg"
|
|||||||
|
|
||||||
func (t Toolchain) newWayland() (pkg.Artifact, string) {
|
func (t Toolchain) newWayland() (pkg.Artifact, string) {
|
||||||
const (
|
const (
|
||||||
version = "1.24.91"
|
version = "1.24.0"
|
||||||
checksum = "SQkjYShk2TutoBOfmeJcdLU9iDExVKOg0DZhLeL8U_qjc9olLTC7h3vuUBvVtx9w"
|
checksum = "JxgLiFRRGw2D3uhVw8ZeDbs3V7K_d4z_ypDog2LBqiA_5y2vVbUAk5NT6D5ozm0m"
|
||||||
)
|
)
|
||||||
return t.NewPackage("wayland", version, pkg.NewHTTPGetTar(
|
return t.NewPackage("wayland", version, pkg.NewHTTPGetTar(
|
||||||
nil, "https://gitlab.freedesktop.org/wayland/wayland/"+
|
nil, "https://gitlab.freedesktop.org/wayland/wayland/"+
|
||||||
@@ -41,8 +41,6 @@ func init() {
|
|||||||
Name: "wayland",
|
Name: "wayland",
|
||||||
Description: "core Wayland window system code and protocol",
|
Description: "core Wayland window system code and protocol",
|
||||||
Website: "https://wayland.freedesktop.org/",
|
Website: "https://wayland.freedesktop.org/",
|
||||||
|
|
||||||
ID: 10061,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -124,7 +122,5 @@ func init() {
|
|||||||
Name: "wayland-protocols",
|
Name: "wayland-protocols",
|
||||||
Description: "Additional standard Wayland protocols",
|
Description: "Additional standard Wayland protocols",
|
||||||
Website: "https://wayland.freedesktop.org/",
|
Website: "https://wayland.freedesktop.org/",
|
||||||
|
|
||||||
ID: 13997,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,14 +4,14 @@ import "hakurei.app/internal/pkg"
|
|||||||
|
|
||||||
func (t Toolchain) newUtilMacros() (pkg.Artifact, string) {
|
func (t Toolchain) newUtilMacros() (pkg.Artifact, string) {
|
||||||
const (
|
const (
|
||||||
version = "1.20.2"
|
version = "1.17"
|
||||||
checksum = "Ze8QH3Z3emC0pWFP-0nUYeMy7aBW3L_dxBBmVgcumIHNzEKc1iGTR-yUFR3JcM1G"
|
checksum = "vYPO4Qq3B_WGcsBjG0-lfwZ6DZ7ayyrOLqfDrVOgTDcyLChuMGOAAVAa_UXLu5tD"
|
||||||
)
|
)
|
||||||
return t.NewPackage("util-macros", version, pkg.NewHTTPGetTar(
|
return t.NewPackage("util-macros", version, pkg.NewHTTPGetTar(
|
||||||
nil, "https://www.x.org/releases/individual/util/"+
|
nil, "https://www.x.org/releases/X11R7.7/src/util/"+
|
||||||
"util-macros-"+version+".tar.gz",
|
"util-macros-"+version+".tar.bz2",
|
||||||
mustDecode(checksum),
|
mustDecode(checksum),
|
||||||
pkg.TarGzip,
|
pkg.TarBzip2,
|
||||||
), nil, (*MakeHelper)(nil)), version
|
), nil, (*MakeHelper)(nil)), version
|
||||||
}
|
}
|
||||||
func init() {
|
func init() {
|
||||||
@@ -21,18 +21,16 @@ func init() {
|
|||||||
Name: "util-macros",
|
Name: "util-macros",
|
||||||
Description: "X.Org Autotools macros",
|
Description: "X.Org Autotools macros",
|
||||||
Website: "https://xorg.freedesktop.org/",
|
Website: "https://xorg.freedesktop.org/",
|
||||||
|
|
||||||
ID: 5252,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t Toolchain) newXproto() (pkg.Artifact, string) {
|
func (t Toolchain) newXproto() (pkg.Artifact, string) {
|
||||||
const (
|
const (
|
||||||
version = "7.0.31"
|
version = "7.0.23"
|
||||||
checksum = "Cm69urWY5RctKpR78eGzuwrjDEfXGkvHRdodj6sjypOGy5FF4-lmnUttVHYV1ydg"
|
checksum = "goxwWxV0jZ_3pNczXFltZWHAhq92x-aEreUGyp5Ns8dBOoOmgbpeNIu1nv0Zx07z"
|
||||||
)
|
)
|
||||||
return t.NewPackage("xproto", version, pkg.NewHTTPGetTar(
|
return t.NewPackage("xproto", version, pkg.NewHTTPGetTar(
|
||||||
nil, "https://www.x.org/releases/individual/proto/"+
|
nil, "https://www.x.org/releases/X11R7.7/src/proto/"+
|
||||||
"xproto-"+version+".tar.bz2",
|
"xproto-"+version+".tar.bz2",
|
||||||
mustDecode(checksum),
|
mustDecode(checksum),
|
||||||
pkg.TarBzip2,
|
pkg.TarBzip2,
|
||||||
@@ -56,21 +54,19 @@ func init() {
|
|||||||
Name: "xproto",
|
Name: "xproto",
|
||||||
Description: "X Window System unified protocol definitions",
|
Description: "X Window System unified protocol definitions",
|
||||||
Website: "https://gitlab.freedesktop.org/xorg/proto/xorgproto",
|
Website: "https://gitlab.freedesktop.org/xorg/proto/xorgproto",
|
||||||
|
|
||||||
ID: 13650,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t Toolchain) newLibXau() (pkg.Artifact, string) {
|
func (t Toolchain) newLibXau() (pkg.Artifact, string) {
|
||||||
const (
|
const (
|
||||||
version = "1.0.12"
|
version = "1.0.7"
|
||||||
checksum = "G9AjnU_C160q814MCdjFOVt_mQz_pIt4wf4GNOQmGJS3UuuyMw53sfPvJ7WOqwXN"
|
checksum = "bm768RoZZnHRe9VjNU1Dw3BhfE60DyS9D_bgSR-JLkEEyUWT_Hb_lQripxrXto8j"
|
||||||
)
|
)
|
||||||
return t.NewPackage("libXau", version, pkg.NewHTTPGetTar(
|
return t.NewPackage("libXau", version, pkg.NewHTTPGetTar(
|
||||||
nil, "https://www.x.org/releases/individual/lib/"+
|
nil, "https://www.x.org/releases/X11R7.7/src/lib/"+
|
||||||
"libXau-"+version+".tar.gz",
|
"libXau-"+version+".tar.bz2",
|
||||||
mustDecode(checksum),
|
mustDecode(checksum),
|
||||||
pkg.TarGzip,
|
pkg.TarBzip2,
|
||||||
), nil, &MakeHelper{
|
), nil, &MakeHelper{
|
||||||
// ancient configure script
|
// ancient configure script
|
||||||
Generate: "autoreconf -if",
|
Generate: "autoreconf -if",
|
||||||
@@ -93,7 +89,5 @@ func init() {
|
|||||||
Name: "libXau",
|
Name: "libXau",
|
||||||
Description: "functions for handling Xauthority files and entries",
|
Description: "functions for handling Xauthority files and entries",
|
||||||
Website: "https://gitlab.freedesktop.org/xorg/lib/libxau",
|
Website: "https://gitlab.freedesktop.org/xorg/lib/libxau",
|
||||||
|
|
||||||
ID: 1765,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -22,8 +22,6 @@ func init() {
|
|||||||
Name: "xcb-proto",
|
Name: "xcb-proto",
|
||||||
Description: "XML-XCB protocol descriptions used by libxcb for the X11 protocol & extensions",
|
Description: "XML-XCB protocol descriptions used by libxcb for the X11 protocol & extensions",
|
||||||
Website: "https://gitlab.freedesktop.org/xorg/proto/xcbproto",
|
Website: "https://gitlab.freedesktop.org/xorg/proto/xcbproto",
|
||||||
|
|
||||||
ID: 13646,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -52,7 +50,5 @@ func init() {
|
|||||||
Name: "xcb",
|
Name: "xcb",
|
||||||
Description: "The X protocol C-language Binding",
|
Description: "The X protocol C-language Binding",
|
||||||
Website: "https://xcb.freedesktop.org/",
|
Website: "https://xcb.freedesktop.org/",
|
||||||
|
|
||||||
ID: 1767,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -23,7 +23,5 @@ func init() {
|
|||||||
Name: "xz",
|
Name: "xz",
|
||||||
Description: "XZ Utils",
|
Description: "XZ Utils",
|
||||||
Website: "https://tukaani.org/xz/",
|
Website: "https://tukaani.org/xz/",
|
||||||
|
|
||||||
ID: 5277,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,8 +4,8 @@ import "hakurei.app/internal/pkg"
|
|||||||
|
|
||||||
func (t Toolchain) newZlib() (pkg.Artifact, string) {
|
func (t Toolchain) newZlib() (pkg.Artifact, string) {
|
||||||
const (
|
const (
|
||||||
version = "1.3.1"
|
version = "1.3.2"
|
||||||
checksum = "E-eIpNzE8oJ5DsqH4UuA_0GDKuQF5csqI8ooDx2w7Vx-woJ2mb-YtSbEyIMN44mH"
|
checksum = "KHZrePe42vL2XvOUE3KlJkp1UgWhWkl0jjT_BOvFhuM4GzieEH9S7CioepOFVGYB"
|
||||||
)
|
)
|
||||||
return t.NewPackage("zlib", version, pkg.NewHTTPGetTar(
|
return t.NewPackage("zlib", version, pkg.NewHTTPGetTar(
|
||||||
nil, "https://www.zlib.net/fossils/zlib-"+version+".tar.gz",
|
nil, "https://www.zlib.net/fossils/zlib-"+version+".tar.gz",
|
||||||
@@ -29,7 +29,5 @@ func init() {
|
|||||||
Name: "zlib",
|
Name: "zlib",
|
||||||
Description: "lossless data-compression library",
|
Description: "lossless data-compression library",
|
||||||
Website: "https://zlib.net/",
|
Website: "https://zlib.net/",
|
||||||
|
|
||||||
ID: 5303,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -27,7 +27,5 @@ func init() {
|
|||||||
Name: "zstd",
|
Name: "zstd",
|
||||||
Description: "a fast compression algorithm",
|
Description: "a fast compression algorithm",
|
||||||
Website: "https://facebook.github.io/zstd/",
|
Website: "https://facebook.github.io/zstd/",
|
||||||
|
|
||||||
ID: 12083,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -35,7 +35,7 @@ package
|
|||||||
|
|
||||||
|
|
||||||
*Default:*
|
*Default:*
|
||||||
` <derivation hakurei-static-x86_64-unknown-linux-musl-0.3.6> `
|
` <derivation hakurei-static-x86_64-unknown-linux-musl-0.3.5> `
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -805,7 +805,7 @@ package
|
|||||||
|
|
||||||
|
|
||||||
*Default:*
|
*Default:*
|
||||||
` <derivation hakurei-hsu-0.3.6> `
|
` <derivation hakurei-hsu-0.3.5> `
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -30,7 +30,7 @@
|
|||||||
|
|
||||||
buildGoModule rec {
|
buildGoModule rec {
|
||||||
pname = "hakurei";
|
pname = "hakurei";
|
||||||
version = "0.3.6";
|
version = "0.3.5";
|
||||||
|
|
||||||
srcFiltered = builtins.path {
|
srcFiltered = builtins.path {
|
||||||
name = "${pname}-src";
|
name = "${pname}-src";
|
||||||
|
|||||||
Reference in New Issue
Block a user