about summary refs log tree commit diff
path: root/nixpkgs/pkgs/by-name/re
diff options
context:
space:
mode:
authorAlyssa Ross <hi@alyssa.is>2024-05-03 15:14:25 +0200
committerAlyssa Ross <hi@alyssa.is>2024-05-07 11:19:19 +0200
commitd92b2b6a1bbd322dd65a8b6f51019610d350046e (patch)
tree7f7c21927b9cc05676501f297c51eb76b49e326c /nixpkgs/pkgs/by-name/re
parent93c9e56b40530cc627d921cfc255c05b495d4017 (diff)
parent49050352f602fe87d16ff7b2b6a05b79eb20dc6f (diff)
downloadnixlib-d92b2b6a1bbd322dd65a8b6f51019610d350046e.tar
nixlib-d92b2b6a1bbd322dd65a8b6f51019610d350046e.tar.gz
nixlib-d92b2b6a1bbd322dd65a8b6f51019610d350046e.tar.bz2
nixlib-d92b2b6a1bbd322dd65a8b6f51019610d350046e.tar.lz
nixlib-d92b2b6a1bbd322dd65a8b6f51019610d350046e.tar.xz
nixlib-d92b2b6a1bbd322dd65a8b6f51019610d350046e.tar.zst
nixlib-d92b2b6a1bbd322dd65a8b6f51019610d350046e.zip
Merge remote-tracking branch 'nixpkgs/nixos-unstable-small'
Conflicts:
	nixpkgs/nixos/modules/services/mail/mailman.nix
	nixpkgs/nixos/modules/services/mail/public-inbox.nix
	nixpkgs/pkgs/build-support/go/module.nix
