From: classabbyamp <classabbyamp@users.noreply.github.com>
To: ml@inbox.vuxu.org
Subject: Re: [PR PATCH] [Updated] New package: turnstile-0.1.4
Date: Tue, 04 Jul 2023 10:36:49 +0200 [thread overview]
Message-ID: <20230704083649.Q69JMfInlh3jomtKYcwv872uPFRpn3buGd6bQelITwM@z> (raw)
In-Reply-To: <gh-mailinglist-notifications-41a7ca26-5023-4802-975b-f1789d68868e-void-packages-44676@inbox.vuxu.org>
[-- Attachment #1: Type: text/plain, Size: 740 bytes --]
There is an updated pull request by classabbyamp against master on the void-packages repository
https://github.com/classabbyamp/void-packages new/turnstile
https://github.com/void-linux/void-packages/pull/44676
New package: turnstile-0.1.4
WIP while i create the runit backend upstream ([mostly done](https://github.com/chimera-linux/turnstile/compare/master...classabbyamp:runit-backend))
#### Testing the changes
- I tested the changes in this PR: **NO**
#### New package
- This new package conforms to the [package requirements](https://github.com/void-linux/void-packages/blob/master/CONTRIBUTING.md#package-requirements): **YES**
A patch file from https://github.com/void-linux/void-packages/pull/44676.patch is attached
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: github-pr-new/turnstile-44676.patch --]
[-- Type: text/x-diff, Size: 20603 bytes --]
From 904de399f3ac5fcaa9ea7f5256b22a102b028a52 Mon Sep 17 00:00:00 2001
From: classabbyamp <void@placeviolette.net>
Date: Sun, 2 Jul 2023 22:04:40 -0400
Subject: [PATCH 1/2] pam-base: add turnstile pam
---
srcpkgs/pam-base/files/system-login | 1 +
srcpkgs/pam-base/template | 2 +-
2 files changed, 2 insertions(+), 1 deletion(-)
diff --git a/srcpkgs/pam-base/files/system-login b/srcpkgs/pam-base/files/system-login
index 2275deba480d..72c4638f07d3 100644
--- a/srcpkgs/pam-base/files/system-login
+++ b/srcpkgs/pam-base/files/system-login
@@ -14,6 +14,7 @@ session optional pam_loginuid.so
session include system-auth
session optional pam_motd.so motd=/etc/motd
session optional pam_mail.so dir=/var/mail standard quiet
+-session optional pam_turnstile.so
-session optional pam_elogind.so
-session optional pam_dumb_runtime_dir.so
session required pam_env.so
diff --git a/srcpkgs/pam-base/template b/srcpkgs/pam-base/template
index 70dfab9fa996..38bfa74cd885 100644
--- a/srcpkgs/pam-base/template
+++ b/srcpkgs/pam-base/template
@@ -1,7 +1,7 @@
# Template file for 'pam-base'
pkgname=pam-base
version=0.4
-revision=2
+revision=3
short_desc="PAM base configuration files"
maintainer="Érico Nogueira <ericonr@disroot.org>"
license="Public Domain"
From 4ad4f22baef9b1e8016f708d259465a9afc069b1 Mon Sep 17 00:00:00 2001
From: classabbyamp <void@placeviolette.net>
Date: Wed, 28 Jun 2023 05:10:55 -0400
Subject: [PATCH 2/2] New package: turnstile-0.1.5
---
srcpkgs/turnstile/files/README.voidlinux | 32 +++
srcpkgs/turnstile/files/dbus.run | 5 +
srcpkgs/turnstile/files/turnstiled/run | 4 +
srcpkgs/turnstile/patches/pipe.patch | 256 +++++++++++++++++++++++
srcpkgs/turnstile/patches/runit.patch | 184 ++++++++++++++++
srcpkgs/turnstile/template | 24 +++
6 files changed, 505 insertions(+)
create mode 100644 srcpkgs/turnstile/files/README.voidlinux
create mode 100755 srcpkgs/turnstile/files/dbus.run
create mode 100644 srcpkgs/turnstile/files/turnstiled/run
create mode 100644 srcpkgs/turnstile/patches/pipe.patch
create mode 100644 srcpkgs/turnstile/patches/runit.patch
create mode 100644 srcpkgs/turnstile/template
diff --git a/srcpkgs/turnstile/files/README.voidlinux b/srcpkgs/turnstile/files/README.voidlinux
new file mode 100644
index 000000000000..46214113067e
--- /dev/null
+++ b/srcpkgs/turnstile/files/README.voidlinux
@@ -0,0 +1,32 @@
+# User Services
+
+User services can be placed in ~/.config/service/.
+
+To ensure that a subset of services are started before login can proceed,
+these services can be listed in ~/.config/service/turnstile-ready/conf, for
+example:
+
+ core_services="dbus foo"
+
+The turnstile-ready service is created by turnstile on first login.
+
+# D-Bus Session Bus
+
+If you want to manage dbus using a turnstile-managed runit user service:
+
+ mkdir ~/.config/service/dbus
+ cp /usr/share/examples/turnstile/dbus.run ~/.config/service/dbus/run
+
+# Elogind Replacement
+
+Turnstile is not (nor ever will be, according to the developer) a complete
+replacement for elogind, but it can replace several parts, including
+XDG_RUNTIME_DIR management.
+
+If using turnstile with elogind:
+- disable rundir management in /etc/turnstile/turnstiled.conf
+ (manage_rundir = no)
+
+If using turnstile without elogind:
+- install and enable seatd for seat management
+- install and enable acpid for lid switch/button handling
diff --git a/srcpkgs/turnstile/files/dbus.run b/srcpkgs/turnstile/files/dbus.run
new file mode 100755
index 000000000000..08d45d41be45
--- /dev/null
+++ b/srcpkgs/turnstile/files/dbus.run
@@ -0,0 +1,5 @@
+#!/bin/sh
+
+[ -r ./conf ] && . ./conf
+
+exec dbus-daemon --session --nofork --nopidfile --address="$DBUS_SESSION_BUS_ADDRESS" $OPTS
diff --git a/srcpkgs/turnstile/files/turnstiled/run b/srcpkgs/turnstile/files/turnstiled/run
new file mode 100644
index 000000000000..aa5d624fda19
--- /dev/null
+++ b/srcpkgs/turnstile/files/turnstiled/run
@@ -0,0 +1,4 @@
+#!/bin/sh
+
+exec 2>&1
+exec turnstiled
diff --git a/srcpkgs/turnstile/patches/pipe.patch b/srcpkgs/turnstile/patches/pipe.patch
new file mode 100644
index 000000000000..7ef856ad24bb
--- /dev/null
+++ b/srcpkgs/turnstile/patches/pipe.patch
@@ -0,0 +1,256 @@
+From 795cb7359d542aa470e119e79ea7f74339d294ab Mon Sep 17 00:00:00 2001
+From: q66 <q66@chimera-linux.org>
+Date: Tue, 4 Jul 2023 01:15:26 +0200
+Subject: [PATCH] use named pipes for signaling readiness instead of fds
+
+This is more versatile as it allows any process to open the
+readiness pipe, which is important for service managers that
+cannot directly report their readiness with a file descriptor
+(as those would then have the pipe fd opened forever which would
+result in readiness not being reported).
+---
+ backend/dinit | 10 ++++-----
+ src/exec_utils.cc | 26 +++++++----------------
+ src/turnstiled.cc | 53 ++++++++++++++++++++++++++++++-----------------
+ src/turnstiled.hh | 2 +-
+ 4 files changed, 47 insertions(+), 44 deletions(-)
+
+diff --git a/backend/dinit b/backend/dinit
+index 792c2dc..8eeeeaf 100644
+--- a/backend/dinit
++++ b/backend/dinit
+@@ -15,8 +15,8 @@
+ #
+ # Arguments for "run":
+ #
+-# ready_fd: file descriptor that should be poked with a string; this will
+-# be passed to the "ready" script of the sequence as its sole
++# ready_p: path to named pipe (fifo) that should be poked with a string; this
++# will be passed to the "ready" script of the sequence as its sole
+ # argument (here this is a control socket path)
+ # srvdir: an internal directory that can be used by the service manager
+ # for any purpose (usually to keep track of its state)
+@@ -47,11 +47,11 @@ case "$1" in
+ ;;
+ esac
+
+-DINIT_READY_FD="$2"
++DINIT_READY_PIPE="$2"
+ DINIT_DIR="$3"
+ DINIT_CONF="$4/dinit.conf"
+
+-if [ -z "$DINIT_READY_FD" -o -z "$DINIT_DIR" -o ! -d "$DINIT_DIR" ]; then
++if [ ! -p "$DINIT_READY_PIPE" -o ! -d "$DINIT_DIR" ]; then
+ echo "dinit: invalid input argument(s)" >&2
+ exit 69
+ fi
+@@ -106,4 +106,4 @@ type = internal
+ waits-for.d = ${system_boot_dir}
+ EOF
+
+-exec dinit --user --ready-fd "$DINIT_READY_FD" --services-dir "$DINIT_DIR" "$@"
++exec dinit --user --ready-fd 3 --services-dir "$DINIT_DIR" "$@" 3>"$DINIT_READY_PIPE"
+diff --git a/src/exec_utils.cc b/src/exec_utils.cc
+index 06da738..c923d65 100644
+--- a/src/exec_utils.cc
++++ b/src/exec_utils.cc
+@@ -150,7 +150,7 @@ static void sig_handler(int sign) {
+ write(sigpipe[1], &sign, sizeof(sign));
+ }
+
+-static void fork_and_wait(pam_handle_t *pamh, int dpipe) {
++static void fork_and_wait(pam_handle_t *pamh) {
+ int pst, status;
+ struct pollfd pfd;
+ struct sigaction sa{};
+@@ -186,8 +186,6 @@ static void fork_and_wait(pam_handle_t *pamh, int dpipe) {
+ sigemptyset(&sa.sa_mask);
+ sigaction(SIGCHLD, &sa, nullptr);
+ sigaction(SIGTERM, &sa, nullptr);
+- /* make sure we don't block this pipe */
+- close(dpipe);
+ /* our own little event loop */
+ for (;;) {
+ auto pret = poll(&pfd, 1, -1);
+@@ -240,13 +238,7 @@ fail:
+ }
+
+ /* dummy "service manager" child process with none backend */
+-static void srv_dummy(int pipew) {
+- /* we're always ready, the dummy process just sleeps forever */
+- if (write(pipew, "poke", 5) != 5) {
+- perror("dummy: failed to poke the pipe");
+- return;
+- }
+- close(pipew);
++static void srv_dummy() {
+ /* block all signals except the ones we need to terminate */
+ sigset_t mask;
+ sigfillset(&mask);
+@@ -259,7 +251,7 @@ static void srv_dummy(int pipew) {
+ exit(0);
+ }
+
+-void srv_child(session &sess, char const *backend, int dpipe, bool dummy) {
++void srv_child(session &sess, char const *backend, bool dummy) {
+ pam_handle_t *pamh = nullptr;
+ bool is_root = (getuid() == 0);
+ /* create a new session */
+@@ -276,10 +268,10 @@ void srv_child(session &sess, char const *backend, int dpipe, bool dummy) {
+ /* handle the parent/child logic here
+ * if we're forking, only child makes it past this func
+ */
+- fork_and_wait(pamh, dpipe);
++ fork_and_wait(pamh);
+ /* dummy service manager if requested */
+ if (dummy) {
+- srv_dummy(dpipe);
++ srv_dummy();
+ return;
+ }
+ /* drop privs */
+@@ -329,12 +321,8 @@ void srv_child(session &sess, char const *backend, int dpipe, bool dummy) {
+ add_str(LIBEXEC_PATH, "/", backend);
+ /* arg1: action */
+ add_str("run");
+- /* arg1: ready_fd */
+- {
+- char pipestr[32];
+- std::snprintf(pipestr, sizeof(pipestr), "%d", dpipe);
+- add_str(pipestr);
+- }
++ /* arg1: ready pipe */
++ add_str(RUN_PATH, "/", SOCK_DIR, "/", sess.uids, "/ready");
+ /* arg2: srvdir */
+ add_str(RUN_PATH, "/", SOCK_DIR, "/", sess.uids, "/", tdirn);
+ /* arg3: confdir */
+diff --git a/src/turnstiled.cc b/src/turnstiled.cc
+index d2ad545..3feb5ad 100644
+--- a/src/turnstiled.cc
++++ b/src/turnstiled.cc
+@@ -116,7 +116,6 @@ static int sigpipe[2] = {-1, -1};
+
+ /* start the service manager instance for a session */
+ static bool srv_start(session &sess) {
+- int dpipe[2];
+ /* mark as waiting */
+ sess.srv_wait = true;
+ /* make rundir if needed, we don't want to create that and session dir
+@@ -152,11 +151,25 @@ static bool srv_start(session &sess) {
+ sess.remove_sdir();
+ return false;
+ }
+- }
+- /* here we'll receive the initial readiness string from the backend */
+- if (pipe2(dpipe, O_NONBLOCK) < 0) {
+- print_err("srv: pipe2 failed (%s)", strerror(errno));
+- return false;
++ print_dbg("srv: create readiness pipe");
++ unlinkat(sess.dirfd, "ready", 0);
++ if (mkfifoat(sess.dirfd, "ready", 0700) < 0) {
++ print_err("srv: failed to make ready pipe (%s)", strerror(errno));
++ return false;
++ }
++ /* ensure it's owned by user too, and open in nonblocking mode */
++ if (fchownat(
++ sess.dirfd, "ready", sess.uid, sess.gid, AT_SYMLINK_NOFOLLOW
++ ) || ((sess.userpipe = openat(
++ sess.dirfd, "ready", O_NONBLOCK | O_RDONLY
++ )) < 0)) {
++ print_err(
++ "srv: failed to set up ready pipe (%s)", strerror(errno)
++ );
++ unlinkat(sess.dirfd, "ready", 0);
++ sess.remove_sdir();
++ return false;
++ }
+ }
+ /* set up the timer, issue SIGLARM when it fires */
+ print_dbg("srv: timer set");
+@@ -181,22 +194,25 @@ static bool srv_start(session &sess) {
+ sigaction(SIGTERM, &sa, nullptr);
+ sigaction(SIGINT, &sa, nullptr);
+ /* close some descriptors, these can be reused */
++ close(sess.userpipe);
+ close(userv_dirfd);
+- close(dpipe[0]);
+ close(sigpipe[0]);
+ close(sigpipe[1]);
+ /* and run the session */
+- srv_child(sess, cdata->backend.data(), dpipe[1], cdata->disable);
++ srv_child(sess, cdata->backend.data(), cdata->disable);
+ exit(1);
+ } else if (pid < 0) {
+ print_err("srv: fork failed (%s)", strerror(errno));
+ return false;
+ }
+ /* close the write end on our side */
+- close(dpipe[1]);
+ sess.srv_pending = false;
+ sess.srv_pid = pid;
+- sess.userpipe = dpipe[0];
++ if (sess.userpipe < 0) {
++ /* disabled */
++ return srv_boot(sess, nullptr);
++ }
++ /* otherwise queue the pipe */
+ sess.pipe_queued = true;
+ return true;
+ }
+@@ -728,6 +744,7 @@ static bool fd_handle_pipe(std::size_t i) {
+ /* this should never happen */
+ return false;
+ }
++ bool done = false;
+ if (fds[i].revents & POLLIN) {
+ /* read the string from the pipe */
+ for (;;) {
+@@ -735,10 +752,15 @@ static bool fd_handle_pipe(std::size_t i) {
+ if (read(fds[i].fd, &c, 1) != 1) {
+ break;
+ }
++ if (c == '\0') {
++ /* done receiving */
++ done = true;
++ break;
++ }
+ sess->srvstr.push_back(c);
+ }
+ }
+- if (fds[i].revents & POLLHUP) {
++ if (done || (fds[i].revents & POLLHUP)) {
+ /* kill the pipe, we don't need it anymore */
+ close(sess->userpipe);
+ sess->userpipe = -1;
+@@ -747,15 +769,8 @@ static bool fd_handle_pipe(std::size_t i) {
+ fds[i].fd = -1;
+ fds[i].revents = 0;
+ --npipes;
+- /* but error early if needed */
+- if (sess->srvstr.empty()) {
+- print_err("read failed (%s)", strerror(errno));
+- return true;
+- }
+ /* wait for the boot service to come up */
+- if (!srv_boot(
+- *sess, cdata->disable ? nullptr : cdata->backend.data()
+- )) {
++ if (!srv_boot(*sess, cdata->backend.data())) {
+ /* this is an unrecoverable condition */
+ return false;
+ }
+diff --git a/src/turnstiled.hh b/src/turnstiled.hh
+index f2739c4..58e4edb 100644
+--- a/src/turnstiled.hh
++++ b/src/turnstiled.hh
+@@ -86,7 +86,7 @@ bool cfg_expand_rundir(
+ );
+
+ /* service manager utilities */
+-void srv_child(session &sess, char const *backend, int p, bool d);
++void srv_child(session &sess, char const *backend, bool d);
+ bool srv_boot(session &sess, char const *backend);
+
+ struct cfg_data {
+--
+2.41.0
diff --git a/srcpkgs/turnstile/patches/runit.patch b/srcpkgs/turnstile/patches/runit.patch
new file mode 100644
index 000000000000..8c120f382206
--- /dev/null
+++ b/srcpkgs/turnstile/patches/runit.patch
@@ -0,0 +1,184 @@
+From 22933f404cee49974f51c0873c897d0b565c5620 Mon Sep 17 00:00:00 2001
+From: classabbyamp <dev@placeviolette.net>
+Date: Wed, 28 Jun 2023 05:05:25 -0400
+Subject: [PATCH] add runit backend
+
+---
+ backend/meson.build | 16 +++++++++
+ backend/runit | 80 +++++++++++++++++++++++++++++++++++++++++++++
+ backend/runit.conf | 13 ++++++++
+ meson.build | 3 ++
+ meson_options.txt | 5 +++
+ 5 files changed, 117 insertions(+)
+ create mode 100644 backend/runit
+ create mode 100644 backend/runit.conf
+
+diff --git a/backend/meson.build b/backend/meson.build
+index 681e6a0..e4c63f1 100644
+--- a/backend/meson.build
++++ b/backend/meson.build
+@@ -13,3 +13,19 @@ if have_dinit
+ install_mode: 'rw-r--r--'
+ )
+ endif
++
++# runit backend
++
++if have_runit
++ install_data(
++ 'runit',
++ install_dir: join_paths(get_option('libexecdir'), 'turnstile'),
++ install_mode: 'rwxr-xr-x'
++ )
++
++ install_data(
++ 'runit.conf',
++ install_dir: join_paths(get_option('sysconfdir'), 'turnstile/backend'),
++ install_mode: 'rw-r--r--'
++ )
++endif
+diff --git a/backend/runit b/backend/runit
+new file mode 100644
+index 0000000..e8370d6
+--- /dev/null
++++ b/backend/runit
+@@ -0,0 +1,80 @@
++#!/bin/sh
++#
++# This is the turnstile runit backend. It accepts the action as its first
++# argument, which is either "ready" or "run". In case of "run", it's invoked
++# directly through /bin/sh as if it was a login shell, and therefore it has
++# acccess to shell profile, and the shebang is functionally useless but
++# should be preserved as a convention. For "ready", it's a regular shell.
++#
++# Arguments for "ready":
++#
++# ready_sv: path to the readiness service
++#
++# Arguments for "run":
++#
++# ready_p: readiness pipe (fifo). has the path to the ready service written to it.
++# srvdir: unused
++# confdir: the path where turnstile's configuration data resides, used
++# to source the configuration file
++#
++# Copyright 2023 classabbyamp <dev@placeviolette.net>
++# License: BSD-2-Clause
++
++case "$1" in
++ run) ;;
++ ready)
++ set -x
++ echo "runit: ready_sv: $2" >&2
++ if [ -z "$2" ] || [ ! -d "$2" ]; then
++ echo "runit: invalid readiness service '$2'" >&2
++ exit 69
++ fi
++ sv start "$2" >&2
++ set +x
++ exit 0
++ ;;
++ *)
++ exit 32
++ ;;
++esac
++
++RUNIT_READY_PIPE="$2"
++RUNIT_CONF="$4/runit.conf"
++
++if [ ! -p "$RUNIT_READY_PIPE" ]; then
++ echo "runit: invalid input argument(s)" >&2
++ exit 69
++fi
++
++if [ -z "$HOME" ] || [ ! -d "$HOME" ]; then
++ echo "runit: invalid home directory" >&2
++ exit 70
++fi
++
++shift $#
++
++# be strict
++set -e
++
++# source the conf
++[ -r "$RUNIT_CONF" ] && . "$RUNIT_CONF"
++
++# set some defaults in case the conf cannot be read or is mangled
++: "${ready_sv:="turnstile-ready"}"
++: "${services_dir:="${HOME}/.config/service"}"
++
++mkdir -p "${services_dir}/${ready_sv}" > /dev/null 2>&1
++
++# this must succeed
++cat << EOF > "${services_dir}/${ready_sv}/run"
++#!/bin/sh
++[ -r ./conf ] && . ./conf
++[ -n "\$core_services" ] && SVDIR=".." sv start \$core_services
++[ -p "$RUNIT_READY_PIPE" ] && printf "${services_dir}/${ready_sv}" > "$RUNIT_READY_PIPE"
++exec pause
++EOF
++chmod +x "${services_dir}/${ready_sv}/run"
++
++exec env DBUS_SESSION_BUS_ADDRESS="unix:path=/run/user/$(id -u)/bus" \
++ runsvdir -P "$services_dir" \
++ 'log: ...........................................................................................................................................................................................................................................................................................................................................................................................................'
+diff --git a/backend/runit.conf b/backend/runit.conf
+new file mode 100644
+index 0000000..7b258c9
+--- /dev/null
++++ b/backend/runit.conf
+@@ -0,0 +1,13 @@
++# This is the configuration file for turnstile's runit backend.
++#
++# It follows the POSIX shell syntax (being sourced into a script).
++# The complete launch environment available to dinit can be used.
++#
++# It is a low-level configuration file. In most cases, it should
++# not be modified by the user.
++
++# the name of the service that turnstile will check for login readiness
++ready_sv="turnstile-ready"
++
++# the directory user service files are read from.
++services_dir="${HOME}/.config/service"
+diff --git a/meson.build b/meson.build
+index 823ff2a..de82e21 100644
+--- a/meson.build
++++ b/meson.build
+@@ -23,6 +23,7 @@ scdoc_dep = dependency(
+ )
+
+ have_dinit = get_option('dinit').enabled()
++have_runit = get_option('runit').enabled()
+
+ conf_data = configuration_data()
+ conf_data.set_quoted('RUN_PATH', get_option('rundir'))
+@@ -103,6 +104,8 @@ install_data(
+ # decide the default backend
+ if have_dinit
+ default_backend = 'dinit'
++elif have_runit
++ default_backend = 'runit'
+ else
+ default_backend = 'none'
+ endif
+diff --git a/meson_options.txt b/meson_options.txt
+index 9b03995..85ea1ce 100644
+--- a/meson_options.txt
++++ b/meson_options.txt
+@@ -3,6 +3,11 @@ option('dinit',
+ description: 'Whether to install Dinit-related backend and data'
+ )
+
++option('runit',
++ type: 'feature', value: 'disabled',
++ description: 'Whether to install runit-related backend and data'
++)
++
+ option('rundir',
+ type: 'string', value: '/run',
+ description: 'Where the base directory will be located'
+--
+2.41.0
+
diff --git a/srcpkgs/turnstile/template b/srcpkgs/turnstile/template
new file mode 100644
index 000000000000..ab0d216bea67
--- /dev/null
+++ b/srcpkgs/turnstile/template
@@ -0,0 +1,24 @@
+# Template file for 'turnstile'
+pkgname=turnstile
+version=0.1.5+1
+revision=1
+build_style=meson
+configure_args="-Ddinit=disabled -Drunit=enabled -Dmanage_rundir=true"
+hostmakedepends="pkg-config scdoc"
+makedepends="pam-devel"
+short_desc="Independent session/login tracker and user service manager"
+maintainer="classabbyamp <void@placeviolette.net>"
+license="BSD-2-Clause"
+homepage="https://github.com/chimera-linux/turnstile"
+# distfiles="https://github.com/chimera-linux/turnstile/archive/refs/tags/v${version}.tar.gz"
+_commit="b5f3b18419efa088697310fb67584ccc6b5f8142"
+distfiles="https://github.com/chimera-linux/turnstile/archive/${_commit}.tar.gz"
+checksum=6805bb6a561cab7d59b75feec695bf01da3a517d360b82527f462035df854c9a
+conf_files="/etc/turnstile/turnstiled.conf"
+
+post_install() {
+ vsv turnstiled
+ vsconf "${FILESDIR}/dbus.run"
+ vdoc "${FILESDIR}/README.voidlinux"
+ vlicense COPYING.md
+}
next prev parent reply other threads:[~2023-07-04 8:36 UTC|newest]
Thread overview: 55+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-06-28 9:12 [PR PATCH] " classabbyamp
2023-06-28 20:45 ` dkwo
2023-06-28 21:36 ` classabbyamp
2023-07-04 8:36 ` classabbyamp [this message]
2023-07-04 8:40 ` [PR PATCH] [Updated] " classabbyamp
2023-07-04 8:43 ` classabbyamp
2023-07-04 8:45 ` classabbyamp
2023-07-04 8:59 ` classabbyamp
2023-07-04 9:00 ` classabbyamp
2023-07-04 9:44 ` New package: turnstile-0.1.5 classabbyamp
2023-07-04 9:58 ` classabbyamp
2023-07-09 22:52 ` [PR PATCH] [Updated] " classabbyamp
2023-07-10 14:03 ` junkminerman
2023-07-10 16:37 ` classabbyamp
2023-07-10 16:55 ` classabbyamp
2023-07-10 17:59 ` junkminerman
2023-07-10 18:04 ` classabbyamp
2023-07-10 21:36 ` junkminerman
2023-07-10 21:44 ` classabbyamp
2023-07-11 9:01 ` junkminerman
2023-07-12 3:06 ` [PR PATCH] [Updated] " classabbyamp
2023-07-13 23:29 ` New package: turnstile-0.1.6 junkminerman
2023-07-25 17:27 ` [PR PATCH] [Updated] " classabbyamp
2023-09-08 10:47 ` classabbyamp
2023-09-08 10:56 ` classabbyamp
2023-09-08 11:04 ` [PR PATCH] [Closed]: New package: turnstile-0.1.8 classabbyamp
2023-09-08 11:05 ` classabbyamp
2023-09-08 12:58 ` dkwo
2023-09-08 14:13 ` classabbyamp
2023-09-09 22:21 ` [PR PATCH] [Updated] " classabbyamp
2023-09-09 22:23 ` classabbyamp
2023-09-10 0:02 ` classabbyamp
2023-09-11 8:19 ` dkwo
2023-09-12 22:55 ` [PR PATCH] [Updated] " classabbyamp
2023-09-12 23:09 ` classabbyamp
2023-09-26 17:44 ` dkwo
2023-09-26 18:04 ` dkwo
2023-09-26 18:06 ` classabbyamp
2023-09-26 18:09 ` classabbyamp
2023-09-26 20:15 ` dkwo
2023-09-26 21:15 ` dkwo
2023-09-26 21:16 ` dkwo
2023-09-26 21:25 ` classabbyamp
2023-09-26 21:40 ` dkwo
2023-09-26 21:41 ` dkwo
2023-12-26 1:45 ` github-actions
2023-12-26 17:52 ` [PR PATCH] [Updated] " classabbyamp
2023-12-26 17:54 ` classabbyamp
2023-12-26 19:05 ` dkwo
2023-12-26 19:24 ` classabbyamp
2024-01-16 19:42 ` dkwo
2024-01-16 20:08 ` classabbyamp
2024-03-22 20:31 ` [PR PATCH] [Updated] " classabbyamp
2024-03-22 21:02 ` classabbyamp
2024-03-22 21:11 ` [PR PATCH] [Merged]: " classabbyamp
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20230704083649.Q69JMfInlh3jomtKYcwv872uPFRpn3buGd6bQelITwM@z \
--to=classabbyamp@users.noreply.github.com \
--cc=ml@inbox.vuxu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).