* [bug#44130] [PATCH] Add a recursive version of mkdir-p
@ 2020-10-21 23:29 divoplade
2020-10-23 13:12 ` Ludovic Courtès
` (2 more replies)
0 siblings, 3 replies; 10+ messages in thread
From: divoplade @ 2020-10-21 23:29 UTC (permalink / raw)
To: 44130
[-- Attachment #1: Type: text/plain, Size: 757 bytes --]
Dear guix,
I need this mkdir-p function in any non-trivial program I write. I had
3 bad choices:
1. Lobby guile to provide this function out of the box (this will take
time);
2. Copy that of guix, or gash, or any other: this does not seem
acceptable to me, because this function will surely evolve (for
instance, if guile gets suport for mingw and we start running guile
programs on windows) and I don't want to update more than one version
of this function;
3. Depend on guix, gash or another package: this would be too large a
dependency for my programs.
So I wrote it in its own package and I intend to depend on it for my
other projects. It would be best if you could accept this package in
guix proper.
What do you think?
Best regards,
divoplade
[-- Attachment #2: 0001-Add-guile-mkdir-p.patch --]
[-- Type: text/x-patch, Size: 2323 bytes --]
From 1a1798a99b09ef7df0f183d99ea9a4717b9406d7 Mon Sep 17 00:00:00 2001
From: divoplade <d@divoplade.fr>
Date: Thu, 22 Oct 2020 01:14:27 +0200
Subject: [PATCH] Add guile-mkdir-p
As there is no guile function to create directories recursively, a lot of
packages bundle their own. For instance, Guile as Shell or Guix. This also
happens to me, as I need this function in any substantial program.
---
gnu/packages/guile-xyz.scm | 39 ++++++++++++++++++++++++++++++++++++++
1 file changed, 39 insertions(+)
diff --git a/gnu/packages/guile-xyz.scm b/gnu/packages/guile-xyz.scm
index 88c0586dc9..2504deb3af 100644
--- a/gnu/packages/guile-xyz.scm
+++ b/gnu/packages/guile-xyz.scm
@@ -4007,3 +4007,42 @@ features not found in the standard read procedure such as a compatible mode
with support for other RnRS standards and a tolerant mode that continues on
errors.")
(license license:expat)))
+
+(define-public guile-mkdir-p
+ (package
+ (name "guile-mkdir-p")
+ (version "1.0.1")
+ (source
+ (origin
+ (method git-fetch)
+ (uri (git-reference
+ (url "https://code.divoplade.fr/mkdir-p.git")
+ (commit "83e955ba612369336a69fe50fe023ad14fbe5d7c")))
+ (sha256 (base32 "01k20rjcv6p0spmw8ls776aar6bfw0jxw46d2n12w0cb2p79xjv8"))
+ (snippet
+ `(begin
+ (with-output-to-file ".tarball-version"
+ (lambda _ (format #t "~a~%" "1.0.1")))
+ #t))))
+ (build-system gnu-build-system)
+ (arguments `())
+ (native-inputs
+ `(("guile" ,guile-3.0)
+ ("texinfo" ,texinfo)
+ ("autoconf" ,autoconf)
+ ("autoconf-archive" ,autoconf-archive)
+ ("automake" ,automake)
+ ("pkg-config" ,pkg-config)
+ ("gettext" ,gnu-gettext)))
+ (inputs `(("guile" ,guile-3.0)))
+ (propagated-inputs
+ `(("guile" ,guile-3.0)))
+ (synopsis "Implementation of a recursive mkdir for guile")
+ (description
+ "This package provides within the (mkdir-p) module the mkdir-p function
+that tries to create the chain of directories recursively. It also provides
+new versions of open-output-file, call-with-output-file and
+with-output-to-file to create the directory of its argument if it does not
+exist.")
+ (home-page "https://mkdir-p.divoplade.fr")
+ (license license:asl2.0)))
--
2.28.0
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [bug#44130] [PATCH] Add a recursive version of mkdir-p
2020-10-21 23:29 [bug#44130] [PATCH] Add a recursive version of mkdir-p divoplade
@ 2020-10-23 13:12 ` Ludovic Courtès
2020-10-23 14:14 ` divoplade
2020-10-23 19:36 ` [bug#44130] " zimoun
2020-10-23 20:01 ` Leo Prikler
2 siblings, 1 reply; 10+ messages in thread
From: Ludovic Courtès @ 2020-10-23 13:12 UTC (permalink / raw)
To: divoplade; +Cc: 44130
Hi!
divoplade <d@divoplade.fr> skribis:
> I need this mkdir-p function in any non-trivial program I write. I had
> 3 bad choices:
>
> 1. Lobby guile to provide this function out of the box (this will take
> time);
> 2. Copy that of guix, or gash, or any other: this does not seem
> acceptable to me, because this function will surely evolve (for
> instance, if guile gets suport for mingw and we start running guile
> programs on windows) and I don't want to update more than one version
> of this function;
> 3. Depend on guix, gash or another package: this would be too large a
> dependency for my programs.
>
> So I wrote it in its own package and I intend to depend on it for my
> other projects. It would be best if you could accept this package in
> guix proper.
>
> What do you think?
I have nothing against adding this package to Guix, but…
Do you realize that the package definition is longer than the ‘mkdir-p’
procedure itself? :-)
I think npm packages are too fine-grain; I don’t think this is the
approach to follow for Guile.
It’s likely that packages that need ‘mkdir-p’ also need other high-level
file system operations that Gash (say) provides. In that case, I’d
encourage people to depend on Gash. If Gash is too big a dependency for
the project, including its own copy of this 24-line procedure is
probably acceptable.
All that said, I do think that Guile itself should eventually include
some of the utilities found in (guix build utils) or Gash. For
instance, it recently got a new ‘pipeline’ procedure, which comes from
Gash, and I think it’s a great addition. This is the way to go in the
longer term.
Thoughts?
Ludo’.
^ permalink raw reply [flat|nested] 10+ messages in thread
* [bug#44130] [PATCH] Add a recursive version of mkdir-p
2020-10-23 13:12 ` Ludovic Courtès
@ 2020-10-23 14:14 ` divoplade
2020-10-23 16:37 ` Ludovic Courtès
0 siblings, 1 reply; 10+ messages in thread
From: divoplade @ 2020-10-23 14:14 UTC (permalink / raw)
To: Ludovic Courtès; +Cc: 44130
Hi,
Le vendredi 23 octobre 2020 à 15:12 +0200, Ludovic Courtès a écrit :
> It’s likely that packages that need ‘mkdir-p’ also need other high-
> level
> file system operations that Gash (say) provides. In that case, I’d
> encourage people to depend on Gash. If Gash is too big a dependency
> for
> the project, including its own copy of this 24-line procedure is
> probably acceptable.
This function is needed for nearly all desktop applications. In the
freedesktop.org world of specifications, your application should store
data in different places in the home directory of the user. The
application data, such as your bookmarks, should be stored in
$XDG_DATA_HOME/<app>/, or $HOME/.local/share/<app>/ if XDG_DATA_HOME is
not set. So if that's a fresh system, or you want to have different
folders in your application data, you will need to make sure that an
arbitrary long chain of directories exist before writing your files.
You can't expect a static chain of directories, since you have to rely
on an environment variable. This is one example, but as a general rule,
whenever you want to write to a file, guile will create it if it does
not exist, because the intent is "do whatever it takes to have that
file and let me write to it".
As I explained, copying the function is not a good thing, because it
will need to adapt. If not a package, the solution could take the form
of a gnulib for guile (which makes little sense since the whole guile
is the standard library), or...
> All that said, I do think that Guile itself should eventually include
> some of the utilities found in (guix build utils) or Gash.
I really think that would be the ideal solution. I understand that you
don't want my package (to be fair, I'm not satisfied with one-package-
per-function either), but the need for that particular function exceeds
that of most other from guix build utils or gash.
Look, even guix itself does not care about mkdir! I get 481 instances
of '(mkdir ' in the source, for 1317 instances of '(mkdir-p '. That
should say something about having a mkdir function by default, but not
mkdir-p. The only functions from guix build utils that have more than
100 calls (detected as '(fun ') are with-directory-excursion (616),
install-file (1018) (half of its job being mkdir-p), copy-recursively
(559), delete-file-recursively (470), find-files (1161), which (1423,
that's more than mkdir-p), modify-phases (4556, that's a lot more but
it's very specific to guix), substitute* (4240, same), wrap-program
(311, same), and invoke (2242). So I think if you want to import one
function from guix build utils into guile, start with mkdir-p!
Best regards,
divoplade
^ permalink raw reply [flat|nested] 10+ messages in thread
* [bug#44130] [PATCH] Add a recursive version of mkdir-p
2020-10-23 14:14 ` divoplade
@ 2020-10-23 16:37 ` Ludovic Courtès
2020-10-23 17:12 ` divoplade
0 siblings, 1 reply; 10+ messages in thread
From: Ludovic Courtès @ 2020-10-23 16:37 UTC (permalink / raw)
To: divoplade; +Cc: 44130
Maybe I wasn’t clear enough but I don’t need to be convinced about the
usefulness of ‘mkdir-p’ and friends—I totally agree with you!
What I was questioning is the temptation to make one-function packages
as is common for instance in npm.
Thanks,
Ludo’.
^ permalink raw reply [flat|nested] 10+ messages in thread
* [bug#44130] [PATCH] Add a recursive version of mkdir-p
2020-10-23 16:37 ` Ludovic Courtès
@ 2020-10-23 17:12 ` divoplade
2020-10-26 16:57 ` bug#44130: " Ludovic Courtès
0 siblings, 1 reply; 10+ messages in thread
From: divoplade @ 2020-10-23 17:12 UTC (permalink / raw)
To: Ludovic Courtès; +Cc: 44130
Le vendredi 23 octobre 2020 à 18:37 +0200, Ludovic Courtès a écrit :
>
> What I was questioning is the temptation to make one-function
> packages
> as is common for instance in npm.
Ah, so I can summarize. My solutions are:
1. Guile provides mkdir-p: Perfect!
2. I put the function in a package: not great, but acceptable.
3. I depend on gash: not acceptable, there's only mkdir-p that's
interesting, the rest is for advanced system tools.
4. I copy that function around: not acceptable.
So, there's no temptation to make one-function packages.
Should I understand that you question the integration of one-function
packages into guix? If you don't want it in guix, then it's fine, I can
just use it only for myself, I have my own channel. In which case,
please just say so, so we can all move on to more interesting things.
Best regards,
divoplade
^ permalink raw reply [flat|nested] 10+ messages in thread
* [bug#44130] [PATCH] Add a recursive version of mkdir-p
2020-10-21 23:29 [bug#44130] [PATCH] Add a recursive version of mkdir-p divoplade
2020-10-23 13:12 ` Ludovic Courtès
@ 2020-10-23 19:36 ` zimoun
2020-10-23 22:00 ` [bug#44130] Recursive mkdir divoplade
2020-10-23 22:11 ` [bug#44130] [PATCH] Add a recursive version of mkdir-p divoplade
2020-10-23 20:01 ` Leo Prikler
2 siblings, 2 replies; 10+ messages in thread
From: zimoun @ 2020-10-23 19:36 UTC (permalink / raw)
To: divoplade; +Cc: 44130
salut,
On Thu, 22 Oct 2020 at 01:29, divoplade <d@divoplade.fr> wrote:
> 1. Lobby guile to provide this function out of the box (this will take
> time);
This path seems the one to go. It will take less time than running
Guile on Windows. ;-)
The only issue is that your code will depend on Guile 3.0.x where x>4.
Otherwise, why is it not possible to send a patch to Guile?
> 2. Copy that of guix, or gash, or any other: this does not seem
> acceptable to me, because this function will surely evolve (for
> instance, if guile gets suport for mingw and we start running guile
> programs on windows) and I don't want to update more than one version
> of this function;
The ’mkdir-p’ version in (guix build utils) is the same as 2012. So I
am not convinced that you will need to update it really often.
> 3. Depend on guix, gash or another package: this would be too large a
> dependency for my programs.
Ok.
On Fri, 23 Oct 2020 at 19:12, divoplade <d@divoplade.fr> wrote:
> So, there's no temptation to make one-function packages.
One package making one-function package will call other one-function
packages. :-)
à tantôt,
simon
^ permalink raw reply [flat|nested] 10+ messages in thread
* [bug#44130] [PATCH] Add a recursive version of mkdir-p
2020-10-21 23:29 [bug#44130] [PATCH] Add a recursive version of mkdir-p divoplade
2020-10-23 13:12 ` Ludovic Courtès
2020-10-23 19:36 ` [bug#44130] " zimoun
@ 2020-10-23 20:01 ` Leo Prikler
2 siblings, 0 replies; 10+ messages in thread
From: Leo Prikler @ 2020-10-23 20:01 UTC (permalink / raw)
To: d; +Cc: 44130
> Le vendredi 23 octobre 2020 à 18:37 +0200, Ludovic Courtès a écrit :
> >
> > What I was questioning is the temptation to make one-function
> > packages
> > as is common for instance in npm.
>
> Ah, so I can summarize. My solutions are:
>
> 1. Guile provides mkdir-p: Perfect!
> 2. I put the function in a package: not great, but acceptable.
> 3. I depend on gash: not acceptable, there's only mkdir-p that's
> interesting, the rest is for advanced system tools.
> 4. I copy that function around: not acceptable.
5. You depend on any other package, that provides mkdir-p among other
utilities big enough to be packaged in Guix: Not acceptable.
6. You depend on any other package, that provides just mkdir-p with
maybe a few other utilities, that make Guix devs question whether this
will become the next npm.
7. You write a module, that evals untrusted code from the internet and
point it towards your implementation of mkdir-p.
8. You find existing implementations of mkdir-p insufficient and roll
yet another mkdir-p.
9. You write an accelerated mkdir-p in native code as a shared library.
10. You combine 7 and 9.
...
For what it's worth, I've been hacking on a slightly more complete set
of filesystem utilities over at [1] for the past few days. It is not
yet complete to the point that I'd consider its inclusion into Guix
upstream, but you might want to try it out and perhaps contribute if
that fits your niche.
> So, there's no temptation to make one-function packages.
>
> Should I understand that you question the integration of one-function
> packages into guix? If you don't want it in guix, then it's fine, I
> can
> just use it only for myself, I have my own channel. In which case,
> please just say so, so we can all move on to more interesting things.
In that case, you still recreate npm, just with an additional layer of
indirection. Obviously Guix developers can not stop you from doing so,
only advise you not to.
Regards, Leo
[1] https://gitlab.com/leoprikler/guile-filesystem
^ permalink raw reply [flat|nested] 10+ messages in thread
* [bug#44130] Recursive mkdir
2020-10-23 19:36 ` [bug#44130] " zimoun
@ 2020-10-23 22:00 ` divoplade
2020-10-23 22:11 ` [bug#44130] [PATCH] Add a recursive version of mkdir-p divoplade
1 sibling, 0 replies; 10+ messages in thread
From: divoplade @ 2020-10-23 22:00 UTC (permalink / raw)
To: bug-guile; +Cc: zimoun, 44130
[-- Attachment #1: Type: text/plain, Size: 891 bytes --]
Dear guile,
I have slightly modified the mkdir function so that it takes a third
argument to try to create the intermediate directories when calling
mkdir, in effect acting as "mkdir -p".
However, I could not make the test suite run the ports test, on which I
added the test for the new behavior. Is it expected? How do I run it?
In the mean time, here is the WIP version of the patch.
Best regards,
divoplade
Le vendredi 23 octobre 2020 à 21:36 +0200, zimoun a écrit :
> salut,
>
> On Thu, 22 Oct 2020 at 01:29, divoplade <d@divoplade.fr> wrote:
>
> > 1. Lobby guile to provide this function out of the box (this will
> > take
> > time);
>
> This path seems the one to go. It will take less time than running
> Guile on Windows. ;-)
>
> The only issue is that your code will depend on Guile 3.0.x where
> x>4.
>
> Otherwise, why is it not possible to send a patch to Guile?
[-- Attachment #2: 0001-mkdir-Add-an-optional-argument-recursive-to-create-t.patch --]
[-- Type: text/x-patch, Size: 7683 bytes --]
From d69f24617290c4a875ff2356ca229bf1659feafe Mon Sep 17 00:00:00 2001
From: divoplade <d@divoplade.fr>
Date: Fri, 23 Oct 2020 22:44:36 +0200
Subject: [PATCH] mkdir: Add an optional argument, recursive, to create the
intermediates
2020-10-23 divoplade <d@divoplade.fr>
* libguile/filesys.c: include eq.h, so we can compare strings.
* libguile/filesys.c (scm_mkdir): add an optional argument,
recursive, to create the intermediate directories if they do not
exist.
* libguile/filesys.h (scm_mkdir): add the optional argument to
the prototype.
* doc/ref/posix.texi (mkdir): document the new optional
argument.
* NEWS: say there is a new argument.
* test-suite/tests/ports.test: add a test suite to check
recursive mkdir.
---
NEWS | 5 +++++
doc/ref/posix.texi | 7 +++++--
libguile/filesys.c | 39 ++++++++++++++++++++++++++++++++++--
libguile/filesys.h | 2 +-
test-suite/tests/ports.test | 40 +++++++++++++++++++++++++++++++++++++
5 files changed, 88 insertions(+), 5 deletions(-)
diff --git a/NEWS b/NEWS
index 694449202..765f3d2a3 100644
--- a/NEWS
+++ b/NEWS
@@ -16,6 +16,11 @@ O(1) dispatch time, regardless of the length of the chain. This
optimization is also unlocked in many cases for `match' expressions with
many similar clauses whose first differentiator are constants.
+** Additional optional argument in `mkdir' to create the directory recursively
+
+When the third argument to mkdir is true, the intermediate directories
+are created.
+
* Incompatible changes
** `copy' read-option removed
diff --git a/doc/ref/posix.texi b/doc/ref/posix.texi
index f34c5222d..db0cdeae0 100644
--- a/doc/ref/posix.texi
+++ b/doc/ref/posix.texi
@@ -878,12 +878,15 @@ Create a symbolic link named @var{newpath} with the value (i.e., pointing to)
@var{oldpath}. The return value is unspecified.
@end deffn
-@deffn {Scheme Procedure} mkdir path [mode]
-@deffnx {C Function} scm_mkdir (path, mode)
+@deffn {Scheme Procedure} mkdir path [mode [recursive]]
+@deffnx {C Function} scm_mkdir (path, mode, recursive)
Create a new directory named by @var{path}. If @var{mode} is omitted
then the permissions of the directory are set to @code{#o777}
masked with the current umask (@pxref{Processes, @code{umask}}).
Otherwise they are set to the value specified with @var{mode}.
+If @var{recursive} is true, also try to create the intermediate missing
+directories. If an error happens, the created directories are left in
+place.
The return value is unspecified.
@end deffn
diff --git a/libguile/filesys.c b/libguile/filesys.c
index 39bfd38cc..a3c26cfe0 100644
--- a/libguile/filesys.c
+++ b/libguile/filesys.c
@@ -82,6 +82,7 @@
#include "async.h"
#include "boolean.h"
#include "dynwind.h"
+#include "eq.h"
#include "fdes-finalizers.h"
#include "feature.h"
#include "fports.h"
@@ -1271,12 +1272,15 @@ SCM_DEFINE (scm_getcwd, "getcwd", 0, 0, 0,
#undef FUNC_NAME
#endif /* HAVE_GETCWD */
-SCM_DEFINE (scm_mkdir, "mkdir", 1, 1, 0,
- (SCM path, SCM mode),
+SCM_DEFINE (scm_mkdir, "mkdir", 1, 2, 0,
+ (SCM path, SCM mode, SCM recursive),
"Create a new directory named by @var{path}. If @var{mode} is omitted\n"
"then the permissions of the directory are set to @code{#o777}\n"
"masked with the current umask (@pxref{Processes, @code{umask}}).\n"
"Otherwise they are set to the value specified with @var{mode}.\n"
+ "If @var{recursive} is true, also try tocreate the intermediate missing\n"
+ "directories. If an error happens, the created directories are left\n"
+ "in place.\n"
"The return value is unspecified.")
#define FUNC_NAME s_scm_mkdir
{
@@ -1285,6 +1289,37 @@ SCM_DEFINE (scm_mkdir, "mkdir", 1, 1, 0,
c_mode = SCM_UNBNDP (mode) ? 0777 : scm_to_uint (mode);
+ if (scm_is_true (recursive))
+ {
+ /* Record in paths all intermediate directory names up to the
+ root. The root is reached when the dirname of the current
+ directory is equal to the directory. */
+ SCM paths = SCM_EOL;
+ SCM current_name = path;
+ SCM parent_name = scm_dirname (current_name);
+ while (!scm_is_true (scm_equal_p (parent_name, current_name)))
+ {
+ paths = scm_cons (parent_name, paths);
+ current_name = parent_name;
+ parent_name = scm_dirname (current_name);
+ }
+ if (scm_is_true (scm_equal_p (current_name, scm_from_utf8_string ("."))))
+ {
+ /* If the root is '.', then also make the current working
+ directory the same way. */
+ scm_mkdir (scm_getcwd (), mode, recursive);
+ }
+ while (!scm_is_null (paths))
+ {
+ SCM dir = scm_car (paths);
+ /* Ignore the errors. If one mkdir fails, the final
+ STRING_SYSCALL at the end of this function will fail
+ too. */
+ STRING_SYSCALL (dir, c_dir, mkdir (c_dir, c_mode));
+ paths = scm_cdr (paths);
+ }
+ }
+
STRING_SYSCALL (path, c_path, rv = mkdir (c_path, c_mode));
if (rv != 0)
SCM_SYSERROR;
diff --git a/libguile/filesys.h b/libguile/filesys.h
index f870ee434..011cc5d1d 100644
--- a/libguile/filesys.h
+++ b/libguile/filesys.h
@@ -49,7 +49,7 @@ SCM_API SCM scm_stat (SCM object, SCM exception_on_error);
SCM_API SCM scm_link (SCM oldpath, SCM newpath);
SCM_API SCM scm_rename (SCM oldname, SCM newname);
SCM_API SCM scm_delete_file (SCM str);
-SCM_API SCM scm_mkdir (SCM path, SCM mode);
+SCM_API SCM scm_mkdir (SCM path, SCM mode, SCM recursive);
SCM_API SCM scm_rmdir (SCM path);
SCM_API SCM scm_directory_stream_p (SCM obj);
SCM_API SCM scm_opendir (SCM dirname);
diff --git a/test-suite/tests/ports.test b/test-suite/tests/ports.test
index 31fb2b0a8..c2b8b0596 100644
--- a/test-suite/tests/ports.test
+++ b/test-suite/tests/ports.test
@@ -2020,6 +2020,46 @@
(not (string-index (%search-load-path (basename (test-file)))
#\\))))))
+(with-test-prefix "recursive mkdir"
+
+ (pass-if "Relative recursive mkdir creates the chain of directories"
+ (let ((dir "./nested/relative/subdirectory"))
+ (mkdir dir #o777 dir #t)
+ (let ((ok
+ (catch #t
+ (lambda ()
+ (with-output-to-file "./nested/relative/subdirectory/file"
+ (lambda ()
+ (display "The directories have been created!")
+ #t)))
+ (lambda (error . args)
+ #f))))
+ (when ok
+ (delete-file "./nested/relative/subdirectory/file")
+ (rmdir "./nested/relative/subdirectory")
+ (rmdir "./nested/relative")
+ (rmdir "./nested"))
+ ok)))
+
+ (pass-if "Absolute recursive mkdir creates the chain of directories"
+ (let ((dir (string-append %temporary-directory "/nested/absolute/subdirectory")))
+ (mkdir dir #o777 dir #t)
+ (let ((ok
+ (catch #t
+ (lambda ()
+ (with-output-to-file (string-append dir "/file")
+ (lambda ()
+ (display "The directories have been created!")
+ #t)))
+ (lambda (error . args)
+ #f))))
+ (when ok
+ (delete-file (string-append dir "/file"))
+ (rmdir (string-append %temporary-directory "/nested/absolute/subdirectory"))
+ (rmdir (string-append %temporary-directory "/nested/absolute"))
+ (rmdir (string-append %temporary-directory "/nested")))
+ ok))))
+
(delete-file (test-file))
;;; Local Variables:
--
2.28.0
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [bug#44130] [PATCH] Add a recursive version of mkdir-p
2020-10-23 19:36 ` [bug#44130] " zimoun
2020-10-23 22:00 ` [bug#44130] Recursive mkdir divoplade
@ 2020-10-23 22:11 ` divoplade
1 sibling, 0 replies; 10+ messages in thread
From: divoplade @ 2020-10-23 22:11 UTC (permalink / raw)
To: zimoun; +Cc: 44130
Le vendredi 23 octobre 2020 à 21:36 +0200, zimoun a écrit :
> salut,
>
> On Thu, 22 Oct 2020 at 01:29, divoplade <d@divoplade.fr> wrote:
>
> > 1. Lobby guile to provide this function out of the box (this will
> > take
> > time);
>
> This path seems the one to go. It will take less time than running
> Guile on Windows. ;-)
>
> The only issue is that your code will depend on Guile 3.0.x where
> x>4.
>
> Otherwise, why is it not possible to send a patch to Guile?
The discussion continues here, in order to send the desired patch to
guile: 44186@debbugs.gnu.org
^ permalink raw reply [flat|nested] 10+ messages in thread
* bug#44130: [PATCH] Add a recursive version of mkdir-p
2020-10-23 17:12 ` divoplade
@ 2020-10-26 16:57 ` Ludovic Courtès
0 siblings, 0 replies; 10+ messages in thread
From: Ludovic Courtès @ 2020-10-26 16:57 UTC (permalink / raw)
To: divoplade; +Cc: 44130-done
[-- Attachment #1: Type: text/plain, Size: 1305 bytes --]
Hello!
divoplade <d@divoplade.fr> skribis:
> Le vendredi 23 octobre 2020 à 18:37 +0200, Ludovic Courtès a écrit :
>>
>> What I was questioning is the temptation to make one-function
>> packages
>> as is common for instance in npm.
>
> Ah, so I can summarize. My solutions are:
>
> 1. Guile provides mkdir-p: Perfect!
Yes, we can work towards that goal.
> 2. I put the function in a package: not great, but acceptable.
> 3. I depend on gash: not acceptable, there's only mkdir-p that's
> interesting, the rest is for advanced system tools.
> 4. I copy that function around: not acceptable.
I agree that #4 is suboptimal, but I think you’re overstating it.
> So, there's no temptation to make one-function packages.
Well… :-)
> Should I understand that you question the integration of one-function
> packages into guix? If you don't want it in guix, then it's fine, I can
> just use it only for myself, I have my own channel. In which case,
> please just say so, so we can all move on to more interesting things.
No no, like I wrote, I’m fine adding the ‘mkdir-p’ package, no problem;
the project currently has no guideline against one-function packages.
Anyway, I’ve applied the patch with the cosmetic changes below.
Thanks!
Ludo’.
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: Type: text/x-patch, Size: 2002 bytes --]
diff --git a/gnu/packages/guile-xyz.scm b/gnu/packages/guile-xyz.scm
index e3f547412b..d09e8d9737 100644
--- a/gnu/packages/guile-xyz.scm
+++ b/gnu/packages/guile-xyz.scm
@@ -4016,12 +4016,14 @@ errors.")
(method git-fetch)
(uri (git-reference
(url "https://code.divoplade.fr/mkdir-p.git")
- (commit "83e955ba612369336a69fe50fe023ad14fbe5d7c")))
- (sha256 (base32 "01k20rjcv6p0spmw8ls776aar6bfw0jxw46d2n12w0cb2p79xjv8"))
+ (commit (string-append "v" version))))
+ (sha256
+ (base32 "01k20rjcv6p0spmw8ls776aar6bfw0jxw46d2n12w0cb2p79xjv8"))
+ (file-name (git-file-name name version))
(snippet
`(begin
(with-output-to-file ".tarball-version"
- (lambda _ (format #t "~a~%" "1.0.1")))
+ (lambda _ (format #t "~a~%" ,version)))
#t))))
(build-system gnu-build-system)
(arguments `())
@@ -4034,14 +4036,12 @@ errors.")
("pkg-config" ,pkg-config)
("gettext" ,gnu-gettext)))
(inputs `(("guile" ,guile-3.0)))
- (propagated-inputs
- `(("guile" ,guile-3.0)))
- (synopsis "Implementation of a recursive mkdir for guile")
+ (synopsis "Implementation of a recursive @code{mkdir} for Guile")
(description
- "This package provides within the (mkdir-p) module the mkdir-p function
-that tries to create the chain of directories recursively. It also provides
-new versions of open-output-file, call-with-output-file and
-with-output-to-file to create the directory of its argument if it does not
-exist.")
+ "This package provides within the @code{(mkdir-p)} module the
+@code{mkdir-p} function that tries to create the chain of directories
+recursively. It also provides new versions of @code{open-output-file},
+@code{call-with-output-file} and @code{with-output-to-file} to create the
+directory of its argument if it does not exist.")
(home-page "https://mkdir-p.divoplade.fr")
(license license:asl2.0)))
^ permalink raw reply related [flat|nested] 10+ messages in thread
end of thread, other threads:[~2020-10-26 16:58 UTC | newest]
Thread overview: 10+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2020-10-21 23:29 [bug#44130] [PATCH] Add a recursive version of mkdir-p divoplade
2020-10-23 13:12 ` Ludovic Courtès
2020-10-23 14:14 ` divoplade
2020-10-23 16:37 ` Ludovic Courtès
2020-10-23 17:12 ` divoplade
2020-10-26 16:57 ` bug#44130: " Ludovic Courtès
2020-10-23 19:36 ` [bug#44130] " zimoun
2020-10-23 22:00 ` [bug#44130] Recursive mkdir divoplade
2020-10-23 22:11 ` [bug#44130] [PATCH] Add a recursive version of mkdir-p divoplade
2020-10-23 20:01 ` Leo Prikler
Code repositories for project(s) associated with this public inbox
https://git.savannah.gnu.org/cgit/guix.git
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 read-only IMAP folder(s) and NNTP newsgroup(s).