Merge branch 'master' into haskell-updates

This commit is contained in:
maralorn
2022-12-30 20:39:23 +01:00
82 changed files with 3181 additions and 604 deletions
+6
View File
@@ -842,6 +842,12 @@ in mkLicense lset) ({
fullName = "SGI Free Software License B v2.0";
};
# Gentoo seems to treat it as a license:
# https://gitweb.gentoo.org/repo/gentoo.git/tree/licenses/SGMLUG?id=7d999af4a47bf55e53e54713d98d145f935935c1
sgmlug = {
fullName = "SGML UG SGML Parser Materials license";
};
sleepycat = {
spdxId = "Sleepycat";
fullName = "Sleepycat License";
@@ -76,6 +76,14 @@
<link xlink:href="options.html#opt-services.v2raya.enable">services.v2raya</link>.
</para>
</listitem>
<listitem>
<para>
<link xlink:href="https://www.netfilter.org/projects/ulogd/index.html">ulogd</link>,
a userspace logging daemon for netfilter/iptables related
logging. Available as
<link xlink:href="options.html#opt-services.ulogd.enable">services.ulogd</link>.
</para>
</listitem>
</itemizedlist>
</section>
<section xml:id="sec-release-23.05-incompatibilities">
@@ -399,6 +407,21 @@
<link xlink:href="https://github.com/google/ngx_brotli/blob/master/README.md">here</link>.
</para>
</listitem>
<listitem>
<para>
<link xlink:href="https://garagehq.deuxfleurs.fr/">Garage</link>
version is based on
<link xlink:href="options.html#opt-system.stateVersion">system.stateVersion</link>,
existing installations will keep using version 0.7. New
installations will use version 0.8. In order to upgrade a
Garage cluster, please follow
<link xlink:href="https://garagehq.deuxfleurs.fr/documentation/cookbook/upgrading/">upstream
instructions</link> and force
<link xlink:href="options.html#opt-services.garage.package">services.garage.package</link>
or upgrade accordingly
<link xlink:href="options.html#opt-system.stateVersion">system.stateVersion</link>.
</para>
</listitem>
<listitem>
<para>
Resilio sync secret keys can now be provided using a secrets
@@ -28,6 +28,8 @@ In addition to numerous new and upgraded packages, this release has the followin
- [v2rayA](https://v2raya.org), a Linux web GUI client of Project V which supports V2Ray, Xray, SS, SSR, Trojan and Pingtunnel. Available as [services.v2raya](options.html#opt-services.v2raya.enable).
- [ulogd](https://www.netfilter.org/projects/ulogd/index.html), a userspace logging daemon for netfilter/iptables related logging. Available as [services.ulogd](options.html#opt-services.ulogd.enable).
## Backward Incompatibilities {#sec-release-23.05-incompatibilities}
<!-- To avoid merge conflicts, consider adding your item at an arbitrary place in the list instead. -->
@@ -109,6 +111,8 @@ In addition to numerous new and upgraded packages, this release has the followin
- A new option `recommendedBrotliSettings` has been added to `services.nginx`. Learn more about compression in Brotli format [here](https://github.com/google/ngx_brotli/blob/master/README.md).
- [Garage](https://garagehq.deuxfleurs.fr/) version is based on [system.stateVersion](options.html#opt-system.stateVersion), existing installations will keep using version 0.7. New installations will use version 0.8. In order to upgrade a Garage cluster, please follow [upstream instructions](https://garagehq.deuxfleurs.fr/documentation/cookbook/upgrading/) and force [services.garage.package](options.html#opt-services.garage.package) or upgrade accordingly [system.stateVersion](options.html#opt-system.stateVersion).
- Resilio sync secret keys can now be provided using a secrets file at runtime, preventing these secrets from ending up in the Nix store.
- The `firewall` and `nat` module now has a nftables based implementation. Enable `networking.nftables` to use it.
@@ -41,11 +41,9 @@ def writeable_dir(arg: str) -> Path:
"""
path = Path(arg)
if not path.is_dir():
raise argparse.ArgumentTypeError("{0} is not a directory".format(path))
raise argparse.ArgumentTypeError(f"{path} is not a directory")
if not os.access(path, os.W_OK):
raise argparse.ArgumentTypeError(
"{0} is not a writeable directory".format(path)
)
raise argparse.ArgumentTypeError(f"{path} is not a writeable directory")
return path
+2 -6
View File
@@ -19,15 +19,11 @@ def get_tmp_dir() -> Path:
tmp_dir.mkdir(mode=0o700, exist_ok=True)
if not tmp_dir.is_dir():
raise NotADirectoryError(
"The directory defined by TMPDIR, TEMP, TMP or CWD: {0} is not a directory".format(
tmp_dir
)
f"The directory defined by TMPDIR, TEMP, TMP or CWD: {tmp_dir} is not a directory"
)
if not os.access(tmp_dir, os.W_OK):
raise PermissionError(
"The directory defined by TMPDIR, TEMP, TMP, or CWD: {0} is not writeable".format(
tmp_dir
)
f"The directory defined by TMPDIR, TEMP, TMP, or CWD: {tmp_dir} is not writeable"
)
return tmp_dir
+3 -5
View File
@@ -36,7 +36,7 @@ class Logger:
def maybe_prefix(self, message: str, attributes: Dict[str, str]) -> str:
if "machine" in attributes:
return "{}: {}".format(attributes["machine"], message)
return f"{attributes['machine']}: {message}"
return message
def log_line(self, message: str, attributes: Dict[str, str]) -> None:
@@ -62,9 +62,7 @@ class Logger:
def log_serial(self, message: str, machine: str) -> None:
self.enqueue({"msg": message, "machine": machine, "type": "serial"})
if self._print_serial_logs:
self._eprint(
Style.DIM + "{} # {}".format(machine, message) + Style.RESET_ALL
)
self._eprint(Style.DIM + f"{machine} # {message}" + Style.RESET_ALL)
def enqueue(self, item: Dict[str, str]) -> None:
self.queue.put(item)
@@ -97,7 +95,7 @@ class Logger:
yield
self.drain_log_queue()
toc = time.time()
self.log("(finished: {}, in {:.2f} seconds)".format(message, toc - tic))
self.log(f"(finished: {message}, in {toc - tic:.2f} seconds)")
self.xml.endElement("nest")
+50 -63
View File
@@ -420,8 +420,8 @@ class Machine:
def send_monitor_command(self, command: str) -> str:
self.run_callbacks()
with self.nested("sending monitor command: {}".format(command)):
message = ("{}\n".format(command)).encode()
with self.nested(f"sending monitor command: {command}"):
message = f"{command}\n".encode()
assert self.monitor is not None
self.monitor.send(message)
return self.wait_for_monitor_prompt()
@@ -438,7 +438,7 @@ class Machine:
info = self.get_unit_info(unit, user)
state = info["ActiveState"]
if state == "failed":
raise Exception('unit "{}" reached state "{}"'.format(unit, state))
raise Exception(f'unit "{unit}" reached state "{state}"')
if state == "inactive":
status, jobs = self.systemctl("list-jobs --full 2>&1", user)
@@ -446,27 +446,24 @@ class Machine:
info = self.get_unit_info(unit, user)
if info["ActiveState"] == state:
raise Exception(
(
'unit "{}" is inactive and there ' "are no pending jobs"
).format(unit)
f'unit "{unit}" is inactive and there are no pending jobs'
)
return state == "active"
with self.nested(
"waiting for unit {}{}".format(
unit, f" with user {user}" if user is not None else ""
)
f"waiting for unit {unit}"
+ (f" with user {user}" if user is not None else "")
):
retry(check_active, timeout)
def get_unit_info(self, unit: str, user: Optional[str] = None) -> Dict[str, str]:
status, lines = self.systemctl('--no-pager show "{}"'.format(unit), user)
status, lines = self.systemctl(f'--no-pager show "{unit}"', user)
if status != 0:
raise Exception(
'retrieving systemctl info for unit "{}" {} failed with exit code {}'.format(
unit, "" if user is None else 'under user "{}"'.format(user), status
)
f'retrieving systemctl info for unit "{unit}"'
+ ("" if user is None else f' under user "{user}"')
+ f" failed with exit code {status}"
)
line_pattern = re.compile(r"^([^=]+)=(.*)$")
@@ -486,24 +483,22 @@ class Machine:
if user is not None:
q = q.replace("'", "\\'")
return self.execute(
(
"su -l {} --shell /bin/sh -c "
"$'XDG_RUNTIME_DIR=/run/user/`id -u` "
"systemctl --user {}'"
).format(user, q)
f"su -l {user} --shell /bin/sh -c "
"$'XDG_RUNTIME_DIR=/run/user/`id -u` "
f"systemctl --user {q}'"
)
return self.execute("systemctl {}".format(q))
return self.execute(f"systemctl {q}")
def require_unit_state(self, unit: str, require_state: str = "active") -> None:
with self.nested(
"checking if unit {} has reached state '{}'".format(unit, require_state)
f"checking if unit '{unit}' has reached state '{require_state}'"
):
info = self.get_unit_info(unit)
state = info["ActiveState"]
if state != require_state:
raise Exception(
"Expected unit {} to to be in state ".format(unit)
+ "'{}' but it is in state {}".format(require_state, state)
f"Expected unit '{unit}' to to be in state "
f"'{require_state}' but it is in state '{state}'"
)
def _next_newline_closed_block_from_shell(self) -> str:
@@ -593,13 +588,11 @@ class Machine:
"""Execute each command and check that it succeeds."""
output = ""
for command in commands:
with self.nested("must succeed: {}".format(command)):
with self.nested(f"must succeed: {command}"):
(status, out) = self.execute(command, timeout=timeout)
if status != 0:
self.log("output: {}".format(out))
raise Exception(
"command `{}` failed (exit code {})".format(command, status)
)
self.log(f"output: {out}")
raise Exception(f"command `{command}` failed (exit code {status})")
output += out
return output
@@ -607,12 +600,10 @@ class Machine:
"""Execute each command and check that it fails."""
output = ""
for command in commands:
with self.nested("must fail: {}".format(command)):
with self.nested(f"must fail: {command}"):
(status, out) = self.execute(command, timeout=timeout)
if status == 0:
raise Exception(
"command `{}` unexpectedly succeeded".format(command)
)
raise Exception(f"command `{command}` unexpectedly succeeded")
output += out
return output
@@ -627,7 +618,7 @@ class Machine:
status, output = self.execute(command, timeout=timeout)
return status == 0
with self.nested("waiting for success: {}".format(command)):
with self.nested(f"waiting for success: {command}"):
retry(check_success, timeout)
return output
@@ -642,7 +633,7 @@ class Machine:
status, output = self.execute(command, timeout=timeout)
return status != 0
with self.nested("waiting for failure: {}".format(command)):
with self.nested(f"waiting for failure: {command}"):
retry(check_failure)
return output
@@ -661,8 +652,8 @@ class Machine:
def get_tty_text(self, tty: str) -> str:
status, output = self.execute(
"fold -w$(stty -F /dev/tty{0} size | "
"awk '{{print $2}}') /dev/vcs{0}".format(tty)
f"fold -w$(stty -F /dev/tty{tty} size | "
f"awk '{{print $2}}') /dev/vcs{tty}"
)
return output
@@ -681,11 +672,11 @@ class Machine:
)
return len(matcher.findall(text)) > 0
with self.nested("waiting for {} to appear on tty {}".format(regexp, tty)):
with self.nested(f"waiting for {regexp} to appear on tty {tty}"):
retry(tty_matches)
def send_chars(self, chars: str, delay: Optional[float] = 0.01) -> None:
with self.nested("sending keys {}".format(chars)):
with self.nested(f"sending keys '{chars}'"):
for char in chars:
self.send_key(char, delay)
@@ -693,35 +684,33 @@ class Machine:
"""Waits until the file exists in machine's file system."""
def check_file(_: Any) -> bool:
status, _ = self.execute("test -e {}".format(filename))
status, _ = self.execute(f"test -e {filename}")
return status == 0
with self.nested("waiting for file {}".format(filename)):
with self.nested(f"waiting for file '{filename}'"):
retry(check_file)
def wait_for_open_port(self, port: int, addr: str = "localhost") -> None:
def port_is_open(_: Any) -> bool:
status, _ = self.execute("nc -z {} {}".format(addr, port))
status, _ = self.execute(f"nc -z {addr} {port}")
return status == 0
with self.nested("waiting for TCP port {} on {}".format(port, addr)):
with self.nested(f"waiting for TCP port {port} on {addr}"):
retry(port_is_open)
def wait_for_closed_port(self, port: int, addr: str = "localhost") -> None:
def port_is_closed(_: Any) -> bool:
status, _ = self.execute("nc -z {} {}".format(addr, port))
status, _ = self.execute(f"nc -z {addr} {port}")
return status != 0
with self.nested(
"waiting for TCP port {} on {} to be closed".format(port, addr)
):
with self.nested(f"waiting for TCP port {port} on {addr} to be closed"):
retry(port_is_closed)
def start_job(self, jobname: str, user: Optional[str] = None) -> Tuple[int, str]:
return self.systemctl("start {}".format(jobname), user)
return self.systemctl(f"start {jobname}", user)
def stop_job(self, jobname: str, user: Optional[str] = None) -> Tuple[int, str]:
return self.systemctl("stop {}".format(jobname), user)
return self.systemctl(f"stop {jobname}", user)
def wait_for_job(self, jobname: str) -> None:
self.wait_for_unit(jobname)
@@ -741,21 +730,21 @@ class Machine:
toc = time.time()
self.log("connected to guest root shell")
self.log("(connecting took {:.2f} seconds)".format(toc - tic))
self.log(f"(connecting took {toc - tic:.2f} seconds)")
self.connected = True
def screenshot(self, filename: str) -> None:
word_pattern = re.compile(r"^\w+$")
if word_pattern.match(filename):
filename = os.path.join(self.out_dir, "{}.png".format(filename))
tmp = "{}.ppm".format(filename)
filename = os.path.join(self.out_dir, f"{filename}.png")
tmp = f"{filename}.ppm"
with self.nested(
"making screenshot {}".format(filename),
f"making screenshot {filename}",
{"image": os.path.basename(filename)},
):
self.send_monitor_command("screendump {}".format(tmp))
ret = subprocess.run("pnmtopng {} > {}".format(tmp, filename), shell=True)
self.send_monitor_command(f"screendump {tmp}")
ret = subprocess.run(f"pnmtopng {tmp} > {filename}", shell=True)
os.unlink(tmp)
if ret.returncode != 0:
raise Exception("Cannot convert screenshot")
@@ -817,7 +806,7 @@ class Machine:
def dump_tty_contents(self, tty: str) -> None:
"""Debugging: Dump the contents of the TTY<n>"""
self.execute("fold -w 80 /dev/vcs{} | systemd-cat".format(tty))
self.execute(f"fold -w 80 /dev/vcs{tty} | systemd-cat")
def _get_screen_text_variants(self, model_ids: Iterable[int]) -> List[str]:
with tempfile.TemporaryDirectory() as tmpdir:
@@ -839,15 +828,15 @@ class Machine:
return True
if last:
self.log("Last OCR attempt failed. Text was: {}".format(variants))
self.log(f"Last OCR attempt failed. Text was: {variants}")
return False
with self.nested("waiting for {} to appear on screen".format(regex)):
with self.nested(f"waiting for {regex} to appear on screen"):
retry(screen_matches)
def wait_for_console_text(self, regex: str) -> None:
with self.nested("waiting for {} to appear on console".format(regex)):
with self.nested(f"waiting for {regex} to appear on console"):
# Buffer the console output, this is needed
# to match multiline regexes.
console = io.StringIO()
@@ -864,7 +853,7 @@ class Machine:
def send_key(self, key: str, delay: Optional[float] = 0.01) -> None:
key = CHAR_TO_KEY.get(key, key)
self.send_monitor_command("sendkey {}".format(key))
self.send_monitor_command(f"sendkey {key}")
if delay is not None:
time.sleep(delay)
@@ -923,7 +912,7 @@ class Machine:
self.pid = self.process.pid
self.booted = True
self.log("QEMU running (pid {})".format(self.pid))
self.log(f"QEMU running (pid {self.pid})")
def cleanup_statedir(self) -> None:
shutil.rmtree(self.state_dir)
@@ -977,7 +966,7 @@ class Machine:
names = self.get_window_names()
if last_try:
self.log(
"Last chance to match {} on the window list,".format(regexp)
f"Last chance to match {regexp} on the window list,"
+ " which currently contains: "
+ ", ".join(names)
)
@@ -994,9 +983,7 @@ class Machine:
"""Forward a TCP port on the host to a TCP port on the guest.
Useful during interactive testing.
"""
self.send_monitor_command(
"hostfwd_add tcp::{}-:{}".format(host_port, guest_port)
)
self.send_monitor_command(f"hostfwd_add tcp::{host_port}-:{guest_port}")
def block(self) -> None:
"""Make the machine unreachable by shutting down eth1 (the multicast
+9 -1
View File
@@ -77,6 +77,14 @@ let
else
config.boot.loader.timeout * 10;
# Timeout in grub is in seconds.
# null means max timeout (infinity)
# 0 means disable timeout
grubEfiTimeout = if config.boot.loader.timeout == null then
-1
else
config.boot.loader.timeout;
# The configuration file for syslinux.
# Notes on syslinux configuration and UNetbootin compatibility:
@@ -284,7 +292,7 @@ let
if serial; then set with_serial=yes ;fi
export with_serial
clear
set timeout=10
set timeout=${toString grubEfiTimeout}
# This message will only be viewable when "gfxterm" is not used.
echo ""
+1
View File
@@ -520,6 +520,7 @@
./services/logging/syslog-ng.nix
./services/logging/syslogd.nix
./services/logging/vector.nix
./services/logging/ulogd.nix
./services/mail/clamsmtp.nix
./services/mail/davmail.nix
./services/mail/dkimproxy-out.nix
+48
View File
@@ -0,0 +1,48 @@
{ config, lib, pkgs, ... }:
with lib;
let
cfg = config.services.ulogd;
settingsFormat = pkgs.formats.ini { };
settingsFile = settingsFormat.generate "ulogd.conf" cfg.settings;
in {
options = {
services.ulogd = {
enable = mkEnableOption (lib.mdDoc "ulogd");
settings = mkOption {
example = {
global.stack = "stack=log1:NFLOG,base1:BASE,pcap1:PCAP";
log1.group = 2;
pcap1 = {
file = "/var/log/ulogd.pcap";
sync = 1;
};
};
type = settingsFormat.type;
default = { };
description = lib.mdDoc "Configuration for ulogd. See {file}`/share/doc/ulogd/` in `pkgs.ulogd.doc`.";
};
logLevel = mkOption {
type = types.enum [ 1 3 5 7 8 ];
default = 5;
description = lib.mdDoc "Log level (1 = debug, 3 = info, 5 = notice, 7 = error, 8 = fatal)";
};
};
};
config = mkIf cfg.enable {
systemd.services.ulogd = {
description = "Ulogd Daemon";
wantedBy = [ "multi-user.target" ];
wants = [ "network-pre.target" ];
before = [ "network-pre.target" ];
serviceConfig = {
ExecStart = "${pkgs.ulogd}/bin/ulogd -c ${settingsFile} --verbose --loglevel ${toString cfg.logLevel}";
ExecReload = "${pkgs.coreutils}/bin/kill -HUP $MAINPID";
};
};
};
}
@@ -168,8 +168,7 @@ in
inherit originRequest;
credentialsFile = mkOption {
type = with types; nullOr str;
default = null;
type = types.str;
description = lib.mdDoc ''
Credential file.
@@ -190,8 +189,7 @@ in
};
default = mkOption {
type = with types; nullOr str;
default = null;
type = types.str;
description = lib.mdDoc ''
Catch-all service if no ingress matches.
@@ -262,12 +260,12 @@ in
systemd.targets =
mapAttrs'
(name: tunnel:
nameValuePair "cloudflared-tunnel-${name}" ({
description = lib.mdDoc "Cloudflare tunnel '${name}' target";
nameValuePair "cloudflared-tunnel-${name}" {
description = "Cloudflare tunnel '${name}' target";
requires = [ "cloudflared-tunnel-${name}.service" ];
after = [ "cloudflared-tunnel-${name}.service" ];
unitConfig.StopWhenUnneeded = true;
})
}
)
config.services.cloudflared.tunnels;
@@ -32,6 +32,7 @@ let
description = lib.mdDoc "Username to authenticate with.";
example = "example-user";
type = types.nullOr types.str;
default = null;
};
# Note: It does not make sense to provide a way to declaratively
@@ -108,7 +109,7 @@ let
ExecStart = "${openconnect}/bin/openconnect --config=${
generateConfig name icfg
} ${icfg.gateway}";
StandardInput = "file:${icfg.passwordFile}";
StandardInput = lib.mkIf (icfg.passwordFile != null) "file:${icfg.passwordFile}";
ProtectHome = true;
};
@@ -0,0 +1,139 @@
<chapter xmlns="http://docbook.org/ns/docbook"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:xi="http://www.w3.org/2001/XInclude"
version="5.0"
xml:id="module-services-garage">
<title>Garage</title>
<para>
<link xlink:href="https://garagehq.deuxfleurs.fr/">Garage</link>
is an open-source, self-hostable S3 store, simpler than MinIO, for geodistributed stores.
The server setup can be automated using
<link linkend="opt-services.garage.enable">services.garage</link>. A
client configured to your local Garage instance is available in
the global environment as <literal>garage-manage</literal>.
</para>
<para>
The current default by NixOS is <package>garage_0_8</package> which is also the latest
major version available.
</para>
<section xml:id="module-services-garage-upgrade-scenarios">
<title>General considerations on upgrades</title>
<para>
Garage provides a cookbook documentation on how to upgrade:
<link xlink:href="https://garagehq.deuxfleurs.fr/documentation/cookbook/upgrading/">https://garagehq.deuxfleurs.fr/documentation/cookbook/upgrading/</link>
</para>
<warning>
<para>Garage has two types of upgrades: patch-level upgrades and minor/major version upgrades.</para>
<para>In all cases, you should read the changelog and ideally test the upgrade on a staging cluster.</para>
<para>Checking the health of your cluster can be achieved using <literal>garage-manage repair</literal>.</para>
</warning>
<warning>
<para>Until 1.0 is released, patch-level upgrades are considered as minor version upgrades.
Minor version upgrades are considered as major version upgrades.
i.e. 0.6 to 0.7 is a major version upgrade.</para>
</warning>
<itemizedlist>
<listitem>
<formalpara>
<title>Straightforward upgrades (patch-level upgrades)</title>
<para>
Upgrades must be performed one by one, i.e. for each node, stop it, upgrade it : change <link linkend="opt-system.stateVersion">stateVersion</link> or <link linkend="opt-services.garage.package">services.garage.package</link>, restart it if it was not already by switching.
</para>
</formalpara>
</listitem>
<listitem>
<formalpara>
<title>Multiple version upgrades</title>
<para>
Garage do not provide any guarantee on moving more than one major-version forward.
E.g., if you're on <literal>0.7</literal>, you cannot upgrade to <literal>0.9</literal>.
You need to upgrade to <literal>0.8</literal> first.
As long as <link linkend="opt-system.stateVersion">stateVersion</link> is declared properly,
this is enforced automatically. The module will issue a warning to remind the user to upgrade to latest
Garage <emphasis>after</emphasis> that deploy.
</para>
</formalpara>
</listitem>
</itemizedlist>
</section>
<section xml:id="module-services-garage-advanced-upgrades">
<title>Advanced upgrades (minor/major version upgrades)</title>
<para>Here are some baseline instructions to handle advanced upgrades in Garage, when in doubt, please refer to upstream instructions.</para>
<itemizedlist>
<listitem><para>Disable API and web access to Garage.</para></listitem>
<listitem><para>Perform <literal>garage-manage repair --all-nodes --yes tables</literal> and <literal>garage-manage repair --all-nodes --yes blocks</literal>.</para></listitem>
<listitem><para>Verify the resulting logs and check that data is synced properly between all nodes.
If you have time, do additional checks (<literal>scrub</literal>, <literal>block_refs</literal>, etc.).</para></listitem>
<listitem><para>Check if queues are empty by <literal>garage-manage stats</literal> or through monitoring tools.</para></listitem>
<listitem><para>Run <literal>systemctl stop garage</literal> to stop the actual Garage version.</para></listitem>
<listitem><para>Backup the metadata folder of ALL your nodes, e.g. for a metadata directory (the default one) in <literal>/var/lib/garage/meta</literal>,
you can run <literal>pushd /var/lib/garage; tar -acf meta-v0.7.tar.zst meta/; popd</literal>.</para></listitem>
<listitem><para>Run the offline migration: <literal>nix-shell -p garage_0_8 --run "garage offline-repair --yes"</literal>, this can take some time depending on how many objects are stored in your cluster.</para></listitem>
<listitem><para>Bump Garage version in your NixOS configuration, either by changing <link linkend="opt-system.stateVersion">stateVersion</link> or bumping <link linkend="opt-services.garage.package">services.garage.package</link>, this should restart Garage automatically.</para></listitem>
<listitem><para>Perform <literal>garage-manage repair --all-nodes --yes tables</literal> and <literal>garage-manage repair --all-nodes --yes blocks</literal>.</para></listitem>
<listitem><para>Wait for a full table sync to run.</para></listitem>
</itemizedlist>
<para>
Your upgraded cluster should be in a working state, re-enable API and web access.
</para>
</section>
<section xml:id="module-services-garage-maintainer-info">
<title>Maintainer information</title>
<para>
As stated in the previous paragraph, we must provide a clean upgrade-path for Garage
since it cannot move more than one major version forward on a single upgrade. This chapter
adds some notes how Garage updates should be rolled out in the future.
This is inspired from how Nextcloud does it.
</para>
<para>
While patch-level updates are no problem and can be done directly in the
package-expression (and should be backported to supported stable branches after that),
major-releases should be added in a new attribute (e.g. Garage <literal>v0.8.0</literal>
should be available in <literal>nixpkgs</literal> as <literal>pkgs.garage_0_8_0</literal>).
To provide simple upgrade paths it's generally useful to backport those as well to stable
branches. As long as the package-default isn't altered, this won't break existing setups.
After that, the versioning-warning in the <literal>garage</literal>-module should be
updated to make sure that the
<link linkend="opt-services.garage.package">package</link>-option selects the latest version
on fresh setups.
</para>
<para>
If major-releases will be abandoned by upstream, we should check first if those are needed
in NixOS for a safe upgrade-path before removing those. In that case we shold keep those
packages, but mark them as insecure in an expression like this (in
<literal>&lt;nixpkgs/pkgs/tools/filesystem/garage/default.nix&gt;</literal>):
<programlisting>/* ... */
{
garage_0_7_3 = generic {
version = "0.7.3";
sha256 = "0000000000000000000000000000000000000000000000000000";
eol = true;
};
}</programlisting>
</para>
<para>
Ideally we should make sure that it's possible to jump two NixOS versions forward:
i.e. the warnings and the logic in the module should guard a user to upgrade from a
Garage on e.g. 22.11 to a Garage on 23.11.
</para>
</section>
</chapter>
@@ -8,7 +8,10 @@ let
configFile = toml.generate "garage.toml" cfg.settings;
in
{
meta.maintainers = [ maintainers.raitobezarius ];
meta = {
doc = ./garage-doc.xml;
maintainers = with pkgs.lib.maintainers; [ raitobezarius ];
};
options.services.garage = {
enable = mkEnableOption (lib.mdDoc "Garage Object Storage (S3 compatible)");
@@ -56,10 +59,12 @@ in
};
package = mkOption {
default = pkgs.garage;
defaultText = literalExpression "pkgs.garage";
# TODO: when 23.05 is released and if Garage 0.9 is the default, put a stateVersion check.
default = if versionAtLeast stateVersion "23.05" then pkgs.garage_0_8_0
else pkgs.garage_0_7;
defaultText = literalExpression "pkgs.garage_0_7";
type = types.package;
description = lib.mdDoc "Garage package to use.";
description = lib.mdDoc "Garage package to use, if you are upgrading from a major version, please read NixOS and Garage release notes for upgrade instructions.";
};
};
+3 -1
View File
@@ -229,7 +229,7 @@ in {
fsck = handleTest ./fsck.nix {};
ft2-clone = handleTest ./ft2-clone.nix {};
mimir = handleTest ./mimir.nix {};
garage = handleTest ./garage.nix {};
garage = handleTest ./garage {};
gerrit = handleTest ./gerrit.nix {};
geth = handleTest ./geth.nix {};
ghostunnel = handleTest ./ghostunnel.nix {};
@@ -240,6 +240,7 @@ in {
gitolite-fcgiwrap = handleTest ./gitolite-fcgiwrap.nix {};
glusterfs = handleTest ./glusterfs.nix {};
gnome = handleTest ./gnome.nix {};
gnome-flashback = handleTest ./gnome-flashback.nix {};
gnome-xorg = handleTest ./gnome-xorg.nix {};
go-neb = handleTest ./go-neb.nix {};
gobgpd = handleTest ./gobgpd.nix {};
@@ -683,6 +684,7 @@ in {
tuxguitar = handleTest ./tuxguitar.nix {};
ucarp = handleTest ./ucarp.nix {};
udisks2 = handleTest ./udisks2.nix {};
ulogd = handleTest ./ulogd.nix {};
unbound = handleTest ./unbound.nix {};
unifi = handleTest ./unifi.nix {};
unit-php = handleTest ./web-servers/unit-php.nix {};
+98
View File
@@ -0,0 +1,98 @@
args@{ mkNode, ... }:
(import ../make-test-python.nix ({ pkgs, ...} : {
name = "garage-basic";
meta = {
maintainers = with pkgs.lib.maintainers; [ raitobezarius ];
};
nodes = {
single_node = mkNode { replicationMode = "none"; };
};
testScript = ''
from typing import List
from dataclasses import dataclass
import re
start_all()
cur_version_regex = re.compile('Current cluster layout version: (?P<ver>\d*)')
key_creation_regex = re.compile('Key name: (?P<key_name>.*)\nKey ID: (?P<key_id>.*)\nSecret key: (?P<secret_key>.*)')
@dataclass
class S3Key:
key_name: str
key_id: str
secret_key: str
@dataclass
class GarageNode:
node_id: str
host: str
def get_node_fqn(machine: Machine) -> GarageNode:
node_id, host = machine.succeed("garage node id").split('@')
return GarageNode(node_id=node_id, host=host)
def get_node_id(machine: Machine) -> str:
return get_node_fqn(machine).node_id
def get_layout_version(machine: Machine) -> int:
version_data = machine.succeed("garage layout show")
m = cur_version_regex.search(version_data)
if m and m.group('ver') is not None:
return int(m.group('ver')) + 1
else:
raise ValueError('Cannot find current layout version')
def apply_garage_layout(machine: Machine, layouts: List[str]):
for layout in layouts:
machine.succeed(f"garage layout assign {layout}")
version = get_layout_version(machine)
machine.succeed(f"garage layout apply --version {version}")
def create_api_key(machine: Machine, key_name: str) -> S3Key:
output = machine.succeed(f"garage key new --name {key_name}")
m = key_creation_regex.match(output)
if not m or not m.group('key_id') or not m.group('secret_key'):
raise ValueError('Cannot parse API key data')
return S3Key(key_name=key_name, key_id=m.group('key_id'), secret_key=m.group('secret_key'))
def get_api_key(machine: Machine, key_pattern: str) -> S3Key:
output = machine.succeed(f"garage key info {key_pattern}")
m = key_creation_regex.match(output)
if not m or not m.group('key_name') or not m.group('key_id') or not m.group('secret_key'):
raise ValueError('Cannot parse API key data')
return S3Key(key_name=m.group('key_name'), key_id=m.group('key_id'), secret_key=m.group('secret_key'))
def test_bucket_writes(node):
node.succeed("garage bucket create test-bucket")
s3_key = create_api_key(node, "test-api-key")
node.succeed("garage bucket allow --read --write test-bucket --key test-api-key")
other_s3_key = get_api_key(node, 'test-api-key')
assert other_s3_key.secret_key == other_s3_key.secret_key
node.succeed(
f"mc alias set test-garage http://[::1]:3900 {s3_key.key_id} {s3_key.secret_key} --api S3v4"
)
node.succeed("echo test | mc pipe test-garage/test-bucket/test.txt")
assert node.succeed("mc cat test-garage/test-bucket/test.txt").strip() == "test"
def test_bucket_over_http(node, bucket='test-bucket', url=None):
if url is None:
url = f"{bucket}.web.garage"
node.succeed(f'garage bucket website --allow {bucket}')
node.succeed(f'echo hello world | mc pipe test-garage/{bucket}/index.html')
assert (node.succeed(f"curl -H 'Host: {url}' http://localhost:3902")).strip() == 'hello world'
with subtest("Garage works as a single-node S3 storage"):
single_node.wait_for_unit("garage.service")
single_node.wait_for_open_port(3900)
# Now Garage is initialized.
single_node_id = get_node_id(single_node)
apply_garage_layout(single_node, [f'-z qemutest -c 1 "{single_node_id}"'])
# Now Garage is operational.
test_bucket_writes(single_node)
test_bucket_over_http(single_node)
'';
})) args
+53
View File
@@ -0,0 +1,53 @@
{ system ? builtins.currentSystem
, config ? { }
, pkgs ? import ../../.. { inherit system config; }
}:
with pkgs.lib;
let
mkNode = package: { replicationMode, publicV6Address ? "::1" }: { pkgs, ... }: {
networking.interfaces.eth1.ipv6.addresses = [{
address = publicV6Address;
prefixLength = 64;
}];
networking.firewall.allowedTCPPorts = [ 3901 3902 ];
services.garage = {
enable = true;
inherit package;
settings = {
replication_mode = replicationMode;
rpc_bind_addr = "[::]:3901";
rpc_public_addr = "[${publicV6Address}]:3901";
rpc_secret = "5c1915fa04d0b6739675c61bf5907eb0fe3d9c69850c83820f51b4d25d13868c";
s3_api = {
s3_region = "garage";
api_bind_addr = "[::]:3900";
root_domain = ".s3.garage";
};
s3_web = {
bind_addr = "[::]:3902";
root_domain = ".web.garage";
index = "index.html";
};
};
};
environment.systemPackages = [ pkgs.minio-client ];
# Garage requires at least 1GiB of free disk space to run.
virtualisation.diskSize = 2 * 1024;
};
in
foldl
(matrix: ver: matrix // {
"basic${toString ver}" = import ./basic.nix { inherit system pkgs; mkNode = mkNode pkgs."garage_${ver}"; };
"with-3node-replication${toString ver}" = import ./with-3node-replication.nix { inherit system pkgs; mkNode = mkNode pkgs."garage_${ver}"; };
})
{}
[
"0_8_0"
]
@@ -1,50 +1,12 @@
import ./make-test-python.nix ({ pkgs, ...} :
let
mkNode = { replicationMode, publicV6Address ? "::1" }: { pkgs, ... }: {
networking.interfaces.eth1.ipv6.addresses = [{
address = publicV6Address;
prefixLength = 64;
}];
networking.firewall.allowedTCPPorts = [ 3901 3902 ];
services.garage = {
enable = true;
settings = {
replication_mode = replicationMode;
rpc_bind_addr = "[::]:3901";
rpc_public_addr = "[${publicV6Address}]:3901";
rpc_secret = "5c1915fa04d0b6739675c61bf5907eb0fe3d9c69850c83820f51b4d25d13868c";
s3_api = {
s3_region = "garage";
api_bind_addr = "[::]:3900";
root_domain = ".s3.garage";
};
s3_web = {
bind_addr = "[::]:3902";
root_domain = ".web.garage";
index = "index.html";
};
};
};
environment.systemPackages = [ pkgs.minio-client ];
# Garage requires at least 1GiB of free disk space to run.
virtualisation.diskSize = 2 * 1024;
};
in {
name = "garage";
args@{ mkNode, ... }:
(import ../make-test-python.nix ({ pkgs, ...} :
{
name = "garage-3node-replication";
meta = {
maintainers = with pkgs.lib.maintainers; [ raitobezarius ];
};
nodes = {
single_node = mkNode { replicationMode = "none"; };
node1 = mkNode { replicationMode = 3; publicV6Address = "fc00:1::1"; };
node2 = mkNode { replicationMode = 3; publicV6Address = "fc00:1::2"; };
node3 = mkNode { replicationMode = 3; publicV6Address = "fc00:1::3"; };
@@ -126,16 +88,6 @@ in {
node.succeed(f'echo hello world | mc pipe test-garage/{bucket}/index.html')
assert (node.succeed(f"curl -H 'Host: {url}' http://localhost:3902")).strip() == 'hello world'
with subtest("Garage works as a single-node S3 storage"):
single_node.wait_for_unit("garage.service")
single_node.wait_for_open_port(3900)
# Now Garage is initialized.
single_node_id = get_node_id(single_node)
apply_garage_layout(single_node, [f'-z qemutest -c 1 "{single_node_id}"'])
# Now Garage is operational.
test_bucket_writes(single_node)
test_bucket_over_http(single_node)
with subtest("Garage works as a multi-node S3 storage"):
nodes = ('node1', 'node2', 'node3', 'node4')
rev_machines = {m.name: m for m in machines}
@@ -166,4 +118,4 @@ in {
for node in nodes:
test_bucket_over_http(get_machine(node))
'';
})
})) args
+51
View File
@@ -0,0 +1,51 @@
import ./make-test-python.nix ({ pkgs, lib, ...} : {
name = "gnome-flashback";
meta = with lib; {
maintainers = teams.gnome.members ++ [ maintainers.chpatrick ];
};
nodes.machine = { nodes, ... }: let
user = nodes.machine.config.users.users.alice;
in
{ imports = [ ./common/user-account.nix ];
services.xserver.enable = true;
services.xserver.displayManager = {
gdm.enable = true;
gdm.debug = true;
autoLogin = {
enable = true;
user = user.name;
};
};
services.xserver.desktopManager.gnome.enable = true;
services.xserver.desktopManager.gnome.debug = true;
services.xserver.desktopManager.gnome.flashback.enableMetacity = true;
services.xserver.displayManager.defaultSession = "gnome-flashback-metacity";
};
testScript = { nodes, ... }: let
user = nodes.machine.config.users.users.alice;
uid = toString user.uid;
xauthority = "/run/user/${uid}/gdm/Xauthority";
in ''
with subtest("Login to GNOME Flashback with GDM"):
machine.wait_for_x()
# Wait for alice to be logged in"
machine.wait_for_unit("default.target", "${user.name}")
machine.wait_for_file("${xauthority}")
machine.succeed("xauth merge ${xauthority}")
# Check that logging in has given the user ownership of devices
assert "alice" in machine.succeed("getfacl -p /dev/snd/timer")
with subtest("Wait for Metacity"):
machine.wait_until_succeeds(
"pgrep metacity"
)
machine.sleep(20)
machine.screenshot("screen")
'';
})
+84
View File
@@ -0,0 +1,84 @@
import ./make-test-python.nix ({ pkgs, lib, ... }: {
name = "ulogd";
meta = with lib; {
maintainers = with maintainers; [ p-h ];
};
nodes.machine = { ... }: {
networking.firewall.enable = false;
networking.nftables.enable = true;
networking.nftables.ruleset = ''
table inet filter {
chain input {
type filter hook input priority 0;
log group 2 accept
}
chain output {
type filter hook output priority 0; policy accept;
log group 2 accept
}
chain forward {
type filter hook forward priority 0; policy drop;
log group 2 accept
}
}
'';
services.ulogd = {
enable = true;
settings = {
global = {
logfile = "/var/log/ulogd.log";
stack = "log1:NFLOG,base1:BASE,pcap1:PCAP";
};
log1.group = 2;
pcap1 = {
file = "/var/log/ulogd.pcap";
sync = 1;
};
};
};
environment.systemPackages = with pkgs; [
tcpdump
];
};
testScript = ''
start_all()
machine.wait_for_unit("ulogd.service")
machine.wait_for_unit("network-online.target")
with subtest("Ulogd is running"):
machine.succeed("pgrep ulogd >&2")
# All packets show up twice in the logs
with subtest("Logs are collected"):
machine.succeed("ping -f 127.0.0.1 -c 5 >&2")
machine.succeed("sleep 2")
machine.wait_until_succeeds("du /var/log/ulogd.pcap >&2")
_, echo_request_packets = machine.execute("tcpdump -r /var/log/ulogd.pcap icmp[0] == 8 and host 127.0.0.1")
expected, actual = 5*2, len(echo_request_packets.splitlines())
assert expected == actual, f"Expected {expected} packets, got: {actual}"
_, echo_reply_packets = machine.execute("tcpdump -r /var/log/ulogd.pcap icmp[0] == 0 and host 127.0.0.1")
expected, actual = 5*2, len(echo_reply_packets.splitlines())
assert expected == actual, f"Expected {expected} packets, got: {actual}"
with subtest("Reloading service reopens log file"):
machine.succeed("mv /var/log/ulogd.pcap /var/log/old_ulogd.pcap")
machine.succeed("systemctl reload ulogd.service")
machine.succeed("ping -f 127.0.0.1 -c 5 >&2")
machine.succeed("sleep 2")
_, echo_request_packets = machine.execute("tcpdump -r /var/log/ulogd.pcap icmp[0] == 8 and host 127.0.0.1")
expected, actual = 5*2, len(echo_request_packets.splitlines())
assert expected == actual, f"Expected {expected} packets, got: {actual}"
_, echo_reply_packets = machine.execute("tcpdump -r /var/log/ulogd.pcap icmp[0] == 0 and host 127.0.0.1")
expected, actual = 5*2, len(echo_reply_packets.splitlines())
assert expected == actual, f"Expected {expected} packets, got: {actual}"
'';
})
@@ -1,4 +1,8 @@
{ lib, stdenv, fetchFromGitHub, pythonPackages, mopidy }:
{ lib
, fetchFromGitHub
, pythonPackages
, mopidy
}:
pythonPackages.buildPythonApplication rec {
pname = "mopidy-musicbox-webclient";
@@ -6,18 +10,22 @@ pythonPackages.buildPythonApplication rec {
src = fetchFromGitHub {
owner = "pimusicbox";
repo = "mopidy-musicbox-webclient";
repo = pname;
rev = "v${version}";
sha256 = "1lzarazq67gciyn6r8cdms0f7j0ayyfwhpf28z93ydb280mfrrb9";
};
propagatedBuildInputs = [ mopidy ];
propagatedBuildInputs = [
mopidy
];
doCheck = false;
meta = with lib; {
description = "Mopidy extension for playing music from SoundCloud";
license = licenses.mit;
maintainers = [ maintainers.spwhitt ];
description = "A Mopidy frontend extension and web client with additional features for Pi MusicBox";
homepage = "https://github.com/pimusicbox/mopidy-musicbox-webclient";
changelog = "https://github.com/pimusicbox/mopidy-musicbox-webclient/blob/v${version}/CHANGELOG.rst";
license = licenses.asl20;
maintainers = with maintainers; [ spwhitt ];
};
}
+2 -2
View File
@@ -24,13 +24,13 @@ let
in
stdenv.mkDerivation rec {
pname = "neovim-unwrapped";
version = "0.8.1";
version = "0.8.2";
src = fetchFromGitHub {
owner = "neovim";
repo = "neovim";
rev = "v${version}";
sha256 = "sha256-B2ZpwhdmdvPOnxVyJDfNzUT5rTVuBhJXyMwwzCl9Fac=";
sha256 = "sha256-eqiH/K8w0FZNHLBBMjiTSQjNQyONqcx3X+d85gPnFJg=";
};
patches = [
@@ -1,13 +1,17 @@
{ fetchzip, lib, stdenv, jdk, runtimeShell }:
{ fetchzip, lib, stdenv, jdk, runtimeShell, glib, wrapGAppsHook }:
stdenv.mkDerivation rec {
version = "5.4.4";
version = "5.5.1";
pname = "keystore-explorer";
src = fetchzip {
url = "https://github.com/kaikramer/keystore-explorer/releases/download/v${version}/kse-544.zip";
sha256 = "01kpa8g6p6vcqq9y70w5bm8jbw4kp55pbywj2zrhgjibrhgjqi0b";
url = "https://github.com/kaikramer/keystore-explorer/releases/download/v${version}/kse-${lib.replaceStrings ["."] [""] version}.zip";
sha256 = "2C/LkUUuef30PkN7HL0CtcNOjR5uNo9XaCiTatv5hgA=";
};
# glib is necessary so file dialogs don't hang.
buildInputs = [ glib ];
nativeBuildInputs = [ wrapGAppsHook ];
installPhase = ''
runHook preInstall
+11 -3
View File
@@ -1,12 +1,19 @@
{ lib, stdenv, fetchurl, appimageTools, makeWrapper, electron, git }:
{ lib
, stdenv
, fetchurl
, appimageTools
, makeWrapper
, electron
, git
}:
stdenv.mkDerivation rec {
pname = "logseq";
version = "0.8.12";
version = "0.8.15";
src = fetchurl {
url = "https://github.com/logseq/logseq/releases/download/${version}/logseq-linux-x64-${version}.AppImage";
sha256 = "sha256-I1jGPNGlZ53N3ZlN9nN/GSgQIfdoUeclyuMl+PpNVY4=";
sha256 = "sha256-lE/bO/zpqChvdf8vfNqbC5iIpXAZDb36/N7Tpsj7PWY=";
name = "${pname}-${version}.AppImage";
};
@@ -52,6 +59,7 @@ stdenv.mkDerivation rec {
meta = with lib; {
description = "A local-first, non-linear, outliner notebook for organizing and sharing your personal knowledge base";
homepage = "https://github.com/logseq/logseq";
changelog = "https://github.com/logseq/logseq/releases/tag/${version}";
license = licenses.agpl3Plus;
maintainers = with maintainers; [ weihua ];
platforms = [ "x86_64-linux" ];
@@ -14,12 +14,12 @@ let
in
stdenv.mkDerivation rec {
pname = "splitter";
version = "652";
version = "653";
src = fetchsvn {
url = "https://svn.mkgmap.org.uk/mkgmap/splitter/trunk";
rev = version;
sha256 = "sha256-yCdVOT8if3AImD4Q63gKfMep7WZsrCgV+IXfP4ZL3Qw=";
sha256 = "sha256-iw414ecnOfeG3FdlIaoVOPv9BXZ95uUHuPzCQGH4G+A=";
};
patches = [
@@ -2,7 +2,7 @@
(callPackage ./generic.nix { }) {
channel = "edge";
version = "22.8.2";
sha256 = "114lfq5d5b09zg14iwnmaf0vmm183xr37q7b4bj3m8zbzhpbk7xx";
vendorSha256 = "sha256-hKdokt5QW50oc2z8UFMq78DRWpwPlL5tSf2F0rQNEQ8=";
version = "22.12.1";
sha256 = "1ss6rhh71nq89ya8312fgy30pdw9vvnvnc8a7zs8a8yqg6p4x9lp";
vendorSha256 = "sha256-V4BQ+7J1T+g5I7SrCexkfe3ngl7Qy3cf0SF+u28QKWE=";
}
@@ -149,13 +149,13 @@
},
"baiducloud": {
"deleteVendor": true,
"hash": "sha256-4v9FuM69U+4V2Iy85vc4RP9KgzeME/R8rXxNSMBABdM=",
"hash": "sha256-13vbO5EJsdVvR456uBCDbFBWlOaAZb9XhNJ7fE8fjto=",
"homepage": "https://registry.terraform.io/providers/baidubce/baiducloud",
"owner": "baidubce",
"repo": "terraform-provider-baiducloud",
"rev": "v1.18.4",
"rev": "v1.19.0",
"spdx": "MPL-2.0",
"vendorHash": "sha256-ya2FpsLQMIu8zWYObpyPgBHVkHoNKzHgdMxukbtsje4="
"vendorHash": "sha256-3PLBs8LSE5JPtrhmdx+jQsnCrfZQQEUGA7wnf9M72yY="
},
"bigip": {
"hash": "sha256-VntKiBTQxe8lKV8Bb3A0moA/EUzyQQ7CInPjKJL4iBQ=",
@@ -415,13 +415,13 @@
"vendorHash": "sha256-ZgVA2+2tu17dnAc51Aw3k6v8k7QosNTmFjFhmeknxa8="
},
"gandi": {
"hash": "sha256-dF3YCX3ghjg/OGLQT3Vzs/VLRoiuDXrTo5xP1Y8Jhgw=",
"hash": "sha256-mQ4L2XCudyPGDw21jihF7nkSct7/KWAe/txnbtuJ8Lk=",
"homepage": "https://registry.terraform.io/providers/go-gandi/gandi",
"owner": "go-gandi",
"repo": "terraform-provider-gandi",
"rev": "v2.2.1",
"rev": "v2.2.2",
"spdx": "MPL-2.0",
"vendorHash": "sha256-cStVmI58V46I3MYYYrbCY3llnOx2pyuM2Ku+rhe5DVQ="
"vendorHash": "sha256-uWTY8cFztXFrQQ7GW6/R+x9M6vHmsb934ldq+oeW5vk="
},
"github": {
"hash": "sha256-o7Sge0rCfP6Yueq+DP7siBsEinawgGe+nEu0/Olu8uQ=",
@@ -1095,11 +1095,11 @@
"vendorHash": "sha256-2wPmLpjhG6QgG+BUCO0oIzHjBOWIOYuptgdtSIm9TZw="
},
"tencentcloud": {
"hash": "sha256-mN52iD0HdsfzPxo9hLFlKxiwIm7641cnjUYk8XyRP0s=",
"hash": "sha256-vXd0yZ57bEdZ0OcIANMWdDN8PzOKnXJKw7HgjcOhSeE=",
"homepage": "https://registry.terraform.io/providers/tencentcloudstack/tencentcloud",
"owner": "tencentcloudstack",
"repo": "terraform-provider-tencentcloud",
"rev": "v1.79.2",
"rev": "v1.79.3",
"spdx": "MPL-2.0",
"vendorHash": null
},
@@ -27,11 +27,11 @@ let
in
stdenv.mkDerivation rec {
pname = "PortfolioPerformance";
version = "0.60.0";
version = "0.60.1";
src = fetchurl {
url = "https://github.com/buchen/portfolio/releases/download/${version}/PortfolioPerformance-${version}-linux.gtk.x86_64.tar.gz";
sha256 = "sha256-L4ZLlxHsnJrvrrrX56Z+agjnaMl472Izm4Un1uaNqZA=";
sha256 = "sha256-Lyo/T8df7tIc+h8MFh6yL+I+2W6On/C5PguNZfQAu9s=";
};
nativeBuildInputs = [
@@ -2,11 +2,11 @@
stdenv.mkDerivation rec {
pname = "workcraft";
version = "3.3.8";
version = "3.3.9";
src = fetchurl {
url = "https://github.com/workcraft/workcraft/releases/download/v${version}/workcraft-v${version}-linux.tar.gz";
sha256 = "sha256-T2rUEZsO8g/nk10LZvC+mXEC6IzutbjncERlmqg814g=";
sha256 = "sha256-Z3QtOGyOjmiM+qfB0FO4UDg8O99Ru/Qy2WNoBpXd1So=";
};
nativeBuildInputs = [ makeWrapper ];
@@ -3,12 +3,12 @@
stdenv.mkDerivation rec {
pname = "seabios";
version = "1.16.0";
version = "1.16.1";
src = fetchgit {
url = "https://git.seabios.org/seabios.git";
rev = "rel-${version}";
sha256 = "0acal1rr7sya86wlhw2mgimabwhjnr0y1pl5zxwb79j8k1w1r8sh";
sha256 = "sha256-oIl2ZbhgSiVJPMBGbVt6N074vOifAoZL6VdKcBwM8D4=";
};
nativeBuildInputs = [ python3 ];
@@ -65,5 +65,5 @@ writeTextFile {
name = "${name}.pc";
destination = "/lib/pkgconfig/${name}.pc";
text = builtins.concatStringsSep "\n" content;
checkPhase = ''${buildPackages.pkg-config}/bin/pkg-config --validate "$target"'';
checkPhase = ''${buildPackages.pkg-config}/bin/${buildPackages.pkg-config.targetPrefix}pkg-config --validate "$target"'';
}
+2 -2
View File
@@ -4,10 +4,10 @@
fetchzip rec {
pname = "hackgen-font";
version = "2.7.1";
version = "2.8.0";
url = "https://github.com/yuru7/HackGen/releases/download/v${version}/HackGen_v${version}.zip";
sha256 = "sha256-UL6U/q2u1UUP31lp0tEnFjzkn6dn8AY6hk5hJhPsOAE=";
sha256 = "sha256-TLqns6ulovHRKoLHxxwKpj6SqfCq5UDVBf7gUASCGK4=";
postFetch = ''
install -Dm644 $out/*.ttf -t $out/share/fonts/hackgen
shopt -s extglob dotglob
+15 -7
View File
@@ -1,6 +1,7 @@
{ stdenv
, lib
, fetchFromGitHub
, fetchpatch
, substituteAll
, cairo
, cinnamon-desktop
@@ -39,13 +40,6 @@ stdenv.mkDerivation rec {
outputs = [ "out" "dev" "man" ];
patches = [
(substituteAll {
src = ./fix-paths.patch;
zenity = gnome.zenity;
})
];
src = fetchFromGitHub {
owner = "linuxmint";
repo = pname;
@@ -53,6 +47,20 @@ stdenv.mkDerivation rec {
hash = "sha256-bHEBzl0aBXsHOhSWJUz428pG5M6L0s/Q6acKO+2oMXo=";
};
patches = [
(substituteAll {
src = ./fix-paths.patch;
zenity = gnome.zenity;
})
# compositor: Fix crash when restarting Cinnamon
# https://github.com/linuxmint/muffin/pull/655
(fetchpatch {
url = "https://github.com/linuxmint/muffin/commit/1a941ec603a1565dbd2f943f7da6e877d1541bcb.patch";
sha256 = "sha256-6x64rWQ20ZjM9z79Pg6QMDPeFN5VNdDHBueRvy2kA6c=";
})
];
nativeBuildInputs = [
desktop-file-utils
mesa # needed for gbm
@@ -180,9 +180,11 @@ let
dontWrapGApps = true; # We want to do the wrapping ourselves.
# gnome-flashback and gnome-panel need to be added to XDG_DATA_DIRS so that their .desktop files can be found by gnome-session.
# We need to pass the --builtin flag so that gnome-session invokes gnome-session-binary instead of systemd.
# If systemd is used, it doesn't use the environment we set up here and so it can't find the .desktop files.
preFixup = ''
makeWrapper ${gnome-session}/bin/gnome-session $out \
--add-flags "--session=gnome-flashback-${wmName}" \
--add-flags "--session=gnome-flashback-${wmName} --builtin" \
--set-default XDG_CURRENT_DESKTOP 'GNOME-Flashback:GNOME' \
--prefix XDG_DATA_DIRS : '${lib.makeSearchPath "share" ([ wmApplication gnomeSession gnome-flashback ] ++ lib.optional enableGnomePanel gnome-panel)}' \
"''${gappsWrapperArgs[@]}" \
@@ -163,4 +163,8 @@ rec {
inherit callPackage fetchFromGitHub passthruFun;
};
luajit_openresty = import ../luajit/openresty.nix {
self = luajit_openresty;
inherit callPackage fetchFromGitHub passthruFun;
};
}
+1 -1
View File
@@ -2,7 +2,7 @@
callPackage ./default.nix {
version = "2.0.5-2022-09-13";
isStable = true;
src = fetchFromGitHub {
owner = "LuaJIT";
repo = "LuaJIT";
+2 -1
View File
@@ -1,7 +1,8 @@
{ self, callPackage, fetchFromGitHub, passthruFun }:
callPackage ./default.nix {
version = "2.1.0-2022-10-04";
isStable = false;
src = fetchFromGitHub {
owner = "LuaJIT";
repo = "LuaJIT";
@@ -2,7 +2,6 @@
, stdenv
, fetchFromGitHub
, buildPackages
, isStable
, version
, src
, extraMeta ? { }
@@ -71,7 +70,7 @@ stdenv.mkDerivation rec {
} >> src/luaconf.h
'';
configurePhase = false;
dontConfigure = true;
buildInputs = lib.optional enableValgrindSupport valgrind;
@@ -91,8 +90,9 @@ stdenv.mkDerivation rec {
postInstall = ''
( cd "$out/include"; ln -s luajit-*/* . )
ln -s "$out"/bin/luajit-* "$out"/bin/lua
'' + lib.optionalString (!isStable) ''
ln -s "$out"/bin/luajit-* "$out"/bin/luajit
if [[ ! -e "$out"/bin/luajit ]]; then
ln -s "$out"/bin/luajit* "$out"/bin/luajit
fi
'';
LuaPathSearchPaths = luaPackages.luaLib.luaPathList;
@@ -117,7 +117,7 @@ stdenv.mkDerivation rec {
meta = with lib; {
description = "High-performance JIT compiler for Lua 5.1";
homepage = "http://luajit.org";
homepage = "https://luajit.org/";
license = licenses.mit;
platforms = platforms.linux ++ platforms.darwin;
# See https://github.com/LuaJIT/LuaJIT/issues/628
@@ -0,0 +1,14 @@
{ self, callPackage, fetchFromGitHub, passthruFun }:
callPackage ./default.nix rec {
version = "2.1-20220915";
src = fetchFromGitHub {
owner = "openresty";
repo = "luajit2";
rev = "v${version}";
hash = "sha256-kMHE4iQtm2CujK9TVut1jNhY2QxYP514jfBsxOCyd4s=";
};
inherit self passthruFun;
}
@@ -2,6 +2,7 @@
, lib
, fetchgit
, autoreconfHook
, buildPackages
, optimize ? false # impure hardware optimizations
}:
stdenv.mkDerivation rec {
@@ -16,6 +17,8 @@ stdenv.mkDerivation rec {
sha256 = "04g5jg0i4vz46b4w2dvbmahwzi3k6b8g515mfw7im1inc78s14id";
};
depsBuildBuild = [ buildPackages.stdenv.cc ];
nativeBuildInputs = [
autoreconfHook
];
+3 -1
View File
@@ -1,9 +1,11 @@
{ lib, stdenv, fetchurl, m4, which, yasm }:
{ lib, stdenv, fetchurl, m4, which, yasm, buildPackages }:
stdenv.mkDerivation rec {
pname = "mpir";
version = "3.0.0";
depsBuildBuild = [ buildPackages.stdenv.cc ];
nativeBuildInputs = [ m4 which yasm ];
src = fetchurl {
@@ -266,7 +266,6 @@ stdenv.mkDerivation rec {
# Move development tools to $dev
moveQtDevTools
moveToOutput bin "$dev"
moveToOutput libexec "$dev"
# fixup .pc file (where to find 'moc' etc.)
@@ -17,4 +17,28 @@ qtModule {
NIX_CFLAGS_COMPILE = [
"-DNIX_OUTPUT_DEV=\"${placeholder "dev"}\""
];
devTools = [
"bin/qcollectiongenerator"
"bin/linguist"
"bin/assistant"
"bin/qdoc"
"bin/lconvert"
"bin/designer"
"bin/qtattributionsscanner"
"bin/lrelease"
"bin/lrelease-pro"
"bin/pixeltool"
"bin/lupdate"
"bin/lupdate-pro"
"bin/qtdiag"
"bin/qhelpgenerator"
"bin/qtplugininfo"
"bin/qthelpconverter"
"bin/lprodump"
"bin/qdistancefieldgenerator"
] ++ lib.optionals stdenv.isDarwin [
"bin/macdeployqt"
];
}
@@ -1,4 +1,4 @@
commit 4f497c358e0386b65df1c1d636aadf72f8647134
commit bd8f6ecea0663bdd150aa48941cbd47d25874396
Author: Nick Cao <nickcao@nichi.co>
Date: Tue Apr 19 13:49:59 2022 +0800
@@ -13,10 +13,10 @@ Date: Tue Apr 19 13:49:59 2022 +0800
generated cmake files to point to the corrected pathes.
diff --git a/Source/cmExportFileGenerator.cxx b/Source/cmExportFileGenerator.cxx
index 8b0f64e23b..03291e2ee2 100644
index 5a33349b19..677a6084d6 100644
--- a/Source/cmExportFileGenerator.cxx
+++ b/Source/cmExportFileGenerator.cxx
@@ -6,6 +6,7 @@
@@ -7,6 +7,7 @@
#include <cstring>
#include <sstream>
#include <utility>
@@ -24,7 +24,7 @@ index 8b0f64e23b..03291e2ee2 100644
#include <cm/memory>
@@ -325,9 +326,23 @@ static void prefixItems(std::string& exportDirs)
@@ -330,9 +331,21 @@ static void prefixItems(std::string& exportDirs)
for (std::string const& e : entries) {
exportDirs += sep;
sep = ";";
@@ -35,8 +35,6 @@ index 8b0f64e23b..03291e2ee2 100644
+ if (std::getenv("dev")) {
+ if (cmHasLiteralPrefix(e, "include") || cmHasLiteralPrefix(e, "./include")) {
+ exportDirs += std::getenv("dev");
+ } else if (cmHasLiteralPrefix(e, "bin") || cmHasLiteralPrefix(e, "./bin")) {
+ exportDirs += std::getenv("dev");
+ } else if (cmHasLiteralPrefix(e, "mkspecs") || cmHasLiteralPrefix(e, "./mkspecs")) {
+ exportDirs += std::getenv("dev");
+ } else if (cmHasLiteralPrefix(e, "libexec") || cmHasLiteralPrefix(e, "./libexec")) {
@@ -52,18 +50,18 @@ index 8b0f64e23b..03291e2ee2 100644
exportDirs += e;
}
diff --git a/Source/cmExportInstallFileGenerator.cxx b/Source/cmExportInstallFileGenerator.cxx
index 4a3c565bce..5afa9e5e50 100644
index adccdfeece..ba248305bd 100644
--- a/Source/cmExportInstallFileGenerator.cxx
+++ b/Source/cmExportInstallFileGenerator.cxx
@@ -5,6 +5,7 @@
@@ -6,6 +6,7 @@
#include <memory>
#include <sstream>
#include <utility>
+#include <cstdlib>
#include "cmExportSet.h"
#include "cmGeneratedFileStream.h"
@@ -263,7 +264,7 @@ void cmExportInstallFileGenerator::LoadConfigFiles(std::ostream& os)
#include "cmFileSet.h"
@@ -266,7 +267,7 @@ void cmExportInstallFileGenerator::LoadConfigFiles(std::ostream& os)
void cmExportInstallFileGenerator::ReplaceInstallPrefix(std::string& input)
{
@@ -72,7 +70,7 @@ index 4a3c565bce..5afa9e5e50 100644
}
bool cmExportInstallFileGenerator::GenerateImportFileConfig(
@@ -381,9 +382,24 @@ void cmExportInstallFileGenerator::SetImportLocationProperty(
@@ -382,9 +383,22 @@ void cmExportInstallFileGenerator::SetImportLocationProperty(
// Construct the installed location of the target.
std::string dest = itgen->GetDestination(config);
std::string value;
@@ -83,8 +81,6 @@ index 4a3c565bce..5afa9e5e50 100644
+ if (std::getenv("dev")) {
+ if (cmHasLiteralPrefix(dest, "include") || cmHasLiteralPrefix(dest, "./include")) {
+ value = std::getenv("dev");
+ } else if (cmHasLiteralPrefix(dest, "bin") || cmHasLiteralPrefix(dest, "./bin")) {
+ value = std::getenv("dev");
+ } else if (cmHasLiteralPrefix(dest, "mkspecs") || cmHasLiteralPrefix(dest, "./mkspecs")) {
+ value = std::getenv("dev");
+ } else if (cmHasLiteralPrefix(dest, "libexec") || cmHasLiteralPrefix(dest, "./libexec")) {
@@ -100,10 +96,10 @@ index 4a3c565bce..5afa9e5e50 100644
value += dest;
value += "/";
diff --git a/Source/cmGeneratorExpression.cxx b/Source/cmGeneratorExpression.cxx
index 840f5112d6..7bb4ab41aa 100644
index f988e54a19..cc5c7ac9fd 100644
--- a/Source/cmGeneratorExpression.cxx
+++ b/Source/cmGeneratorExpression.cxx
@@ -197,7 +197,22 @@ static void prefixItems(const std::string& content, std::string& result,
@@ -192,7 +192,20 @@ static void prefixItems(const std::string& content, std::string& result,
sep = ";";
if (!cmSystemTools::FileIsFullPath(e) &&
cmGeneratorExpression::Find(e) != 0) {
@@ -111,8 +107,6 @@ index 840f5112d6..7bb4ab41aa 100644
+ if (std::getenv("dev")) {
+ if (cmHasLiteralPrefix(e, "include") || cmHasLiteralPrefix(e, "./include")) {
+ result += std::getenv("dev");
+ } else if (cmHasLiteralPrefix(e, "bin") || cmHasLiteralPrefix(e, "./bin")) {
+ result += std::getenv("dev");
+ } else if (cmHasLiteralPrefix(e, "mkspecs") || cmHasLiteralPrefix(e, "./mkspecs")) {
+ result += std::getenv("dev");
+ } else if (cmHasLiteralPrefix(e, "libexec") || cmHasLiteralPrefix(e, "./libexec")) {
+1 -1
View File
@@ -33,7 +33,7 @@ stdenv.mkDerivation (args // {
postInstall = ''
if [ ! -z "$dev" ]; then
mkdir "$dev"
for dir in bin libexec mkspecs
for dir in libexec mkspecs
do
moveToOutput "$dir" "$dev"
done
@@ -2,6 +2,7 @@
{ disabled ? false
, propagatedBuildInputs ? [ ]
, makeFlags ? [ ]
, ...
} @ attrs:
@@ -9,18 +10,16 @@ if disabled then
throw "${attrs.name} not supported by interpreter lua-${lua.luaversion}"
else
toLuaModule (lua.stdenv.mkDerivation (
{
attrs // {
name = "lua${lua.luaversion}-" + attrs.pname + "-" + attrs.version;
makeFlags = [
"PREFIX=$(out)"
"LUA_LIBDIR=$(out)/lib/lua/${lua.luaversion}"
"LUA_INC=-I${lua}/include"
];
}
//
attrs
//
{
name = "lua${lua.luaversion}-" + attrs.pname + "-" + attrs.version;
"LUA_LIBDIR=$(out)/lib/lua/${lua.luaversion}"
"LUA_VERSION=${lua.luaversion}"
] ++ makeFlags;
propagatedBuildInputs = propagatedBuildInputs ++ [
lua # propagate it for its setup-hook
];
@@ -3,10 +3,10 @@
}:
{ toolsVersion ? "26.1.1"
, platformToolsVersion ? "33.0.2"
, buildToolsVersions ? [ "32.0.0" ]
, platformToolsVersion ? "33.0.3"
, buildToolsVersions ? [ "33.0.1" ]
, includeEmulator ? false
, emulatorVersion ? "31.3.9"
, emulatorVersion ? "31.3.14"
, platformVersions ? []
, includeSources ? false
, includeSystemImages ? false
@@ -14,7 +14,7 @@
, abiVersions ? [ "armeabi-v7a" "arm64-v8a" ]
, cmakeVersions ? [ ]
, includeNDK ? false
, ndkVersion ? "24.0.8215888"
, ndkVersion ? "25.1.8937393"
, ndkVersions ? [ndkVersion]
, useGoogleAPIs ? false
, useGoogleTVAddOns ? false
@@ -6,12 +6,15 @@
url = "https://github.com/NixOS/nixpkgs/archive/20.09.tar.gz";
sha256 = "1wg61h4gndm3vcprdcg7rc4s1v3jkm5xd7lw8r2f67w502y94gcy";
}),
pkgs ? import nixpkgsSource {},
pkgsi686Linux ? import nixpkgsSource { system = "i686-linux"; },*/
pkgs ? import nixpkgsSource {
config.allowUnfree = true;
},
*/
# If you want to use the in-tree version of nixpkgs:
pkgs ? import ../../../../.. {},
pkgsi686Linux ? import ../../../../.. { system = "i686-linux"; },
pkgs ? import ../../../../.. {
config.allowUnfree = true;
},
config ? pkgs.config
}:
@@ -23,17 +26,17 @@ let
android = {
versions = {
tools = "26.1.1";
platformTools = "31.0.2";
platformTools = "33.0.3";
buildTools = "30.0.3";
ndk = [
"22.1.7171670"
"21.3.6528147" # LTS NDK
"25.1.8937393" # LTS NDK
"24.0.8215888"
];
cmake = "3.18.1";
emulator = "30.6.3";
cmake = "3.22.1";
emulator = "31.3.14";
};
platforms = ["23" "24" "25" "26" "27" "28" "29" "30"];
platforms = ["23" "24" "25" "26" "27" "28" "29" "30" "31" "32" "33"];
abis = ["armeabi-v7a" "arm64-v8a"];
extras = ["extras;google;gcm"];
};
@@ -46,13 +49,13 @@ let
};
androidEnv = pkgs.callPackage "${androidEnvNixpkgs}/pkgs/development/mobile/androidenv" {
inherit config pkgs pkgsi686Linux;
inherit config pkgs;
licenseAccepted = true;
};*/
# Otherwise, just use the in-tree androidenv:
androidEnv = pkgs.callPackage ./.. {
inherit config pkgs pkgsi686Linux;
inherit config pkgs;
licenseAccepted = true;
};
+18 -4
View File
@@ -17,6 +17,9 @@ end
# Returns a system image URL for a given system image name.
def image_url value, dir
if dir == "default"
dir = "android"
end
if value && value.start_with?('http')
value
elsif value
@@ -154,6 +157,7 @@ def normalize_license license
license = license.dup
license.gsub!(/([^\n])\n([^\n])/m, '\1 \2')
license.gsub!(/ +/, ' ')
license.strip!
license
end
@@ -281,8 +285,18 @@ def parse_addon_xml doc
[licenses, addons, extras]
end
def merge_recursively a, b
a.merge!(b) {|key, a_item, b_item|
if a_item.is_a?(Hash) && b_item.is_a?(Hash)
merge_recursively(a_item, b_item)
else
a[key] = b_item
end
}
end
def merge dest, src
dest.merge! src
merge_recursively dest, src
end
opts = Slop.parse do |o|
@@ -300,19 +314,19 @@ result = {
}
opts[:packages].each do |filename|
licenses, packages = parse_package_xml(Nokogiri::XML(File.open(filename)))
licenses, packages = parse_package_xml(Nokogiri::XML(File.open(filename)) { |conf| conf.noblanks })
merge result[:licenses], licenses
merge result[:packages], packages
end
opts[:images].each do |filename|
licenses, images = parse_image_xml(Nokogiri::XML(File.open(filename)))
licenses, images = parse_image_xml(Nokogiri::XML(File.open(filename)) { |conf| conf.noblanks })
merge result[:licenses], licenses
merge result[:images], images
end
opts[:addons].each do |filename|
licenses, addons, extras = parse_addon_xml(Nokogiri::XML(File.open(filename)))
licenses, addons, extras = parse_addon_xml(Nokogiri::XML(File.open(filename)) { |conf| conf.noblanks })
merge result[:licenses], licenses
merge result[:addons], addons
merge result[:extras], extras
File diff suppressed because one or more lines are too long
@@ -11,7 +11,7 @@
buildPythonPackage rec {
pname = "azure-mgmt-containerservice";
version = "21.0.0";
version = "21.1.0";
format = "setuptools";
disabled = pythonOlder "3.7";
@@ -19,7 +19,7 @@ buildPythonPackage rec {
src = fetchPypi {
inherit pname version;
extension = "zip";
hash = "sha256-9Jhhd/qmphNnmWphXtFr6V52WA7KtKA8lI6cKsdGsOE=";
hash = "sha256-5EOythXO7spLzzlqDWrwcdkkJAMH9W8OBv96rYaWxAY=";
};
propagatedBuildInputs = [
@@ -39,6 +39,7 @@ buildPythonPackage rec {
meta = with lib; {
description = "This is the Microsoft Azure Container Service Management Client Library";
homepage = "https://github.com/Azure/azure-sdk-for-python";
changelog = "https://github.com/Azure/azure-sdk-for-python/blob/azure-mgmt-containerservice_${version}/sdk/containerservice/azure-mgmt-containerservice/CHANGELOG.md";
license = licenses.mit;
maintainers = with maintainers; [ maxwilson ];
};
@@ -28,7 +28,7 @@
buildPythonPackage rec {
pname = "labelbox";
version = "3.33.1";
version = "3.34.0";
format = "setuptools";
disabled = pythonOlder "3.7";
@@ -37,7 +37,7 @@ buildPythonPackage rec {
owner = "Labelbox";
repo = "labelbox-python";
rev = "refs/tags/v.${version}";
hash = "sha256-lYhgBELeVtNUp6ZvcSTIeKp2YkaGt6MH8BbzSERGHXw=";
hash = "sha256-x/XvcGiFS//f/le3JAd2n/tuUy9MBrCsISpkIkCCNis=";
};
postPatch = ''
@@ -7,17 +7,19 @@
, nbformat
, sphinx
, traitlets
, isPy3k
, pythonOlder
}:
buildPythonPackage rec {
pname = "nbsphinx";
version = "0.8.10";
version = "0.8.11";
format = "setuptools";
disabled = pythonOlder "3.7";
src = fetchPypi {
inherit pname version;
sha256 = "sha256-qNaARviquRbilAubOBm9PvndzoaKo4hF6jZmRcq7YlQ=";
hash = "sha256-q+GMBLM9m837PWbxGV9rDVHuykY+ywf2Bh3kl+QzFuQ=";
};
propagatedBuildInputs = [
@@ -33,16 +35,16 @@ buildPythonPackage rec {
doCheck = false;
JUPYTER_PATH = "${nbconvert}/share/jupyter";
pythonImportsCheck = [
"nbsphinx"
];
disabled = !isPy3k;
meta = with lib; {
description = "Jupyter Notebook Tools for Sphinx";
homepage = "https://nbsphinx.readthedocs.io/";
changelog = "https://github.com/spatialaudio/nbsphinx/blob/${version}/NEWS.rst";
license = licenses.mit;
maintainers = [ maintainers.costrouc ];
maintainers = with maintainers; [ costrouc ];
};
}
@@ -1,7 +1,10 @@
{ stdenv
, lib
{ lib
, stdenv
, bash
, buildPythonPackage
, fetchFromGitHub
, gnumake
, httpx
, openssl
, paramiko
, pytest-asyncio
@@ -15,7 +18,7 @@
buildPythonPackage rec {
pname = "proxy-py";
version = "2.4.3";
format = "setuptools";
format = "pyproject";
disabled = pythonOlder "3.7";
@@ -23,9 +26,18 @@ buildPythonPackage rec {
owner = "abhinavsingh";
repo = "proxy.py";
rev = "refs/tags/v${version}";
sha256 = "sha256-dA7a9RicBFCSf6IoGX/CdvI8x/xMOFfNtyuvFn9YmHI=";
hash = "sha256-dA7a9RicBFCSf6IoGX/CdvI8x/xMOFfNtyuvFn9YmHI=";
};
postPatch = ''
substituteInPlace Makefile \
--replace "SHELL := /bin/bash" "SHELL := ${bash}/bin/bash"
substituteInPlace pytest.ini \
--replace "-p pytest_cov" "" \
--replace "--no-cov-on-fail" ""
sed -i "/--cov/d" pytest.ini
'';
nativeBuildInputs = [
setuptools-scm
];
@@ -36,7 +48,9 @@ buildPythonPackage rec {
];
checkInputs = [
httpx
openssl
gnumake
pytest-asyncio
pytest-mock
pytestCheckHook
@@ -46,20 +60,23 @@ buildPythonPackage rec {
export HOME=$(mktemp -d);
'';
postPatch = ''
substituteInPlace requirements.txt \
--replace "typing-extensions==3.7.4.3" "typing-extensions"
'';
disabledTests = [
# Test requires network access
"test_http2_via_proxy"
# Tests run into a timeout
"integration"
];
pythonImportsCheck = [
"proxy"
];
meta = with lib; {
broken = (stdenv.isLinux && stdenv.isAarch64) || stdenv.isDarwin;
description = "Python proxy framework";
homepage = "https://github.com/abhinavsingh/proxy.py";
changelog = "https://github.com/abhinavsingh/proxy.py/releases/tag/v${version}";
license = with licenses; [ bsd3 ];
maintainers = with maintainers; [ fab ];
broken = (stdenv.isLinux && stdenv.isAarch64) || stdenv.isDarwin;
};
}
@@ -8,7 +8,7 @@
buildPythonPackage rec {
pname = "pybravia";
version = "0.2.3";
version = "0.2.5";
format = "pyproject";
disabled = pythonOlder "3.8";
@@ -17,7 +17,7 @@ buildPythonPackage rec {
owner = "Drafteed";
repo = pname;
rev = "v${version}";
hash = "sha256-ZM1XJnEYMNcbVOkpcI1ml7Cck2CXA2QXEpJMx3RwtSQ=";
hash = "sha256-QWn5VdZlbxm2/ZvsQWlKuVPPBcqFkyt75Odh9Mf9Bqk=";
};
nativeBuildInputs = [
@@ -38,6 +38,7 @@ buildPythonPackage rec {
meta = with lib; {
description = "Library for remote control of Sony Bravia TVs 2013 and newer";
homepage = "https://github.com/Drafteed/pybravia";
changelog = "https://github.com/Drafteed/pybravia/releases/tag/v${version}";
license = licenses.mit;
maintainers = with maintainers; [ fab ];
};
@@ -0,0 +1,52 @@
{ lib
, buildPythonPackage
, fetchFromGitHub
, freezegun
, hatchling
, pytest
, pytestCheckHook
, pythonOlder
}:
buildPythonPackage rec {
pname = "pytest-freezer";
version = "0.4.6";
format = "pyproject";
disabled = pythonOlder "3.6";
src = fetchFromGitHub {
owner = "pytest-dev";
repo = pname;
rev = "refs/tags/${version}";
hash = "sha256-0JZv6MavRceAV+ZOetCVxJEyttd5W3PCts6Fz2KQsh0=";
};
nativeBuildInputs = [
hatchling
];
buildInputs = [
pytest
];
propagatedBuildInputs = [
freezegun
];
checkInputs = [
pytestCheckHook
];
pythonImportsCheck = [
"pytest_freezer"
];
meta = with lib; {
description = "Pytest plugin providing a fixture interface for spulec/freezegun";
homepage = "https://github.com/pytest-dev/pytest-freezer";
changelog = "https://github.com/pytest-dev/pytest-freezer/releases/tag/${version}";
license = licenses.mit;
maintainers = with maintainers; [ fab ];
};
}
@@ -1,33 +1,45 @@
{ lib, fetchFromGitHub, buildPythonPackage, isPy3k,
isodate, lxml, xmlsec, freezegun }:
{ lib
, buildPythonPackage
, fetchFromGitHub
, freezegun
, isodate
, lxml
, pythonOlder
, xmlsec
}:
buildPythonPackage rec {
pname = "python3-saml";
version = "1.14.0";
disabled = !isPy3k;
version = "1.15.0";
format = "setuptools";
disabled = pythonOlder "3.7";
src = fetchFromGitHub {
owner = "onelogin";
repo = "python3-saml";
rev = "v${version}";
sha256 = "sha256-TAfVXh1fSKhNn/lsi7elq4wFyKCxCtCYUTrnH3ytBTw=";
rev = "refs/tags/v${version}";
hash = "sha256-xPPR2z3h8RpoAROpKpu9ZoDxGq5Stm9wQVt4Stj/6fg=";
};
postPatch = ''
substituteInPlace setup.py \
--replace "lxml<4.7.1" "lxml<5"
'';
propagatedBuildInputs = [
isodate lxml xmlsec
isodate
lxml
xmlsec
];
checkInputs = [ freezegun ];
pythonImportsCheck = [ "onelogin.saml2" ];
checkInputs = [
freezegun
];
pythonImportsCheck = [
"onelogin.saml2"
];
meta = with lib; {
description = "OneLogin's SAML Python Toolkit for Python 3";
description = "OneLogin's SAML Python Toolkit";
homepage = "https://github.com/onelogin/python3-saml";
changelog = "https://github.com/SAML-Toolkits/python3-saml/blob/v${version}/changelog.md";
license = licenses.mit;
maintainers = with maintainers; [ zhaofengli ];
};
@@ -1,28 +1,42 @@
{ lib, buildPythonPackage, fetchPypi, isPy27, isPy3k
, pbr, six, futures ? null, monotonic ? null, typing ? null, setuptools-scm
, pytest, sphinx, tornado, typeguard
{ lib
, buildPythonPackage
, fetchPypi
, pbr
, pytest-asyncio
, pytestCheckHook
, pythonOlder
, setuptools-scm
, tornado
, typeguard
}:
buildPythonPackage rec {
pname = "tenacity";
version = "8.0.1";
version = "8.1.0";
format = "pyproject";
disabled = pythonOlder "3.6";
src = fetchPypi {
inherit pname version;
sha256 = "43242a20e3e73291a28bcbcacfd6e000b02d3857a9a9fff56b297a27afdc932f";
sha256 = "sha256-5IxDf9+TQPVma5LNeZDpa8X8lV4SmLr0qQfjlyBnpEU=";
};
nativeBuildInputs = [ pbr setuptools-scm ];
propagatedBuildInputs = [ six ]
++ lib.optionals isPy27 [ futures monotonic typing ];
nativeBuildInputs = [
pbr
setuptools-scm
];
checkInputs = [ pytest sphinx tornado ]
++ lib.optionals isPy3k [ typeguard ];
checkPhase = if isPy27 then ''
pytest --ignore='tenacity/tests/test_asyncio.py'
'' else ''
pytest
'';
checkInputs = [
pytest-asyncio
pytestCheckHook
tornado
typeguard
];
pythonImportsCheck = [
"tenacity"
];
meta = with lib; {
homepage = "https://github.com/jd/tenacity";
@@ -10,12 +10,13 @@
, pytest-asyncio
, pytestCheckHook
, pythonOlder
, tenacity
, wrapt
}:
buildPythonPackage rec {
pname = "teslajsonpy";
version = "3.6.0";
version = "3.7.0";
format = "pyproject";
disabled = pythonOlder "3.7";
@@ -24,7 +25,7 @@ buildPythonPackage rec {
owner = "zabuldon";
repo = pname;
rev = "refs/tags/v${version}";
hash = "sha256-qxC1nhvisYMfWRTyrkNSpqCKofAmqui23cMRaup8llU=";
hash = "sha256-H2PXn2RwEteLpbbQftlSXM7vD59IJCFJhYdnHHGXfo8=";
};
nativeBuildInputs = [
@@ -37,6 +38,7 @@ buildPythonPackage rec {
backoff
beautifulsoup4
httpx
tenacity
wrapt
];
@@ -5,13 +5,13 @@
buildPythonPackage rec {
pname = "types-dateutil";
version = "2.8.19.2";
version = "2.8.19.5";
format = "setuptools";
src = fetchPypi {
pname = "types-python-dateutil";
inherit version;
hash = "sha256-5uMs4Y83dlsIxGYiKHvI2BNtwMVi2a1bj9FYxZlj16c=";
hash = "sha256-q5H8X3FffXbZpQ09100MaN/jilTwI5z6BQZXWuTYep0=";
};
pythonImportsCheck = [
+15 -12
View File
@@ -1,17 +1,20 @@
{ lib
, stdenv
, fetchFromGitHub
, cmake
, libclang
, libffi
, libxml2
, llvm
, sphinx
, zlib
, withManual ? true
, withHTML ? true
{ lib,
stdenv,
fetchFromGitHub,
cmake,
libffi,
libxml2,
zlib,
withManual ? true,
withHTML ? true,
llvmPackages,
python3,
}:
let
inherit (llvmPackages) libclang llvm;
inherit (python3.pkgs) sphinx;
in
stdenv.mkDerivation (finalAttrs: {
pname = "castxml";
version = "0.5.1";
@@ -6,16 +6,16 @@
buildNpmPackage rec {
pname = "ansible-language-server";
version = "1.0.3";
version = "1.0.4";
src = fetchFromGitHub {
owner = "ansible";
repo = pname;
rev = "refs/tags/v${version}";
hash = "sha256-+42fZ4ILUHg/KcnllUaFYYPBKHxauagbsVdIY1MgwSI=";
hash = "sha256-IBySScjfF2bIbiOv09uLMt9QH07zegm/W1vmGhdWxGY=";
};
npmDepsHash = "sha256-DRXIbIogMeiJvZOB44hKkkfc3dg8mscnV6k2rUvYCNs=";
npmDepsHash = "sha256-rJ1O2OsrJhTIfywK9/MRubwwcCmMbu61T4zyayg+mAU=";
npmBuildScript = "compile";
# We remove the prepare and prepack scripts because they run the
@@ -2,13 +2,13 @@
stdenv.mkDerivation rec {
pname = "uncrustify";
version = "0.75.1";
version = "0.76.0";
src = fetchFromGitHub {
owner = "uncrustify";
repo = "uncrustify";
rev = "uncrustify-${version}";
sha256 = "sha256-wLzj/KcqXlcTsOJo7T166jLcWi1KNLmgblIqqkj7/9c=";
sha256 = "sha256-th3lp4WqqruHx2/ym3I041y2wLbYM1b+V6yXNOWuUvM=";
};
nativeBuildInputs = [ cmake python3 ];
+2 -2
View File
@@ -25,14 +25,14 @@ with py.pkgs;
buildPythonApplication rec {
pname = "pip-audit";
version = "2.4.11";
version = "2.4.12";
format = "pyproject";
src = fetchFromGitHub {
owner = "trailofbits";
repo = pname;
rev = "refs/tags/v${version}";
hash = "sha256-gfqxrEp+8Jmh32wjmBh0laQvEqja7kZqkqf2l2ztVyk=";
hash = "sha256-bpAs7xXWvBVGzbX6Fij71BnEMpqYjSSCtWjuA/EFms8=";
};
nativeBuildInputs = [
+3 -3
View File
@@ -7,16 +7,16 @@
rustPlatform.buildRustPackage rec {
pname = "ruff";
version = "0.0.199";
version = "0.0.201";
src = fetchFromGitHub {
owner = "charliermarsh";
repo = pname;
rev = "v${version}";
sha256 = "sha256-cA3MTk7jlcPKHqW+8Xf508v9v42WmdhCU2r4eIiG5ic=";
sha256 = "sha256-+Jt7uvwzA1AtSaQOqsZBm9k0OBSvOaAoNBpsiZ/G+wI=";
};
cargoSha256 = "sha256-cXjQWMnMSypHn0fynzJQYj+bqszuvRmIOPX4IrSuQbo=";
cargoSha256 = "sha256-8wxS1ViA5F+y8gkKfSENYga/YSZ7QE8cl2lQlVL382Y=";
buildInputs = lib.optionals stdenv.isDarwin [
darwin.apple_sdk.frameworks.CoreServices
+3 -3
View File
@@ -2,16 +2,16 @@
buildGoModule rec {
pname = "skaffold";
version = "2.0.3";
version = "2.0.4";
src = fetchFromGitHub {
owner = "GoogleContainerTools";
repo = "skaffold";
rev = "v${version}";
sha256 = "sha256-wt1BEa8ir8i4VWW03opfy7cSNqCPzQoHgtJz+i8iaLw=";
sha256 = "sha256-TFI715knhQ3QyWF1EwIxZfZQW16uDWAqa6LVNfqC8Ws=";
};
vendorSha256 = "sha256-2i7NKf/VJduBec4rEBJqFt1cb6ODqOviSY+flGekN4w=";
vendorSha256 = "sha256-yy1BVorjLEcZR6PqupBiZx2plwPJ6xlxripbyB6RLek=";
subPackages = ["cmd/skaffold"];
+74
View File
@@ -0,0 +1,74 @@
{ stdenv, lib, fetchurl, gnumake, libnetfilter_acct, libnetfilter_conntrack
, libnetfilter_log, libmnl, libnfnetlink, automake, autoconf, autogen, libtool
, pkg-config, libpcap, linuxdoc-tools, autoreconfHook, nixosTests }:
stdenv.mkDerivation rec {
version = "2.0.8";
pname = "ulogd";
src = fetchurl {
url = "https://netfilter.org/projects/${pname}/files/${pname}-${version}.tar.bz2";
hash = "sha256-Tq1sOXDD9X+h6J/i18xIO6b+K9GwhwFSHgs6/WZ98pE=";
};
outputs = [ "out" "doc" "man" ];
postPatch = ''
substituteInPlace ulogd.8 --replace "/usr/share/doc" "$doc/share/doc"
'';
postBuild = ''
pushd doc/
linuxdoc --backend=txt --filter ulogd.sgml
linuxdoc --backend=html --split=0 ulogd.sgml
popd
'';
postInstall = ''
install -Dm444 -t $out/share/doc/${pname} ulogd.conf doc/ulogd.txt doc/ulogd.html README doc/*table
install -Dm444 -t $out/share/doc/${pname}-mysql doc/mysql*.sql
install -Dm444 -t $out/share/doc/${pname}-pgsql doc/pgsql*.sql
'';
buildInputs = [
libnetfilter_acct
libnetfilter_conntrack
libnetfilter_log
libmnl
libnfnetlink
libpcap
];
nativeBuildInputs = [
autoreconfHook
pkg-config
automake
autoconf
autogen
libtool
linuxdoc-tools
];
passthru.tests = { inherit (nixosTests) ulogd; };
meta = with lib; {
description = "Userspace logging daemon for netfilter/iptables";
longDescription = ''
Logging daemon that reads event messages coming from the Netfilter
connection tracking, the Netfilter packet logging subsystem and from the
Netfilter accounting subsystem. You have to enable support for connection
tracking event delivery; ctnetlink and the NFLOG target in your Linux
kernel 2.6.x or load their respective modules. The deprecated ULOG target
(which has been superseded by NFLOG) is also supported.
The received messages can be logged into files or into a MySQL, SQLite3
or PostgreSQL database. IPFIX and Graphite output are also supported.
'';
homepage = "https://www.netfilter.org/projects/ulogd/index.html";
license = licenses.gpl2;
platforms = platforms.linux;
maintainers = with maintainers; [ p-h ];
};
}
+1 -1
View File
@@ -19,7 +19,7 @@ buildGoPackage rec {
meta = with lib; {
description = "A cross-platform markdown web server";
homepage = "https://allmark.io";
homepage = "https://github.com/andreaskoch/allmark";
changelog = "https://github.com/andreaskoch/allmark/-/releases/v${version}";
license = licenses.bsd3;
maintainers = with maintainers; [ urandom ];
+2 -2
View File
@@ -6,13 +6,13 @@
buildGoModule rec {
pname = "nats-server";
version = "2.9.9";
version = "2.9.10";
src = fetchFromGitHub {
owner = "nats-io";
repo = pname;
rev = "v${version}";
hash = "sha256-GIekoIhXhsWl0od/tkUO8h+9WPICds4iPVARTn4P0tE=";
hash = "sha256-r/hz80XFEOQN7bzQQTIMAeZI8H09WyiUqQl3glJz+RM=";
};
vendorHash = "sha256-ASLy0rPuCSYGyy5Pw9fj559nxO4vPPagDKAe8wM29lo=";
+4 -3
View File
@@ -2,13 +2,13 @@
stdenvNoCC.mkDerivation rec {
pname = "spaceship-prompt";
version = "3.16.7";
version = "4.12.0";
src = fetchFromGitHub {
owner = "denysdovhan";
repo = pname;
rev = "v${version}";
sha256 = "sha256-dMP7mDzb0xLCP2l9j4SOP47bcpuBNSoXsDecVOvZaL8=";
sha256 = "sha256-ZL6z5pj2xbnUZl4SK7wxiJjheUY79hwDNVYm9+biKZU=";
};
strictDeps = true;
@@ -22,6 +22,7 @@ stdenvNoCC.mkDerivation rec {
find scripts -type f -exec install -Dm644 {} "$out/lib/spaceship-prompt/{}" \;
find sections -type f -exec install -Dm644 {} "$out/lib/spaceship-prompt/{}" \;
install -Dm644 spaceship.zsh "$out/lib/spaceship-prompt/spaceship.zsh"
install -Dm644 async.zsh "$out/lib/spaceship-prompt/async.zsh"
install -d "$out/share/zsh/themes/"
ln -s "$out/lib/spaceship-prompt/spaceship.zsh" "$out/share/zsh/themes/spaceship.zsh-theme"
install -d "$out/share/zsh/site-functions/"
@@ -34,6 +35,6 @@ stdenvNoCC.mkDerivation rec {
changelog = "https://github.com/spaceship-prompt/spaceship-prompt/releases/tag/v${version}";
license = licenses.mit;
platforms = platforms.unix;
maintainers = with maintainers; [ nyanloutre fortuneteller2k ];
maintainers = with maintainers; [ nyanloutre fortuneteller2k kyleondy ];
};
}
+85 -41
View File
@@ -1,50 +1,94 @@
{ lib, stdenv, rustPlatform, fetchFromGitea, openssl, pkg-config, protobuf
, testers, Security, garage }:
, testers, Security, garage, nixosTests }:
let
generic = { version, sha256, cargoSha256, eol ? false, broken ? false }: rustPlatform.buildRustPackage {
pname = "garage";
inherit version;
rustPlatform.buildRustPackage rec {
pname = "garage";
version = "0.7.3";
src = fetchFromGitea {
domain = "git.deuxfleurs.fr";
owner = "Deuxfleurs";
repo = "garage";
rev = "v${version}";
inherit sha256;
};
src = fetchFromGitea {
domain = "git.deuxfleurs.fr";
owner = "Deuxfleurs";
repo = "garage";
rev = "v${version}";
sha256 = "sha256-WDhe2L+NalMoIy2rhfmv8KCNDMkcqBC9ezEKKocihJg=";
inherit cargoSha256;
nativeBuildInputs = [ protobuf pkg-config ];
buildInputs = [
openssl
] ++ lib.optional stdenv.isDarwin Security;
OPENSSL_NO_VENDOR = true;
# See https://git.deuxfleurs.fr/Deuxfleurs/garage/src/tag/v0.7.2/default.nix#L84-L98
# on version changes for checking if changes are required here
buildFeatures = [
"kubernetes-discovery"
] ++
(lib.optional (lib.versionAtLeast version "0.8") [
"bundled-libs"
"sled"
"metrics"
"k2v"
"telemetry-otlp"
"lmdb"
"sqlite"
]);
# To make integration tests pass, we include the optional k2v feature here,
# but not in buildFeatures. See:
# https://garagehq.deuxfleurs.fr/documentation/reference-manual/k2v/
checkFeatures = [
"k2v"
"kubernetes-discovery"
] ++
(lib.optional (lib.versionAtLeast version "0.8") [
"bundled-libs"
"sled"
"metrics"
"telemetry-otlp"
"lmdb"
"sqlite"
]);
passthru = nixosTests.garage;
meta = {
description = "S3-compatible object store for small self-hosted geo-distributed deployments";
homepage = "https://garagehq.deuxfleurs.fr";
license = lib.licenses.agpl3Only;
maintainers = with lib.maintainers; [ nickcao _0x4A6F teutat3s raitobezarius ];
knownVulnerabilities = (lib.optional eol "Garage version ${version} is EOL");
inherit broken;
};
};
in
rec {
# Until Garage hits 1.0, 0.7.3 is equivalent to 7.3.0 for now, therefore
# we have to keep all the numbers in the version to handle major/minor/patch level.
# for <1.0.
cargoSha256 = "sha256-5m4c8/upBYN8nuysDhGKEnNVJjEGC+yLrraicrAQOfI=";
garage_0_7_3 = generic {
version = "0.7.3";
sha256 = "sha256-WDhe2L+NalMoIy2rhfmv8KCNDMkcqBC9ezEKKocihJg=";
cargoSha256 = "sha256-5m4c8/upBYN8nuysDhGKEnNVJjEGC+yLrraicrAQOfI=";
eol = true; # Confirmed with upstream maintainers over Matrix.
};
nativeBuildInputs = [ protobuf pkg-config ];
garage_0_7 = garage_0_7_3;
buildInputs = [
openssl
] ++ lib.optional stdenv.isDarwin Security;
garage_0_8_0 = generic {
version = "0.8.0";
sha256 = "sha256-c2RhHfg0+YV2E9Ckl1YSc+0nfzbHPIt0JgtT0DND9lA=";
cargoSha256 = "sha256-vITXckNOiJbMuQW6/8p7dsZThkjxg/zUy3AZBbn33no=";
# On Darwin, tests are failing.
broken = stdenv.isDarwin;
};
OPENSSL_NO_VENDOR = true;
garage_0_8 = garage_0_8_0;
# See https://git.deuxfleurs.fr/Deuxfleurs/garage/src/tag/v0.7.2/default.nix#L84-L98
# on version changes for checking if changes are required here
buildFeatures = [
"kubernetes-discovery"
];
# To make integration tests pass, we include the optional k2v feature here,
# but not in buildFeatures. See:
# https://garagehq.deuxfleurs.fr/documentation/reference-manual/k2v/
checkFeatures = [
"k2v"
"kubernetes-discovery"
];
passthru = {
tests.version = testers.testVersion { package = garage; };
};
meta = {
description = "S3-compatible object store for small self-hosted geo-distributed deployments";
homepage = "https://garagehq.deuxfleurs.fr";
license = lib.licenses.agpl3Only;
maintainers = with lib.maintainers; [ nickcao _0x4A6F teutat3s ];
};
}
garage = garage_0_8;
}
+2 -2
View File
@@ -2,12 +2,12 @@
stdenv.mkDerivation rec {
pname = "mtd-utils";
version = "2.1.4";
version = "2.1.5";
src = fetchgit {
url = "git://git.infradead.org/mtd-utils.git";
rev = "v${version}";
sha256 = "sha256-lnvG2aJiihOyScmWZu0i8OYowmIMRBkgC3j67sdLkT4=";
sha256 = "sha256-Ph9Xjb2Nyo7l3T1pDgW2gnSJxn0pOC6uvCGUfCh0MXU=";
};
nativeBuildInputs = [ autoreconfHook pkg-config ] ++ lib.optional doCheck cmocka;
+2 -3
View File
@@ -1,9 +1,9 @@
{ stdenv
, lib
, pkgs
, buildGoModule
, fetchFromGitHub
, writeText
, writeShellScriptBin
, runtimeShell
, installShellFiles
, ncurses
@@ -16,8 +16,7 @@ let
# so that using the shell completion (ctrl+r, etc) doesn't result in ugly
# warnings on non-nixos machines
ourPerl = if stdenv.isDarwin then perl else (
pkgs.writers.writeBashBin "perl" ''
#!${pkgs.runtimeShell}
writeShellScriptBin "perl" ''
export LOCALE_ARCHIVE="${glibcLocales}/lib/locale/locale-archive"
exec ${perl}/bin/perl "$@"
'');
-49
View File
@@ -1,49 +0,0 @@
{ lib, stdenv, fetchurl, libffi, coreutils }:
stdenv.mkDerivation rec {
pname = "txr";
version = "280";
src = fetchurl {
url = "http://www.kylheku.com/cgit/txr/snapshot/${pname}-${version}.tar.bz2";
sha256 = "sha256-1iqWerUehLFPM63ZjJYY6xo9oHoNK7ne/a6M3+4L4so=";
};
buildInputs = [ libffi ];
enableParallelBuilding = true;
doCheck = true;
checkTarget = "tests";
postPatch = ''
# Fixup references to /usr/bin in tests
substituteInPlace tests/017/realpath.tl --replace /usr/bin /bin
substituteInPlace tests/017/realpath.expected --replace /usr/bin /bin
substituteInPlace tests/018/process.tl --replace /usr/bin/env ${lib.getBin coreutils}/bin/env
'';
# Remove failing tests -- 018/chmod tries setting sticky bit
preCheck = "rm -rf tests/018/chmod*";
postInstall = ''
d=$out/share/vim-plugins/txr
mkdir -p $d/{syntax,ftdetect}
cp {tl,txr}.vim $d/syntax/
cat > $d/ftdetect/txr.vim <<EOF
au BufRead,BufNewFile *.txr set filetype=txr | set lisp
au BufRead,BufNewFile *.tl,*.tlo set filetype=tl | set lisp
EOF
'';
meta = with lib; {
description = "Programming language for convenient data munging";
license = licenses.bsd2;
homepage = "http://nongnu.org/txr";
maintainers = with lib.maintainers; [ dtzWill ];
platforms = platforms.all;
};
}
+6 -2
View File
@@ -21,6 +21,12 @@ stdenv.mkDerivation rec {
url = "https://github.com/openwall/john/commit/154ee1156d62dd207aff0052b04c61796a1fde3b.patch";
sha256 = "sha256-3rfS2tu/TF+KW2MQiR+bh4w/FVECciTooDQNTHNw31A=";
})
(fetchpatch {
name = "improve-apple-clang-pseudo-intrinsics-portability.patch";
url = "https://github.com/openwall/john/commit/c9825e688d1fb9fdd8942ceb0a6b4457b0f9f9b4.patch";
excludes = [ "doc/*" ];
sha256 = "sha256-hgoiz7IgR4f66fMP7bV1F8knJttY8g2Hxyk3QfkTu+g=";
})
];
postPatch = ''
@@ -83,7 +89,5 @@ stdenv.mkDerivation rec {
homepage = "https://github.com/openwall/john/";
maintainers = with maintainers; [ offline matthewbauer ];
platforms = platforms.unix;
# never built on aarch64-darwin since first introduction in nixpkgs
broken = stdenv.isDarwin && stdenv.isAarch64;
};
}
+8 -4
View File
@@ -1,21 +1,25 @@
{ lib, stdenv, fetchFromGitHub }:
{ lib
, stdenv
, fetchFromGitHub
}:
stdenv.mkDerivation rec {
pname = "wslu";
version = "4.0.0";
version = "4.1.0";
src = fetchFromGitHub {
owner = "wslutilities";
repo = pname;
rev = "v${version}";
hash = "sha256-bW/otr1kqmH2N5sD3R9kYCZyn+BbBZ2fCVGlP1pFnK8=";
hash = "sha256-DlWI+rHj1vSJzJ8VJnUfoPH6t4LQhqxJgRKqz41fVmY=";
};
makeFlags = [ "PREFIX=$(out)" ];
makeFlags = [ "DESTDIR=$(out)" ];
meta = with lib; {
description = "A collection of utilities for Windows 10 Linux Subsystems";
homepage = "https://github.com/wslutilities/wslu";
changelog = "https://github.com/wslutilities/wslu/releases/tag/v${version}";
license = licenses.gpl3Plus;
maintainers = with maintainers; [ jamiemagee ];
platforms = platforms.linux;
+5 -5
View File
@@ -9,24 +9,24 @@
rustPlatform.buildRustPackage rec {
pname = "difftastic";
version = "0.39.0";
version = "0.40.0";
src = fetchFromGitHub {
owner = "wilfred";
repo = pname;
rev = version;
sha256 = "sha256-PyjgnO5LXV0UGNqpb2J39Ni077L5MjHc5ZkK/r8//II=";
sha256 = "sha256-zLps/R3KMx51eGdHINmvq9Cv4JTkVSont3Gktwgxsrg=";
};
depsExtraArgs = {
postBuild = let
mimallocPatch = (fetchpatch {
mimallocPatch = fetchpatch {
name = "mimalloc-older-macos-fixes.patch";
url = "https://github.com/microsoft/mimalloc/commit/40e0507a5959ee218f308d33aec212c3ebeef3bb.patch";
stripLen = 1;
extraPrefix = "libmimalloc-sys/c_src/mimalloc/";
sha256 = "1cqgay6ayzxsj8v1dy8405kwd8av34m4bjc84iyg9r52amlijbg4";
});
};
in ''
pushd $name
patch -p1 < ${mimallocPatch}
@@ -40,7 +40,7 @@ rustPlatform.buildRustPackage rec {
popd
'';
};
cargoSha256 = "sha256-jVs5KokgofAqhNLfr/RJ9qOHwBYMnkqc2EcAFezS9/0=";
cargoSha256 = "sha256-kVJwGEY0TvsKzTbcSgOSWIhx8MbH/KNB3Q8KvQfhCac=";
passthru.tests.version = testers.testVersion { package = difftastic; };
@@ -0,0 +1,62 @@
{ stdenv, lib, makeWrapper, fetchFromGitLab, openjade, gnumake, perl, flex
, gnused, coreutils, which, opensp, groff, texlive, texinfo, withLatex ? false
}:
stdenv.mkDerivation rec {
pname = "linuxdoc-tools";
version = "0.9.82";
src = fetchFromGitLab {
owner = "agmartin";
repo = "linuxdoc-tools";
rev = version;
sha256 = "17v9ilh79av4n94vk4m52aq57ykb9myffxd2qr8kb8b3xnq5d36z";
};
outputs = [ "out" "man" "doc" ];
configureFlags = [
("--enable-docs=txt info lyx html rtf"
+ lib.optionalString withLatex " pdf")
];
LEX = "flex";
postInstall = ''
wrapProgram $out/bin/linuxdoc \
--prefix PATH : "${lib.makeBinPath [ groff opensp ]}:$out/bin" \
--prefix PERL5LIB : "$out/share/linuxdoc-tools/"
'';
doInstallCheck = true;
installCheckPhase = ''
pushd doc/example
substituteInPlace Makefile \
--replace "COMMAND=linuxdoc" "COMMAND=$out/bin/linuxdoc" \
${lib.optionalString (!withLatex) "--replace '.tex .dvi .ps .pdf' ''"}
make
popd
'';
nativeBuildInputs = [ flex which makeWrapper ];
buildInputs = [ opensp groff texinfo perl gnused coreutils ]
++ lib.optionals withLatex [ texlive.combined.scheme-medium ];
meta = with lib; {
description = "Toolset for processing LinuxDoc DTD SGML files";
longDescription = ''
A collection of text formatters which understands a LinuxDoc DTD SGML
source file. Each formatter (or "back-end") renders the source file into
a variety of output formats, including HTML, TeX, DVI, PostScript, plain
text, and groff source in manual-page format. The linuxdoc suite is
provided for backward compatibility, because there are still many useful
documents written in LinuxDoc DTD sgml source.
'';
homepage = "https://gitlab.com/agmartin/linuxdoc-tools";
license = with licenses; [ gpl3Plus mit sgmlug ];
platforms = platforms.linux;
maintainers = with maintainers; [ p-h ];
};
}
+65
View File
@@ -0,0 +1,65 @@
{ lib,
stdenv,
fetchurl,
coreutils,
libffi,
}:
stdenv.mkDerivation (finalAttrs: {
pname = "txr";
version = "283";
src = fetchurl {
url = "http://www.kylheku.com/cgit/txr/snapshot/txr-${finalAttrs.version}.tar.bz2";
hash = "sha256-2TnwxHAiiWEytHpKXrEwQ+ajq19f0lv7ss842kkPs4Y=";
};
buildInputs = [ libffi ];
enableParallelBuilding = true;
doCheck = true;
checkTarget = "tests";
postPatch = ''
substituteInPlace tests/017/realpath.tl --replace /usr/bin /bin
substituteInPlace tests/017/realpath.expected --replace /usr/bin /bin
substituteInPlace tests/018/process.tl --replace /usr/bin/env ${lib.getBin coreutils}/bin/env
'';
# Remove failing tests -- 018/chmod tries setting sticky bit
preCheck = ''
rm -rf tests/018/chmod*
'';
# TODO: ship vim plugin separately?
postInstall = ''
mkdir -p $out/share/vim-plugins/txr/{syntax,ftdetect}
cp {tl,txr}.vim $out/share/vim-plugins/txr/syntax/
cat > $out/share/vim-plugins/txr/ftdetect/txr.vim <<EOF
au BufRead,BufNewFile *.txr set filetype=txr | set lisp
au BufRead,BufNewFile *.tl,*.tlo set filetype=tl | set lisp
EOF
'';
meta = with lib; {
homepage = "http://nongnu.org/txr";
description = "An Original, New Programming Language for Convenient Data Munging";
longDescription = ''
TXR is a general-purpose, multi-paradigm programming language. It
comprises two languages integrated into a single tool: a text scanning and
extraction language referred to as the TXR Pattern Language (sometimes
just "TXR"), and a general-purpose dialect of Lisp called TXR Lisp.
TXR can be used for everything from "one liner" data transformation tasks
at the command line, to data scanning and extracting scripts, to full
application development in a wide range of areas.
'';
license = licenses.bsd2;
maintainers = with lib.maintainers; [ AndersonTorres dtzWill ];
platforms = platforms.all;
};
})
+12 -8
View File
@@ -357,10 +357,7 @@ with pkgs;
castget = callPackage ../applications/networking/feedreaders/castget { };
castxml = callPackage ../development/tools/castxml {
inherit (llvmPackages) libclang llvm;
inherit (python3.pkgs) sphinx;
};
castxml = callPackage ../development/tools/castxml { };
catatonit = callPackage ../applications/virtualization/catatonit { };
@@ -4921,6 +4918,8 @@ with pkgs;
linuxptp = callPackage ../os-specific/linux/linuxptp { };
linuxdoc-tools = callPackage ../tools/text/sgml/linuxdoc-tools { };
lisgd = callPackage ../tools/inputmethods/lisgd { };
lite = callPackage ../applications/editors/lite { };
@@ -7356,9 +7355,12 @@ with pkgs;
gaphor = python3Packages.callPackage ../tools/misc/gaphor { };
garage = callPackage ../tools/filesystems/garage {
inherit (callPackage ../tools/filesystems/garage {
inherit (darwin.apple_sdk.frameworks) Security;
};
})
garage
garage_0_7 garage_0_8
garage_0_7_3 garage_0_8_0;
garmin-plugin = callPackage ../applications/misc/garmin-plugin {};
@@ -12538,7 +12540,7 @@ with pkgs;
twurl = callPackage ../tools/misc/twurl { };
txr = callPackage ../tools/misc/txr { inherit (llvmPackages_latest) stdenv; };
txr = callPackage ../tools/text/txr { };
txt2man = callPackage ../tools/misc/txt2man { };
@@ -13089,6 +13091,8 @@ with pkgs;
inherit (chickenPackages_4) eggDerivation fetchegg;
};
ulogd = callPackage ../os-specific/linux/ulogd { };
unar = callPackage ../tools/archivers/unar {
inherit (darwin.apple_sdk.frameworks) Foundation AppKit;
stdenv = clangStdenv;
@@ -16015,7 +16019,7 @@ with pkgs;
### LUA interpreters
luaInterpreters = callPackage ./../development/interpreters/lua-5 {};
inherit (luaInterpreters) lua5_1 lua5_2 lua5_2_compat lua5_3 lua5_3_compat lua5_4 lua5_4_compat luajit_2_1 luajit_2_0;
inherit (luaInterpreters) lua5_1 lua5_2 lua5_2_compat lua5_3 lua5_3_compat lua5_4 lua5_4_compat luajit_2_1 luajit_2_0 luajit_openresty;
lua5 = lua5_2_compat;
lua = lua5;
+41 -1
View File
@@ -30,7 +30,7 @@ let
lib.concatMapStringsSep ";" (path: "${drv}/${path}") pathListForVersion;
in
{
rec {
# Dont take luaPackages from "global" pkgs scope to avoid mixing lua versions
luaPackages = self;
@@ -59,6 +59,46 @@ in
# a fork of luarocks used to generate nix lua derivations from rockspecs
luarocks-nix = callPackage ../development/tools/misc/luarocks/luarocks-nix.nix { };
lua-resty-core = callPackage ({ fetchFromGitHub }: buildLuaPackage rec {
pname = "lua-resty-core";
version = "0.1.24";
src = fetchFromGitHub {
owner = "openresty";
repo = "lua-resty-core";
rev = "v${version}";
sha256 = "sha256-obwyxHSot1Lb2c1dNqJor3inPou+UIBrqldbkNBCQQk=";
};
propagatedBuildInputs = [ lua-resty-lrucache ];
meta = with lib; {
description = "New FFI-based API for lua-nginx-module";
homepage = "https://github.com/openresty/lua-resty-core";
license = licenses.bsd3;
maintainers = with maintainers; [ SuperSandro2000 ];
};
}) {};
lua-resty-lrucache = callPackage ({ fetchFromGitHub }: buildLuaPackage rec {
pname = "lua-resty-lrucache";
version = "0.13";
src = fetchFromGitHub {
owner = "openresty";
repo = "lua-resty-lrucache";
rev = "v${version}";
sha256 = "sha256-J8RNAMourxqUF8wPKd8XBhNwGC/x1KKvrVnZtYDEu4Q=";
};
meta = with lib; {
description = "Lua-land LRU Cache based on LuaJIT FFI";
homepage = "https://github.com/openresty/lua-resty-lrucache";
license = licenses.bsd3;
maintainers = with maintainers; [ SuperSandro2000 ];
};
}) {};
luxio = callPackage ({ fetchurl, which, pkg-config }: buildLuaPackage rec {
pname = "luxio";
version = "13";
+2
View File
@@ -8884,6 +8884,8 @@ self: super: with self; {
pytest-freezegun = callPackage ../development/python-modules/pytest-freezegun { };
pytest-freezer = callPackage ../development/python-modules/pytest-freezer { };
pytest-golden = callPackage ../development/python-modules/pytest-golden { };
pytest-helpers-namespace = callPackage ../development/python-modules/pytest-helpers-namespace { };