Merge staging-next into staging

This commit is contained in:
nixpkgs-ci[bot]
2025-03-11 12:06:37 +00:00
committed by GitHub
84 changed files with 2394 additions and 2587 deletions
+19
View File
@@ -6472,6 +6472,13 @@
name = "Duncan Dean";
keys = [ { fingerprint = "9484 44FC E03B 05BA 5AB0 591E C37B 1C1D 44C7 86EE"; } ];
};
DutchGerman = {
name = "Stefan Visser";
email = "stefan.visser@apm-ecampus.de";
github = "DutchGerman";
githubId = 60694691;
keys = [ { fingerprint = "A7C9 3DC7 E891 046A 980F 2063 F222 A13B 2053 27A5"; } ];
};
dvaerum = {
email = "nixpkgs-maintainer@varum.dk";
github = "dvaerum";
@@ -18700,6 +18707,12 @@
github = "pladypus";
githubId = 56337621;
};
plamper = {
name = "Felix Plamper";
email = "felix.plamper@tuta.io";
github = "plamper";
githubId = 59016721;
};
plchldr = {
email = "mail@oddco.de";
github = "plchldr";
@@ -18879,6 +18892,12 @@
githubId = 4201956;
name = "pongo1231";
};
poopsicles = {
name = "Fumnanya";
email = "fmowete@outlook.com";
github = "poopsicles";
githubId = 87488715;
};
PopeRigby = {
name = "PopeRigby";
github = "poperigby";
+15 -1
View File
@@ -16,6 +16,7 @@
keep-going ? null,
commit ? null,
skip-prompt ? null,
order ? null,
}:
let
@@ -217,6 +218,18 @@ let
to skip prompt:
--argstr skip-prompt true
By default, the updater will update the packages in arbitrary order. Alternately, you can force a specific order based on the packages dependency relations:
- Reverse topological order (e.g. {"gnome-text-editor", "gimp"}, {"gtk3", "gtk4"}, {"glib"}) is useful when you want checkout each commit one by one to build each package individually but some of the packages to be updated would cause a mass rebuild for the others. Of course, this requires that none of the updated dependents require a new version of the dependency.
--argstr order reverse-topological
- Topological order (e.g. {"glib"}, {"gtk3", "gtk4"}, {"gnome-text-editor", "gimp"}) is useful when the updated dependents require a new version of updated dependency.
--argstr order topological
Note that sorting requires instantiating each package and then querying Nix store for requisites so it will be pretty slow with large number of packages.
'';
# Transform a matched package into an object for update.py.
@@ -241,7 +254,8 @@ let
lib.optional (max-workers != null) "--max-workers=${max-workers}"
++ lib.optional (keep-going == "true") "--keep-going"
++ lib.optional (commit == "true") "--commit"
++ lib.optional (skip-prompt == "true") "--skip-prompt";
++ lib.optional (skip-prompt == "true") "--skip-prompt"
++ lib.optional (order != null) "--order=${order}";
args = [ packagesJson ] ++ optionalArgs;
+434 -87
View File
@@ -1,5 +1,6 @@
from __future__ import annotations
from typing import Dict, Generator, List, Optional, Tuple
from graphlib import TopologicalSorter
from pathlib import Path
from typing import Any, Generator, Literal
import argparse
import asyncio
import contextlib
@@ -10,17 +11,24 @@ import subprocess
import sys
import tempfile
Order = Literal["arbitrary", "reverse-topological", "topological"]
class CalledProcessError(Exception):
process: asyncio.subprocess.Process
stderr: Optional[bytes]
stderr: bytes | None
class UpdateFailedException(Exception):
pass
def eprint(*args, **kwargs):
def eprint(*args: Any, **kwargs: Any) -> None:
print(*args, file=sys.stderr, **kwargs)
async def check_subprocess_output(*args, **kwargs):
async def check_subprocess_output(*args: str, **kwargs: Any) -> bytes:
"""
Emulate check and capture_output arguments of subprocess.run function.
"""
@@ -38,26 +46,182 @@ async def check_subprocess_output(*args, **kwargs):
return stdout
async def run_update_script(nixpkgs_root: str, merge_lock: asyncio.Lock, temp_dir: Optional[Tuple[str, str]], package: Dict, keep_going: bool):
worktree: Optional[str] = None
update_script_command = package['updateScript']
async def nix_instantiate(attr_path: str) -> Path:
out = await check_subprocess_output(
"nix-instantiate",
"-A",
attr_path,
stdout=asyncio.subprocess.PIPE,
stderr=asyncio.subprocess.PIPE,
)
drv = out.decode("utf-8").strip().split("!", 1)[0]
return Path(drv)
async def nix_query_requisites(drv: Path) -> list[Path]:
requisites = await check_subprocess_output(
"nix-store",
"--query",
"--requisites",
str(drv),
stdout=asyncio.subprocess.PIPE,
stderr=asyncio.subprocess.PIPE,
)
drv_str = str(drv)
return [
Path(requisite)
for requisite in requisites.decode("utf-8").splitlines()
# Avoid self-loops.
if requisite != drv_str
]
async def attr_instantiation_worker(
semaphore: asyncio.Semaphore,
attr_path: str,
) -> tuple[Path, str]:
async with semaphore:
eprint(f"Instantiating {attr_path}")
return (await nix_instantiate(attr_path), attr_path)
async def requisites_worker(
semaphore: asyncio.Semaphore,
drv: Path,
) -> tuple[Path, list[Path]]:
async with semaphore:
eprint(f"Obtaining requisites for {drv}")
return (drv, await nix_query_requisites(drv))
def requisites_to_attrs(
drv_attr_paths: dict[Path, str],
requisites: list[Path],
) -> set[str]:
"""
Converts a set of requisite `.drv`s to a set of attribute paths.
Derivations that do not correspond to any of the packages we want to update will be discarded.
"""
return {
drv_attr_paths[requisite]
for requisite in requisites
if requisite in drv_attr_paths
}
def reverse_edges(graph: dict[str, set[str]]) -> dict[str, set[str]]:
"""
Flips the edges of a directed graph.
"""
reversed_graph: dict[str, set[str]] = {}
for dependent, dependencies in graph.items():
for dependency in dependencies:
reversed_graph.setdefault(dependency, set()).add(dependent)
return reversed_graph
def get_independent_sorter(
packages: list[dict],
) -> TopologicalSorter[str]:
"""
Returns a sorter which treats all packages as independent,
which will allow them to be updated in parallel.
"""
attr_deps: dict[str, set[str]] = {
package["attrPath"]: set() for package in packages
}
sorter = TopologicalSorter(attr_deps)
sorter.prepare()
return sorter
async def get_topological_sorter(
max_workers: int,
packages: list[dict],
reverse_order: bool,
) -> tuple[TopologicalSorter[str], list[dict]]:
"""
Returns a sorter which returns packages in topological or reverse topological order,
which will ensure a package is updated before or after its dependencies, respectively.
"""
semaphore = asyncio.Semaphore(max_workers)
drv_attr_paths = dict(
await asyncio.gather(
*(
attr_instantiation_worker(semaphore, package["attrPath"])
for package in packages
)
)
)
drv_requisites = await asyncio.gather(
*(requisites_worker(semaphore, drv) for drv in drv_attr_paths.keys())
)
attr_deps = {
drv_attr_paths[drv]: requisites_to_attrs(drv_attr_paths, requisites)
for drv, requisites in drv_requisites
}
if reverse_order:
attr_deps = reverse_edges(attr_deps)
# Adjust packages order based on the topological one
ordered = list(TopologicalSorter(attr_deps).static_order())
packages = sorted(packages, key=lambda package: ordered.index(package["attrPath"]))
sorter = TopologicalSorter(attr_deps)
sorter.prepare()
return sorter, packages
async def run_update_script(
nixpkgs_root: str,
merge_lock: asyncio.Lock,
temp_dir: tuple[str, str] | None,
package: dict,
keep_going: bool,
) -> None:
worktree: str | None = None
update_script_command = package["updateScript"]
if temp_dir is not None:
worktree, _branch = temp_dir
# Ensure the worktree is clean before update.
await check_subprocess_output('git', 'reset', '--hard', '--quiet', 'HEAD', cwd=worktree)
await check_subprocess_output(
"git",
"reset",
"--hard",
"--quiet",
"HEAD",
cwd=worktree,
)
# Update scripts can use $(dirname $0) to get their location but we want to run
# their clones in the git worktree, not in the main nixpkgs repo.
update_script_command = map(lambda arg: re.sub(r'^{0}'.format(re.escape(nixpkgs_root)), worktree, arg), update_script_command)
update_script_command = map(
lambda arg: re.sub(r"^{0}".format(re.escape(nixpkgs_root)), worktree, arg),
update_script_command,
)
eprint(f" - {package['name']}: UPDATING ...")
try:
update_info = await check_subprocess_output(
'env',
"env",
f"UPDATE_NIX_NAME={package['name']}",
f"UPDATE_NIX_PNAME={package['pname']}",
f"UPDATE_NIX_OLD_VERSION={package['oldVersion']}",
@@ -69,50 +233,77 @@ async def run_update_script(nixpkgs_root: str, merge_lock: asyncio.Lock, temp_di
)
await merge_changes(merge_lock, package, update_info, temp_dir)
except KeyboardInterrupt as e:
eprint('Cancelling…')
eprint("Cancelling…")
raise asyncio.exceptions.CancelledError()
except CalledProcessError as e:
eprint(f" - {package['name']}: ERROR")
eprint()
eprint(f"--- SHOWING ERROR LOG FOR {package['name']} ----------------------")
eprint()
eprint(e.stderr.decode('utf-8'))
with open(f"{package['pname']}.log", 'wb') as logfile:
logfile.write(e.stderr)
eprint()
eprint(f"--- SHOWING ERROR LOG FOR {package['name']} ----------------------")
if e.stderr is not None:
eprint()
eprint(
f"--- SHOWING ERROR LOG FOR {package['name']} ----------------------"
)
eprint()
eprint(e.stderr.decode("utf-8"))
with open(f"{package['pname']}.log", "wb") as logfile:
logfile.write(e.stderr)
eprint()
eprint(
f"--- SHOWING ERROR LOG FOR {package['name']} ----------------------"
)
if not keep_going:
raise UpdateFailedException(f"The update script for {package['name']} failed with exit code {e.process.returncode}")
raise UpdateFailedException(
f"The update script for {package['name']} failed with exit code {e.process.returncode}"
)
@contextlib.contextmanager
def make_worktree() -> Generator[Tuple[str, str], None, None]:
def make_worktree() -> Generator[tuple[str, str], None, None]:
with tempfile.TemporaryDirectory() as wt:
branch_name = f'update-{os.path.basename(wt)}'
target_directory = f'{wt}/nixpkgs'
branch_name = f"update-{os.path.basename(wt)}"
target_directory = f"{wt}/nixpkgs"
subprocess.run(['git', 'worktree', 'add', '-b', branch_name, target_directory])
subprocess.run(["git", "worktree", "add", "-b", branch_name, target_directory])
try:
yield (target_directory, branch_name)
finally:
subprocess.run(['git', 'worktree', 'remove', '--force', target_directory])
subprocess.run(['git', 'branch', '-D', branch_name])
subprocess.run(["git", "worktree", "remove", "--force", target_directory])
subprocess.run(["git", "branch", "-D", branch_name])
async def commit_changes(name: str, merge_lock: asyncio.Lock, worktree: str, branch: str, changes: List[Dict]) -> None:
async def commit_changes(
name: str,
merge_lock: asyncio.Lock,
worktree: str,
branch: str,
changes: list[dict],
) -> None:
for change in changes:
# Git can only handle a single index operation at a time
async with merge_lock:
await check_subprocess_output('git', 'add', *change['files'], cwd=worktree)
commit_message = '{attrPath}: {oldVersion} -> {newVersion}'.format(**change)
if 'commitMessage' in change:
commit_message = change['commitMessage']
elif 'commitBody' in change:
commit_message = commit_message + '\n\n' + change['commitBody']
await check_subprocess_output('git', 'commit', '--quiet', '-m', commit_message, cwd=worktree)
await check_subprocess_output('git', 'cherry-pick', branch)
await check_subprocess_output("git", "add", *change["files"], cwd=worktree)
commit_message = "{attrPath}: {oldVersion} -> {newVersion}".format(**change)
if "commitMessage" in change:
commit_message = change["commitMessage"]
elif "commitBody" in change:
commit_message = commit_message + "\n\n" + change["commitBody"]
await check_subprocess_output(
"git",
"commit",
"--quiet",
"-m",
commit_message,
cwd=worktree,
)
await check_subprocess_output("git", "cherry-pick", branch)
async def check_changes(package: Dict, worktree: str, update_info: str):
if 'commit' in package['supportedFeatures']:
async def check_changes(
package: dict,
worktree: str,
update_info: bytes,
) -> list[dict]:
if "commit" in package["supportedFeatures"]:
changes = json.loads(update_info)
else:
changes = [{}]
@@ -120,133 +311,289 @@ async def check_changes(package: Dict, worktree: str, update_info: str):
# Try to fill in missing attributes when there is just a single change.
if len(changes) == 1:
# Dynamic data from updater take precedence over static data from passthru.updateScript.
if 'attrPath' not in changes[0]:
if "attrPath" not in changes[0]:
# update.nix is always passing attrPath
changes[0]['attrPath'] = package['attrPath']
changes[0]["attrPath"] = package["attrPath"]
if 'oldVersion' not in changes[0]:
if "oldVersion" not in changes[0]:
# update.nix is always passing oldVersion
changes[0]['oldVersion'] = package['oldVersion']
changes[0]["oldVersion"] = package["oldVersion"]
if 'newVersion' not in changes[0]:
attr_path = changes[0]['attrPath']
obtain_new_version_output = await check_subprocess_output('nix-instantiate', '--expr', f'with import ./. {{}}; lib.getVersion {attr_path}', '--eval', '--strict', '--json', stdout=asyncio.subprocess.PIPE, stderr=asyncio.subprocess.PIPE, cwd=worktree)
changes[0]['newVersion'] = json.loads(obtain_new_version_output.decode('utf-8'))
if "newVersion" not in changes[0]:
attr_path = changes[0]["attrPath"]
obtain_new_version_output = await check_subprocess_output(
"nix-instantiate",
"--expr",
f"with import ./. {{}}; lib.getVersion {attr_path}",
"--eval",
"--strict",
"--json",
stdout=asyncio.subprocess.PIPE,
stderr=asyncio.subprocess.PIPE,
cwd=worktree,
)
changes[0]["newVersion"] = json.loads(
obtain_new_version_output.decode("utf-8")
)
if 'files' not in changes[0]:
changed_files_output = await check_subprocess_output('git', 'diff', '--name-only', 'HEAD', stdout=asyncio.subprocess.PIPE, cwd=worktree)
if "files" not in changes[0]:
changed_files_output = await check_subprocess_output(
"git",
"diff",
"--name-only",
"HEAD",
stdout=asyncio.subprocess.PIPE,
cwd=worktree,
)
changed_files = changed_files_output.splitlines()
changes[0]['files'] = changed_files
changes[0]["files"] = changed_files
if len(changed_files) == 0:
return []
return changes
async def merge_changes(merge_lock: asyncio.Lock, package: Dict, update_info: str, temp_dir: Optional[Tuple[str, str]]) -> None:
async def merge_changes(
merge_lock: asyncio.Lock,
package: dict,
update_info: bytes,
temp_dir: tuple[str, str] | None,
) -> None:
if temp_dir is not None:
worktree, branch = temp_dir
changes = await check_changes(package, worktree, update_info)
if len(changes) > 0:
await commit_changes(package['name'], merge_lock, worktree, branch, changes)
await commit_changes(package["name"], merge_lock, worktree, branch, changes)
else:
eprint(f" - {package['name']}: DONE, no changes.")
else:
eprint(f" - {package['name']}: DONE.")
async def updater(nixpkgs_root: str, temp_dir: Optional[Tuple[str, str]], merge_lock: asyncio.Lock, packages_to_update: asyncio.Queue[Optional[Dict]], keep_going: bool, commit: bool):
async def updater(
nixpkgs_root: str,
temp_dir: tuple[str, str] | None,
merge_lock: asyncio.Lock,
packages_to_update: asyncio.Queue[dict | None],
keep_going: bool,
commit: bool,
) -> None:
while True:
package = await packages_to_update.get()
if package is None:
# A sentinel received, we are done.
return
if not ('commit' in package['supportedFeatures'] or 'attrPath' in package):
if not ("commit" in package["supportedFeatures"] or "attrPath" in package):
temp_dir = None
await run_update_script(nixpkgs_root, merge_lock, temp_dir, package, keep_going)
async def start_updates(max_workers: int, keep_going: bool, commit: bool, packages: List[Dict]):
packages_to_update.task_done()
async def populate_queue(
attr_packages: dict[str, dict],
sorter: TopologicalSorter[str],
packages_to_update: asyncio.Queue[dict | None],
num_workers: int,
) -> None:
"""
Keeps populating the queue with packages that can be updated
according to ordering requirements. If topological order
is used, the packages will appear in waves, as packages with
no dependencies are processed and removed from the sorter.
With `order="none"`, all packages will be enqueued simultaneously.
"""
# Fill up an update queue,
while sorter.is_active():
ready_packages = list(sorter.get_ready())
eprint(f"Enqueuing group of {len(ready_packages)} packages")
for package in ready_packages:
await packages_to_update.put(attr_packages[package])
await packages_to_update.join()
sorter.done(*ready_packages)
# Add sentinels, one for each worker.
# A worker will terminate when it gets a sentinel from the queue.
for i in range(num_workers):
await packages_to_update.put(None)
async def start_updates(
max_workers: int,
keep_going: bool,
commit: bool,
attr_packages: dict[str, dict],
sorter: TopologicalSorter[str],
) -> None:
merge_lock = asyncio.Lock()
packages_to_update: asyncio.Queue[Optional[Dict]] = asyncio.Queue()
packages_to_update: asyncio.Queue[dict | None] = asyncio.Queue()
with contextlib.ExitStack() as stack:
temp_dirs: List[Optional[Tuple[str, str]]] = []
temp_dirs: list[tuple[str, str] | None] = []
# Do not create more workers than there are packages.
num_workers = min(max_workers, len(packages))
num_workers = min(max_workers, len(attr_packages))
nixpkgs_root_output = await check_subprocess_output('git', 'rev-parse', '--show-toplevel', stdout=asyncio.subprocess.PIPE)
nixpkgs_root = nixpkgs_root_output.decode('utf-8').strip()
nixpkgs_root_output = await check_subprocess_output(
"git",
"rev-parse",
"--show-toplevel",
stdout=asyncio.subprocess.PIPE,
)
nixpkgs_root = nixpkgs_root_output.decode("utf-8").strip()
# Set up temporary directories when using auto-commit.
for i in range(num_workers):
temp_dir = stack.enter_context(make_worktree()) if commit else None
temp_dirs.append(temp_dir)
# Fill up an update queue,
for package in packages:
await packages_to_update.put(package)
# Add sentinels, one for each worker.
# A workers will terminate when it gets sentinel from the queue.
for i in range(num_workers):
await packages_to_update.put(None)
queue_task = populate_queue(
attr_packages,
sorter,
packages_to_update,
num_workers,
)
# Prepare updater workers for each temp_dir directory.
# At most `num_workers` instances of `run_update_script` will be running at one time.
updaters = asyncio.gather(*[updater(nixpkgs_root, temp_dir, merge_lock, packages_to_update, keep_going, commit) for temp_dir in temp_dirs])
updater_tasks = [
updater(
nixpkgs_root,
temp_dir,
merge_lock,
packages_to_update,
keep_going,
commit,
)
for temp_dir in temp_dirs
]
tasks = asyncio.gather(
*updater_tasks,
queue_task,
)
try:
# Start updater workers.
await updaters
await tasks
except asyncio.exceptions.CancelledError:
# When one worker is cancelled, cancel the others too.
updaters.cancel()
tasks.cancel()
except UpdateFailedException as e:
# When one worker fails, cancel the others, as this exception is only thrown when keep_going is false.
updaters.cancel()
tasks.cancel()
eprint(e)
sys.exit(1)
def main(max_workers: int, keep_going: bool, commit: bool, packages_path: str, skip_prompt: bool) -> None:
async def main(
max_workers: int,
keep_going: bool,
commit: bool,
packages_path: str,
skip_prompt: bool,
order: Order,
) -> None:
with open(packages_path) as f:
packages = json.load(f)
if order != "arbitrary":
eprint("Sorting packages…")
reverse_order = order == "reverse-topological"
sorter, packages = await get_topological_sorter(
max_workers,
packages,
reverse_order,
)
else:
sorter = get_independent_sorter(packages)
attr_packages = {package["attrPath"]: package for package in packages}
eprint()
eprint('Going to be running update for following packages:')
eprint("Going to be running update for following packages:")
for package in packages:
eprint(f" - {package['name']}")
eprint()
confirm = '' if skip_prompt else input('Press Enter key to continue...')
confirm = "" if skip_prompt else input("Press Enter key to continue...")
if confirm == '':
if confirm == "":
eprint()
eprint('Running update for:')
eprint("Running update for:")
asyncio.run(start_updates(max_workers, keep_going, commit, packages))
await start_updates(max_workers, keep_going, commit, attr_packages, sorter)
eprint()
eprint('Packages updated!')
eprint("Packages updated!")
sys.exit()
else:
eprint('Aborting!')
eprint("Aborting!")
sys.exit(130)
parser = argparse.ArgumentParser(description='Update packages')
parser.add_argument('--max-workers', '-j', dest='max_workers', type=int, help='Number of updates to run concurrently', nargs='?', default=4)
parser.add_argument('--keep-going', '-k', dest='keep_going', action='store_true', help='Do not stop after first failure')
parser.add_argument('--commit', '-c', dest='commit', action='store_true', help='Commit the changes')
parser.add_argument('packages', help='JSON file containing the list of package names and their update scripts')
parser.add_argument('--skip-prompt', '-s', dest='skip_prompt', action='store_true', help='Do not stop for prompts')
if __name__ == '__main__':
parser = argparse.ArgumentParser(description="Update packages")
parser.add_argument(
"--max-workers",
"-j",
dest="max_workers",
type=int,
help="Number of updates to run concurrently",
nargs="?",
default=4,
)
parser.add_argument(
"--keep-going",
"-k",
dest="keep_going",
action="store_true",
help="Do not stop after first failure",
)
parser.add_argument(
"--commit",
"-c",
dest="commit",
action="store_true",
help="Commit the changes",
)
parser.add_argument(
"--order",
dest="order",
default="arbitrary",
choices=["arbitrary", "reverse-topological", "topological"],
help="Sort the packages based on dependency relation",
)
parser.add_argument(
"packages",
help="JSON file containing the list of package names and their update scripts",
)
parser.add_argument(
"--skip-prompt",
"-s",
dest="skip_prompt",
action="store_true",
help="Do not stop for prompts",
)
if __name__ == "__main__":
args = parser.parse_args()
try:
main(args.max_workers, args.keep_going, args.commit, args.packages, args.skip_prompt)
asyncio.run(
main(
args.max_workers,
args.keep_going,
args.commit,
args.packages,
args.skip_prompt,
args.order,
)
)
except KeyboardInterrupt as e:
# Lets cancel outside of the main loop too.
sys.exit(130)
+1
View File
@@ -64,6 +64,7 @@ with lib.maintainers;
# Edits to this list should only be done by an already existing member.
members = [
wolfgangwalther
DutchGerman
];
};
@@ -114,6 +114,54 @@ using lightdm for a user `alice`:
}
```
## Running X without a display manager {#sec-x11-startx}
It is possible to avoid a display manager entirely and starting the X server
manually from a virtual terminal. Add to your configuration
```nix
{
services.xserver.displayManager.startx = {
enable = true;
generateScript = true;
};
}
```
then you can start the X server with the `startx` command.
The second option will generate a base `xinitrc` script that will run your
window manager and set up the systemd user session.
You can extend the script using the [extraCommands](#opt-services.xserver.displayManager.startx.extraCommands) for example:
```nix
{
services.xserver.displayManager.startx = {
generateScript = true;
extraCommands = ''
xrdb -load .Xresources
xsetroot -solid '#666661'
xsetroot -cursor_name left_ptr
'';
};
}
```
or, alternatively, you can write your own from scratch in `~/.xinitrc`.
In this case, remember you're responsible for starting the window manager, for
example
```shell
sxhkd &
bspwm &
```
and if you have enabled some systemd user service, you will probably want to
also add these lines too:
```shell
# import required env variables from the current shell
systemctl --user import-environment DISPLAY XDG_SESSION_ID
# start all graphical user services
systemctl --user start nixos-fake-graphical-session.target
# start the user dbus daemon
dbus-daemon --session --address="unix:path=/run/user/$(id -u)/bus" &
```
## Intel Graphics drivers {#sec-x11--graphics-cards-intel}
The default and recommended driver for Intel Graphics in X.org is `modesetting`
+3
View File
@@ -272,6 +272,9 @@
"sec-x11-auto-login": [
"index.html#sec-x11-auto-login"
],
"sec-x11-startx": [
"index.html#sec-x11-startx"
],
"sec-x11--graphics-cards-intel": [
"index.html#sec-x11--graphics-cards-intel"
],
@@ -206,9 +206,6 @@
- `pkgs.nextcloud28` has been removed since it's out of support upstream.
- Emacs lisp build helpers, such as `emacs.pkgs.melpaBuild`, now enables `__structuredAttrs` by default.
Environment variables have to be passed via the `env` attribute.
- `buildGoModule` now passes environment variables via the `env` attribute. `CGO_ENABLED` should now be specified with `env.CGO_ENABLED` when passing to buildGoModule. Direct specification of `CGO_ENABLED` is now redirected by a compatibility layer with a warning, but will become an error in future releases.
Go-related environment variables previously shadowed by `buildGoModule` now results in errors when specified directly. Such variables include `GOOS` and `GOARCH`.
@@ -559,6 +556,10 @@
- For matrix homeserver Synapse we are now following the upstream recommendation to enable jemalloc as the memory allocator by default.
- In `dovecot` package removed hard coding path to module directory.
- `services.dovecot2.modules` have been removed, now need to use `environment.systemPackages` to load additional Dovecot modules.
- `services.kmonad` now creates a determinate symlink (in `/dev/input/by-id/`) to each of KMonad virtual devices.
- `services.gitea` now supports CAPTCHA usage through the `services.gitea.captcha` variable.
-5
View File
@@ -49,10 +49,5 @@ in
);
serviceConfig.Restart = "always";
};
warnings = lib.mkIf (config.services.xserver.displayManager.startx.enable) [
"xss-lock service only works if a displayManager is set; it doesn't work when services.xserver.displayManager.startx.enable = true"
];
};
}
+6 -20
View File
@@ -111,6 +111,7 @@ let
base_dir = ${baseDir}
protocols = ${concatStringsSep " " cfg.protocols}
sendmail_path = /run/wrappers/bin/sendmail
mail_plugin_dir = /run/current-system/sw/lib/dovecot/modules
# defining mail_plugins must be done before the first protocol {} filter because of https://doc.dovecot.org/configuration_manual/config_file/config_file_syntax/#variable-expansion
mail_plugins = $mail_plugins ${concatStringsSep " " cfg.mailPlugins.globally.enable}
''
@@ -207,13 +208,6 @@ let
cfg.extraConfig
];
modulesDir = pkgs.symlinkJoin {
name = "dovecot-modules";
paths = map (pkg: "${pkg}/lib/dovecot") (
[ dovecotPkg ] ++ map (module: module.override { dovecot = dovecotPkg; }) cfg.modules
);
};
mailboxConfig =
mailbox:
''
@@ -280,6 +274,11 @@ in
{
imports = [
(mkRemovedOptionModule [ "services" "dovecot2" "package" ] "")
(mkRemovedOptionModule [
"services"
"dovecot2"
"modules"
] "Now need to use `environment.systemPackages` to load additional Dovecot modules")
(mkRenamedOptionModule
[ "services" "dovecot2" "sieveScripts" ]
[ "services" "dovecot2" "sieve" "scripts" ]
@@ -409,17 +408,6 @@ in
default = true;
};
modules = mkOption {
type = types.listOf types.package;
default = [ ];
example = literalExpression "[ pkgs.dovecot_pigeonhole ]";
description = ''
Symlinks the contents of lib/dovecot of every given package into
/etc/dovecot/modules. This will make the given modules available
if a dovecot package with the module_dir patch applied is being used.
'';
};
sslCACert = mkOption {
type = types.nullOr types.str;
default = null;
@@ -702,7 +690,6 @@ in
${cfg.mailGroup} = { };
};
environment.etc."dovecot/modules".source = modulesDir;
environment.etc."dovecot/dovecot.conf".source = cfg.configFile;
systemd.services.dovecot2 = {
@@ -712,7 +699,6 @@ in
wantedBy = [ "multi-user.target" ];
restartTriggers = [
cfg.configFile
modulesDir
];
startLimitIntervalSec = 60; # 1 min
+1 -1
View File
@@ -10,7 +10,7 @@ let
settings = lib.attrsets.filterAttrs (n: v: v != null) cfg.settings;
configFile = format.generate "evremap.toml" settings;
key = lib.types.strMatching "(BTN|KEY)_[[:upper:]]+" // {
key = lib.types.strMatching "(BTN|KEY)_[[:upper:][:digit:]_]+" // {
description = "key ID prefixed with BTN_ or KEY_";
};
@@ -5,12 +5,16 @@
...
}:
with lib;
let
cfg = config.services.xserver.displayManager.startx;
# WM session script
# Note: this assumes a single WM has been enabled
sessionScript = lib.concatMapStringsSep "\n" (
i: i.start
) config.services.xserver.windowManager.session;
in
{
@@ -19,40 +23,93 @@ in
options = {
services.xserver.displayManager.startx = {
enable = mkOption {
type = types.bool;
enable = lib.mkOption {
type = lib.types.bool;
default = false;
description = ''
Whether to enable the dummy "startx" pseudo-display manager,
which allows users to start X manually via the "startx" command
from a vt shell. The X server runs under the user's id, not as root.
The user must provide a ~/.xinitrc file containing session startup
commands, see {manpage}`startx(1)`. This is not automatically generated
from the desktopManager and windowManager settings.
Whether to enable the dummy "startx" pseudo-display manager, which
allows users to start X manually via the `startx` command from a
virtual terminal.
::: {.note}
The X server will run under the current user, not as root.
:::
'';
};
generateScript = lib.mkOption {
type = lib.types.bool;
default = false;
description = ''
Whether to generate the system-wide xinitrc script (/etc/X11/xinit/xinitrc).
This script will take care of setting up the session for systemd user
services, running the window manager and cleaning up on exit.
::: {.note}
This script will only be used by `startx` when both `.xinitrc` does not
exists and the `XINITRC` environment variable is unset.
:::
'';
};
extraCommands = lib.mkOption {
type = lib.types.lines;
default = "";
description = ''
Shell commands to be added to the system-wide xinitrc script.
'';
};
};
};
###### implementation
config = mkIf cfg.enable {
services.xserver = {
exportConfiguration = true;
};
config = lib.mkIf cfg.enable {
services.xserver.exportConfiguration = true;
# Other displayManagers log to /dev/null because they're services and put
# Xorg's stdout in the journal
#
# To send log to Xorg's default log location ($XDG_DATA_HOME/xorg/), we do
# not specify a log file when running X
services.xserver.logFile = mkDefault null;
services.xserver.logFile = lib.mkDefault null;
# Implement xserverArgs via xinit's system-wide xserverrc
environment.etc."X11/xinit/xserverrc".source = pkgs.writeShellScript "xserverrc" ''
exec ${pkgs.xorg.xorgserver}/bin/X ${toString config.services.xserver.displayManager.xserverArgs} "$@"
exec ${pkgs.xorg.xorgserver}/bin/X \
${toString config.services.xserver.displayManager.xserverArgs} "$@"
'';
# Add a sane system-wide xinitrc script
environment.etc."X11/xinit/xinitrc".source = lib.mkIf cfg.generateScript (
pkgs.writeShellScript "xinitrc" ''
${cfg.extraCommands}
# start user services
systemctl --user import-environment DISPLAY XDG_SESSION_ID
systemctl --user start nixos-fake-graphical-session.target
# run the window manager script
${sessionScript}
wait $waitPID
# stop services and all subprocesses
systemctl --user stop nixos-fake-graphical-session.target
kill 0
''
);
environment.systemPackages = with pkgs; [ xorg.xinit ];
# Make graphical-session fail if the user environment has not been imported
systemd.user.targets.graphical-session = {
unitConfig.AssertEnvironment = [
"DISPLAY"
"XDG_SESSION_ID"
];
};
};
}
+1
View File
@@ -1152,6 +1152,7 @@ in {
systemd-userdbd = handleTest ./systemd-userdbd.nix {};
systemd-homed = handleTest ./systemd-homed.nix {};
systemtap = handleTest ./systemtap.nix {};
startx = runTest ./startx.nix;
taler = handleTest ./taler {};
tandoor-recipes = handleTest ./tandoor-recipes.nix {};
tandoor-recipes-script-name = handleTest ./tandoor-recipes-script-name.nix {};
+108
View File
@@ -0,0 +1,108 @@
{ lib, ... }:
{
name = "startx";
meta.maintainers = with lib.maintainers; [ rnhmjoj ];
nodes.machine =
{ pkgs, ... }:
{
services.getty.autologinUser = "root";
environment.systemPackages = with pkgs; [
xdotool
catclock
];
programs.bash.promptInit = "PS1='# '";
# startx+bspwm setup
services.xserver = {
enable = true;
windowManager.bspwm = {
enable = true;
configFile = pkgs.writeShellScript "bspwrc" ''
bspc config border_width 2
bspc config window_gap 12
bspc rule -a xclock state=floating sticky=on
'';
sxhkd.configFile = pkgs.writeText "sxhkdrc" ''
# open a terminal
super + Return
urxvtc
# quit bspwm
super + alt + Escape
bspc quit
'';
};
displayManager.startx = {
enable = true;
generateScript = true;
extraCommands = ''
xrdb -load ~/.Xresources
xsetroot -solid '#343d46'
xsetroot -cursor_name trek
xclock &
'';
};
};
# enable some user services
security.polkit.enable = true;
services.urxvtd.enable = true;
programs.xss-lock.enable = true;
};
testScript = ''
import textwrap
sysu = "env XDG_RUNTIME_DIR=/run/user/0 systemctl --user";
prompt = "# "
with subtest("Wait for the autologin"):
machine.wait_until_tty_matches("1", prompt)
with subtest("Setup dotfiles"):
machine.execute(textwrap.dedent("""
cat <<EOF > ~/.Xresources
urxvt*foreground: #9b9081
urxvt*background: #181b20
urxvt*scrollBar: false
urxvt*title: myterm
urxvt*geometry: 80x240+0+0
xclock*geometry: 164x164+24+440
EOF
"""))
with subtest("Can start the X server"):
machine.send_chars("startx\n")
machine.wait_for_x()
machine.wait_for_window("xclock")
with subtest("Graphical services are running"):
machine.succeed(f"{sysu} is-active graphical-session.target")
machine.succeed(f"{sysu} is-active urxvtd")
machine.succeed(f"{sysu} is-active xss-lock")
with subtest("Can interact with the WM"):
machine.wait_until_succeeds("pgrep sxhkd")
machine.wait_until_succeeds("pgrep bspwm")
# spawn some terminals
machine.send_key("meta_l-ret", delay=0.5)
machine.send_key("meta_l-ret", delay=0.5)
machine.send_key("meta_l-ret", delay=0.5)
# Note: this tests that resources have beeen loaded
machine.wait_for_window("myterm")
machine.screenshot("screenshot.png")
with subtest("Can stop the X server"):
# kill the WM
machine.send_key("meta_l-alt-esc")
machine.wait_until_tty_matches("1", prompt)
with subtest("Graphical session has stopped"):
machine.fail(f"{sysu} is-active graphical-session.target")
machine.fail(f"{sysu} is-active urxvtd")
machine.fail(f"{sysu} is-active xss-lock")
'';
}
@@ -61,7 +61,6 @@ lib.extendMkDerivation {
propagatedUserEnvPkgs = finalAttrs.packageRequires ++ propagatedUserEnvPkgs;
strictDeps = args.strictDeps or true;
__structuredAttrs = args.__structuredAttrs or true;
inherit turnCompilationWarningToError ignoreCompilationError;
@@ -12,12 +12,12 @@
pkgs,
}:
let
version = "0.0.22";
version = "0.0.23";
src = fetchFromGitHub {
owner = "yetone";
repo = "avante.nvim";
tag = "v${version}";
hash = "sha256-m33yNoGnSYKfjTuabxx/QsMptiUxAcP8NVe/su+JfkE=";
hash = "sha256-Ud4NkJH7hze5796KjVe5Nj9DzxwQkDQErCJDDiBzAIY=";
};
avante-nvim-lib = rustPlatform.buildRustPackage {
pname = "avante-nvim-lib";
File diff suppressed because it is too large Load Diff
@@ -7,8 +7,8 @@ vscode-utils.buildVscodeMarketplaceExtension {
mktplcRef = {
publisher = "ms-pyright";
name = "pyright";
version = "1.1.394";
hash = "sha256-LQYC4dZ0lJ+NkQjRGW0HQ16TK2NI0ZK2IYytkxoBhR0=";
version = "1.1.396";
hash = "sha256-QKfFJvzyPlF9tPDeg271/oZ506hIlr3OX7JuF0f6kEE=";
};
meta = {
+5 -1
View File
@@ -21,7 +21,7 @@ let
in
symlinkJoin rec {
inherit (qgis-unwrapped) version;
inherit (qgis-unwrapped) version src;
name = "qgis-${version}";
paths = [ qgis-unwrapped ];
@@ -47,6 +47,10 @@ symlinkJoin rec {
passthru = {
unwrapped = qgis-unwrapped;
tests.qgis = nixosTests.qgis;
updateScript = [
./update.sh
"qgis"
];
};
meta = qgis-unwrapped.meta;
+5 -1
View File
@@ -21,7 +21,7 @@ let
in
symlinkJoin rec {
inherit (qgis-ltr-unwrapped) version;
inherit (qgis-ltr-unwrapped) version src;
name = "qgis-${version}";
paths = [ qgis-ltr-unwrapped ];
@@ -48,6 +48,10 @@ symlinkJoin rec {
passthru = {
unwrapped = qgis-ltr-unwrapped;
tests.qgis-ltr = nixosTests.qgis-ltr;
updateScript = [
./update.sh
"qgis-ltr"
];
};
inherit (qgis-ltr-unwrapped) meta;
@@ -11,16 +11,6 @@ index b51fd0075e..87ee317e05 100644
IF(_pyqt5_metadata)
FILE(READ ${_pyqt5_metadata} _pyqt5_metadata_contents)
STRING(REGEX REPLACE ".*\nVersion: ([^\n]+).*$" "\\1" PYQT5_VERSION_STR ${_pyqt5_metadata_contents})
@@ -34,8 +34,8 @@ ELSE(EXISTS PYQT5_VERSION_STR)
ENDIF(_pyqt5_metadata)
IF(PYQT5_VERSION_STR)
- SET(PYQT5_MOD_DIR "${Python_SITEARCH}/PyQt5")
- SET(PYQT5_SIP_DIR "${Python_SITEARCH}/PyQt5/bindings")
+ SET(PYQT5_MOD_DIR "@pyQt5PackageDir@/PyQt5")
+ SET(PYQT5_SIP_DIR "@pyQt5PackageDir@/PyQt5/bindings")
FIND_PROGRAM(__pyuic5 "pyuic5")
GET_FILENAME_COMPONENT(PYQT5_BIN_DIR ${__pyuic5} DIRECTORY)
diff --git a/cmake/FindQsci.cmake b/cmake/FindQsci.cmake
index 69e41c1fe9..5456c3d59b 100644
+7 -2
View File
@@ -82,14 +82,14 @@ let
];
in
mkDerivation rec {
version = "3.34.15";
version = "3.40.4";
pname = "qgis-ltr-unwrapped";
src = fetchFromGitHub {
owner = "qgis";
repo = "QGIS";
rev = "final-${lib.replaceStrings [ "." ] [ "_" ] version}";
hash = "sha256-TFnlQIizI+8CZgNpwkuipSCNT3OYIaOeoz6kIGcSYL4=";
hash = "sha256-R2/ycRPQVKqleSt+9D/YCpBlqKgJdhLc0BvYT7qFJo8=";
};
passthru = {
@@ -160,6 +160,11 @@ mkDerivation rec {
"-DWITH_3D=True"
"-DWITH_PDAL=True"
"-DENABLE_TESTS=False"
"-DQT_PLUGINS_DIR=${qtbase}/${qtbase.qtPluginPrefix}"
# Remove for QGIS 3.42
"-DCMAKE_POLICY_DEFAULT_CMP0175=OLD"
"-DCMAKE_POLICY_DEFAULT_CMP0177=OLD"
]
++ lib.optional (!withWebKit) "-DWITH_QTWEBKIT=OFF"
++ lib.optional withServer [
+2 -2
View File
@@ -80,14 +80,14 @@ let
urllib3
];
in mkDerivation rec {
version = "3.40.3";
version = "3.42.0";
pname = "qgis-unwrapped";
src = fetchFromGitHub {
owner = "qgis";
repo = "QGIS";
rev = "final-${lib.replaceStrings [ "." ] [ "_" ] version}";
hash = "sha256-AUDohf71NIuEjFrzRQ8QsdvmEjYsZK9aI4j0msVJgcQ=";
hash = "sha256-vqT6ffqY1M6/2eW08VghysC+v7ZI9Yz0Zhk9UY/izZc=";
};
passthru = {
+20
View File
@@ -0,0 +1,20 @@
#!/usr/bin/env nix-shell
#!nix-shell -i bash -p common-updater-scripts curl jq
set -eu -o pipefail
url="https://version.qgis.org/version.json"
package="$1"
function make_version {
jq --raw-output '[.major, .minor, .patch] | join(".")'
}
if [ "$package" == "qgis" ]; then
version="$(curl --silent $url | jq '.latest' | make_version)"
elif [ "$package" == "qgis-ltr" ]; then
version="$(curl --silent $url | jq '.ltr' | make_version)"
fi
update-source-version "$package" "$version"
File diff suppressed because it is too large Load Diff
@@ -9,10 +9,10 @@
buildMozillaMach rec {
pname = "firefox";
version = "136.0";
version = "136.0.1";
src = fetchurl {
url = "mirror://mozilla/firefox/releases/${version}/source/firefox-${version}.source.tar.xz";
sha512 = "a2b7e74e8404138b294f7b3c5f1eaeaeb8ce84c9aad25379e8ec785a9686f42def9f8c119d4bc276dd371d13d7bebbe4b1b092af41500aa8c2b2c827971445b4";
sha512 = "e5833ccf97796c15b5156357427621d1f2d1d7ee55b53262f3935eadb98229c74a355bbe2f72a4168ec4e29dd3f83f4eaca99c5215d61bd087475331d3522abd";
};
meta = {
+2 -2
View File
@@ -15,13 +15,13 @@
python3Packages.buildPythonApplication rec {
pname = "tartube";
version = "2.5.062";
version = "2.5.100";
src = fetchFromGitHub {
owner = "axcore";
repo = "tartube";
tag = "v${version}";
sha256 = "sha256-AtyqSapX8M8PUGeOiC2WFgs0nPgosT7UcbTHejIfwhc=";
sha256 = "sha256-zocFQRpYbWxG/EoZW419v6li8HBo/9woTBYDbzHR4qQ=";
};
nativeBuildInputs = [
+3 -3
View File
@@ -22,16 +22,16 @@ let
in
buildNpmPackage' rec {
pname = "balena-cli";
version = "20.2.7";
version = "20.2.10";
src = fetchFromGitHub {
owner = "balena-io";
repo = "balena-cli";
rev = "v${version}";
hash = "sha256-D6GZRkA+O6vuz1ntUT8Hz0fCEv6xlHx7sG6BrLzJm/k=";
hash = "sha256-kY8hXNDxbQwM2QleQ8MafDuANQzBRL3+Tei10P976bU=";
};
npmDepsHash = "sha256-x9/qwDJH0AlWehUlsFQdNHI53YWh2DHX/19VDA7vJc4=";
npmDepsHash = "sha256-AD/5QMgko1l8xH8dwua6YkrYuXe1Af7eo17p2L2PkyY=";
postPatch = ''
ln -s npm-shrinkwrap.json package-lock.json
+3 -3
View File
@@ -7,16 +7,16 @@
buildGoModule rec {
pname = "containerlab";
version = "0.65.1";
version = "0.66.0";
src = fetchFromGitHub {
owner = "srl-labs";
repo = "containerlab";
rev = "v${version}";
hash = "sha256-ivygQomXIgRpCBa3YZYKfk6Twml+TJOae7YGsTDqf+8=";
hash = "sha256-y3zmKS5jeVxJAe+TBu7eg7OeM27d0xbKuxR03WnibkE=";
};
vendorHash = "sha256-Y7ckQeC94zqNmSu9Y5Cd/kM3aoRdjsmBK2uMZzoJNh4=";
vendorHash = "sha256-zRq9o+xOmb3C3BARS2Y2Cu5ioQKey/5MGu9HxYBxcsw=";
nativeBuildInputs = [ installShellFiles ];
+10
View File
@@ -3,6 +3,7 @@
fetchFromGitHub,
rustPlatform,
pkg-config,
installShellFiles,
stdenv,
darwin,
versionCheckHook,
@@ -26,6 +27,7 @@ rustPlatform.buildRustPackage rec {
nativeBuildInputs =
[
pkg-config
installShellFiles
]
++ lib.optionals stdenv.hostPlatform.isDarwin [
darwin.DarwinTools
@@ -39,6 +41,14 @@ rustPlatform.buildRustPackage rec {
"--skip=test_run"
];
postInstall = ''
installManPage doc/cyme.1
installShellCompletion --cmd cyme \
--bash doc/cyme.bash \
--fish doc/cyme.fish \
--zsh doc/_cyme
'';
nativeInstallCheckInputs = [
versionCheckHook
];
+2 -2
View File
@@ -11,13 +11,13 @@
stdenv.mkDerivation (finalAttrs: {
pname = "dayon";
version = "16.0.1";
version = "16.0.2";
src = fetchFromGitHub {
owner = "RetGal";
repo = "dayon";
rev = "v${finalAttrs.version}";
hash = "sha256-w5k5AiJ956+VO16e3hSjZWCTlR9l/oeNg6kWQLpFvOs=";
hash = "sha256-EOQVDzza1tqAzGtEV0npT2k1thTNJOhzMXXX1Tuti6Q=";
};
nativeBuildInputs = [
@@ -30,7 +30,7 @@ stdenv.mkDerivation rec {
configureFlags = [
"--with-dovecot=${dovecot}/lib/dovecot"
"--with-moduledir=$(out)/lib/dovecot"
"--with-moduledir=${placeholder "out"}/lib/dovecot/modules"
];
meta = with lib; {
@@ -38,7 +38,7 @@ stdenv.mkDerivation rec {
configureFlags = [
"--with-dovecot=${dovecot}/lib/dovecot"
"--with-moduledir=$(out)/lib/dovecot"
"--with-moduledir=${placeholder "out"}/lib/dovecot/modules"
];
meta = with lib; {
@@ -33,8 +33,8 @@ stdenv.mkDerivation rec {
configureFlags = [
"--with-dovecot=${dovecot}/lib/dovecot"
"--with-moduledir=${placeholder "out"}/lib/dovecot/modules"
"--without-dovecot-install-dirs"
"--with-moduledir=$(out)/lib/dovecot"
];
enableParallelBuilding = true;
+55
View File
@@ -0,0 +1,55 @@
{
lib,
rustPlatform,
fetchFromGitHub,
pkg-config,
fontconfig,
versionCheckHook,
nix-update-script,
}:
rustPlatform.buildRustPackage (finalAttrs: {
pname = "dovi-tool";
version = "2.2.0";
src = fetchFromGitHub {
owner = "quietvoid";
repo = "dovi_tool";
tag = finalAttrs.version;
hash = "sha256-z783L6gBr9o44moKYZGwymWEMp5ZW7yOhZcpvbznXK4=";
};
useFetchCargoVendor = true;
cargoHash = "sha256-pwB6QBLeHALbYZHzTBm/ODLPHhxM3B5n+B/0iXYNuVc=";
nativeBuildInputs = [
pkg-config
];
buildInputs = [
fontconfig
];
checkFlags = [
# fails because nix-store is read only
"--skip=rpu::plot::plot_p7"
];
nativeInstallCheckInputs = [
versionCheckHook
];
versionCheckProgram = "${placeholder "out"}/bin/dovi_tool";
versionCheckProgramArg = "--version";
doInstallCheck = true;
passthru.updateScript = nix-update-script { };
meta = {
description = "CLI tool combining multiple utilities for working with Dolby Vision";
homepage = "https://github.com/quietvoid/dovi_tool";
changelog = "https://github.com/quietvoid/dovi_tool/releases";
mainProgram = "dovi_tool";
license = lib.licenses.mit;
maintainers = with lib.maintainers; [ plamper ];
};
})
File diff suppressed because it is too large Load Diff
@@ -1,33 +1,73 @@
{
lib,
buildNpmPackage,
stdenvNoCC,
nodejs,
pnpm_9,
fetchFromGitHub,
nix-update-script,
}:
buildNpmPackage rec {
stdenvNoCC.mkDerivation (finalAttrs: {
pname = "emmet-language-server";
version = "2.6.0";
version = "2.6.1";
src = fetchFromGitHub {
owner = "olrtg";
repo = "emmet-language-server";
rev = "v${version}";
hash = "sha256-R20twrmfLz9FP87qkjgz1R/n+Nhzwn22l9t/2fyuVeM=";
tag = "v${finalAttrs.version}";
hash = "sha256-2ptIdZPGLjKsdFJKjt5LZ8JQNNBU5KR62Yw78qzfRxg=";
};
npmDepsHash = "sha256-yv+5/wBif75AaAsbJrwLNtlui9SHws2mu3jYOR1Z55M=";
pnpmDeps = pnpm_9.fetchDeps {
inherit (finalAttrs) pname version src;
hash = "sha256-hh5PEtmSHPs6QBgwWHS0laGU21e82JckIP3mB/P9/vE=";
};
# Upstream doesn't have a lockfile
postPatch = ''
cp ${./package-lock.json} ./package-lock.json
nativeBuildInputs = [
nodejs
pnpm_9.configHook
];
buildPhase = ''
runHook preBuild
# TODO: use deploy after resolved https://github.com/pnpm/pnpm/issues/5315
pnpm build
runHook postBuild
'';
# remove unnecessary and non-deterministic files
preInstall = ''
pnpm --ignore-scripts --prod prune
find -type f \( -name "*.ts" -o -name "*.map" \) -exec rm -rf {} +
# https://github.com/pnpm/pnpm/issues/3645
find node_modules -xtype l -delete
rm node_modules/.modules.yaml
'';
installPhase = ''
runHook preInstall
mkdir -p $out/{bin,lib/emmet-language-server}
mv {node_modules,dist} $out/lib/emmet-language-server
ln -s $out/lib/emmet-language-server/dist/index.js $out/bin/emmet-language-server
chmod +x $out/bin/emmet-language-server
runHook postInstall
'';
passthru.updateScript = nix-update-script { };
meta = {
description = "Language server for emmet.io";
homepage = "https://github.com/olrtg/emmet-language-server";
changelog = "https://github.com/olrtg/emmet-language-server/releases/tag/v${version}";
changelog = "https://github.com/olrtg/emmet-language-server/releases/tag/v${finalAttrs.version}";
license = lib.licenses.mit;
maintainers = [ ];
maintainers = with lib.maintainers; [
gepbird
];
mainProgram = "emmet-language-server";
};
}
})
+3 -3
View File
@@ -18,13 +18,13 @@
stdenvNoCC.mkDerivation (finalAttrs: {
pname = "grimblast";
version = "0.1-unstable-2025-03-06";
version = "0.1-unstable-2025-03-11";
src = fetchFromGitHub {
owner = "hyprwm";
repo = "contrib";
rev = "0e40ccfc2d6772f9b7d5e1b50c56fb5e468a18fb";
hash = "sha256-inSG4OUSdCHXSJZhLNcCUA1s0Ebomr5+v4x3FE/XQ3M=";
rev = "e14d9c5e9aea4a84c3677e0a7c73268153b15327";
hash = "sha256-SJrLVyoaQUg29fq3nNdRmYrLgiu9dtgcIVqpl8j/Teo=";
};
strictDeps = true;
@@ -8,17 +8,17 @@
}:
buildNpmPackage rec {
pname = "immich-public-proxy";
version = "1.7.3";
version = "1.8.0";
src = fetchFromGitHub {
owner = "alangrainger";
repo = "immich-public-proxy";
tag = "v${version}";
hash = "sha256-8cy06fNPqzg39Cg/hP6LT1cGNotr08McDVsHxBKs9kA=";
hash = "sha256-khOmZj/9/28bADeffAqnbpw9yTvyz+wgBkxZlY9sXPw=";
};
sourceRoot = "${src.name}/app";
npmDepsHash = "sha256-YH3Li+JMQk8CtddrITIcTYtASh8+bmm/LgZSCnYdlKc=";
npmDepsHash = "sha256-jLXO8in7gWBg24210lEVNpfKq0HFs4b+zXPAZGzXsIg=";
# patch in absolute nix store paths so the process doesn't need to cwd in $out
postPatch = ''
+57
View File
@@ -0,0 +1,57 @@
{
lib,
rustPlatform,
fetchFromGitHub,
stdenv,
pkg-config,
openssl,
oniguruma,
nix-update-script,
}:
rustPlatform.buildRustPackage (finalAttrs: {
pname = "is-fast";
version = "0.1.3";
src = fetchFromGitHub {
owner = "Magic-JD";
repo = "is-fast";
tag = "v${finalAttrs.version}";
hash = "sha256-exC9xD0scCa1jYomBCewaLv2kzoxSjHhc75EhEERPR8=";
};
useFetchCargoVendor = true;
cargoHash = "sha256-r1neLuUkWVKl7Qc4FNqW1jzX/HHyVJPEqgZV/GYkGRU=";
nativeBuildInputs = [
pkg-config
];
buildInputs = [
openssl
oniguruma
];
env = {
OPENSSL_NO_VENDOR = true;
RUSTONIG_SYSTEM_LIBONIG = true;
};
checkFlags = lib.optionals stdenv.hostPlatform.isDarwin [
# Error creating config directory: Operation not permitted (os error 1)
# Using writableTmpDirAsHomeHomeHook is not working
"--skip=generate_config::tests::test_run_creates_config_file"
];
passthru = {
updateScript = nix-update-script { };
};
meta = {
description = "Check the internet as fast as possible";
homepage = "https://github.com/Magic-JD/is-fast";
license = lib.licenses.mit;
maintainers = with lib.maintainers; [ pwnwriter ];
mainProgram = "is-fast";
};
})
@@ -12,11 +12,14 @@
makeWrapper,
removeReferencesTo,
replaceVars,
go,
go_1_23,
applyPatches,
nvidia-modprobe,
}:
let
# https://github.com/NVIDIA/libnvidia-container/pull/297
go = go_1_23;
modprobeVersion = "550.54.14";
patchedModprobe = applyPatches {
src = nvidia-modprobe.src.override {
+25 -12
View File
@@ -1,18 +1,21 @@
{
lib,
stdenv,
fetchurl,
fetchFromGitHub,
fetchpatch,
openssl,
versionCheckHook,
}:
stdenv.mkDerivation rec {
stdenv.mkDerivation (finalAttrs: {
pname = "mailsend";
version = "1.19";
src = fetchurl {
url = "https://github.com/muquit/mailsend/archive/${version}.tar.gz";
sha256 = "sha256-Vl72vibFjvdQZcVRnq6N1VuuMUKShhlpayjSQrc0k/c=";
src = fetchFromGitHub {
owner = "muquit";
repo = "mailsend";
tag = finalAttrs.version;
hash = "sha256-g1V4NrFlIz8oh7IS+cGWG6eje6kBGvPZS7Q131ESrXI=";
};
buildInputs = [
@@ -23,9 +26,11 @@ stdenv.mkDerivation rec {
];
patches = [
(fetchurl {
# OpenSSL 1.1 support for HMAC api
(fetchpatch {
name = "openssl-1-1-hmac.patch";
url = "https://github.com/muquit/mailsend/commit/960df6d7a11eef90128dc2ae660866b27f0e4336.patch";
sha256 = "0vz373zcfl19inflybfjwshcq06rvhx0i5g0f4b021cxfhyb1sm0";
hash = "sha256-Gy4pZMYoUXcjMatw5BSk+IUKXjgpLCwPXtfC++WPKAM=";
})
# Pull fix pending upstream inclusion for parallel build failures:
# https://github.com/muquit/mailsend/pull/165
@@ -36,15 +41,23 @@ stdenv.mkDerivation rec {
})
];
NIX_CFLAGS_COMPILE = "-Wno-error=implicit-function-declaration";
enableParallelBuilding = true;
meta = with lib; {
nativeInstallCheckInputs = [
versionCheckHook
];
doInstallCheck = true;
versionCheckProgramArg = "-V";
meta = {
description = "CLI email sending tool";
license = licenses.bsd3;
maintainers = with maintainers; [ raskin ];
platforms = platforms.linux;
license = lib.licenses.bsd3;
maintainers = with lib.maintainers; [ raskin ];
platforms = lib.platforms.linux;
homepage = "https://github.com/muquit/mailsend";
downloadPage = "https://github.com/muquit/mailsend/releases";
mainProgram = "mailsend";
};
}
})
+65
View File
@@ -0,0 +1,65 @@
{
_7zz,
appimageTools,
fetchurl,
fetchzip,
lib,
stdenvNoCC,
xorg,
}:
let
pname = "mochi";
version = "1.18.7";
linux = appimageTools.wrapType2 rec {
inherit pname version meta;
src = fetchurl {
url = "https://mochi.cards/releases/Mochi-${version}.AppImage";
hash = "sha256-FCh8KLnvs26GKTVJY4Tqp+iA8sNlK7e0rv+oywBIF+U=";
};
appimageContents = appimageTools.extractType2 { inherit pname version src; };
extraPkgs = pkgs: [ xorg.libxshmfence ];
extraInstallCommands = ''
install -Dm444 ${appimageContents}/${pname}.desktop -t $out/share/applications/
install -Dm444 ${appimageContents}/${pname}.png -t $out/share/pixmaps/
substituteInPlace $out/share/applications/${pname}.desktop \
--replace-fail 'Exec=AppRun --no-sandbox' 'Exec=${pname}'
'';
};
darwin = stdenvNoCC.mkDerivation {
inherit pname version meta;
src = fetchzip {
url = "https://mochi.cards/releases/Mochi-${version}.dmg";
hash = "sha256-W3JqEPF8iCiXlKqjPoFcm7lP+n3lN4XBeAQdBEWvy8s=";
stripRoot = false;
nativeBuildInputs = [ _7zz ];
};
installPhase = ''
runHook preInstall
mkdir -p $out/Applications
cp -r *.app $out/Applications
runHook postInstall
'';
};
meta = {
description = "Simple markdown-powered SRS app";
homepage = "https://mochi.cards/";
changelog = "https://mochi.cards/changelog.html";
license = lib.licenses.unfree;
sourceProvenance = with lib.sourceTypes; [ binaryNativeCode ];
maintainers = with lib.maintainers; [ poopsicles ];
platforms = lib.platforms.linux ++ lib.platforms.darwin;
};
in
if stdenvNoCC.hostPlatform.isDarwin then darwin else linux
+2 -2
View File
@@ -9,11 +9,11 @@
stdenv.mkDerivation rec {
pname = "mysql-connector-java";
version = "9.1.0";
version = "9.2.0";
src = fetchurl {
url = "https://dev.mysql.com/get/Downloads/Connector-J/mysql-connector-j-${version}.zip";
hash = "sha256-cs3VP+Rd99JrITkxqlVLn9x5FPyrppZcImhdE10VT0U=";
hash = "sha256-4+5QyBvRVSCYbc6a0vYuk9S/dgLkGwb22yttJHx/pkk=";
};
installPhase = ''
+2 -2
View File
@@ -12,11 +12,11 @@
stdenv.mkDerivation rec {
pname = "nss-pam-ldapd";
version = "0.9.12";
version = "0.9.13";
src = fetchurl {
url = "https://arthurdejong.org/nss-pam-ldapd/${pname}-${version}.tar.gz";
sha256 = "sha256-xtZh50aTy/Uxp5BjHKk7c/KR+yPMOUZbCd642iv7DhQ=";
sha256 = "sha256-4BeE4Xy1M7tmvQYB4gXnhSY0RcPC33pvkCMqtBMccW0=";
};
nativeBuildInputs = [
+23 -8
View File
@@ -2,21 +2,25 @@
lib,
fetchFromGitHub,
buildGoModule,
go_1_24,
testers,
openbao,
versionCheckHook,
nix-update-script,
}:
buildGoModule rec {
buildGoModule.override { go = go_1_24; } rec {
pname = "openbao";
version = "2.1.1";
version = "2.2.0";
src = fetchFromGitHub {
owner = "openbao";
repo = "openbao";
rev = "v${version}";
hash = "sha256-viN1Yuqnyg/nrRzV2HkjVGZSWD9QIXLN6nG5N0QtwbU=";
tag = "v${version}";
hash = "sha256-dDMOeAceMaSrF7P4JZ2MKy6zDa10LxCQKkKwu/Q3kOU=";
};
vendorHash = "sha256-dSEFoD2UbY6OejSxPBDxCNKHBoHI8YNnixayIS7z3e8=";
vendorHash = "sha256-zcMc63B/jTUykPfRKvea27xRxjOV+zytaxKOEQAUz1Q=";
proxyVendor = true;
@@ -49,12 +53,23 @@ buildGoModule rec {
version = "v${version}";
};
meta = with lib; {
nativeInstallCheckInputs = [
versionCheckHook
];
versionCheckProgram = "${placeholder "out"}/bin/bao";
versionCheckProgramArg = [ "--version" ];
doInstallCheck = true;
passthru = {
updateScript = nix-update-script { };
};
meta = {
homepage = "https://www.openbao.org/";
description = "Open source, community-driven fork of Vault managed by the Linux Foundation";
changelog = "https://github.com/openbao/openbao/blob/v${version}/CHANGELOG.md";
license = licenses.mpl20;
license = lib.licenses.mpl20;
mainProgram = "bao";
maintainers = with maintainers; [ brianmay ];
maintainers = with lib.maintainers; [ brianmay ];
};
}
+2 -2
View File
@@ -16,14 +16,14 @@
tcl.mkTclDerivation rec {
pname = "remind";
version = "05.03.02";
version = "05.03.04";
src = fetchFromGitea {
domain = "git.skoll.ca";
owner = "Skollsoft-Public";
repo = "Remind";
rev = version;
hash = "sha256-lVFa7STvkNVX9D+f5E7H7ArVxThzdWAh7h3Q4b8bIC4=";
hash = "sha256-6pUQONmafwfUZ3DAsYS6dju8mLE9piu7btPmP6QX4pM=";
};
propagatedBuildInputs = lib.optionals withGui [
+61
View File
@@ -0,0 +1,61 @@
{
lib,
stdenv,
fetchFromGitHub,
qt5,
p7zip,
python3,
installShellFiles,
# Whether to compile with XDG support
# (See: https://gemba.github.io/skyscraper/XDG/)
enableXdg ? false,
}:
stdenv.mkDerivation (finalAttrs: {
pname = "skyscraper";
version = "3.14.0";
src = fetchFromGitHub {
owner = "Gemba";
repo = "skyscraper";
rev = "refs/tags/${finalAttrs.version}";
hash = "sha256-UgPo9qEsYYYl2RgdPtPmToAruPKuvJ3FSgVrXa94kdA=";
};
strictDeps = true;
nativeBuildInputs = [
qt5.wrapQtAppsHook
qt5.qmake
installShellFiles
];
buildInputs = [ python3 ];
postPatch = lib.optionalString enableXdg ''
substituteInPlace skyscraper.pro --replace-fail "#DEFINES+=XDG" "DEFINES+=XDG"
'';
postInstall = ''
installShellCompletion --cmd Skyscraper \
--bash supplementary/bash-completion/Skyscraper.bash
'';
preFixup = ''
qtWrapperArgs+=(--prefix PATH : ${lib.makeBinPath [ p7zip ]})
chmod +x $out/bin/*.py
'';
env.PREFIX = placeholder "out";
meta = {
description = "Powerful and versatile game data scraper written in Qt and C++";
homepage = "https://gemba.github.io/skyscraper/";
downloadPage = "https://github.com/Gemba/skyscraper/releases/tag/${finalAttrs.version}";
license = lib.licenses.gpl3Plus;
maintainers = with lib.maintainers; [ ashgoldofficial ];
mainProgram = "Skyscraper";
platforms = lib.platforms.linux;
};
})
+2 -2
View File
@@ -6,13 +6,13 @@
buildGoModule rec {
pname = "topicctl";
version = "1.19.1";
version = "1.19.2";
src = fetchFromGitHub {
owner = "segmentio";
repo = "topicctl";
rev = "v${version}";
sha256 = "sha256-3sYi2/c5twM10Q70/73Pd58qkAl5m8KqghG7oV+p2t8=";
sha256 = "sha256-sYt/t16OVJiWFVqSdLNog/mj1gj/TeY0r7z/gMZspls=";
};
vendorHash = "sha256-vPeqStOjoJPYKpdkHQNTBJFKc8NBjTH4A/W9B+HAy1I=";
+4 -4
View File
@@ -83,12 +83,12 @@ in
stdenv.mkDerivation (finalAttrs: {
pname = "torzu";
version = "unstable-2024-12-15";
version = "unstable-2025-02-22";
src = fetchgit {
url = "https://notabug.org/litucks/torzu";
rev = "02cfee3f184e6fdcc3b483ef399fb5d2bb1e8ec7";
hash = "sha256-hAWMFzTNJGFcrXov5LKMdW9YWhsu7wueATmiuS7EVkI=";
url = "https://git.ynh.ovh/liberodark/torzu.git";
rev = "eaa9c9e3a46eb5099193b11d620ddfe96b6aec83";
hash = "sha256-KxLRXM8Y+sIW5L9oYMSeK95HRb30zGRRSfil9DO+utU=";
fetchSubmodules = true;
};
+93
View File
@@ -0,0 +1,93 @@
{
lib,
stdenv,
fetchurl,
autoPatchelfHook,
makeWrapper,
parted,
util-linux,
dosfstools,
exfatprogs,
e2fsprogs,
ntfs3g,
btrfs-progs,
xfsprogs,
jfsutils,
f2fs-tools,
nix-update-script,
}:
stdenv.mkDerivation (finalAttrs: {
pname = "tparted";
version = "2025-01-24";
src = fetchurl {
url = "https://github.com/Kagamma/tparted/releases/download/${finalAttrs.version}/linux_x86-64_tparted_${finalAttrs.version}.tar.gz";
hash = "sha256-7V3bdsP4uqZ5zyw3j/s8fhMYFCyQ1Rz5Z1JiPFc1oFY=";
};
nativeBuildInputs = [
autoPatchelfHook
makeWrapper
];
postFixup = ''
wrapProgram $out/bin/tparted \
--prefix PATH : ${
lib.makeBinPath [
parted
util-linux
dosfstools
exfatprogs
e2fsprogs
ntfs3g
btrfs-progs
xfsprogs
jfsutils
f2fs-tools
]
}
'';
runtimeDependencies = [
parted
util-linux
dosfstools
exfatprogs
e2fsprogs
ntfs3g
btrfs-progs
xfsprogs
jfsutils
f2fs-tools
];
unpackPhase = ''
runHook preUnpack
tar xf $src
runHook postUnpack
'';
installPhase = ''
runHook preInstall
mkdir -p $out/bin
cp tparted $out/bin/
mkdir -p $out/opt/tparted
cp -r locale $out/opt/tparted/
runHook postInstall
'';
passthru = {
updateScript = nix-update-script { };
};
meta = {
description = "Text-based user interface (TUI) frontend for parted";
homepage = "https://github.com/Kagamma/tparted";
changelog = "https://github.com/Kagamma/tparted/releases/tag/${finalAttrs.version}";
license = lib.licenses.gpl3;
maintainers = with lib.maintainers; [ liberodark ];
sourceProvenance = [ lib.sourceTypes.binaryNativeCode ];
mainProgram = "tparted";
};
})
+3 -3
View File
@@ -6,16 +6,16 @@
buildGoModule rec {
pname = "versitygw";
version = "1.0.10";
version = "1.0.11";
src = fetchFromGitHub {
owner = "versity";
repo = "versitygw";
tag = "v${version}";
hash = "sha256-IG+Jg9+SVaj4Nlv7mfwjpAf1tsXMMEaVgq7w7fpIMcc=";
hash = "sha256-K0w9BoKqwVsEoxCuRvmKtuHYyCzZhVt/OZQ3vElHPdE=";
};
vendorHash = "sha256-ZRu5519FRgdDFcKm+Ada0/KFNvPrZ+5hODPp7lUeyuI=";
vendorHash = "sha256-xFj4IGCCDhgIbBA1qIm9J06BUNYJiQQZYPSe6Uthm6w=";
doCheck = false; # Require access to online S3 services
+11 -8
View File
@@ -169,18 +169,21 @@ rec {
assert lib.assertMsg (lib.all validateFeatures scripts)
"Combining update scripts with features enabled (other than silent scripts and an optional single script with commit) is currently unsupported.";
assert lib.assertMsg (
builtins.length (
lib.unique (
builtins.map (
{
attrPath ? null,
...
}:
attrPath
) scripts
builtins.filter (attrPath: attrPath != null) (
builtins.map (
{
attrPath ? null,
...
}:
attrPath
) scripts
)
)
) == 1
) <= 1
) "Combining update scripts with different attr paths is currently unsupported.";
{
+1
View File
@@ -108,4 +108,5 @@ in
supportedFeatures = [
"commit"
];
inherit attrPath;
}
@@ -2,11 +2,11 @@
stdenv.mkDerivation (finalAttrs: {
pname = "kotlin";
version = "2.1.0";
version = "2.1.10";
src = fetchurl {
url = "https://github.com/JetBrains/kotlin/releases/download/v${finalAttrs.version}/kotlin-compiler-${finalAttrs.version}.zip";
sha256 = "sha256-tmmNVyitj57c3QFhfWOAcxkdigMTnMU4o5G043Wa0pc=";
sha256 = "sha256-xuniY2iJgo4ZyIEdWriQhiU4yJ3CoxAZVt/uPCqLprE=";
};
propagatedBuildInputs = [ jre ] ;
+3 -3
View File
@@ -32,9 +32,9 @@ let
"19.1.7".officialRelease.sha256 = "sha256-cZAB5vZjeTsXt9QHbP5xluWNQnAHByHtHnAhVDV0E6I=";
"20.1.0-rc3".officialRelease.sha256 = "sha256-mLSBoyq24FD+khynC6sC5IkDFqizgAn07lR9+ZRXlV0=";
"21.0.0-git".gitRelease = {
rev = "71f4c7dabec0f32b2d475e8e08f0da99628a067c";
rev-version = "21.0.0-unstable-2025-03-02";
sha256 = "sha256-RNqQMVs0syNEXPNW6qOlvXGXYhZnN4s91Wc5vGcSuZM=";
rev = "58fc4b13cb5ff7e877c52c11f71328ed12e6a89c";
rev-version = "21.0.0-unstable-2025-03-09";
sha256 = "sha256-ioZubgLW+GpnA3DPe01YDxELnIJhXDGskCUAKZlDvUo=";
};
} // llvmVersions;
+12 -36
View File
@@ -5,58 +5,34 @@
cmake,
pkg-config,
wrapQtAppsHook,
qt6,
qtbase,
}:
stdenv.mkDerivation rec {
pname = "tytools";
version = "0.9.9";
version = "0.9.8";
src = fetchFromGitHub {
owner = "Koromix";
repo = "rygel";
tag = "tytools/${version}";
hash = "sha256-nQZaNYOTkx79UC0RHencKIQFSYUnQ9resdmmWTmgQxA=";
repo = pname;
rev = "v${version}";
sha256 = "sha256-MKhh0ooDZI1Ks8vVuPRiHhpOqStetGaAhE2ulvBstxA=";
};
nativeBuildInputs = [
cmake
pkg-config
qt6.wrapQtAppsHook
wrapQtAppsHook
];
buildInputs = [
qt6.qtbase
qtbase
];
buildPhase = ''
runHook preBuild
./bootstrap.sh
./felix -p Fast tyuploader
./felix -p Fast tycmd
./felix -p Fast tycommander
runHook postBuild
'';
installPhase = ''
runHook preInstall
mkdir -p $out/bin $out/share/applications
cp bin/Fast/tyuploader $out/bin/
cp bin/Fast/tycmd $out/bin/
cp bin/Fast/tycommander $out/bin/
cp src/tytools/tycommander/tycommander_linux.desktop $out/share/applications/tycommander.desktop
cp src/tytools/tyuploader/tyuploader_linux.desktop $out/share/applications/tyuploader.desktop
runHook postInstall
'';
meta = {
meta = with lib; {
description = "Collection of tools to manage Teensy boards";
homepage = "https://koromix.dev/tytools";
license = lib.licenses.unlicense;
platforms = lib.platforms.unix;
maintainers = with lib.maintainers; [ ahuzik ];
license = licenses.unlicense;
platforms = platforms.unix;
maintainers = with maintainers; [ ahuzik ];
};
}
@@ -1,11 +1,11 @@
{
"version": "8.15",
"version": "8.16",
"full": {
"filename": "racket-8.15-src.tgz",
"sha256": "602b848459daf1b2222a46a9094e85ae2d28e480067219957fa46af8400e1233"
"filename": "racket-8.16-src.tgz",
"sha256": "b233a968f4a561f7b005ce06f2c4c29428562f308c1a04d28e2e2286f6b945c3"
},
"minimal": {
"filename": "racket-minimal-8.15-src.tgz",
"sha256": "1ac132c56bc52312049fa4f0849237f66713e8e0a7ab6c4780504633ee8f1dc3"
"filename": "racket-minimal-8.16-src.tgz",
"sha256": "4e727db75574ab11d6bec7af5e5d72a084fa7f662e200c35d5bc200772f5ce96"
}
}
@@ -19,7 +19,7 @@
let
manifest = lib.importJSON ./manifest.json;
inherit (stdenv.hostPlatform) isDarwin isStatic;
inherit (stdenv.hostPlatform) isDarwin;
in
stdenv.mkDerivation (finalAttrs: {
@@ -69,13 +69,14 @@ stdenv.mkDerivation (finalAttrs: {
configureFlags =
[
"--enable-check"
# > docs failure: ftype-ref: ftype mismatch for #<ftype-pointer>
# "--enable-check"
"--enable-csonly"
"--enable-liblz4"
"--enable-libz"
]
++ lib.optional disableDocs "--disable-docs"
++ lib.optionals (!isStatic) [
++ lib.optionals (!(finalAttrs.dontDisableStatic or false)) [
# instead of `--disable-static` that `stdenv` assumes
"--disable-libs"
# "not currently supported" in `configure --help-cs` but still emphasized in README
@@ -87,6 +88,9 @@ stdenv.mkDerivation (finalAttrs: {
"--enable-xonx"
];
# The upstream script builds static libraries by default.
dontAddStaticConfigureFlags = true;
dontStrip = isDarwin;
postFixup =
@@ -18,12 +18,12 @@
buildPythonPackage rec {
pname = "cliff";
version = "4.8.0";
version = "4.9.1";
pyproject = true;
src = fetchPypi {
inherit pname version;
hash = "sha256-I+/1AuYDzwqoQerqZmKkLNMGQWkWKz5ZayAiZADjTf0=";
hash = "sha256-WzkhmCk8C5Il1Fm+i6cQz4JI8e4zAGves9kvsAElkrQ=";
};
postPatch = ''
@@ -1,7 +1,7 @@
{
buildPythonPackage,
cliff,
docutils,
sphinx,
stestr,
testscenarios,
}:
@@ -22,7 +22,7 @@ buildPythonPackage {
nativeCheckInputs = [
cliff
docutils
sphinx
stestr
testscenarios
];
@@ -72,6 +72,12 @@ buildPythonPackage rec {
url = "https://github.com/django/django/commit/12f4f95405c7857cbf2f4bf4d0261154aac31676.patch";
hash = "sha256-+K20/V8sh036Ox9U7CSPgfxue7f28Sdhr3MsB7erVOk=";
})
# fix regression which breaks django-import-export
# https://github.com/django-import-export/django-import-export/pull/2045
# https://github.com/django/django/pull/19233
# manual backport because commit doesn't apply on stable cleanly
./Restored-single_object-rgument-to-LogEntry-objects-log_actions.diff
]
++ lib.optionals withGdal [
(replaceVars ./django_5_set_geos_gdal_lib.patch {
@@ -0,0 +1,15 @@
diff --git a/django/contrib/admin/models.py b/django/contrib/admin/models.py
index 345b8cf341..2ed78d775b 100644
--- a/django/contrib/admin/models.py
+++ b/django/contrib/admin/models.py
@@ -51,7 +51,9 @@ def log_action(
change_message=change_message,
)
- def log_actions(self, user_id, queryset, action_flag, change_message=""):
+ def log_actions(
+ self, user_id, queryset, action_flag, change_message="", *, single_object=False
+ ):
# RemovedInDjango60Warning.
if type(self).log_action != LogEntryManager.log_action:
warnings.warn(
@@ -1,53 +1,48 @@
{
lib,
stdenv,
buildPythonPackage,
fetchPypi,
pythonOlder,
# dependencies
blessed,
prefixed,
# tests
pytestCheckHook,
pythonOlder,
}:
buildPythonPackage rec {
pname = "enlighten";
version = "1.13.0";
version = "1.14.1";
format = "setuptools";
disabled = pythonOlder "3.7";
src = fetchPypi {
inherit pname version;
hash = "sha256-7nGNqsaHPIP9Nwa8532kcsd2pR4Nb1+G9+YeJ/mtFmo=";
hash = "sha256-hcNUEqmk84hrMzfUH4E0Qfq5ow2fW18MAVvQeKRBFHM=";
};
propagatedBuildInputs = [
dependencies = [
blessed
prefixed
];
nativeCheckInputs = [ pytestCheckHook ];
nativeCheckInputs = [
pytestCheckHook
];
pythonImportsCheck = [ "enlighten" ];
disabledTests =
[
# AssertionError: <_io.TextIOWrapper name='<stdout>' mode='w' encoding='utf-8'> is not...
"test_init"
# AssertionError: Invalid format specifier (deprecated since prefixed 0.4.0)
"test_floats_prefixed"
"test_subcounter_prefixed"
]
++ lib.optionals stdenv.hostPlatform.isDarwin [
# https://github.com/Rockhopper-Technologies/enlighten/issues/44
"test_autorefresh"
];
meta = with lib; {
meta = {
description = "Enlighten Progress Bar for Python Console Apps";
homepage = "https://github.com/Rockhopper-Technologies/enlighten";
changelog = "https://github.com/Rockhopper-Technologies/enlighten/releases/tag/${version}";
license = with licenses; [ mpl20 ];
maintainers = with maintainers; [ veprbl ];
license = with lib.licenses; [ mpl20 ];
maintainers = with lib.maintainers; [
veprbl
doronbehar
];
};
}
@@ -0,0 +1,51 @@
{
buildPythonPackage,
fetchPypi,
hypothesis,
lib,
pytestCheckHook,
pythonOlder,
rustPlatform,
}:
buildPythonPackage rec {
pname = "jsonschema-rs";
version = "0.29.1";
pyproject = true;
disabled = pythonOlder "3.8";
# Fetching from Pypi, because there is no Cargo.lock in the GitHub repo.
src = fetchPypi {
inherit version;
pname = "jsonschema_rs";
hash = "sha256-qfiWqeRRdjA3TxdTZHBYNsIvCdW9W7sG7AYRMytnAv0=";
};
cargoDeps = rustPlatform.fetchCargoVendor {
inherit src;
name = "${pname}-${version}";
hash = "sha256-kVi4EFig0ZGnOSVjzfJuGeR7BiEngP1Jhj6NvbhMVy4=";
};
nativeBuildInputs = with rustPlatform; [
cargoSetupHook
maturinBuildHook
];
nativeCheckInputs = [
hypothesis
pytestCheckHook
];
pythonImportsCheck = [ "jsonschema_rs" ];
meta = {
description = "High-performance JSON Schema validator for Python";
homepage = "https://github.com/Stranger6667/jsonschema/tree/master/crates/jsonschema-py";
changelog = "https://github.com/Stranger6667/jsonschema/blob/python-v${version}/crates/jsonschema-py/CHANGELOG.md";
license = lib.licenses.mit;
maintainers = lib.teams.apm.members;
};
}
@@ -0,0 +1,41 @@
{
buildPythonPackage,
fetchPypi,
lib,
rustPlatform,
}:
buildPythonPackage rec {
pname = "minify-html";
version = "0.15.0";
pyproject = true;
# Fetching from Pypi, because there is no Cargo.lock in the GitHub repo.
src = fetchPypi {
inherit version;
pname = "minify_html";
hash = "sha256-z0w2tvmvOwkBvSoKKds7CcDN8MONPd4o5oNbzg9gXTc=";
};
cargoDeps = rustPlatform.fetchCargoVendor {
inherit src;
name = "${pname}-${version}";
hash = "sha256-f93gKKQRkjxQJ49EK/0UI+BzFEa6iSfDX/0gNysSDmc=";
};
nativeBuildInputs = with rustPlatform; [
cargoSetupHook
maturinBuildHook
];
pythonImportsCheck = [ "minify_html" ];
meta = {
description = "Extremely fast and smart HTML + JS + CSS minifier";
homepage = "https://github.com/wilsonzlin/minify-html/tree/master/minify-html-python";
changelog = "https://github.com/wilsonzlin/minify-html/blob/v${version}/CHANGELOG.md";
license = lib.licenses.mit;
maintainers = lib.teams.apm.members;
};
}
@@ -3,21 +3,27 @@
stdenv,
buildPythonPackage,
fetchPypi,
# build-system
setuptools,
# dependencies
jsonschema,
mwcli,
mwtypes,
# tests
pytestCheckHook,
setuptools,
}:
buildPythonPackage rec {
pname = "mwxml";
version = "0.3.5";
version = "0.3.6";
pyproject = true;
src = fetchPypi {
inherit pname version;
hash = "sha256-K/5c6BfX2Jo/jcKhCa3hCQ8PtWzqSFZ8xFqe1R/CSEs=";
hash = "sha256-WlMYHTAhUq0D7FE/8Yaongx+H8xQx4MwRSoIcsqmOTU=";
};
build-system = [ setuptools ];
@@ -28,10 +34,10 @@ buildPythonPackage rec {
mwtypes
];
nativeCheckInputs = [ pytestCheckHook ];
pythonImportsCheck = [ "mwxml" ];
nativeCheckInputs = [ pytestCheckHook ];
disabledTests = lib.optionals stdenv.hostPlatform.isDarwin [
# AttributeError: Can't get local object 'map.<locals>.process_path'
"test_complex_error_handler"
@@ -13,14 +13,14 @@
buildPythonPackage rec {
pname = "pykeepass";
version = "4.1.0.post1";
version = "4.1.1.post1";
pyproject = true;
src = fetchFromGitHub {
owner = "libkeepass";
repo = "pykeepass";
tag = "v${version}";
hash = "sha256-64is/XoRF/kojqd4jQIAQi1od8TRhiv9uR+WNIGvP2A=";
hash = "sha256-DeEz3zrUK3cXIvMK/32Zn3FPiNsenhpAb17Zgel826s=";
};
build-system = [ setuptools ];
@@ -31,14 +31,14 @@
buildPythonPackage rec {
pname = "pylance";
version = "0.24.0";
version = "0.24.1";
pyproject = true;
src = fetchFromGitHub {
owner = "lancedb";
repo = "lance";
tag = "v${version}";
hash = "sha256-tzz+Zww6/owkcFhHBt8+2cvouCeqdspuv6Gy7HpZTP0=";
hash = "sha256-tfpHW36ESCXffoRI3QbeoKArycIMnddtk5fUXO5p9us=";
};
sourceRoot = "${src.name}/python";
@@ -50,7 +50,7 @@ buildPythonPackage rec {
src
sourceRoot
;
hash = "sha256-7GN4iAQMvqZkK5kjBMrNa8Q6fETW0HDZklSQGye+Huc=";
hash = "sha256-5NoIuev3NoXfgifm7ALDRfNNQc6uTflBcBfAnRQ481E=";
};
nativeBuildInputs = [
@@ -2,8 +2,7 @@
lib,
stdenv,
buildPythonPackage,
fetchPypi,
fetchpatch,
fetchFromGitHub,
pytestCheckHook,
pythonOlder,
@@ -17,24 +16,17 @@
buildPythonPackage rec {
pname = "shapely";
version = "2.0.6";
version = "2.0.7";
pyproject = true;
disabled = pythonOlder "3.7";
src = fetchPypi {
inherit pname version;
hash = "sha256-mX9hWbFIQFnsI5ysqlNGf9i1Vk2r4YbNhKwpRGY7C/Y=";
src = fetchFromGitHub {
owner = "shapely";
repo = "shapely";
tag = version;
hash = "sha256-oq08nDeCdS6ARISai/hKM74v+ezSxO2PpSzas/ZFVaw=";
};
patches = [
# fixes build error with GCC 14
(fetchpatch {
url = "https://github.com/shapely/shapely/commit/05455886750680728dc751dc5888cd02086d908e.patch";
hash = "sha256-YnmiWFfjHHFZCxrmabBINM4phqfLQ+6xEc30EoV5d98=";
})
];
nativeBuildInputs = [
cython
geos # for geos-config
@@ -45,7 +37,7 @@ buildPythonPackage rec {
buildInputs = [ geos ];
propagatedBuildInputs = [ numpy ];
dependencies = [ numpy ];
nativeCheckInputs = [ pytestCheckHook ];
@@ -68,11 +60,11 @@ buildPythonPackage rec {
pythonImportsCheck = [ "shapely" ];
meta = with lib; {
meta = {
changelog = "https://github.com/shapely/shapely/blob/${version}/CHANGES.txt";
description = "Manipulation and analysis of geometric objects";
homepage = "https://github.com/shapely/shapely";
license = licenses.bsd3;
maintainers = teams.geospatial.members;
license = lib.licenses.bsd3;
maintainers = lib.teams.geospatial.members;
};
}
@@ -28,14 +28,14 @@
buildPythonPackage rec {
pname = "streamlit";
version = "1.41.1";
version = "1.42.2";
pyproject = true;
disabled = pythonOlder "3.9";
src = fetchPypi {
inherit pname version;
hash = "sha256-ZibTKwmLoUWLce691jTGKvLdh2OA5ZxLah6CijnWLWk=";
hash = "sha256-YgJtvctIJ5CTP2WLCW191Y+nDaicHwb7w2WLkdzU2rI=";
};
build-system = [
@@ -0,0 +1,42 @@
{
lib,
buildPythonPackage,
fetchFromGitHub,
setuptools,
jinja2,
pytestCheckHook,
}:
buildPythonPackage rec {
pname = "tiptapy";
# github repository does not have version tags
version = "0.20.0-unstable-2024-06-14";
pyproject = true;
src = fetchFromGitHub {
owner = "stckme";
repo = "tiptapy";
rev = "f34ed358b1b3448721b791150f4f104347a416bf";
hash = "sha256-y43/901tznZ9N9A4wH3z8FW0mHzNrA8pC+0d1CxdqJM=";
};
build-system = [
setuptools
];
dependencies = [ jinja2 ];
nativeCheckInputs = [
pytestCheckHook
];
pythonImportsCheck = [ "tiptapy" ];
meta = {
description = "Library that generates HTML output from JSON export of tiptap editor";
homepage = "https://github.com/stckme/tiptapy";
changelog = "https://github.com/stckme/tiptapy/blob/master/CHANGELOG.rst";
license = lib.licenses.mit;
maintainers = lib.teams.apm.members;
};
}
@@ -13,7 +13,7 @@
buildPythonPackage rec {
pname = "vallox-websocket-api";
version = "5.3.0";
version = "5.4.0";
pyproject = true;
disabled = pythonOlder "3.9";
@@ -22,7 +22,7 @@ buildPythonPackage rec {
owner = "yozik04";
repo = "vallox_websocket_api";
tag = version;
hash = "sha256-jJ+FFDU4w1vdCqErz6ksJDvjFcalSAwaH+G77BNI5/E=";
hash = "sha256-L9duL8XfDUxHgJxVbG7PPPRJRzVEckxqbB+1vX0GalU=";
};
nativeBuildInputs = [
@@ -45,7 +45,7 @@ buildPythonPackage rec {
pythonImportsCheck = [ "vallox_websocket_api" ];
meta = {
changelog = "https://github.com/yozik04/vallox_websocket_api/releases/tag/${version}";
changelog = "https://github.com/yozik04/vallox_websocket_api/releases/tag/${src.tag}";
description = "Async API for Vallox ventilation units";
homepage = "https://github.com/yozik04/vallox_websocket_api";
license = lib.licenses.lgpl3Only;
@@ -24,7 +24,7 @@
buildPythonPackage rec {
pname = "xml2rfc";
version = "3.25.0";
version = "3.28.0";
pyproject = true;
disabled = pythonOlder "3.9";
@@ -33,7 +33,7 @@ buildPythonPackage rec {
owner = "ietf-tools";
repo = "xml2rfc";
tag = "v${version}";
hash = "sha256-hBQ90OtqRWVgr9EHf2EWm1KSy7di1PcrOJ7O+5bLK6I=";
hash = "sha256-pWJ2nzRMnukcsuhzwsp1uZ3kFakfqrPn8/qooxGeM74=";
};
postPatch = ''
@@ -81,7 +81,7 @@ buildPythonPackage rec {
description = "Tool generating IETF RFCs and drafts from XML sources";
mainProgram = "xml2rfc";
homepage = "https://github.com/ietf-tools/xml2rfc";
changelog = "https://github.com/ietf-tools/xml2rfc/blob/v${version}/CHANGELOG.md";
changelog = "https://github.com/ietf-tools/xml2rfc/blob/${src.tag}/CHANGELOG.md";
# Well, parts might be considered unfree, if being strict; see:
# http://metadata.ftp-master.debian.org/changelogs/non-free/x/xml2rfc/xml2rfc_2.9.6-1_copyright
license = licenses.bsd3;
@@ -5,13 +5,13 @@
callPackage ../generic.nix rec {
pname = "experienced-pixel-dungeon";
version = "2.18.2";
version = "2.19";
src = fetchFromGitHub {
owner = "TrashboxBobylev";
repo = "Experienced-Pixel-Dungeon-Redone";
rev = "ExpPD-${version}";
hash = "sha256-REBltg7rKgrNSKHh3QuG8XVLPivS1fAtyqf/TRjH0W0=";
tag = "ExpPD-${version}";
hash = "sha256-O3FEHIOGe1sO8L4eDUF3NGXhB9LviLT8M6mGqpe42B4=";
};
desktopName = "Experienced Pixel Dungeon";
+1
View File
@@ -314,6 +314,7 @@ stdenv.mkDerivation {
mainProgram = "nginx";
homepage = "http://nginx.org";
license = [ licenses.bsd2 ] ++ concatMap (m: m.meta.license) modules;
broken = lib.any (m: m.meta.broken or false) modules;
platforms = platforms.all;
maintainers =
with maintainers;
+20
View File
@@ -4,6 +4,7 @@
, fetchFromGitLab
, fetchhg
, runCommand
, stdenv
, arpa2common
, brotli
@@ -1020,6 +1021,25 @@ let self = {
};
};
zip = {
name = "zip";
src = fetchFromGitHub {
name = "zip";
owner = "evanmiller";
repo = "mod_zip";
rev = "8e65b82c82c7890f67a6107271c127e9881b6313";
hash = "sha256-2bUyGsLSaomzaijnAcHQV9TNSuV7Z3G9EUbrZzLG+mk=";
};
meta = with lib; {
description = "Streaming ZIP archiver for nginx";
homepage = "https://github.com/evanmiller/mod_zip";
license = with licenses; [ bsd3 ];
broken = stdenv.hostPlatform.isDarwin;
maintainers = teams.apm.members;
};
};
zstd = {
name = "zstd";
src = fetchFromGitHub {
@@ -1,165 +0,0 @@
diff -ru dovecot-2.3.9.2.orig/src/auth/main.c dovecot-2.3.9.2/src/auth/main.c
--- dovecot-2.3.9.2.orig/src/auth/main.c 2019-12-13 14:12:00.000000000 +0100
+++ dovecot-2.3.9.2/src/auth/main.c 2019-12-15 19:46:52.101597499 +0100
@@ -191,7 +191,7 @@
mod_set.debug = global_auth_settings->debug;
mod_set.filter_callback = auth_module_filter;
- modules = module_dir_load(AUTH_MODULE_DIR, NULL, &mod_set);
+ modules = module_dir_load("/etc/dovecot/modules/auth", NULL, &mod_set);
module_dir_init(modules);
if (!worker)
@@ -222,7 +222,7 @@
mod_set.debug = global_auth_settings->debug;
mod_set.ignore_missing = TRUE;
- modules = module_dir_load_missing(modules, AUTH_MODULE_DIR, names,
+ modules = module_dir_load_missing(modules, "/etc/dovecot/modules/auth", names,
&mod_set);
module_dir_init(modules);
}
diff -ru dovecot-2.3.9.2.orig/src/config/all-settings.c dovecot-2.3.9.2/src/config/all-settings.c
--- dovecot-2.3.9.2.orig/src/config/all-settings.c 2019-12-13 14:12:32.000000000 +0100
+++ dovecot-2.3.9.2/src/config/all-settings.c 2019-12-15 19:49:42.764650074 +0100
@@ -1080,7 +1080,7 @@
.last_valid_gid = 0,
.mail_plugins = "",
- .mail_plugin_dir = MODULEDIR,
+ .mail_plugin_dir = "/etc/dovecot/modules",
.mail_log_prefix = "%s(%u)<%{pid}><%{session}>: ",
@@ -3849,7 +3849,7 @@
.login_log_format = "%$: %s",
.login_access_sockets = "",
.login_proxy_notify_path = "proxy-notify",
- .login_plugin_dir = MODULEDIR"/login",
+ .login_plugin_dir = "/etc/dovecot/modules""/login",
.login_plugins = "",
.login_proxy_max_disconnect_delay = 0,
.director_username_hash = "%u",
@@ -4058,7 +4058,7 @@
.login_trusted_networks = "",
.mail_plugins = "",
- .mail_plugin_dir = MODULEDIR,
+ .mail_plugin_dir = "/etc/dovecot/modules",
};
static const struct setting_parser_info *lmtp_setting_dependencies[] = {
&lda_setting_parser_info,
@@ -4823,7 +4823,7 @@
.base_dir = PKG_RUNDIR,
.libexec_dir = PKG_LIBEXECDIR,
.mail_plugins = "",
- .mail_plugin_dir = MODULEDIR,
+ .mail_plugin_dir = "/etc/dovecot/modules",
.mail_temp_dir = "/tmp",
.auth_debug = FALSE,
.auth_socket_path = "auth-userdb",
diff -ru dovecot-2.3.9.2.orig/src/config/config-parser.c dovecot-2.3.9.2/src/config/config-parser.c
--- dovecot-2.3.9.2.orig/src/config/config-parser.c 2019-12-13 14:12:00.000000000 +0100
+++ dovecot-2.3.9.2/src/config/config-parser.c 2019-12-15 19:46:52.102597505 +0100
@@ -1077,7 +1077,7 @@
i_zero(&mod_set);
mod_set.abi_version = DOVECOT_ABI_VERSION;
- modules = module_dir_load(CONFIG_MODULE_DIR, NULL, &mod_set);
+ modules = module_dir_load("/etc/dovecot/modules/settings", NULL, &mod_set);
module_dir_init(modules);
i_array_init(&new_roots, 64);
diff -ru dovecot-2.3.9.2.orig/src/dict/main.c dovecot-2.3.9.2/src/dict/main.c
--- dovecot-2.3.9.2.orig/src/dict/main.c 2019-12-13 14:12:00.000000000 +0100
+++ dovecot-2.3.9.2/src/dict/main.c 2019-12-15 19:46:52.102597505 +0100
@@ -104,7 +104,7 @@
mod_set.abi_version = DOVECOT_ABI_VERSION;
mod_set.require_init_funcs = TRUE;
- modules = module_dir_load(DICT_MODULE_DIR, NULL, &mod_set);
+ modules = module_dir_load("/etc/dovecot/modules/dict", NULL, &mod_set);
module_dir_init(modules);
/* Register only after loading modules. They may contain SQL drivers,
diff -ru dovecot-2.3.9.2.orig/src/doveadm/doveadm-settings.c dovecot-2.3.9.2/src/doveadm/doveadm-settings.c
--- dovecot-2.3.9.2.orig/src/doveadm/doveadm-settings.c 2019-12-13 14:12:00.000000000 +0100
+++ dovecot-2.3.9.2/src/doveadm/doveadm-settings.c 2019-12-15 19:47:29.525812499 +0100
@@ -89,7 +89,7 @@
.base_dir = PKG_RUNDIR,
.libexec_dir = PKG_LIBEXECDIR,
.mail_plugins = "",
- .mail_plugin_dir = MODULEDIR,
+ .mail_plugin_dir = "/etc/dovecot/modules",
.mail_temp_dir = "/tmp",
.auth_debug = FALSE,
.auth_socket_path = "auth-userdb",
diff -ru dovecot-2.3.9.2.orig/src/doveadm/doveadm-util.c dovecot-2.3.9.2/src/doveadm/doveadm-util.c
--- dovecot-2.3.9.2.orig/src/doveadm/doveadm-util.c 2019-12-13 14:12:00.000000000 +0100
+++ dovecot-2.3.9.2/src/doveadm/doveadm-util.c 2019-12-15 19:52:32.003844670 +0100
@@ -33,7 +33,7 @@
mod_set.debug = doveadm_debug;
mod_set.ignore_dlopen_errors = TRUE;
- modules = module_dir_load_missing(modules, DOVEADM_MODULEDIR,
+ modules = module_dir_load_missing(modules, "/etc/dovecot/modules/doveadm",
NULL, &mod_set);
module_dir_init(modules);
}
@@ -58,7 +58,7 @@
return FALSE;
}
- dir = opendir(DOVEADM_MODULEDIR);
+ dir = opendir("/etc/dovecot/modules/doveadm");
if (dir == NULL)
return FALSE;
diff -ru dovecot-2.3.9.2.orig/src/lib-fs/fs-api.c dovecot-2.3.9.2/src/lib-fs/fs-api.c
--- dovecot-2.3.9.2.orig/src/lib-fs/fs-api.c 2019-12-13 14:12:00.000000000 +0100
+++ dovecot-2.3.9.2/src/lib-fs/fs-api.c 2019-12-15 19:46:52.102597505 +0100
@@ -114,7 +114,7 @@
mod_set.abi_version = DOVECOT_ABI_VERSION;
mod_set.ignore_missing = TRUE;
- fs_modules = module_dir_load_missing(fs_modules, MODULE_DIR,
+ fs_modules = module_dir_load_missing(fs_modules, "/etc/dovecot/modules",
module_name, &mod_set);
module_dir_init(fs_modules);
diff -ru dovecot-2.3.9.2.orig/src/lib-ssl-iostream/iostream-ssl.c dovecot-2.3.9.2/src/lib-ssl-iostream/iostream-ssl.c
--- dovecot-2.3.9.2.orig/src/lib-ssl-iostream/iostream-ssl.c 2019-12-13 14:12:00.000000000 +0100
+++ dovecot-2.3.9.2/src/lib-ssl-iostream/iostream-ssl.c 2019-12-15 19:46:52.102597505 +0100
@@ -54,7 +54,7 @@
mod_set.abi_version = DOVECOT_ABI_VERSION;
mod_set.setting_name = "<built-in lib-ssl-iostream lookup>";
mod_set.require_init_funcs = TRUE;
- ssl_module = module_dir_load(MODULE_DIR, plugin_name, &mod_set);
+ ssl_module = module_dir_load("/etc/dovecot/modules", plugin_name, &mod_set);
if (module_dir_try_load_missing(&ssl_module, MODULE_DIR, plugin_name,
&mod_set, error_r) < 0)
return -1;
diff -ru dovecot-2.3.9.2.orig/src/lib-storage/mail-storage-settings.c dovecot-2.3.9.2/src/lib-storage/mail-storage-settings.c
--- dovecot-2.3.9.2.orig/src/lib-storage/mail-storage-settings.c 2019-12-13 14:12:00.000000000 +0100
+++ dovecot-2.3.9.2/src/lib-storage/mail-storage-settings.c 2019-12-15 19:46:52.102597505 +0100
@@ -337,7 +337,7 @@
.last_valid_gid = 0,
.mail_plugins = "",
- .mail_plugin_dir = MODULEDIR,
+ .mail_plugin_dir = "/etc/dovecot/modules",
.mail_log_prefix = "%s(%u)<%{pid}><%{session}>: ",
diff -ru dovecot-2.3.9.2.orig/src/lmtp/lmtp-settings.c dovecot-2.3.9.2/src/lmtp/lmtp-settings.c
--- dovecot-2.3.9.2.orig/src/lmtp/lmtp-settings.c 2019-12-13 14:12:00.000000000 +0100
+++ dovecot-2.3.9.2/src/lmtp/lmtp-settings.c 2019-12-15 19:46:52.102597505 +0100
@@ -95,7 +95,7 @@
.login_trusted_networks = "",
.mail_plugins = "",
- .mail_plugin_dir = MODULEDIR,
+ .mail_plugin_dir = "/etc/dovecot/modules",
};
static const struct setting_parser_info *lmtp_setting_dependencies[] = {
+3 -4
View File
@@ -103,10 +103,8 @@ stdenv.mkDerivation rec {
patches =
[
# Make dovecot look for plugins in /etc/dovecot/modules
# so we can symlink plugins from several packages there.
# The symlinking needs to be done in NixOS.
./2.3.x-module_dir.patch
# Fix loading extended modules.
./load-extended-modules.patch
# fix openssl 3.0 compatibility
(fetchpatch {
url = "https://salsa.debian.org/debian/dovecot/-/raw/debian/1%252.3.19.1+dfsg1-2/debian/patches/Support-openssl-3.0.patch";
@@ -125,6 +123,7 @@ stdenv.mkDerivation rec {
"--localstatedir=/var"
# We need this so utilities default to reading /etc/dovecot/dovecot.conf file.
"--sysconfdir=/etc"
"--with-moduledir=${placeholder "out"}/lib/dovecot/modules"
"--with-ldap"
"--with-ssl=openssl"
"--with-zlib"
@@ -0,0 +1,12 @@
diff --git a/src/config/config-parser.h b/src/config/config-parser.h
index e0a0a5b..a7fd725 100644
--- a/src/config/config-parser.h
+++ b/src/config/config-parser.h
@@ -1,7 +1,7 @@
#ifndef CONFIG_PARSER_H
#define CONFIG_PARSER_H
-#define CONFIG_MODULE_DIR MODULEDIR"/settings"
+#define CONFIG_MODULE_DIR "/run/current-system/sw/lib/dovecot/modules/settings"
#define IS_WHITE(c) ((c) == ' ' || (c) == '\t')
+2 -2
View File
@@ -5,8 +5,8 @@ let
in
{
mir = common {
version = "2.19.3";
hash = "sha256-WwT0cdLZJlVTTq8REuQrtYWdpRhqEDjYPHDy2oj8Edk=";
version = "2.20.0";
hash = "sha256-Dmo/aEATbbVoZd3fWIO0uHkwnAiATih33XS2MF/azoY=";
};
mir_2_15 = common {
+2 -2
View File
@@ -7,13 +7,13 @@
buildDotnetModule rec {
pname = "depotdownloader";
version = "2.7.4";
version = "3.0.0";
src = fetchFromGitHub {
owner = "SteamRE";
repo = "DepotDownloader";
rev = "DepotDownloader_${version}";
hash = "sha256-XcUWNr3l1Bsl8SRYm8OS7t2JYppfKJVrVWyM5OILFDA=";
hash = "sha256-QfnSs8pmWq/+64XdJskYxmUDKbHCnhA6Xd8VrTUaeJE=";
};
projectFile = "DepotDownloader.sln";
+4 -4
View File
@@ -46,8 +46,8 @@
},
{
"pname": "SteamKit2",
"version": "3.0.0",
"hash": "sha256-bRRdX8WFo9k+QCZWh0KHb3TULpJxpR4Hg9FDXKBW6d4="
"version": "3.0.1",
"hash": "sha256-OnfUEPSEE9J6oTO1NFsa1MJRWvEH5MDR1wsGedKGzgI="
},
{
"pname": "System.Collections.Immutable",
@@ -56,8 +56,8 @@
},
{
"pname": "System.IO.Hashing",
"version": "8.0.0",
"hash": "sha256-szOGt0TNBo6dEdC3gf6H+e9YW3Nw0woa6UnCGGGK5cE="
"version": "9.0.0",
"hash": "sha256-k6Pdndm5fTD6CB1QsQfP7G+2h4B30CWIsuvjHuBg3fc="
},
{
"pname": "System.Security.AccessControl",
+3 -1
View File
@@ -7243,7 +7243,9 @@ with pkgs;
wireplumber = callPackage ../development/libraries/pipewire/wireplumber.nix { };
racket = callPackage ../development/interpreters/racket { };
racket-minimal = callPackage ../development/interpreters/racket/minimal.nix { };
racket-minimal = callPackage ../development/interpreters/racket/minimal.nix {
stdenv = stdenvAdapters.makeStaticLibraries stdenv;
};
rakudo = callPackage ../development/interpreters/rakudo { };
moarvm = darwin.apple_sdk_11_0.callPackage ../development/interpreters/rakudo/moarvm.nix {
+6
View File
@@ -6917,6 +6917,8 @@ self: super: with self; {
jsonschema-path = callPackage ../development/python-modules/jsonschema-path { };
jsonschema-rs = callPackage ../development/python-modules/jsonschema-rs { };
jsonschema-spec = callPackage ../development/python-modules/jsonschema-spec { };
jsonschema-specifications = callPackage ../development/python-modules/jsonschema-specifications { };
@@ -8413,6 +8415,8 @@ self: super: with self; {
miniful = callPackage ../development/python-modules/miniful { };
minify-html = callPackage ../development/python-modules/minify-html { };
minikanren = callPackage ../development/python-modules/minikanren { };
minikerberos = callPackage ../development/python-modules/minikerberos { };
@@ -16656,6 +16660,8 @@ self: super: with self; {
tinytuya = callPackage ../development/python-modules/tinytuya { };
tiptapy = callPackage ../development/python-modules/tiptapy { };
titlecase = callPackage ../development/python-modules/titlecase { };
tivars = callPackage ../development/python-modules/tivars { };