2008-02-29 01:10:37 -05:00
|
|
|
! Copyright (C) 2008 Doug Coleman.
|
|
|
|
! See http://factorcode.org/license.txt for BSD license.
|
2016-03-18 13:57:54 -04:00
|
|
|
USING: combinators continuations fry io.backend io.directories
|
|
|
|
io.directories.hierarchy io.pathnames kernel locals namespaces
|
|
|
|
random.data sequences system vocabs ;
|
2008-02-29 01:10:37 -05:00
|
|
|
IN: io.files.unique
|
|
|
|
|
2016-03-18 13:57:54 -04:00
|
|
|
<PRIVATE
|
|
|
|
|
2009-01-26 16:05:15 -05:00
|
|
|
HOOK: (touch-unique-file) io-backend ( path -- )
|
|
|
|
|
2016-03-18 13:57:54 -04:00
|
|
|
PRIVATE>
|
2009-01-26 16:05:15 -05:00
|
|
|
|
2016-03-18 13:57:54 -04:00
|
|
|
: touch-unique-file ( path -- )
|
|
|
|
normalize-path (touch-unique-file) ;
|
2008-12-08 22:32:36 -05:00
|
|
|
|
2008-11-28 17:14:55 -05:00
|
|
|
SYMBOL: unique-length
|
|
|
|
SYMBOL: unique-retries
|
|
|
|
|
|
|
|
10 unique-length set-global
|
|
|
|
10 unique-retries set-global
|
|
|
|
|
2008-02-29 01:10:37 -05:00
|
|
|
<PRIVATE
|
2008-11-28 17:14:55 -05:00
|
|
|
|
2010-09-19 14:29:43 -04:00
|
|
|
: random-file-name ( -- string )
|
|
|
|
unique-length get random-string ;
|
2008-02-29 01:10:37 -05:00
|
|
|
|
2010-01-14 10:10:13 -05:00
|
|
|
: retry ( quot: ( -- ? ) n -- )
|
2017-06-01 17:59:35 -04:00
|
|
|
<iota> swap [ drop ] prepose attempt-all ; inline
|
2009-05-08 01:20:54 -04:00
|
|
|
|
2016-03-18 13:57:54 -04:00
|
|
|
PRIVATE>
|
|
|
|
|
|
|
|
: unique-file ( prefix suffix -- path )
|
2008-12-08 22:32:36 -05:00
|
|
|
'[
|
2016-03-18 19:54:02 -04:00
|
|
|
_ _ random-file-name glue
|
2008-12-08 22:32:36 -05:00
|
|
|
dup touch-unique-file
|
2016-03-18 19:54:02 -04:00
|
|
|
] unique-retries get retry absolute-path ;
|
2008-12-08 22:32:36 -05:00
|
|
|
|
2016-05-23 16:17:29 -04:00
|
|
|
: unique-files ( prefix suffixes -- paths )
|
|
|
|
'[
|
2016-05-26 17:03:12 -04:00
|
|
|
V{ } clone [
|
|
|
|
_ _ random-file-name '[
|
|
|
|
_ glue
|
|
|
|
dup touch-unique-file suffix!
|
|
|
|
] with each { } like
|
|
|
|
] [
|
|
|
|
[ [ delete-file ] each ] [ rethrow ] bi*
|
|
|
|
] recover
|
2016-05-23 16:17:29 -04:00
|
|
|
] unique-retries get retry [ absolute-path ] map ;
|
|
|
|
|
2016-03-19 16:03:15 -04:00
|
|
|
:: cleanup-unique-file ( ..a prefix suffix quot: ( ..a path -- ..b ) -- ..b )
|
2016-03-18 13:57:54 -04:00
|
|
|
prefix suffix unique-file :> path
|
|
|
|
[ path quot call ] [ path delete-file ] [ ] cleanup ; inline
|
2008-02-29 01:10:37 -05:00
|
|
|
|
2016-05-25 20:44:13 -04:00
|
|
|
:: cleanup-unique-files ( ..a prefix suffixes quot: ( ..a paths -- ..b ) -- ..b )
|
2016-05-23 16:17:29 -04:00
|
|
|
prefix suffixes unique-files :> paths
|
|
|
|
[ paths quot call ] [ paths [ delete-file ] each ] [ ] cleanup ; inline
|
|
|
|
|
2009-01-26 16:05:15 -05:00
|
|
|
: unique-directory ( -- path )
|
2008-02-29 01:10:37 -05:00
|
|
|
[
|
2016-03-18 19:54:02 -04:00
|
|
|
random-file-name
|
2008-02-29 01:10:37 -05:00
|
|
|
dup make-directory
|
2016-03-18 19:54:02 -04:00
|
|
|
] unique-retries get retry absolute-path ;
|
2008-02-29 01:10:37 -05:00
|
|
|
|
2016-03-18 13:57:54 -04:00
|
|
|
:: with-unique-directory ( quot -- path )
|
|
|
|
unique-directory :> path
|
|
|
|
path quot with-directory
|
|
|
|
path ; inline
|
2010-03-24 18:52:28 -04:00
|
|
|
|
2016-03-18 13:57:54 -04:00
|
|
|
:: cleanup-unique-directory ( quot -- )
|
2010-06-11 17:54:30 -04:00
|
|
|
unique-directory :> path
|
2016-03-18 13:57:54 -04:00
|
|
|
[ path quot with-directory ]
|
|
|
|
[ path delete-tree ] [ ] cleanup ; inline
|
2009-10-15 16:28:35 -04:00
|
|
|
|
2008-02-29 18:44:53 -05:00
|
|
|
{
|
2008-12-14 21:03:00 -05:00
|
|
|
{ [ os unix? ] [ "io.files.unique.unix" ] }
|
|
|
|
{ [ os windows? ] [ "io.files.unique.windows" ] }
|
2008-02-29 18:44:53 -05:00
|
|
|
} cond require
|