all messages for Guix-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
From: Mathieu Lirzin <mthl@gnu.org>
To: "Ludovic Courtès" <ludo@gnu.org>
Cc: guix-devel@gnu.org
Subject: Re: [PATCH 3/3] support: Rename user-dmddir to %user-shepherd-dir.
Date: Sun, 17 Jan 2016 21:49:55 +0100	[thread overview]
Message-ID: <87y4bo0w3w.fsf@gnu.org> (raw)
In-Reply-To: <87wpr870gw.fsf@gnu.org> ("Ludovic \=\?utf-8\?Q\?Court\=C3\=A8s\=22'\?\= \=\?utf-8\?Q\?s\?\= message of "Sun, 17 Jan 2016 15:19:11 +0100")

[-- Attachment #1: Type: text/plain, Size: 1254 bytes --]

ludo@gnu.org (Ludovic Courtès) writes:

> Mathieu Lirzin <mthl@gnu.org> skribis:
>
>> * modules/shepherd/support.scm (user-dmddir): Rename to ...
>> (%user-shepherd-dir): ... this.  Honor XDG variables and use
>> '~/.config/shepherd' as default value.  All consumers changed.
>> (mkdir-p): New procedure.  Export it.
>> (default-config-file): Use it.
>> (verify-dir): Likewise.
>
> Cool!
>
>> +(define %user-shepherd-dir
>> +  ;; sheperd default directory if shepherd is run as a normal user.
>          ^^^
> Typo.  :-)
>
> I would rename the variable to ‘%user-config-dir’ or similar; I think
> it’s putting the package name everywhere just makes it more difficult to
> rename it.  :-)

Done.

>> +  (string-append (or (getenv "XDG_CONFIG_HOME")
>> +		     (string-append user-homedir "/.config"))
>    ^^^
> No tabs please!

OK.

> Could you update shepherd.texi to so that it mentions the right
> location, make sure XDG_CACHE_HOME is unset in AM_TESTS_ENVIRONMENT (or
> similar), also add a test in basic.sh?

Partially done.  I have only handle XDG_CONFIG_HOME to replace
'$HOME/.dmd.d'.  IMO it would be better to handle other XDG variables in
future patches.  WDYT?

Thanks.

--
Mathieu Lirzin


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-support-Rename-user-dmddir-to-user-config-dir.patch --]
[-- Type: text/x-diff, Size: 8229 bytes --]

From 3147268bae87d24f787de019391a65ee67ef89f3 Mon Sep 17 00:00:00 2001
From: Mathieu Lirzin <mthl@gnu.org>
Date: Sat, 16 Jan 2016 22:22:26 +0100
Subject: [PATCH] support: Rename user-dmddir to %user-config-dir.

* modules/shepherd/support.scm (user-dmddir): Rename to ...
(%user-config-dir): ... this.  Honor XDG_CONFIG_HOME and use
'$HOME/.config/shepherd' as default value.  All consumers changed.
(mkdir-p): New procedure.  Export it.
(default-config-file): Use it.
(verify-dir): Likewise.
* shepherd.texi (Jump Start, Invoking shepherd): Document the new user
configuration directory.
* tests/basic.sh: Check if XDG_CONFIG_HOME is honored.
* Makefile.am (AM_TESTS_ENVIRONMENT): Unset it.
---
 Makefile.am                  |  3 ++-
 modules/shepherd/support.scm | 47 ++++++++++++++++++++++++++++++++++++--------
 shepherd.texi                | 16 ++++++++-------
 tests/basic.sh               | 30 ++++++++++++++++++++++++++++
 4 files changed, 80 insertions(+), 16 deletions(-)

diff --git a/Makefile.am b/Makefile.am
index 7b3e59f..7eb2a27 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -148,7 +148,8 @@ TEST_EXTENSIONS = .sh
 EXTRA_DIST += $(TESTS)
 
 AM_TESTS_ENVIRONMENT =				\
-  PATH="$(abs_top_builddir):$$PATH" LC_ALL=C	\
+  unset XDG_CONFIG_HOME; LC_ALL=C		\
+  PATH="$(abs_top_builddir):$$PATH"		\
   SHELL="$(SHELL)" GUILE="$(GUILE)"		\
   GUILE_LOAD_PATH="$(abs_top_srcdir)/modules:$(abs_top_builddir)/modules:$$GUILE_LOAD_PATH" \
   GUILE_LOAD_COMPILED_PATH="$(abs_top_srcdir)/modules:$(abs_top_builddir)/modules:$$GUILE_LOAD_COMPILED_PATH"
diff --git a/modules/shepherd/support.scm b/modules/shepherd/support.scm
index 5b1ca7e..319fa91 100644
--- a/modules/shepherd/support.scm
+++ b/modules/shepherd/support.scm
@@ -32,6 +32,7 @@
             with-system-error-handling
             EINTR-safe
             with-atomic-file-output
+            mkdir-p
 
             l10n
             local-output
@@ -155,6 +156,33 @@ output port, and PROC's result is returned."
       (lambda (key . args)
         (catch-system-error (delete-file template))))))
 