Diffstat (limited to 'nixpkgs/pkgs/by-name/re')
-rw-r--r--nixpkgs/pkgs/by-name/re/reactphysics3d/package.nix14
-rw-r--r--nixpkgs/pkgs/by-name/re/realmd/package.nix80
-rw-r--r--nixpkgs/pkgs/by-name/re/realmd/remove-tap-driver.patch40
-rw-r--r--nixpkgs/pkgs/by-name/re/redict/package.nix94
-rw-r--r--nixpkgs/pkgs/by-name/re/redmine/0001-python3.patch275
-rw-r--r--nixpkgs/pkgs/by-name/re/redmine/Gemfile101
-rw-r--r--nixpkgs/pkgs/by-name/re/redmine/Gemfile.lock323
-rw-r--r--nixpkgs/pkgs/by-name/re/redmine/gemset.nix1179
-rw-r--r--nixpkgs/pkgs/by-name/re/redmine/package.nix53
-rwxr-xr-xnixpkgs/pkgs/by-name/re/redmine/update.sh19
-rw-r--r--nixpkgs/pkgs/by-name/re/redocly/package.nix (renamed from nixpkgs/pkgs/by-name/re/redocly-cli/package.nix)29
-rw-r--r--nixpkgs/pkgs/by-name/re/regal/package.nix23
-rw-r--r--nixpkgs/pkgs/by-name/re/renode-dts2repl/package.nix6
-rw-r--r--nixpkgs/pkgs/by-name/re/renode-unstable/package.nix4
-rw-r--r--nixpkgs/pkgs/by-name/re/renode/package.nix11
-rw-r--r--nixpkgs/pkgs/by-name/re/rerun/package.nix11
-rw-r--r--nixpkgs/pkgs/by-name/re/restinio/package.nix29
-rw-r--r--nixpkgs/pkgs/by-name/re/restls/package.nix26
-rw-r--r--nixpkgs/pkgs/by-name/re/retool/package.nix9
19 files changed, 2263 insertions, 63 deletions
diff --git a/nixpkgs/pkgs/by-name/re/reactphysics3d/package.nix b/nixpkgs/pkgs/by-name/re/reactphysics3d/package.nix
index 4e69b9b41cb9..2245eeee4214 100644
--- a/nixpkgs/pkgs/by-name/re/reactphysics3d/package.nix
+++ b/nixpkgs/pkgs/by-name/re/reactphysics3d/package.nix
@@ -2,25 +2,15 @@
 
 stdenv.mkDerivation (finalAttrs: {
   pname = "reactphysics3d";
-  version = "0.9.0";
+  version = "0.10.0";
 
   src = fetchFromGitHub {
     owner = "DanielChappuis";
     repo = "reactphysics3d";
     rev = "v${finalAttrs.version}";
-    hash = "sha256-AUdsUXsygsGfS8H+AHEV1fSrrX7zGmfsaTONYUG3zqk=";
+    hash = "sha256-LWBnrqDFhpzN/XUEGniZeViDq3R1MtmuU5CMCQ59VOY=";
   };
 
-  patches = [
-    # Fix gcc-13 build failure:
-    #   https://github.com/DanielChappuis/reactphysics3d/pull/371
-    (fetchpatch {
-      name ="gcc-13.patch";
-      url = "https://github.com/DanielChappuis/reactphysics3d/commit/9335856664fdc3bd1073209f0b4f6eae24c35848.patch";
-      hash = "sha256-pCiAHfv66tbE8+hpVvjS22jLi7I+pPofSy8w7eWEp9o=";
-    })
-  ];
-
   nativeBuildInputs = [ cmake ];
 
   meta = with lib; {
diff --git a/nixpkgs/pkgs/by-name/re/realmd/package.nix b/nixpkgs/pkgs/by-name/re/realmd/package.nix
new file mode 100644
index 000000000000..4757931926a3
--- /dev/null
+++ b/nixpkgs/pkgs/by-name/re/realmd/package.nix
@@ -0,0 +1,80 @@
+{
+  autoreconfHook,
+  fetchFromGitLab,
+  glib,
+  lib,
+  libkrb5,
+  nix-update-script,
+  openldap,
+  pkg-config,
+  polkit,
+  samba,
+  stdenv,
+  systemdLibs,
+}:
+
+stdenv.mkDerivation (finalAttrs: {
+  pname = "realmd";
+  version = "0.17.1";
+
+  src = fetchFromGitLab {
+    domain = "gitlab.freedesktop.org";
+    owner = "realmd";
+    repo = "realmd";
+    rev = "refs/tags/${finalAttrs.version}";
+    hash = "sha256-lmNlrXOOUSDk/8H/ge0IRA64bnau9nYUIkW6OyVxbBg=";
+  };
+
+  patches = [
+    # Remove unused tap driver/valgrind checks to make tests work
+    ./remove-tap-driver.patch
+  ];
+
+  nativeBuildInputs = [
+    autoreconfHook
+    pkg-config
+  ];
+
+  buildInputs = [
+    glib
+    libkrb5
+    openldap
+    polkit
+    samba
+    systemdLibs
+  ];
+
+  configureFlags = [
+    "--sysconfdir=${placeholder "out"}/etc"
+    "--with-private-dir=${placeholder "out"}/lib/realmd"
+    "--with-systemd-unit-dir=${placeholder "out"}/lib/systemd/system"
+
+    # realmd doesn't fails without proper defaults and distro configuration files
+    # These settings will be overriden by the NixOS module
+    "--with-distro=redhat"
+
+    # Documentation is disabled
+    # We need to run gdbus-codegen & xmlto in **offline mode** to make it work
+    # See https://github.com/NixOS/nixpkgs/pull/301631
+    "--disable-doc"
+  ];
+
+  hardeningDisable = [
+    # causes redefinition of _FORTIFY_SOURCE
+    "fortify3"
+  ];
+
+  doCheck = true;
+
+  passthru.updateScript = nix-update-script { };
+
+  meta = {
+    changelog = "https://gitlab.freedesktop.org/realmd/realmd/-/blob/${finalAttrs.version}/NEWS";
+    description = "DBus service for configuring Kerberos and other online identities";
+    homepage = "https://gitlab.freedesktop.org/realmd/realmd";
+    license = lib.licenses.lgpl21Only;
+    mainProgram = "realm";
+    maintainers = [ lib.maintainers.anthonyroussel ];
+    platforms = lib.platforms.linux;
+  };
+})
diff --git a/nixpkgs/pkgs/by-name/re/realmd/remove-tap-driver.patch b/nixpkgs/pkgs/by-name/re/realmd/remove-tap-driver.patch
new file mode 100644
index 000000000000..162703d9b966
--- /dev/null
+++ b/nixpkgs/pkgs/by-name/re/realmd/remove-tap-driver.patch
@@ -0,0 +1,40 @@
+diff --git a/Makefile.am b/Makefile.am
+index 1df20d1..b355d59 100644
+--- a/Makefile.am
++++ b/Makefile.am
+@@ -152,35 +152,6 @@ uninstall-doc:
+ 	@true
+ endif
+
+-# ------------------------------------------------------------
+-# Testing
+-#
+-
+-LOG_DRIVER = $(top_srcdir)/build/tap-driver
+-LOG_COMPILER = sh -c '"$$0" "$$@" --tap'
+-
+-VALGRIND_ARGS = --trace-children=no --quiet --error-exitcode=33 \
+-	--suppressions=valgrind-suppressions --gen-suppressions=all \
+-	--num-callers=16
+-
+-VALGRIND_SUPPRESSIONS = \
+-	build/glib.supp \
+-	$(NULL)
+-
+-valgrind-suppressions: $(VALGRIND_SUPPRESSIONS)
+-	$(AM_V_GEN) cat $^ > $@
+-
+-check-memory: valgrind-suppressions
+-	$(MAKE) LOG_FLAGS="-- libtool --mode=execute valgrind $(VALGRIND_ARGS)" \
+-		$(AM_MAKEFLAGS) check
+-recheck-memory: valgrind-suppressions
+-	$(MAKE) LOG_FLAGS="-- libtool --mode=execute valgrind $(VALGRIND_ARGS)" \
+-		$(AM_MAKEFLAGS) recheck
+-
+-EXTRA_DIST += \
+-	$(LOG_DRIVER) \
+-	$(VALGRIND_SUPPRESSIONS) \
+-	$(NULL)
+
+ if WITH_COVERAGE
+ coverage:
diff --git a/nixpkgs/pkgs/by-name/re/redict/package.nix b/nixpkgs/pkgs/by-name/re/redict/package.nix
new file mode 100644
index 000000000000..39133faa9b1b
--- /dev/null
+++ b/nixpkgs/pkgs/by-name/re/redict/package.nix
@@ -0,0 +1,94 @@
+{ lib, stdenv, fetchFromGitea, fetchurl, fetchpatch, lua, jemalloc, pkg-config, nixosTests
+, tcl, which, ps, getconf
+, withSystemd ? lib.meta.availableOn stdenv.hostPlatform systemd, systemd
+# dependency ordering is broken at the moment when building with openssl
+, tlsSupport ? !stdenv.hostPlatform.isStatic, openssl
+
+# Using system jemalloc fixes cross-compilation and various setups.
+# However the experimental 'active defragmentation' feature of redict requires
+# their custom patched version of jemalloc.
+, useSystemJemalloc ? true
+}:
+
+stdenv.mkDerivation (finalAttrs: {
+  pname = "redict";
+  version = "7.3.0";
+
+  src = fetchFromGitea {
+    domain = "codeberg.org";
+    owner = "redict";
+    repo = "redict";
+    rev = finalAttrs.version;
+    hash = "sha256-vtDb+VqDAtrce6dpDRnPO6N9Z6dFfy8fUUqNeiZ+r5c=";
+  };
+
+  patches = lib.optionals useSystemJemalloc [
+    # use system jemalloc
+    (fetchurl {
+      url = "https://gitlab.archlinux.org/archlinux/packaging/packages/redis/-/raw/102cc861713c796756abd541bf341a4512eb06e6/redis-5.0-use-system-jemalloc.patch";
+      hash = "sha256-VPRfoSnctkkkzLrXEWQX3Lh5HmZaCXoJafyOG007KzM=";
+    })
+  ];
+
+  nativeBuildInputs = [ pkg-config ];
+
+  buildInputs = [ lua ]
+    ++ lib.optional useSystemJemalloc jemalloc
+    ++ lib.optional withSystemd systemd
+    ++ lib.optionals tlsSupport [ openssl ];
+
+  preBuild = lib.optionalString stdenv.isDarwin ''
+    substituteInPlace src/Makefile --replace "-flto" ""
+  '';
+
+  # More cross-compiling fixes.
+  makeFlags = [ "PREFIX=${placeholder "out"}" ]
+    ++ lib.optionals (stdenv.buildPlatform != stdenv.hostPlatform) [ "AR=${stdenv.cc.targetPrefix}ar" "RANLIB=${stdenv.cc.targetPrefix}ranlib" ]
+    ++ lib.optionals withSystemd [ "USE_SYSTEMD=yes" ]
+    ++ lib.optionals tlsSupport [ "BUILD_TLS=yes" ];
+
+  enableParallelBuilding = true;
+
+  hardeningEnable = lib.optionals (!stdenv.isDarwin) [ "pie" ];
+
+  env.NIX_CFLAGS_COMPILE = toString (lib.optionals stdenv.cc.isClang [ "-std=c11" ]);
+
+  # darwin currently lacks a pure `pgrep` which is extensively used here
+  doCheck = !stdenv.isDarwin;
+  nativeCheckInputs = [ which tcl ps ] ++ lib.optionals stdenv.hostPlatform.isStatic [ getconf ];
+  checkPhase = ''
+    runHook preCheck
+
+    # disable test "Connect multiple replicas at the same time": even
+    # upstream find this test too timing-sensitive
+    substituteInPlace tests/integration/replication.tcl \
+      --replace 'foreach mdl {no yes}' 'foreach mdl {}'
+
+    substituteInPlace tests/support/server.tcl \
+      --replace 'exec /usr/bin/env' 'exec env'
+
+    sed -i '/^proc wait_load_handlers_disconnected/{n ; s/wait_for_condition 50 100/wait_for_condition 50 500/; }' \
+      tests/support/util.tcl
+
+    ./runtest \
+      --no-latency \
+      --timeout 2000 \
+      --clients $NIX_BUILD_CORES \
+      --tags -leaks \
+      --skipunit integration/failover # flaky and slow
+
+    runHook postCheck
+  '';
+
+  passthru.tests.redict = nixosTests.redict;
+
+  meta = with lib; {
+    homepage = "https://redict.io";
+    description = "A distributed key/value store";
+    license = licenses.lgpl3Only;
+    platforms = platforms.all;
+    changelog = "https://codeberg.org/redict/redict/releases/tag/${finalAttrs.version}";
+    maintainers = with maintainers; [ yuka gmemstr ];
+    mainProgram = "redict-cli";
+  };
+})
diff --git a/nixpkgs/pkgs/by-name/re/redmine/0001-python3.patch b/nixpkgs/pkgs/by-name/re/redmine/0001-python3.patch
new file mode 100644
index 000000000000..c88645b85a28
--- /dev/null
+++ b/nixpkgs/pkgs/by-name/re/redmine/0001-python3.patch
@@ -0,0 +1,275 @@
+--- a/lib/redmine/scm/adapters/mercurial/redminehelper.py
++++ b/lib/redmine/scm/adapters/mercurial/redminehelper.py
+@@ -45,17 +45,20 @@ Output example of rhmanifest::
+       </repository>
+     </rhmanifest>
+ """
+-import re, time, cgi, urllib
++import re, time, html, urllib
+ from mercurial import cmdutil, commands, node, error, hg, registrar
+ 
+ cmdtable = {}
+ command = registrar.command(cmdtable) if hasattr(registrar, 'command') else cmdutil.command(cmdtable)
+ 
+-_x = cgi.escape
+-_u = lambda s: cgi.escape(urllib.quote(s))
++_x = lambda s: html.escape(s.decode('utf-8')).encode('utf-8')
++_u = lambda s: html.escape(urllib.parse.quote(s)).encode('utf-8')
++
++def unquoteplus(*args, **kwargs):
++    return urllib.parse.unquote_to_bytes(*args, **kwargs).replace(b'+', b' ')
+ 
+ def _changectx(repo, rev):
+-    if isinstance(rev, str):
++    if isinstance(rev, bytes):
+        rev = repo.lookup(rev)
+     if hasattr(repo, 'changectx'):
+         return repo.changectx(rev)
+@@ -70,10 +73,10 @@ def _tip(ui, repo):
+         except TypeError:  # Mercurial < 1.1
+             return repo.changelog.count() - 1
+     tipctx = _changectx(repo, tiprev())
+-    ui.write('<tip revision="%d" node="%s"/>\n'
++    ui.write(b'<tip revision="%d" node="%s"/>\n'
+              % (tipctx.rev(), _x(node.hex(tipctx.node()))))
+ 
+-_SPECIAL_TAGS = ('tip',)
++_SPECIAL_TAGS = (b'tip',)
+ 
+ def _tags(ui, repo):
+     # see mercurial/commands.py:tags
+@@ -84,7 +87,7 @@ def _tags(ui, repo):
+             r = repo.changelog.rev(n)
+         except error.LookupError:
+             continue
+-        ui.write('<tag revision="%d" node="%s" name="%s"/>\n'
++        ui.write(b'<tag revision="%d" node="%s" name="%s"/>\n'
+                  % (r, _x(node.hex(n)), _u(t)))
+ 
+ def _branches(ui, repo):
+@@ -104,136 +107,148 @@ def _branches(ui, repo):
+             return repo.branchheads(branch)
+     def lookup(rev, n):
+         try:
+-            return repo.lookup(rev)
++            return repo.lookup(str(rev).encode('utf-8'))
+         except RuntimeError:
+             return n
+     for t, n, r in sorted(iterbranches(), key=lambda e: e[2], reverse=True):
+         if lookup(r, n) in branchheads(t):
+-            ui.write('<branch revision="%d" node="%s" name="%s"/>\n'
++            ui.write(b'<branch revision="%d" node="%s" name="%s"/>\n'
+                      % (r, _x(node.hex(n)), _u(t)))
+ 
+ def _manifest(ui, repo, path, rev):
+     ctx = _changectx(repo, rev)
+-    ui.write('<manifest revision="%d" path="%s">\n'
++    ui.write(b'<manifest revision="%d" path="%s">\n'
+              % (ctx.rev(), _u(path)))
+ 
+     known = set()
+-    pathprefix = (path.rstrip('/') + '/').lstrip('/')
++    pathprefix = (path.decode('utf-8').rstrip('/') + '/').lstrip('/')
+     for f, n in sorted(ctx.manifest().iteritems(), key=lambda e: e[0]):
+-        if not f.startswith(pathprefix):
++        fstr = f.decode('utf-8')
++        if not fstr.startswith(pathprefix):
+             continue
+-        name = re.sub(r'/.*', '/', f[len(pathprefix):])
++        name = re.sub(r'/.*', '/', fstr[len(pathprefix):])
+         if name in known:
+             continue
+         known.add(name)
+ 
+         if name.endswith('/'):
+-            ui.write('<dir name="%s"/>\n'
++            ui.write(b'<dir name="%s"/>\n'
+                      % _x(urllib.quote(name[:-1])))
+         else:
+             fctx = repo.filectx(f, fileid=n)
+             tm, tzoffset = fctx.date()
+-            ui.write('<file name="%s" revision="%d" node="%s" '
+-                     'time="%d" size="%d"/>\n'
++            ui.write(b'<file name="%s" revision="%d" node="%s" '
++                     b'time="%d" size="%d"/>\n'
+                      % (_u(name), fctx.rev(), _x(node.hex(fctx.node())),
+                         tm, fctx.size(), ))
+ 
+-    ui.write('</manifest>\n')
++    ui.write(b'</manifest>\n')
+ 
+-@command('rhannotate',
+-         [('r', 'rev', '', 'revision'),
+-          ('u', 'user', None, 'list the author (long with -v)'),
+-          ('n', 'number', None, 'list the revision number (default)'),
+-          ('c', 'changeset', None, 'list the changeset'),
++@command(b'rhannotate',
++         [(b'r', b'rev', b'', b'revision'),
++          (b'u', b'user', None, b'list the author (long with -v)'),
++          (b'n', b'number', None, b'list the revision number (default)'),
++          (b'c', b'changeset', None, b'list the changeset'),
+          ],
+-         'hg rhannotate [-r REV] [-u] [-n] [-c] FILE...')
++         b'hg rhannotate [-r REV] [-u] [-n] [-c] FILE...')
+ def rhannotate(ui, repo, *pats, **opts):
+-    rev = urllib.unquote_plus(opts.pop('rev', None))
++    rev = unquoteplus(opts.pop('rev', b''))
+     opts['rev'] = rev
+-    return commands.annotate(ui, repo, *map(urllib.unquote_plus, pats), **opts)
++    return commands.annotate(ui, repo, *map(unquoteplus, pats), **opts)
+ 
+-@command('rhcat',
+-               [('r', 'rev', '', 'revision')],
+-               'hg rhcat ([-r REV] ...) FILE...')
++@command(b'rhcat',
++               [(b'r', b'rev', b'', b'revision')],
++               b'hg rhcat ([-r REV] ...) FILE...')
+ def rhcat(ui, repo, file1, *pats, **opts):
+-    rev = urllib.unquote_plus(opts.pop('rev', None))
++    rev = unquoteplus(opts.pop('rev', b''))
+     opts['rev'] = rev
+-    return commands.cat(ui, repo, urllib.unquote_plus(file1), *map(urllib.unquote_plus, pats), **opts)
++    return commands.cat(ui, repo, unquoteplus(file1), *map(unquoteplus, pats), **opts)
+ 
+-@command('rhdiff',
+-               [('r', 'rev', [], 'revision'),
+-                ('c', 'change', '', 'change made by revision')],
+-               'hg rhdiff ([-c REV] | [-r REV] ...) [FILE]...')
++@command(b'rhdiff',
++               [(b'r', b'rev', [], b'revision'),
++                (b'c', b'change', b'', b'change made by revision')],
++               b'hg rhdiff ([-c REV] | [-r REV] ...) [FILE]...')
+ def rhdiff(ui, repo, *pats, **opts):
+     """diff repository (or selected files)"""
+     change = opts.pop('change', None)
+     if change:  # add -c option for Mercurial<1.1
+         base = _changectx(repo, change).parents()[0].rev()
+-        opts['rev'] = [str(base), change]
++        opts['rev'] = [base, change]
+     opts['nodates'] = True
+-    return commands.diff(ui, repo, *map(urllib.unquote_plus, pats), **opts)
+-
+-@command('rhlog',
+-                   [
+-                    ('r', 'rev', [], 'show the specified revision'),
+-                    ('b', 'branch', [],
+-                       'show changesets within the given named branch'),
+-                    ('l', 'limit', '',
+-                         'limit number of changes displayed'),
+-                    ('d', 'date', '',
+-                         'show revisions matching date spec'),
+-                    ('u', 'user', [],
+-                      'revisions committed by user'),
+-                    ('', 'from', '',
+-                      ''),
+-                    ('', 'to', '',
+-                      ''),
+-                    ('', 'rhbranch', '',
+-                      ''),
+-                    ('', 'template', '',
+-                       'display with template')],
+-                   'hg rhlog [OPTION]... [FILE]')
++    return commands.diff(ui, repo, *map(unquoteplus, pats), **opts)
++
++@command(b'rhlog',
++                  [
++                    (b'r', b'rev', [], b'show the specified revision'),
++                    (b'b', b'branch', [],
++                       b'show changesets within the given named branch'),
++                    (b'l', b'limit', b'',
++                         b'limit number of changes displayed'),
++                    (b'd', b'date', b'',
++                         b'show revisions matching date spec'),
++                    (b'u', b'user', [],
++                      b'revisions committed by user'),
++                    (b'', b'from', b'',
++                      b''),
++                    (b'', b'to', b'',
++                      b''),
++                    (b'', b'rhbranch', b'',
++                      b''),
++                    (b'', b'template', b'',
++                       b'display with template')],
++                   b'hg rhlog [OPTION]... [FILE]')
++
+ def rhlog(ui, repo, *pats, **opts):
+     rev      = opts.pop('rev')
+     bra0     = opts.pop('branch')
+-    from_rev = urllib.unquote_plus(opts.pop('from', None))
+-    to_rev   = urllib.unquote_plus(opts.pop('to'  , None))
+-    bra      = urllib.unquote_plus(opts.pop('rhbranch', None))
+-    from_rev = from_rev.replace('"', '\\"')
+-    to_rev   = to_rev.replace('"', '\\"')
+-    if hg.util.version() >= '1.6':
+-      opts['rev'] = ['"%s":"%s"' % (from_rev, to_rev)]
++    from_rev = unquoteplus(opts.pop('from', b''))
++    to_rev   = unquoteplus(opts.pop('to'  , b''))
++    bra      = unquoteplus(opts.pop('rhbranch', b''))
++    from_rev = from_rev.replace(b'"', b'\\"')
++    to_rev   = to_rev.replace(b'"', b'\\"')
++    if (from_rev != b'') or (to_rev != b''):
++        if from_rev != b'':
++            quotefrom = b'"%s"' % (from_rev)
++        else:
++            quotefrom = from_rev
++        if to_rev != b'':
++            quoteto = b'"%s"' % (to_rev)
++        else:
++            quoteto = to_rev
++        opts['rev'] = [b'%s:%s' % (quotefrom, quoteto)]
+     else:
+-      opts['rev'] = ['%s:%s' % (from_rev, to_rev)]
+-    opts['branch'] = [bra]
+-    return commands.log(ui, repo, *map(urllib.unquote_plus, pats), **opts)
+-
+-@command('rhmanifest',
+-                   [('r', 'rev', '', 'show the specified revision')],
+-                   'hg rhmanifest [-r REV] [PATH]')
+-def rhmanifest(ui, repo, path='', **opts):
++        opts['rev'] = rev
++    if (bra != b''):
++        opts['branch'] = [bra]
++    return commands.log(ui, repo, *map(unquoteplus, pats), **opts)
++
++
++@command(b'rhmanifest',
++                   [(b'r', b'rev', b'', b'show the specified revision')],
++                   b'hg rhmanifest -r REV [PATH]')
++def rhmanifest(ui, repo, path=b'', **opts):
+     """output the sub-manifest of the specified directory"""
+-    ui.write('<?xml version="1.0"?>\n')
+-    ui.write('<rhmanifest>\n')
+-    ui.write('<repository root="%s">\n' % _u(repo.root))
++    ui.write(b'<?xml version="1.0"?>\n')
++    ui.write(b'<rhmanifest>\n')
++    ui.write(b'<repository root="%s">\n' % _u(repo.root))
+     try:
+-        _manifest(ui, repo, urllib.unquote_plus(path), urllib.unquote_plus(opts.get('rev')))
++        _manifest(ui, repo, unquoteplus(path), unquoteplus(opts.get('rev')))
+     finally:
+-        ui.write('</repository>\n')
+-        ui.write('</rhmanifest>\n')
++        ui.write(b'</repository>\n')
++        ui.write(b'</rhmanifest>\n')
+ 
+-@command('rhsummary',[], 'hg rhsummary')
++@command(b'rhsummary',[], b'hg rhsummary')
+ def rhsummary(ui, repo, **opts):
+     """output the summary of the repository"""
+-    ui.write('<?xml version="1.0"?>\n')
+-    ui.write('<rhsummary>\n')
+-    ui.write('<repository root="%s">\n' % _u(repo.root))
++    ui.write(b'<?xml version="1.0"?>\n')
++    ui.write(b'<rhsummary>\n')
++    ui.write(b'<repository root="%s">\n' % _u(repo.root))
+     try:
+         _tip(ui, repo)
+         _tags(ui, repo)
+         _branches(ui, repo)
+         # TODO: bookmarks in core (Mercurial>=1.8)
+     finally:
+-        ui.write('</repository>\n')
+-        ui.write('</rhsummary>\n')
++        ui.write(b'</repository>\n')
++        ui.write(b'</rhsummary>\n')
+ 
diff --git a/nixpkgs/pkgs/by-name/re/redmine/Gemfile b/nixpkgs/pkgs/by-name/re/redmine/Gemfile
new file mode 100644
index 000000000000..e29e240c75b7
--- /dev/null
+++ b/nixpkgs/pkgs/by-name/re/redmine/Gemfile
@@ -0,0 +1,101 @@
+source 'https://rubygems.org'
+
+ruby '>= 2.7.0', '< 3.3.0'
+
+gem 'rails', '6.1.7.7'
+gem 'rouge', '~> 4.2.0'
+gem 'request_store', '~> 1.5.0'
+gem 'mini_mime', '~> 1.1.0'
+gem "actionpack-xml_parser"
+gem 'roadie-rails', '~> 3.1.0'
+gem 'marcel'
+gem 'mail', '~> 2.8.1'
+gem 'nokogiri', '~> 1.15.2'
+gem 'i18n', '~> 1.14.1'
+gem 'rbpdf', '~> 1.21.3'
+gem 'addressable'
+gem 'rubyzip', '~> 2.3.0'
+
+#  Ruby Standard Gems
+gem 'csv', '~> 3.2.6'
+gem 'net-imap', '~> 0.3.4'
+gem 'net-pop', '~> 0.1.2'
+gem 'net-smtp', '~> 0.3.3'
+gem 'rexml', require: false if Gem.ruby_version >= Gem::Version.new('3.0')
+
+# Windows does not include zoneinfo files, so bundle the tzinfo-data gem
+gem 'tzinfo-data', platforms: [:mingw, :x64_mingw, :mswin]
+
+# TOTP-based 2-factor authentication
+gem 'rotp', '>= 5.0.0'
+gem 'rqrcode'
+
+# HTML pipeline and sanitization
+gem "html-pipeline", "~> 2.13.2"
+gem "sanitize", "~> 6.0"
+
+# Optional gem for LDAP authentication
+group :ldap do
+  gem 'net-ldap', '~> 0.17.0'
+end
+
+# Optional gem for exporting the gantt to a PNG file
+group :minimagick do
+  gem 'mini_magick', '~> 4.12.0'
+end
+
+# Optional Markdown support
+group :markdown do
+  gem 'redcarpet', '~> 3.6.0'
+end
+
+# Optional CommonMark support, not for JRuby
+group :common_mark do
+  gem "commonmarker", '~> 0.23.8'
+  gem 'deckar01-task_list', '2.3.2'
+end
+
+# Include database gems for the database adapters NixOS supports
+require 'erb'
+require 'yaml'
+gem "mysql2", "~> 0.5.0", :platforms => [:mri, :mingw, :x64_mingw]
+gem "with_advisory_lock"
+gem 'pg', '~> 1.5.3', :platforms => [:mri, :mingw, :x64_mingw]
+gem 'sqlite3', '~> 1.6.0', :platforms => [:mri, :mingw, :x64_mingw]
+
+group :development do
+  gem 'listen', '~> 3.3'
+  gem "yard"
+end
+
+group :test do
+  gem "rails-dom-testing"
+  gem 'mocha', '>= 2.0.1'
+  gem 'simplecov', '~> 0.22.0', :require => false
+  gem "ffi", platforms: [:mri, :mingw, :x64_mingw, :mswin]
+  # For running system tests
+  gem 'puma'
+  gem "capybara", ">= 3.39"
+  if Gem.ruby_version < Gem::Version.new('3.0')
+    gem "selenium-webdriver", "<= 4.9.0"
+    gem "webdrivers", require: false
+  else
+    gem "selenium-webdriver", ">= 4.11.0"
+  end
+  # RuboCop
+  gem 'rubocop', '~> 1.57.0', require: false
+  gem 'rubocop-performance', '~> 1.19.0', require: false
+  gem 'rubocop-rails', '~> 2.22.1', require: false
+end
+
+gem "webrick"
+
+local_gemfile = File.join(File.dirname(__FILE__), "Gemfile.local")
+if File.exist?(local_gemfile)
+  eval_gemfile local_gemfile
+end
+
+# Load plugins' Gemfiles
+Dir.glob File.expand_path("../plugins/*/{Gemfile,PluginGemfile}", __FILE__) do |file|
+  eval_gemfile file
+end
diff --git a/nixpkgs/pkgs/by-name/re/redmine/Gemfile.lock b/nixpkgs/pkgs/by-name/re/redmine/Gemfile.lock
new file mode 100644
index 000000000000..c1600850c9a7
--- /dev/null
+++ b/nixpkgs/pkgs/by-name/re/redmine/Gemfile.lock
@@ -0,0 +1,323 @@
+GEM
+  remote: https://rubygems.org/
+  specs:
+    actioncable (6.1.7.7)
+      actionpack (= 6.1.7.7)
+      activesupport (= 6.1.7.7)
+      nio4r (~> 2.0)
+      websocket-driver (>= 0.6.1)
+    actionmailbox (6.1.7.7)
+      actionpack (= 6.1.7.7)
+      activejob (= 6.1.7.7)
+      activerecord (= 6.1.7.7)
+      activestorage (= 6.1.7.7)
+      activesupport (= 6.1.7.7)
+      mail (>= 2.7.1)
+    actionmailer (6.1.7.7)
+      actionpack (= 6.1.7.7)
+      actionview (= 6.1.7.7)
+      activejob (= 6.1.7.7)
+      activesupport (= 6.1.7.7)
+      mail (~> 2.5, >= 2.5.4)
+      rails-dom-testing (~> 2.0)
+    actionpack (6.1.7.7)
+      actionview (= 6.1.7.7)
+      activesupport (= 6.1.7.7)
+      rack (~> 2.0, >= 2.0.9)
+      rack-test (>= 0.6.3)
+      rails-dom-testing (~> 2.0)
+      rails-html-sanitizer (~> 1.0, >= 1.2.0)
+    actionpack-xml_parser (2.0.1)
+      actionpack (>= 5.0)
+      railties (>= 5.0)
+    actiontext (6.1.7.7)
+      actionpack (= 6.1.7.7)
+      activerecord (= 6.1.7.7)
+      activestorage (= 6.1.7.7)
+      activesupport (= 6.1.7.7)
+      nokogiri (>= 1.8.5)
+    actionview (6.1.7.7)
+      activesupport (= 6.1.7.7)
+      builder (~> 3.1)
+      erubi (~> 1.4)
+      rails-dom-testing (~> 2.0)
+      rails-html-sanitizer (~> 1.1, >= 1.2.0)
+    activejob (6.1.7.7)
+      activesupport (= 6.1.7.7)
+      globalid (>= 0.3.6)
+    activemodel (6.1.7.7)
+      activesupport (= 6.1.7.7)
+    activerecord (6.1.7.7)
+      activemodel (= 6.1.7.7)
+      activesupport (= 6.1.7.7)
+    activestorage (6.1.7.7)
+      actionpack (= 6.1.7.7)
+      activejob (= 6.1.7.7)
+      activerecord (= 6.1.7.7)
+      activesupport (= 6.1.7.7)
+      marcel (~> 1.0)
+      mini_mime (>= 1.1.0)
+    activesupport (6.1.7.7)
+      concurrent-ruby (~> 1.0, >= 1.0.2)
+      i18n (>= 1.6, < 2)
+      minitest (>= 5.1)
+      tzinfo (~> 2.0)
+      zeitwerk (~> 2.3)
+    addressable (2.8.6)
+      public_suffix (>= 2.0.2, < 6.0)
+    ast (2.4.2)
+    base64 (0.2.0)
+    builder (3.2.4)
+    capybara (3.40.0)
+      addressable
+      matrix
+      mini_mime (>= 0.1.3)
+      nokogiri (~> 1.11)
+      rack (>= 1.6.0)
+      rack-test (>= 0.6.3)
+      regexp_parser (>= 1.5, < 3.0)
+      xpath (~> 3.2)
+    chunky_png (1.4.0)
+    commonmarker (0.23.10)
+    concurrent-ruby (1.2.3)
+    crass (1.0.6)
+    css_parser (1.16.0)
+      addressable
+    csv (3.2.9)
+    date (3.3.4)
+    deckar01-task_list (2.3.2)
+      html-pipeline
+    docile (1.4.0)
+    erubi (1.12.0)
+    ffi (1.16.3)
+    globalid (1.2.1)
+      activesupport (>= 6.1)
+    html-pipeline (2.13.2)
+      activesupport (>= 2)
+      nokogiri (>= 1.4)
+    htmlentities (4.3.4)
+    i18n (1.14.4)
+      concurrent-ruby (~> 1.0)
+    json (2.7.1)
+    language_server-protocol (3.17.0.3)
+    listen (3.9.0)
+      rb-fsevent (~> 0.10, >= 0.10.3)
+      rb-inotify (~> 0.9, >= 0.9.10)
+    loofah (2.22.0)
+      crass (~> 1.0.2)
+      nokogiri (>= 1.12.0)
+    mail (2.8.1)
+      mini_mime (>= 0.1.1)
+      net-imap
+      net-pop
+      net-smtp
+    marcel (1.0.4)
+    matrix (0.4.2)
+    method_source (1.0.0)
+    mini_magick (4.12.0)
+    mini_mime (1.1.5)
+    mini_portile2 (2.8.5)
+    minitest (5.22.3)
+    mocha (2.1.0)
+      ruby2_keywords (>= 0.0.5)
+    mysql2 (0.5.6)
+    net-imap (0.3.7)
+      date
+      net-protocol
+    net-ldap (0.17.1)
+    net-pop (0.1.2)
+      net-protocol
+    net-protocol (0.2.2)
+      timeout
+    net-smtp (0.3.4)
+      net-protocol
+    nio4r (2.7.1)
+    nokogiri (1.15.6)
+      mini_portile2 (~> 2.8.2)
+      racc (~> 1.4)
+    parallel (1.24.0)
+    parser (3.3.0.5)
+      ast (~> 2.4.1)
+      racc
+    pg (1.5.6)
+    public_suffix (5.0.4)
+    puma (6.4.2)
+      nio4r (~> 2.0)
+    racc (1.7.3)
+    rack (2.2.9)
+    rack-test (2.1.0)
+      rack (>= 1.3)
+    rails (6.1.7.7)
+      actioncable (= 6.1.7.7)
+      actionmailbox (= 6.1.7.7)
+      actionmailer (= 6.1.7.7)
+      actionpack (= 6.1.7.7)
+      actiontext (= 6.1.7.7)
+      actionview (= 6.1.7.7)
+      activejob (= 6.1.7.7)
+      activemodel (= 6.1.7.7)
+      activerecord (= 6.1.7.7)
+      activestorage (= 6.1.7.7)
+      activesupport (= 6.1.7.7)
+      bundler (>= 1.15.0)
+      railties (= 6.1.7.7)
+      sprockets-rails (>= 2.0.0)
+    rails-dom-testing (2.2.0)
+      activesupport (>= 5.0.0)
+      minitest
+      nokogiri (>= 1.6)
+    rails-html-sanitizer (1.6.0)
+      loofah (~> 2.21)
+      nokogiri (~> 1.14)
+    railties (6.1.7.7)
+      actionpack (= 6.1.7.7)
+      activesupport (= 6.1.7.7)
+      method_source
+      rake (>= 12.2)
+      thor (~> 1.0)
+    rainbow (3.1.1)
+    rake (13.1.0)
+    rb-fsevent (0.11.2)
+    rb-inotify (0.10.1)
+      ffi (~> 1.0)
+    rbpdf (1.21.3)
+      htmlentities
+      rbpdf-font (~> 1.19.0)
+    rbpdf-font (1.19.1)
+    redcarpet (3.6.0)
+    regexp_parser (2.9.0)
+    request_store (1.5.1)
+      rack (>= 1.4)
+    rexml (3.2.6)
+    roadie (5.2.1)
+      css_parser (~> 1.4)
+      nokogiri (~> 1.15)
+    roadie-rails (3.1.0)
+      railties (>= 5.1, < 8.0)
+      roadie (~> 5.0)
+    rotp (6.3.0)
+    rouge (4.2.1)
+    rqrcode (2.2.0)
+      chunky_png (~> 1.0)
+      rqrcode_core (~> 1.0)
+    rqrcode_core (1.2.0)
+    rubocop (1.57.2)
+      json (~> 2.3)
+      language_server-protocol (>= 3.17.0)
+      parallel (~> 1.10)
+      parser (>= 3.2.2.4)
+      rainbow (>= 2.2.2, < 4.0)
+      regexp_parser (>= 1.8, < 3.0)
+      rexml (>= 3.2.5, < 4.0)
+      rubocop-ast (>= 1.28.1, < 2.0)
+      ruby-progressbar (~> 1.7)
+      unicode-display_width (>= 2.4.0, < 3.0)
+    rubocop-ast (1.31.2)
+      parser (>= 3.3.0.4)
+    rubocop-performance (1.19.1)
+      rubocop (>= 1.7.0, < 2.0)
+      rubocop-ast (>= 0.4.0)
+    rubocop-rails (2.22.2)
+      activesupport (>= 4.2.0)
+      rack (>= 1.1)
+      rubocop (>= 1.33.0, < 2.0)
+      rubocop-ast (>= 1.30.0, < 2.0)
+    ruby-progressbar (1.13.0)
+    ruby2_keywords (0.0.5)
+    rubyzip (2.3.2)
+    sanitize (6.1.0)
+      crass (~> 1.0.2)
+      nokogiri (>= 1.12.0)
+    selenium-webdriver (4.18.1)
+      base64 (~> 0.2)
+      rexml (~> 3.2, >= 3.2.5)
+      rubyzip (>= 1.2.2, < 3.0)
+      websocket (~> 1.0)
+    simplecov (0.22.0)
+      docile (~> 1.1)
+      simplecov-html (~> 0.11)
+      simplecov_json_formatter (~> 0.1)
+    simplecov-html (0.12.3)
+    simplecov_json_formatter (0.1.4)
+    sprockets (4.2.1)
+      concurrent-ruby (~> 1.0)
+      rack (>= 2.2.4, < 4)
+    sprockets-rails (3.4.2)
+      actionpack (>= 5.2)
+      activesupport (>= 5.2)
+      sprockets (>= 3.0.0)
+    sqlite3 (1.6.9)
+      mini_portile2 (~> 2.8.0)
+    thor (1.3.1)
+    timeout (0.4.1)
+    tzinfo (2.0.6)
+      concurrent-ruby (~> 1.0)
+    unicode-display_width (2.5.0)
+    webrick (1.8.1)
+    websocket (1.2.10)
+    websocket-driver (0.7.6)
+      websocket-extensions (>= 0.1.0)
+    websocket-extensions (0.1.5)
+    with_advisory_lock (5.1.0)
+      activerecord (>= 6.1)
+      zeitwerk (>= 2.6)
+    xpath (3.2.0)
+      nokogiri (~> 1.8)
+    yard (0.9.36)
+    zeitwerk (2.6.13)
+
+PLATFORMS
+  ruby
+
+DEPENDENCIES
+  actionpack-xml_parser
+  addressable
+  capybara (>= 3.39)
+  commonmarker (~> 0.23.8)
+  csv (~> 3.2.6)
+  deckar01-task_list (= 2.3.2)
+  ffi
+  html-pipeline (~> 2.13.2)
+  i18n (~> 1.14.1)
+  listen (~> 3.3)
+  mail (~> 2.8.1)
+  marcel
+  mini_magick (~> 4.12.0)
+  mini_mime (~> 1.1.0)
+  mocha (>= 2.0.1)
+  mysql2 (~> 0.5.0)
+  net-imap (~> 0.3.4)
+  net-ldap (~> 0.17.0)
+  net-pop (~> 0.1.2)
+  net-smtp (~> 0.3.3)
+  nokogiri (~> 1.15.2)
+  pg (~> 1.5.3)
+  puma
+  rails (= 6.1.7.7)
+  rails-dom-testing
+  rbpdf (~> 1.21.3)
+  redcarpet (~> 3.6.0)
+  request_store (~> 1.5.0)
+  rexml
+  roadie-rails (~> 3.1.0)
+  rotp (>= 5.0.0)
+  rouge (~> 4.2.0)
+  rqrcode
+  rubocop (~> 1.57.0)
+  rubocop-performance (~> 1.19.0)
+  rubocop-rails (~> 2.22.1)
+  rubyzip (~> 2.3.0)
+  sanitize (~> 6.0)
+  selenium-webdriver (>= 4.11.0)
+  simplecov (~> 0.22.0)
+  sqlite3 (~> 1.6.0)
+  tzinfo-data
+  webrick
+  with_advisory_lock
+  yard
+
+RUBY VERSION
+   ruby 3.1.4p223
+
+BUNDLED WITH
+   2.4.22
diff --git a/nixpkgs/pkgs/by-name/re/redmine/gemset.nix b/nixpkgs/pkgs/by-name/re/redmine/gemset.nix
new file mode 100644
index 000000000000..10c5de5ed7e2
--- /dev/null
+++ b/nixpkgs/pkgs/by-name/re/redmine/gemset.nix
@@ -0,0 +1,1179 @@
+{
+  actioncable = {
+    dependencies = ["actionpack" "activesupport" "nio4r" "websocket-driver"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1br4vjv1si1gvhh8p96r95crljqwbx3nlzbkkdqg21xq8f9106kl";
+      type = "gem";
+    };
+    version = "6.1.7.7";
+  };
+  actionmailbox = {
+    dependencies = ["actionpack" "activejob" "activerecord" "activestorage" "activesupport" "mail"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1i21621aiv233pa8fp1pvibwgbzzdddp0bx44qqn16yca6z35zrj";
+      type = "gem";
+    };
+    version = "6.1.7.7";
+  };
+  actionmailer = {
+    dependencies = ["actionpack" "actionview" "activejob" "activesupport" "mail" "rails-dom-testing"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0irkj00z2mzsvbrpdl8sd08k04hz5lhvy8rfkzhx2sqq5x1n155a";
+      type = "gem";
+    };
+    version = "6.1.7.7";
+  };
+  actionpack = {
+    dependencies = ["actionview" "activesupport" "rack" "rack-test" "rails-dom-testing" "rails-html-sanitizer"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "15jp9a1mgz8xjm618s8g69d70w19nn2svav4fhz3aarjwfbkvwj7";
+      type = "gem";
+    };
+    version = "6.1.7.7";
+  };
+  actionpack-xml_parser = {
+    dependencies = ["actionpack" "railties"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1rnm6jrw3mzcf2g3q498igmhsn0kfkxq79w0nm532iclx4g4djs0";
+      type = "gem";
+    };
+    version = "2.0.1";
+  };
+  actiontext = {
+    dependencies = ["actionpack" "activerecord" "activestorage" "activesupport" "nokogiri"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0hjm6vapqq1f7addwl71qwzn72lnmq686ypnbyhd873hqlnzangf";
+      type = "gem";
+    };
+    version = "6.1.7.7";
+  };
+  actionview = {
+    dependencies = ["activesupport" "builder" "erubi" "rails-dom-testing" "rails-html-sanitizer"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1hkdqf299dx8bgvgpgknf37kcbprqgq0iy8xdipww6pmbbc45bwk";
+      type = "gem";
+    };
+    version = "6.1.7.7";
+  };
+  activejob = {
+    dependencies = ["activesupport" "globalid"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "06rp7kks22wrc55vric8yh0kg137jsiwd62jimdiqhh9bp48jbbm";
+      type = "gem";
+    };
+    version = "6.1.7.7";
+  };
+  activemodel = {
+    dependencies = ["activesupport"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0zz32997k2fsyd0fzrh8f79yjr6hv3i4j9wykkxncl02j8dhrkay";
+      type = "gem";
+    };
+    version = "6.1.7.7";
+  };
+  activerecord = {
+    dependencies = ["activemodel" "activesupport"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0qzymgyrvw2k32ldabp2jr0zgp6z9w8smyb946qgvs9zfs4n2qnn";
+      type = "gem";
+    };
+    version = "6.1.7.7";
+  };
+  activestorage = {
+    dependencies = ["actionpack" "activejob" "activerecord" "activesupport" "marcel" "mini_mime"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "12i033l3m41vr3qs7msy4p88a6pglx9vnsh5nakp0b6abf6mv5mk";
+      type = "gem";
+    };
+    version = "6.1.7.7";
+  };
+  activesupport = {
+    dependencies = ["concurrent-ruby" "i18n" "minitest" "tzinfo" "zeitwerk"];
+    groups = ["common_mark" "default" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0r2i9b0pm0b1dy8fc7kyls1g7f0bcnyq53v825rykibzdqfqdfgp";
+      type = "gem";
+    };
+    version = "6.1.7.7";
+  };
+  addressable = {
+    dependencies = ["public_suffix"];
+    groups = ["default" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0irbdwkkjwzajq1ip6ba46q49sxnrl2cw7ddkdhsfhb6aprnm3vr";
+      type = "gem";
+    };
+    version = "2.8.6";
+  };
+  ast = {
+    groups = ["default" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "04nc8x27hlzlrr5c2gn7mar4vdr0apw5xg22wp6m8dx3wqr04a0y";
+      type = "gem";
+    };
+    version = "2.4.2";
+  };
+  base64 = {
+    groups = ["default" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "01qml0yilb9basf7is2614skjp8384h2pycfx86cr8023arfj98g";
+      type = "gem";
+    };
+    version = "0.2.0";
+  };
+  builder = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "045wzckxpwcqzrjr353cxnyaxgf0qg22jh00dcx7z38cys5g1jlr";
+      type = "gem";
+    };
+    version = "3.2.4";
+  };
+  capybara = {
+    dependencies = ["addressable" "matrix" "mini_mime" "nokogiri" "rack" "rack-test" "regexp_parser" "xpath"];
+    groups = ["test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1vxfah83j6zpw3v5hic0j70h519nvmix2hbszmjwm8cfawhagns2";
+      type = "gem";
+    };
+    version = "3.40.0";
+  };
+  chunky_png = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1znw5x86hmm9vfhidwdsijz8m38pqgmv98l9ryilvky0aldv7mc9";
+      type = "gem";
+    };
+    version = "1.4.0";
+  };
+  commonmarker = {
+    groups = ["common_mark"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1lb5slzbqrca49h0gaifg82xky5r7i9xgm4560pin1xl5fp15lzx";
+      type = "gem";
+    };
+    version = "0.23.10";
+  };
+  concurrent-ruby = {
+    groups = ["common_mark" "default" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1qh1b14jwbbj242klkyz5fc7npd4j0mvndz62gajhvl1l3wd7zc2";
+      type = "gem";
+    };
+    version = "1.2.3";
+  };
+  crass = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0pfl5c0pyqaparxaqxi6s4gfl21bdldwiawrc0aknyvflli60lfw";
+      type = "gem";
+    };
+    version = "1.0.6";
+  };
+  css_parser = {
+    dependencies = ["addressable"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "18mii41bbl106rn940ah8v3xclj4yrxxa0bwlwp546244n9b83zp";
+      type = "gem";
+    };
+    version = "1.16.0";
+  };
+  csv = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1fp986v5xfpzcj9v3dyvdd26fcnmbbzjwcp66pz34hv6g86z66a9";
+      type = "gem";
+    };
+    version = "3.2.9";
+  };
+  date = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "149jknsq999gnhy865n33fkk22s0r447k76x9pmcnnwldfv2q7wp";
+      type = "gem";
+    };
+    version = "3.3.4";
+  };
+  deckar01-task_list = {
+    dependencies = ["html-pipeline"];
+    groups = ["common_mark"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "01c8vv0xwbhlyhiagj93b1hlm2n0rmj4sw62nbc0jhyj90jhj6as";
+      type = "gem";
+    };
+    version = "2.3.2";
+  };
+  docile = {
+    groups = ["default" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1lxqxgq71rqwj1lpl9q1mbhhhhhhdkkj7my341f2889pwayk85sz";
+      type = "gem";
+    };
+    version = "1.4.0";
+  };
+  erubi = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "08s75vs9cxlc4r1q2bjg4br8g9wc5lc5x5vl0vv4zq5ivxsdpgi7";
+      type = "gem";
+    };
+    version = "1.12.0";
+  };
+  ffi = {
+    groups = ["default" "development" "test"];
+    platforms = [{
+      engine = "maglev";
+    } {
+      engine = "mingw";
+    } {
+      engine = "mingw";
+    } {
+      engine = "mswin";
+    } {
+      engine = "ruby";
+    }];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1yvii03hcgqj30maavddqamqy50h7y6xcn2wcyq72wn823zl4ckd";
+      type = "gem";
+    };
+    version = "1.16.3";
+  };
+  globalid = {
+    dependencies = ["activesupport"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1sbw6b66r7cwdx3jhs46s4lr991969hvigkjpbdl7y3i31qpdgvh";
+      type = "gem";
+    };
+    version = "1.2.1";
+  };
+  html-pipeline = {
+    dependencies = ["activesupport" "nokogiri"];
+    groups = ["common_mark" "default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "00xqmlny1b4ixff8sk0rkl4wcgwqc6v93qv8l3rn8d1dppvq7pm1";
+      type = "gem";
+    };
+    version = "2.13.2";
+  };
+  htmlentities = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1nkklqsn8ir8wizzlakncfv42i32wc0w9hxp00hvdlgjr7376nhj";
+      type = "gem";
+    };
+    version = "4.3.4";
+  };
+  i18n = {
+    dependencies = ["concurrent-ruby"];
+    groups = ["common_mark" "default" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0lbm33fpb3w06wd2231sg58dwlwgjsvym93m548ajvl6s3mfvpn7";
+      type = "gem";
+    };
+    version = "1.14.4";
+  };
+  json = {
+    groups = ["default" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0r9jmjhg2ly3l736flk7r2al47b5c8cayh0gqkq0yhjqzc9a6zhq";
+      type = "gem";
+    };
+    version = "2.7.1";
+  };
+  language_server-protocol = {
+    groups = ["default" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0gvb1j8xsqxms9mww01rmdl78zkd72zgxaap56bhv8j45z05hp1x";
+      type = "gem";
+    };
+    version = "3.17.0.3";
+  };
+  listen = {
+    dependencies = ["rb-fsevent" "rb-inotify"];
+    groups = ["development"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0rwwsmvq79qwzl6324yc53py02kbrcww35si720490z5w0j497nv";
+      type = "gem";
+    };
+    version = "3.9.0";
+  };
+  loofah = {
+    dependencies = ["crass" "nokogiri"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1zkjqf37v2d7s11176cb35cl83wls5gm3adnfkn2zcc61h3nxmqh";
+      type = "gem";
+    };
+    version = "2.22.0";
+  };
+  mail = {
+    dependencies = ["mini_mime" "net-imap" "net-pop" "net-smtp"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1bf9pysw1jfgynv692hhaycfxa8ckay1gjw5hz3madrbrynryfzc";
+      type = "gem";
+    };
+    version = "2.8.1";
+  };
+  marcel = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "190n2mk8m1l708kr88fh6mip9sdsh339d2s6sgrik3sbnvz4jmhd";
+      type = "gem";
+    };
+    version = "1.0.4";
+  };
+  matrix = {
+    groups = ["default" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1h2cgkpzkh3dd0flnnwfq6f3nl2b1zff9lvqz8xs853ssv5kq23i";
+      type = "gem";
+    };
+    version = "0.4.2";
+  };
+  method_source = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1pnyh44qycnf9mzi1j6fywd5fkskv3x7nmsqrrws0rjn5dd4ayfp";
+      type = "gem";
+    };
+    version = "1.0.0";
+  };
+  mini_magick = {
+    groups = ["minimagick"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0slh78f9z6n0l1i2km7m48yz7l4fjrk88sj1f4mh1wb39sl2yc37";
+      type = "gem";
+    };
+    version = "4.12.0";
+  };
+  mini_mime = {
+    groups = ["default" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1vycif7pjzkr29mfk4dlqv3disc5dn0va04lkwajlpr1wkibg0c6";
+      type = "gem";
+    };
+    version = "1.1.5";
+  };
+  mini_portile2 = {
+    groups = ["common_mark" "default" "test"];
+    platforms = [{
+      engine = "maglev";
+    } {
+      engine = "mingw";
+    } {
+      engine = "mingw";
+    } {
+      engine = "ruby";
+    }];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1kl9c3kdchjabrihdqfmcplk3lq4cw1rr9f378y6q22qwy5dndvs";
+      type = "gem";
+    };
+    version = "2.8.5";
+  };
+  minitest = {
+    groups = ["common_mark" "default" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "07lq26b86giy3ha3fhrywk9r1ajhc2pm2mzj657jnpnbj1i6g17a";
+      type = "gem";
+    };
+    version = "5.22.3";
+  };
+  mocha = {
+    dependencies = ["ruby2_keywords"];
+    groups = ["test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0lsll8iba8612dypk718l9kx73m9syiscb2rhciljys1krc5g1zr";
+      type = "gem";
+    };
+    version = "2.1.0";
+  };
+  mysql2 = {
+    groups = ["default"];
+    platforms = [{
+      engine = "maglev";
+    } {
+      engine = "mingw";
+    } {
+      engine = "mingw";
+    } {
+      engine = "ruby";
+    }];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0cysv1wdfdbizwkd0d9s16s832khdwv31pgp01mw2g3bbpa4gx3h";
+      type = "gem";
+    };
+    version = "0.5.6";
+  };
+  net-imap = {
+    dependencies = ["date" "net-protocol"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0lf7wqg7czhaj51qsnmn28j7jmcxhkh3m28rl1cjrqsgjxhwj7r3";
+      type = "gem";
+    };
+    version = "0.3.7";
+  };
+  net-ldap = {
+    groups = ["ldap"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1ycw0qsw3hap8svakl0i30jkj0ffd4lpyrn17a1j0w8mz5ainmsj";
+      type = "gem";
+    };
+    version = "0.17.1";
+  };
+  net-pop = {
+    dependencies = ["net-protocol"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1wyz41jd4zpjn0v1xsf9j778qx1vfrl24yc20cpmph8k42c4x2w4";
+      type = "gem";
+    };
+    version = "0.1.2";
+  };
+  net-protocol = {
+    dependencies = ["timeout"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1a32l4x73hz200cm587bc29q8q9az278syw3x6fkc9d1lv5y0wxa";
+      type = "gem";
+    };
+    version = "0.2.2";
+  };
+  net-smtp = {
+    dependencies = ["net-protocol"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0hwiqplhi29kfjl8jm0rhl51qv6wmxfynl4qap1dhv9xdwc4bm1x";
+      type = "gem";
+    };
+    version = "0.3.4";
+  };
+  nio4r = {
+    groups = ["default" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "15iwbiij52x6jhdbl0rkcldnhfndmsy0sbnsygkr9vhskfqrp72m";
+      type = "gem";
+    };
+    version = "2.7.1";
+  };
+  nokogiri = {
+    dependencies = ["mini_portile2" "racc"];
+    groups = ["common_mark" "default" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "023f2j0q8makgmmfj4pv2fhwgcbh9y8s678za1cb68ry9fdpkkkh";
+      type = "gem";
+    };
+    version = "1.15.6";
+  };
+  parallel = {
+    groups = ["default" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "15wkxrg1sj3n1h2g8jcrn7gcapwcgxr659ypjf75z1ipkgxqxwsv";
+      type = "gem";
+    };
+    version = "1.24.0";
+  };
+  parser = {
+    dependencies = ["ast" "racc"];
+    groups = ["default" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "11r6kp8wam0nkfvnwyc1fmvky102r1vcfr84vi2p1a2wa0z32j3p";
+      type = "gem";
+    };
+    version = "3.3.0.5";
+  };
+  pg = {
+    groups = ["default"];
+    platforms = [{
+      engine = "maglev";
+    } {
+      engine = "mingw";
+    } {
+      engine = "mingw";
+    } {
+      engine = "ruby";
+    }];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "071b55bhsz7mivlnp2kv0a11msnl7xg5awvk8mlflpl270javhsb";
+      type = "gem";
+    };
+    version = "1.5.6";
+  };
+  public_suffix = {
+    groups = ["default" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1bni4qjrsh2q49pnmmd6if4iv3ak36bd2cckrs6npl111n769k9m";
+      type = "gem";
+    };
+    version = "5.0.4";
+  };
+  puma = {
+    dependencies = ["nio4r"];
+    groups = ["test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0i2vaww6qcazj0ywva1plmjnj6rk23b01szswc5jhcq7s2cikd1y";
+      type = "gem";
+    };
+    version = "6.4.2";
+  };
+  racc = {
+    groups = ["common_mark" "default" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "01b9662zd2x9bp4rdjfid07h09zxj7kvn7f5fghbqhzc625ap1dp";
+      type = "gem";
+    };
+    version = "1.7.3";
+  };
+  rack = {
+    groups = ["default" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0hj0rkw2z9r1lcg2wlrcld2n3phwrcgqcp7qd1g9a7hwgalh2qzx";
+      type = "gem";
+    };
+    version = "2.2.9";
+  };
+  rack-test = {
+    dependencies = ["rack"];
+    groups = ["default" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1ysx29gk9k14a14zsp5a8czys140wacvp91fja8xcja0j1hzqq8c";
+      type = "gem";
+    };
+    version = "2.1.0";
+  };
+  rails = {
+    dependencies = ["actioncable" "actionmailbox" "actionmailer" "actionpack" "actiontext" "actionview" "activejob" "activemodel" "activerecord" "activestorage" "activesupport" "railties" "sprockets-rails"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0jqp5fggkxbjm4rhsywa7j5rvwkzp6gbaa1mg4k8zxrbfczhxwwl";
+      type = "gem";
+    };
+    version = "6.1.7.7";
+  };
+  rails-dom-testing = {
+    dependencies = ["activesupport" "minitest" "nokogiri"];
+    groups = ["test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0fx9dx1ag0s1lr6lfr34lbx5i1bvn3bhyf3w3mx6h7yz90p725g5";
+      type = "gem";
+    };
+    version = "2.2.0";
+  };
+  rails-html-sanitizer = {
+    dependencies = ["loofah" "nokogiri"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1pm4z853nyz1bhhqr7fzl44alnx4bjachcr6rh6qjj375sfz3sc6";
+      type = "gem";
+    };
+    version = "1.6.0";
+  };
+  railties = {
+    dependencies = ["actionpack" "activesupport" "method_source" "rake" "thor"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "07qxgrd92yq0cckrmzx54glvjdd1xx87xysgvaqd75hn50klp8ip";
+      type = "gem";
+    };
+    version = "6.1.7.7";
+  };
+  rainbow = {
+    groups = ["default" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0smwg4mii0fm38pyb5fddbmrdpifwv22zv3d3px2xx497am93503";
+      type = "gem";
+    };
+    version = "3.1.1";
+  };
+  rake = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1ilr853hawi09626axx0mps4rkkmxcs54mapz9jnqvpnlwd3wsmy";
+      type = "gem";
+    };
+    version = "13.1.0";
+  };
+  rb-fsevent = {
+    groups = ["default" "development"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1zmf31rnpm8553lqwibvv3kkx0v7majm1f341xbxc0bk5sbhp423";
+      type = "gem";
+    };
+    version = "0.11.2";
+  };
+  rb-inotify = {
+    dependencies = ["ffi"];
+    groups = ["default" "development"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1jm76h8f8hji38z3ggf4bzi8vps6p7sagxn3ab57qc0xyga64005";
+      type = "gem";
+    };
+    version = "0.10.1";
+  };
+  rbpdf = {
+    dependencies = ["htmlentities" "rbpdf-font"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0rb6zqx79fzi0gqdq8xbhp87yp1ldfmzh0kng6fph84qhmzs990n";
+      type = "gem";
+    };
+    version = "1.21.3";
+  };
+  rbpdf-font = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0pxlr0l4vf785qpy55m439dyii63a26l0sd0yyhbwwcy9zm9hd1v";
+      type = "gem";
+    };
+    version = "1.19.1";
+  };
+  redcarpet = {
+    groups = ["markdown"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1sg9sbf9pm91l7lac7fs4silabyn0vflxwaa2x3lrzsm0ff8ilca";
+      type = "gem";
+    };
+    version = "3.6.0";
+  };
+  regexp_parser = {
+    groups = ["default" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1ndxm0xnv27p4gv6xynk6q41irckj76q1jsqpysd9h6f86hhp841";
+      type = "gem";
+    };
+    version = "2.9.0";
+  };
+  request_store = {
+    dependencies = ["rack"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "13ppgmsbrqah08j06bybd3cddv6dml79yzyjn7r8j1src78h98h7";
+      type = "gem";
+    };
+    version = "1.5.1";
+  };
+  rexml = {
+    groups = ["default" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "05i8518ay14kjbma550mv0jm8a6di8yp5phzrd8rj44z9qnrlrp0";
+      type = "gem";
+    };
+    version = "3.2.6";
+  };
+  roadie = {
+    dependencies = ["css_parser" "nokogiri"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1mh1a0m0i0xrm20nry4d3gf0q5kbmm5lp15n52r93gcjwwfgd974";
+      type = "gem";
+    };
+    version = "5.2.1";
+  };
+  roadie-rails = {
+    dependencies = ["railties" "roadie"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "08fycjfbg9rqksk3bch8qv76g7acd1jbxy2y68lsqz1gxfky2ias";
+      type = "gem";
+    };
+    version = "3.1.0";
+  };
+  rotp = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0m48hv6wpmmm6cjr6q92q78h1i610riml19k5h1dil2yws3h1m3m";
+      type = "gem";
+    };
+    version = "6.3.0";
+  };
+  rouge = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1zd1pdldi6h8x27dqim7cy8m69xr01aw5c8k1zhkz497n4np6wgk";
+      type = "gem";
+    };
+    version = "4.2.1";
+  };
+  rqrcode = {
+    dependencies = ["chunky_png" "rqrcode_core"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1hggzz8i1l62pkkiybhiqv6ypxw7q844sddrrbbfczjcnj5sivi3";
+      type = "gem";
+    };
+    version = "2.2.0";
+  };
+  rqrcode_core = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "06ld6386hbdhy5h0k09axmgn424kavpc8f27k1vjhknjhbf8jjfg";
+      type = "gem";
+    };
+    version = "1.2.0";
+  };
+  rubocop = {
+    dependencies = ["json" "language_server-protocol" "parallel" "parser" "rainbow" "regexp_parser" "rexml" "rubocop-ast" "ruby-progressbar" "unicode-display_width"];
+    groups = ["test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "06qnp5zs233j4f59yyqrg8al6hr9n4a7vcdg3p31v0np8bz9srwg";
+      type = "gem";
+    };
+    version = "1.57.2";
+  };
+  rubocop-ast = {
+    dependencies = ["parser"];
+    groups = ["default" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1v3q8n48w8h809rqbgzihkikr4g3xk72m1na7s97jdsmjjq6y83w";
+      type = "gem";
+    };
+    version = "1.31.2";
+  };
+  rubocop-performance = {
+    dependencies = ["rubocop" "rubocop-ast"];
+    groups = ["test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1pzsrnjmrachdjxzl9jpw47cydicn3408vgdg3a4bss4v5r42rjj";
+      type = "gem";
+    };
+    version = "1.19.1";
+  };
+  rubocop-rails = {
+    dependencies = ["activesupport" "rack" "rubocop" "rubocop-ast"];
+    groups = ["test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0ym0h2w97b8c2h6zl44m22lzg253qkmim0ali32aiy58ddvbj0mm";
+      type = "gem";
+    };
+    version = "2.22.2";
+  };
+  ruby-progressbar = {
+    groups = ["default" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0cwvyb7j47m7wihpfaq7rc47zwwx9k4v7iqd9s1xch5nm53rrz40";
+      type = "gem";
+    };
+    version = "1.13.0";
+  };
+  ruby2_keywords = {
+    groups = ["default" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1vz322p8n39hz3b4a9gkmz9y7a5jaz41zrm2ywf31dvkqm03glgz";
+      type = "gem";
+    };
+    version = "0.0.5";
+  };
+  rubyzip = {
+    groups = ["default" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0grps9197qyxakbpw02pda59v45lfgbgiyw48i0mq9f2bn9y6mrz";
+      type = "gem";
+    };
+    version = "2.3.2";
+  };
+  sanitize = {
+    dependencies = ["crass" "nokogiri"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0wsw05y0h1ln3x2kvcw26fs9ivryb4xbjrb4hsk2pishkhydkz4j";
+      type = "gem";
+    };
+    version = "6.1.0";
+  };
+  selenium-webdriver = {
+    dependencies = ["base64" "rexml" "rubyzip" "websocket"];
+    groups = ["test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1asysih4l1mv24wqxrbnz0c0454kw3dhqaj6nsa8pyn9fjjdms5b";
+      type = "gem";
+    };
+    version = "4.18.1";
+  };
+  simplecov = {
+    dependencies = ["docile" "simplecov-html" "simplecov_json_formatter"];
+    groups = ["test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "198kcbrjxhhzca19yrdcd6jjj9sb51aaic3b0sc3pwjghg3j49py";
+      type = "gem";
+    };
+    version = "0.22.0";
+  };
+  simplecov-html = {
+    groups = ["default" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0yx01bxa8pbf9ip4hagqkp5m0mqfnwnw2xk8kjraiywz4lrss6jb";
+      type = "gem";
+    };
+    version = "0.12.3";
+  };
+  simplecov_json_formatter = {
+    groups = ["default" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0a5l0733hj7sk51j81ykfmlk2vd5vaijlq9d5fn165yyx3xii52j";
+      type = "gem";
+    };
+    version = "0.1.4";
+  };
+  sprockets = {
+    dependencies = ["concurrent-ruby" "rack"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "15rzfzd9dca4v0mr0bbhsbwhygl0k9l24iqqlx0fijig5zfi66wm";
+      type = "gem";
+    };
+    version = "4.2.1";
+  };
+  sprockets-rails = {
+    dependencies = ["actionpack" "activesupport" "sprockets"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1b9i14qb27zs56hlcc2hf139l0ghbqnjpmfi0054dxycaxvk5min";
+      type = "gem";
+    };
+    version = "3.4.2";
+  };
+  sqlite3 = {
+    dependencies = ["mini_portile2"];
+    groups = ["default"];
+    platforms = [{
+      engine = "maglev";
+    } {
+      engine = "mingw";
+    } {
+      engine = "mingw";
+    } {
+      engine = "ruby";
+    }];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "08irz5llz31im8pmkk5k0kw433jyyji1qa98xkdmpphncdjr38am";
+      type = "gem";
+    };
+    version = "1.6.9";
+  };
+  thor = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1vq1fjp45az9hfp6fxljhdrkv75cvbab1jfrwcw738pnsiqk8zps";
+      type = "gem";
+    };
+    version = "1.3.1";
+  };
+  timeout = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "16mvvsmx90023wrhf8dxc1lpqh0m8alk65shb7xcya6a9gflw7vg";
+      type = "gem";
+    };
+    version = "0.4.1";
+  };
+  tzinfo = {
+    dependencies = ["concurrent-ruby"];
+    groups = ["common_mark" "default" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "16w2g84dzaf3z13gxyzlzbf748kylk5bdgg3n1ipvkvvqy685bwd";
+      type = "gem";
+    };
+    version = "2.0.6";
+  };
+  unicode-display_width = {
+    groups = ["default" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1d0azx233nags5jx3fqyr23qa2rhgzbhv8pxp46dgbg1mpf82xky";
+      type = "gem";
+    };
+    version = "2.5.0";
+  };
+  webrick = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "13qm7s0gr2pmfcl7dxrmq38asaza4w0i2n9my4yzs499j731wh8r";
+      type = "gem";
+    };
+    version = "1.8.1";
+  };
+  websocket = {
+    groups = ["default" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1a4zc8d0d91c3xqwapda3j3zgpfwdbj76hkb69xn6qvfkfks9h9c";
+      type = "gem";
+    };
+    version = "1.2.10";
+  };
+  websocket-driver = {
+    dependencies = ["websocket-extensions"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1nyh873w4lvahcl8kzbjfca26656d5c6z3md4sbqg5y1gfz0157n";
+      type = "gem";
+    };
+    version = "0.7.6";
+  };
+  websocket-extensions = {
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0hc2g9qps8lmhibl5baa91b4qx8wqw872rgwagml78ydj8qacsqw";
+      type = "gem";
+    };
+    version = "0.1.5";
+  };
+  with_advisory_lock = {
+    dependencies = ["activerecord" "zeitwerk"];
+    groups = ["default"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1mzy29advrdczf88j2ffvck4kf8sfhxn07sym9ciq9rv061cv4h6";
+      type = "gem";
+    };
+    version = "5.1.0";
+  };
+  xpath = {
+    dependencies = ["nokogiri"];
+    groups = ["default" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0bh8lk9hvlpn7vmi6h4hkcwjzvs2y0cmkk3yjjdr8fxvj6fsgzbd";
+      type = "gem";
+    };
+    version = "3.2.0";
+  };
+  yard = {
+    groups = ["development"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1r0b8w58p7gy06wph1qdjv2p087hfnmhd9jk23vjdj803dn761am";
+      type = "gem";
+    };
+    version = "0.9.36";
+  };
+  zeitwerk = {
+    groups = ["common_mark" "default" "test"];
+    platforms = [];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1m67qmsak3x8ixs8rb971azl3l7wapri65pmbf5z886h46q63f1d";
+      type = "gem";
+    };
+    version = "2.6.13";
+  };
+}
diff --git a/nixpkgs/pkgs/by-name/re/redmine/package.nix b/nixpkgs/pkgs/by-name/re/redmine/package.nix
new file mode 100644
index 000000000000..9329c0a111e6
--- /dev/null
+++ b/nixpkgs/pkgs/by-name/re/redmine/package.nix
@@ -0,0 +1,53 @@
+{ lib, stdenv, fetchurl, bundlerEnv, ruby, makeWrapper, nixosTests }:
+
+let
+  version = "5.1.2";
+  rubyEnv = bundlerEnv {
+    name = "redmine-env-${version}";
+
+    inherit ruby;
+    gemdir = ./.;
+    groups = [ "development" "ldap" "markdown" "common_mark" "minimagick" "test" ];
+  };
+in
+  stdenv.mkDerivation rec {
+    pname = "redmine";
+    inherit version;
+
+    src = fetchurl {
+      url = "https://www.redmine.org/releases/${pname}-${version}.tar.gz";
+      hash = "sha256-JsDKCpqu4c65g4Jb8SZsmbCFC/ATwXhxP1o7AIABISM=";
+    };
+
+    nativeBuildInputs = [ makeWrapper ];
+    buildInputs = [ rubyEnv rubyEnv.wrappedRuby rubyEnv.bundler ];
+
+    # taken from https://www.redmine.org/issues/33784
+    # can be dropped when the upstream bug is closed and the fix is present in the upstream release
+    patches = [ ./0001-python3.patch ];
+
+    buildPhase = ''
+      mv config config.dist
+      mv public/themes public/themes.dist
+    '';
+
+    installPhase = ''
+      mkdir -p $out/bin $out/share
+      cp -r . $out/share/redmine
+      for i in config files log plugins public/plugin_assets public/themes tmp; do
+        rm -rf $out/share/redmine/$i
+        ln -fs /run/redmine/$i $out/share/redmine/$i
+      done
+
+      makeWrapper ${rubyEnv.wrappedRuby}/bin/ruby $out/bin/rdm-mailhandler.rb --add-flags $out/share/redmine/extra/mail_handler/rdm-mailhandler.rb
+    '';
+
+    passthru.tests.redmine = nixosTests.redmine;
+
+    meta = with lib; {
+      homepage = "https://www.redmine.org/";
+      platforms = platforms.linux;
+      maintainers = with maintainers; [ aanderse felixsinger megheaiulian ];
+      license = licenses.gpl2;
+    };
+  }
diff --git a/nixpkgs/pkgs/by-name/re/redmine/update.sh b/nixpkgs/pkgs/by-name/re/redmine/update.sh
new file mode 100755
index 000000000000..3c4d842735cf
--- /dev/null
+++ b/nixpkgs/pkgs/by-name/re/redmine/update.sh
@@ -0,0 +1,19 @@
+#!/usr/bin/env nix-shell
+#!nix-shell --pure -i bash -p cacert bundix bundler
+
+# Do these steps before running this script:
+#   1. Copy Gemfile from new Redmine version to this folder
+#   2. Manually modify the database lines in Gemfile (diff the two files, it's obvious)
+
+pkg_dir="$(dirname "$0")"
+cd ${pkg_dir}
+
+for file in "gemset.nix" "Gemfile.lock"; do
+  if [ -f ${file} ]; then
+    rm ${file}
+  fi
+done
+
+bundle lock --add-platform ruby
+bundle lock --remove-platform x86_64-linux
+bundix -l
diff --git a/nixpkgs/pkgs/by-name/re/redocly-cli/package.nix b/nixpkgs/pkgs/by-name/re/redocly/package.nix
index fd3606c1e4c8..eb1b0715d406 100644
--- a/nixpkgs/pkgs/by-name/re/redocly-cli/package.nix
+++ b/nixpkgs/pkgs/by-name/re/redocly/package.nix
@@ -2,20 +2,22 @@
 , buildNpmPackage
 , fetchFromGitHub
 , makeWrapper
+, redocly
+, testers
 }:
 
 buildNpmPackage rec {
-  pname = "redocly-cli";
-  version = "1.6.0";
+  pname = "redocly";
+  version = "1.12.0";
 
   src = fetchFromGitHub {
     owner = "Redocly";
     repo = "redocly-cli";
     rev = "@redocly/cli@${version}";
-    hash = "sha256-xoehTTpXT/9tlL0VoDQwKbyUnNGeMyH+VBIVLiz69ko=";
+    hash = "sha256-KfNwBRGDFNMsba+yjwUHiiO2BJbIl4pW1b3cvLBe+lk=";
   };
 
-  npmDepsHash = "sha256-9fI9P96iNmHrhjbgjePpRnknFe3yIjkirOoIMkVGkH4=";
+  npmDepsHash = "sha256-I3cxMw9zOZb9sfP8UUoHc1UJ0RpDqVn9D29arSdNob4=";
 
   npmBuildScript = "prepare";
 
@@ -32,24 +34,25 @@ buildNpmPackage rec {
 
     mkdir $out/bin
     makeWrapper $out/lib/node_modules/@redocly/cli/node_modules/@redocly/cli/bin/cli.js \
-      $out/bin/redocly-cli \
+      $out/bin/redocly \
       --set-default REDOCLY_TELEMETRY off \
       --set-default CI true # Silence update messages
-  '';
 
-  installCheckPhase = ''
-    runHook preInstallCheck
-    $out/bin/redocly-cli --version
-    runHook postInstallCheck
+    # Symlink for backwards compatibility. Remove after 24.05.
+    ln -s $out/bin/redocly $out/bin/redocly-cli
   '';
 
-  doInstallCheck = true;
+  passthru = {
+    tests.version = testers.testVersion {
+      package = redocly;
+    };
+  };
 
   meta = {
-    description = "Redocly CLI makes OpenAPI easy. Lint/validate to any standard, generate beautiful docs, and more.";
+    description = "Makes OpenAPI easy. Lint/validate to any standard, generate beautiful docs, and more";
     homepage = "https://github.com/Redocly/redocly-cli";
     license = lib.licenses.mit;
-    mainProgram = "redocly-cli";
+    mainProgram = "redocly";
     maintainers = with lib.maintainers; [ szlend ];
   };
 }
diff --git a/nixpkgs/pkgs/by-name/re/regal/package.nix b/nixpkgs/pkgs/by-name/re/regal/package.nix
new file mode 100644
index 000000000000..70f6058c674a
--- /dev/null
+++ b/nixpkgs/pkgs/by-name/re/regal/package.nix
@@ -0,0 +1,23 @@
+{ lib, buildGoModule, fetchFromGitHub }:
+
+buildGoModule rec {
+  name = "regal";
+  version = "0.21.2";
+
+  src = fetchFromGitHub {
+    owner = "StyraInc";
+    repo = "regal";
+    rev = "v${version}";
+    hash = "sha256-YGUXJ5rfzyLwqhOLBuIRdN1G0fTcrPmuIsYKS/CzzW4=";
+  };
+
+  vendorHash = "sha256-5rj2dCWya24VUmIFf0oJQop80trq9NnqqFlBW/A6opk=";
+
+  meta = with lib; {
+    description = "a linter and language server for Rego";
+    mainProgram = "regal";
+    homepage = "https://github.com/StyraInc/regal";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ rinx ];
+  };
+}
diff --git a/nixpkgs/pkgs/by-name/re/renode-dts2repl/package.nix b/nixpkgs/pkgs/by-name/re/renode-dts2repl/package.nix
index 1ec43b01d89a..2472831eac22 100644
--- a/nixpkgs/pkgs/by-name/re/renode-dts2repl/package.nix
+++ b/nixpkgs/pkgs/by-name/re/renode-dts2repl/package.nix
@@ -6,14 +6,14 @@
 
 python3.pkgs.buildPythonApplication {
   pname = "renode-dts2repl";
-  version = "unstable-2024-03-22";
+  version = "unstable-2024-04-16";
   pyproject = true;
 
   src = fetchFromGitHub {
     owner = "antmicro";
     repo = "dts2repl";
-    rev = "b5c2d03cce95c2488d80ce5214131fba8d119fec";
-    hash = "sha256-q8Q5Lx2CQIjdL/LBRaYXvQl1MFw3Bh0RbnGHJgMnXyA=";
+    rev = "83e2d743202684eb1f89a1b93e859c69cd736455";
+    hash = "sha256-iD+59mrFNVRu6g58XXLR2Pg8oDpNIiI/+TyCdbRbjtM=";
   };
 
   nativeBuildInputs = [
diff --git a/nixpkgs/pkgs/by-name/re/renode-unstable/package.nix b/nixpkgs/pkgs/by-name/re/renode-unstable/package.nix
index 309188adfe49..dd971a8df0fe 100644
--- a/nixpkgs/pkgs/by-name/re/renode-unstable/package.nix
+++ b/nixpkgs/pkgs/by-name/re/renode-unstable/package.nix
@@ -5,11 +5,11 @@
 
 renode.overrideAttrs (finalAttrs: _: {
   pname = "renode-unstable";
-  version = "1.15.0+20240323git3bd8e280d";
+  version = "1.15.0+20240426git72f3c383b";
 
   src = fetchurl {
     url = "https://builds.renode.io/renode-${finalAttrs.version}.linux-portable.tar.gz";
-    hash = "sha256-hIPBM9PE6vtqo8XJvOWS3mIa9Vr7v9bcMdXmeQzBYsk=";
+    hash = "sha256-BOQT5nG6Vu12RyAkCwnh6PYfNQTcYGdV4XHDpi/8kPE=";
   };
 
   passthru.updateScript =
diff --git a/nixpkgs/pkgs/by-name/re/renode/package.nix b/nixpkgs/pkgs/by-name/re/renode/package.nix
index ab0df9f5c3e1..0a514587f838 100644
--- a/nixpkgs/pkgs/by-name/re/renode/package.nix
+++ b/nixpkgs/pkgs/by-name/re/renode/package.nix
@@ -1,5 +1,6 @@
 { stdenv
 , lib
+, fetchFromGitHub
 , fetchurl
 , autoPatchelfHook
 , makeWrapper
@@ -17,7 +18,15 @@ let
     psutil
     pyyaml
     requests
-    robotframework
+
+    (robotframework.overrideDerivation (oldAttrs: {
+      src = fetchFromGitHub {
+        owner = "robotframework";
+        repo = "robotframework";
+        rev = "v6.0.2";
+        hash = "sha256-c7pPcDgqyqWQtiMbLQbQd0nAgx4TIFUFHrlBVDNdr8M=";
+      };
+    }))
   ];
 in
 stdenv.mkDerivation (finalAttrs: {
diff --git a/nixpkgs/pkgs/by-name/re/rerun/package.nix b/nixpkgs/pkgs/by-name/re/rerun/package.nix
index 9c96b86f64c9..844f97700c22 100644
--- a/nixpkgs/pkgs/by-name/re/rerun/package.nix
+++ b/nixpkgs/pkgs/by-name/re/rerun/package.nix
@@ -1,6 +1,7 @@
 {
   lib,
   rustPlatform,
+  fetchpatch,
   fetchFromGitHub,
   pkg-config,
   stdenv,
@@ -32,6 +33,14 @@ rustPlatform.buildRustPackage rec {
   patches = [
     # Disables a doctest that depends on a nightly feature
     ./0001-re_space_view_time_series-utils-patch-out-doctests-w.patch
+
+
+    # "Fix cell size test now that the overhead has shrunk"
+    # https://github.com/rerun-io/rerun/pull/5917
+    (fetchpatch {
+      url = "https://github.com/rerun-io/rerun/commit/933fc5cc1f3ee262a78bd4647257295747671152.patch";
+      hash = "sha256-jCeGfzKt0oYqIea+7bA2V/U9VIjhVvfQzLRrYG4jaHY=";
+    })
   ];
 
   cargoHash = "sha256-qvnkOlcjADV4b+JfFAy9yNaZGaf0ZO7hh9HBg5XmPi0=";
@@ -96,7 +105,7 @@ rustPlatform.buildRustPackage rec {
     )
   '';
 
-  postPhases = lib.optionals stdenv.hostPlatform.isLinux  [ "addDlopenRunpathsPhase" ];
+  postPhases = lib.optionals stdenv.hostPlatform.isLinux [ "addDlopenRunpathsPhase" ];
 
   cargoTestFlags = [
     "-p"
diff --git a/nixpkgs/pkgs/by-name/re/restinio/package.nix b/nixpkgs/pkgs/by-name/re/restinio/package.nix
index ad892070b2f0..be6478c1a378 100644
--- a/nixpkgs/pkgs/by-name/re/restinio/package.nix
+++ b/nixpkgs/pkgs/by-name/re/restinio/package.nix
@@ -2,7 +2,6 @@
   lib,
   stdenv,
   fetchFromGitHub,
-  fetchpatch,
   cmake,
   asio,
   boost,
@@ -22,39 +21,15 @@ assert !with_boost_asio -> asio != null;
 
 stdenv.mkDerivation (finalAttrs: {
   pname = "restinio";
-  version = "0.7.1";
+  version = "0.7.2";
 
   src = fetchFromGitHub {
     owner = "Stiffstream";
     repo = "restinio";
     rev = "v.${finalAttrs.version}";
-    hash = "sha256-XodG+dVW4iBgFx0Aq0+/pZyCLyqTBtW7e9r69y176Ro=";
+    hash = "sha256-Nv/VVdHciCv+DsVu3MqfXeAa8Ef+qi6c1OaTAVrYUg0=";
   };
 
-  patches = let
-    useCommit = {id, name, hash}:
-    fetchpatch {
-      inherit name hash;
-      url = "https://github.com/Stiffstream/restinio/commit/${id}.patch";
-    };
-  in [
-    (useCommit {
-      id = "57e6ae3f73a03a5120feb80a7bb5dca27179fa38";
-      name = "restinio-unvendor-catch2_part1.patch";
-      hash = "sha256-2Htt9WTP6nrh+1y7y2xleFj568IpnSEn9Qhb1ObLam8=";
-    })
-    (useCommit {
-      id = "0060e493b99f03c38dda519763f6d6701bc18112";
-      name = "restinio-unvendor-catch2_part2.patch";
-      hash = "sha256-Eg/VNxPwNtEYmalP5myn+QvqwU6wln9v0vxbRelRHA8=";
-    })
-    (useCommit {
-      id = "05bea25f82917602a49b72b8ea10eeb43984762f";
-      name = "restinio-unvendor-catch2_part3.patch";
-      hash = "sha256-fA+U/Y7FyrxDRiWSVXCy9dMF4gmfDLag7gBWoY74In0=";
-    })
-  ];
-
   strictDeps = true;
 
   nativeBuildInputs = [ cmake ];
diff --git a/nixpkgs/pkgs/by-name/re/restls/package.nix b/nixpkgs/pkgs/by-name/re/restls/package.nix
new file mode 100644
index 000000000000..c01e39219012
--- /dev/null
+++ b/nixpkgs/pkgs/by-name/re/restls/package.nix
@@ -0,0 +1,26 @@
+{ fetchFromGitHub
+, rustPlatform
+, lib
+}:
+
+rustPlatform.buildRustPackage rec{
+  pname = "restls";
+  version = "0.1.1";
+
+  src = fetchFromGitHub {
+    owner = "3andne";
+    repo = "restls";
+    rev = "v${version}";
+    hash = "sha256-nlQdBwxHVbpOmb9Wq+ap2i4KI1zJYT3SEqvedDbVH8Q=";
+  };
+
+  cargoHash = "sha256-KtNLLtStZ7SNndcPxWfNPA2duoXFVePrbNQFPUz2xFg=";
+
+  meta = with lib; {
+    homepage = "https://github.com/3andne/restls";
+    description = "A Perfect Impersonation of TLS";
+    license = licenses.bsd3;
+    mainProgram = "restls";
+    maintainers = with maintainers; [ oluceps ];
+  };
+}
diff --git a/nixpkgs/pkgs/by-name/re/retool/package.nix b/nixpkgs/pkgs/by-name/re/retool/package.nix
index 18a982176d9c..9d93358c3d14 100644
--- a/nixpkgs/pkgs/by-name/re/retool/package.nix
+++ b/nixpkgs/pkgs/by-name/re/retool/package.nix
@@ -5,9 +5,9 @@
 , qt6
 }:
 
-python3.pkgs.buildPythonApplication {
+python3.pkgs.buildPythonApplication rec {
   pname = "retool";
-  version = "2.02.2-unstable-2024-03-17";
+  version = "2.3.7";
 
   pyproject = true;
   disabled = python3.pkgs.pythonOlder "3.10";
@@ -15,12 +15,13 @@ python3.pkgs.buildPythonApplication {
   src = fetchFromGitHub {
     owner = "unexpectedpanda";
     repo = "retool";
-    rev = "30d547c7d04b8cbf7710b2037388bf18a00a0c22";
-    hash = "sha256-5Tmi3eVJh9STP9A0dDNPDs4SlIWHw8sk+g1GgpnmqeE=";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-WEx/S6+8lJXu+4yKazzJ55HTGKr38GMRL242FV7KdLQ=";
   };
 
   nativeBuildInputs = with python3.pkgs; [
     hatchling
+    pythonRelaxDepsHook
     qt6.wrapQtAppsHook
   ];