sort directory lists so operations are independent of filesystem directory order
svn: r6930 original commit: 045b9e9ec7996991bf102fbbe99327463841f115
This commit is contained in:
parent
56c8cafc5b
commit
84e2fa4c84
|
@ -185,6 +185,14 @@
|
||||||
(cond [(and name (regexp-match #rx#"[.]([^.]+)$" name)) => cadr]
|
(cond [(and name (regexp-match #rx#"[.]([^.]+)$" name)) => cadr]
|
||||||
[else #f])))
|
[else #f])))
|
||||||
|
|
||||||
|
;; utility: sorted dirlist so functions are deterministic
|
||||||
|
(define/kw (sorted-dirlist . args)
|
||||||
|
(let* ([ps (apply directory-list args)]
|
||||||
|
[ps (map (lambda (p) (cons (path->string p) p)) ps)]
|
||||||
|
[ps (sort ps (lambda (p1 p2) (string<? (car p1) (car p2))))]
|
||||||
|
[ps (map cdr ps)])
|
||||||
|
ps))
|
||||||
|
|
||||||
(define (delete-directory/files path)
|
(define (delete-directory/files path)
|
||||||
(unless (path-string? path)
|
(unless (path-string? path)
|
||||||
(raise-type-error 'delete-directory/files "path or string" path))
|
(raise-type-error 'delete-directory/files "path or string" path))
|
||||||
|
@ -193,25 +201,24 @@
|
||||||
(delete-file path)]
|
(delete-file path)]
|
||||||
[(directory-exists? path)
|
[(directory-exists? path)
|
||||||
(for-each (lambda (e) (delete-directory/files (build-path path e)))
|
(for-each (lambda (e) (delete-directory/files (build-path path e)))
|
||||||
(directory-list path))
|
(sorted-dirlist path))
|
||||||
(delete-directory path)]
|
(delete-directory path)]
|
||||||
[else (error 'delete-directory/files
|
[else (error 'delete-directory/files
|
||||||
"encountered ~a, neither a file nor a directory"
|
"encountered ~a, neither a file nor a directory"
|
||||||
path)]))
|
path)]))
|
||||||
|
|
||||||
(define (copy-directory/files src dest)
|
(define (copy-directory/files src dest)
|
||||||
(cond
|
(cond [(file-exists? src)
|
||||||
[(file-exists? src)
|
(copy-file src dest)]
|
||||||
(copy-file src dest)]
|
[(directory-exists? src)
|
||||||
[(directory-exists? src)
|
(make-directory dest)
|
||||||
(make-directory dest)
|
(for-each (lambda (e)
|
||||||
(for-each (lambda (e)
|
(copy-directory/files (build-path src e)
|
||||||
(copy-directory/files (build-path src e)
|
(build-path dest e)))
|
||||||
(build-path dest e)))
|
(sorted-dirlist src))]
|
||||||
(directory-list src))]
|
[else (error 'copy-directory/files
|
||||||
[else (error 'copy-directory/files
|
"encountered ~a, neither a file nor a directory"
|
||||||
"encountered ~a, neither a file nor a directory"
|
src)]))
|
||||||
src)]))
|
|
||||||
|
|
||||||
(define (make-directory* dir)
|
(define (make-directory* dir)
|
||||||
(let-values ([(base name dir?) (split-path dir)])
|
(let-values ([(base name dir?) (split-path dir)])
|
||||||
|
@ -473,8 +480,7 @@
|
||||||
(case-lambda
|
(case-lambda
|
||||||
[(acc)
|
[(acc)
|
||||||
(do-paths (map (lambda (p) (build-path path p))
|
(do-paths (map (lambda (p) (build-path path p))
|
||||||
(sort
|
(sorted-dirlist path))
|
||||||
(directory-list path) void))
|
|
||||||
acc)]
|
acc)]
|
||||||
[(acc descend?)
|
[(acc descend?)
|
||||||
(if descend? (descend acc) acc)])])
|
(if descend? (descend acc) acc)])])
|
||||||
|
@ -485,7 +491,7 @@
|
||||||
(define (do-paths paths acc)
|
(define (do-paths paths acc)
|
||||||
(cond [(null? paths) acc]
|
(cond [(null? paths) acc]
|
||||||
[else (do-paths (cdr paths) (do-path (car paths) acc))]))
|
[else (do-paths (cdr paths) (do-path (car paths) acc))]))
|
||||||
(if path (do-path path init) (do-paths (directory-list) init)))
|
(if path (do-path path init) (do-paths (sorted-dirlist) init)))
|
||||||
|
|
||||||
(define/kw (find-files f #:optional [path #f])
|
(define/kw (find-files f #:optional [path #f])
|
||||||
(reverse!
|
(reverse!
|
||||||
|
|
Loading…
Reference in New Issue
Block a user