+(define* (mkdir-p dir #:optional mode)  ;copied from Guix
+  "Create directory DIR and all its ancestors."
+  (define absolute?
+    (string-prefix? "/" dir))
+
+  (define not-slash
+    (char-set-complement (char-set #\/)))
+
+  (let loop ((components (string-tokenize dir not-slash))
+             (root       (if absolute?
+                             ""
+                             ".")))
+    (match components
+      ((head tail ...)
+       (let ((path (string-append root "/" head)))
+         (catch 'system-error
+           (lambda ()
+             (if mode
+                 (mkdir path mode)
+                 (mkdir path))
+             (loop tail path))
+           (lambda args
+             (if (= EEXIST (system-error-errno args))
+                 (loop tail path)
+                 (apply throw args))))))
+      (() #t))))
+
 \f
 
 ;; Localized version of STR.
@@ -186,8 +214,11 @@ There is NO WARRANTY, to the extent permitted by law.")))
       (false-if-exception (passwd:dir (getpwuid (getuid))))
       "/"))
 
-;; dmd default subdirectory if dmd is run as a normal user.
-(define user-dmddir (string-append user-homedir "/.dmd.d"))
+(define %user-config-dir
+  ;; Default config directory if shepherd is run as a normal user.
+  (string-append (or (getenv "XDG_CONFIG_HOME")
+                     (string-append user-homedir "/.config"))
+                 "/shepherd"))
 
 (define (make-bare-init-file target)
   "Return #t if a bare init file was created at TARGET; #f otherwise.
@@ -216,7 +247,7 @@ TARGET should be a string representing a filepath + name."
 (define default-logfile
   (if (zero? (getuid))
       (string-append %localstatedir "/log/shepherd.log")
-      (string-append user-dmddir "/shepherd.log")))
+      (string-append %user-config-dir "/shepherd.log")))
 
 ;; Configuration file.
 (define (default-config-file)
@@ -225,8 +256,8 @@ global system configuration file when running as 'root'.  As a side effect,
 create a template configuration file if non exists."
   (if (zero? (getuid))
       (string-append %sysconfdir "/dmdconf.scm")
-      (let ((config-file (string-append user-dmddir "/init.scm")))
-        (catch-system-error (mkdir user-dmddir))
+      (let ((config-file (string-append %user-config-dir "/init.scm")))
+        (mkdir-p %user-config-dir #o700)
         (if (not (file-exists? config-file))
             (make-bare-init-file config-file))
         config-file)))
@@ -239,7 +270,7 @@ create a template configuration file if non exists."
 (define default-socket-dir
   (if (zero? (getuid))
       %system-socket-dir
-      (string-append user-dmddir "/run")))
+      (string-append %user-config-dir "/run")))
 
 ;; Unix domain socket for receiving commands in dmd.
 (define default-socket-file
@@ -253,7 +284,7 @@ create a template configuration file if non exists."
 (define default-persistency-state-file
   (if (zero? (getuid))
       (string-append %localstatedir "/lib/misc/dmd-state")
-      (string-append user-dmddir "/dmd-state")))
+      (string-append %user-config-dir "/dmd-state")))
 
 ;; Global variables set from (dmd).
 (define persistency #f)
@@ -284,7 +315,7 @@ directory are not checked."
   (and (string=? dir default-socket-dir)
        ;; If it exists already, this is fine, thus ignore errors.
        (catch-system-error
-        (mkdir default-socket-dir #o700)))
+        (mkdir-p default-socket-dir #o700)))
   ;; Check for permissions.
   (when secure?
     (let ((dir-stat (stat dir)))
diff --git a/shepherd.texi b/shepherd.texi
index 6cca61c..3131d04 100644
--- a/shepherd.texi
+++ b/shepherd.texi
@@ -139,12 +139,14 @@ instead, add this directory name in front of the absolute file names
 mentioned below.
 
 @cindex Configuration file
-When @command{shepherd} gets started, it reads and evaluates a configuration file.  When it is
-started with superuser priviledges, it tries to use
-@code{/etc/dmdconf.scm}, when started as normal user, it looks for a
-file called @code{.dmd.d/init.scm} in the user's home directory.  With the
-option @code{--config} (or, for short, @code{-c}), you can specify
-where to look instead.  So if you want to start @command{shepherd} with an
+When @command{shepherd} gets started, it reads and evaluates a
+configuration file.  When it is started with superuser priviledges, it
+tries to use @code{/etc/dmdconf.scm}.  When started as normal user, it
+looks for a file called @code{$XDG_CONFIG_HOME/shepherd/init.scm}.  If
+the XDG_CONFIG_HOME environment variable is not defined,
+@code{$HOME/.config/shepherd/init.scm} is used instead.  With the option
+@code{--config} (or, for short, @code{-c}), you can specify where to
+look instead.  So if you want to start @command{shepherd} with an
 alternative file, use one of the following commands:
 
 @example
@@ -402,7 +404,7 @@ permissions are not as expected.
 @cindex log file
 Log output into @var{file}, or if @var{file} is not given,
 @code{/var/log/shepherd.log} when running as superuser,
-@var{~/.dmd.d/shepherd.log} otherwise.
+@code{$XDG_CONFIG_HOME/shepherd/shepherd.log} otherwise.
 
 @item --pid[=@var{file}]
 When @command{shepherd} is ready to accept connections, write its PID to @var{file} or
diff --git a/tests/basic.sh b/tests/basic.sh
index dfe5d18..88d561b 100644
--- a/tests/basic.sh
+++ b/tests/basic.sh
@@ -22,6 +22,7 @@ herd --version
 
 socket="t-socket-$$"
 conf="t-conf-$$"
+confdir="t-confdir-$$"
 log="t-log-$$"
 stamp="t-stamp-$$"
 pid="t-pid-$$"
@@ -97,3 +98,32 @@ $herd stop dmd
 ! kill -0 $dmd_pid
 
 test -f "$log"
+
+## ------------------------ ##
+## Usage of XDG variables.  ##
+## ------------------------ ##
+
+# Set XDG_CONFIG_HOME for configuration files.
+export XDG_CONFIG_HOME=$confdir
+mkdir -p $confdir/shepherd
+mv $conf $confdir/shepherd/init.scm
+rm -f "$pid"
+shepherd -I -s "$socket" --pid="$pid" &
+
+# Wait till it's ready.
+while ! test -f "$pid" ; do : ; done
+
+# Launch a service from $confdir/shepherd/init.scm.
+$herd start test
+test -f "$stamp"
+$herd status test | grep started
+
+$herd stop test
+! test -f "$stamp"
+
+dmd_pid="`cat $pid`"
+
+$herd stop dmd
+! kill -0 $dmd_pid
+
+rm -rf $confdir
-- 
2.6.3


  reply	other threads:[~2016-01-17 20:50 UTC|newest]

Thread overview: 14+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-01-16 22:17 [PATCH 0/3] [Shepherd][PATCH 0/3] Change configuration file Mathieu Lirzin
2016-01-16 22:17 ` [PATCH 1/3] maint: Add .dir-locals.el Mathieu Lirzin
2016-01-17 14:07   ` Ludovic Courtès
2016-01-16 22:17 ` [PATCH 2/3] support: Add a keyword argument '#:secure?' to verify-dir Mathieu Lirzin
2016-01-17 14:08   ` Ludovic Courtès
2016-01-16 22:17 ` [PATCH 3/3] support: Rename user-dmddir to %user-shepherd-dir Mathieu Lirzin
2016-01-17 14:05   ` Mathieu Lirzin
2016-01-17 20:43     ` Ludovic Courtès
2016-01-17 21:51       ` Mathieu Lirzin
2016-01-18 21:08         ` Ludovic Courtès
2016-01-17 14:19   ` Ludovic Courtès
2016-01-17 20:49     ` Mathieu Lirzin [this message]
2016-01-17 21:06       ` Mathieu Lirzin
2016-01-18 20:59         ` Ludovic Courtès

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=87y4bo0w3w.fsf@gnu.org \
    --to=mthl@gnu.org \
    --cc=guix-devel@gnu.org \
    --cc=ludo@gnu.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.
Code repositories for project(s) associated with this external index

	https://git.savannah.gnu.org/cgit/guix.git

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.