Skip to content

Commit 0657e4a

Browse files
authored
Merge pull request #4276 from unisonweb/tmpdir
cloud jit: implement createTempDirectory removeDirectory createDirectory renameFile isFileOpen ready
2 parents 8c04aec + 0d6796c commit 0657e4a

File tree

4 files changed

+112
-9
lines changed

4 files changed

+112
-9
lines changed

scheme-libs/racket/unison/io-handles.rkt

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -45,17 +45,16 @@
4545
getArgs.impl.v1
4646
getEnv.impl.v1
4747
getChar.impl.v1
48+
isFileOpen.impl.v3
4849
process.call
4950
getCurrentDirectory.impl.v3
51+
ready.impl.v1
5052
))
5153

5254
; Still to implement:
5355
; handlePosition.impl.v3
5456
; isSeekable.impl.v3
5557
; getChar.impl.v1
56-
; ready.impl.v1
57-
; isFileOpen.impl.v3
58-
; isFileEOF.impl.v3
5958
)
6059

6160
; typeLink msg any
@@ -64,6 +63,17 @@
6463
[x8 (unison-failure-failure typeLink message x7)])
6564
(unison-either-left x8)))
6665

66+
(define-unison (isFileOpen.impl.v3 port)
67+
(unison-either-right
68+
(if (port-closed? port) unison-boolean-false unison-boolean-true)))
69+
70+
(define-unison (ready.impl.v1 port)
71+
(if (byte-ready? port)
72+
(unison-either-right unison-boolean-true)
73+
(if (port-eof? port)
74+
(Exception 'IO "EOF" port)
75+
(unison-either-right unison-boolean-false))))
76+
6777
(define-unison (getCurrentDirectory.impl.v3 unit)
6878
(unison-either-right
6979
(string->chunked-string (path->string (current-directory)))))

scheme-libs/racket/unison/io.rkt

Lines changed: 40 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,14 @@
22
(require unison/data
33
unison/chunked-seq
44
unison/core
5+
unison/data-info
6+
racket/file
57
racket/flonum
8+
(only-in unison/boot data-case define-unison)
69
(only-in
710
rnrs/arithmetic/flonums-6
811
flmod))
12+
(require racket/file)
913

1014
(provide
1115
(prefix-out
@@ -24,7 +28,14 @@
2428
getFileTimestamp.impl.v3
2529
getTempDirectory.impl.v3
2630
removeFile.impl.v3
27-
getFileSize.impl.v3)))
31+
getFileSize.impl.v3))
32+
(prefix-out
33+
builtin-IO.
34+
(combine-out
35+
renameFile.impl.v3
36+
createDirectory.impl.v3
37+
removeDirectory.impl.v3
38+
createTempDirectory.impl.v3)))
2839

2940
(define (getFileSize.impl.v3 path)
3041
(with-handlers
@@ -36,8 +47,13 @@
3647
[[exn:fail:filesystem? (lambda (e) (exception "IOFailure" (exception->string e) '()))]]
3748
(right (file-or-directory-modify-seconds (chunked-string->string path)))))
3849

50+
; in haskell, it's not just file but also directory
3951
(define (fileExists.impl.v3 path)
40-
(right (bool (file-exists? (chunked-string->string path)))))
52+
(let ([path-string (chunked-string->string path)])
53+
(right (bool
54+
(or
55+
(file-exists? path-string)
56+
(directory-exists? path-string))))))
4157

4258
(define (removeFile.impl.v3 path)
4359
(delete-file (chunked-string->string path))
@@ -46,6 +62,27 @@
4662
(define (getTempDirectory.impl.v3)
4763
(right (string->chunked-string (path->string (find-system-path 'temp-dir)))))
4864

65+
(define-unison (createTempDirectory.impl.v3 prefix)
66+
(unison-either-right
67+
(string->chunked-string
68+
(path->string
69+
(make-temporary-directory*
70+
(string->bytes/utf-8
71+
(chunked-string->string prefix)) #"")))))
72+
73+
(define-unison (createDirectory.impl.v3 file)
74+
(make-directory (chunked-string->string file))
75+
(unison-either-right none))
76+
77+
(define-unison (removeDirectory.impl.v3 file)
78+
(delete-directory (chunked-string->string file))
79+
(unison-either-right none))
80+
81+
(define-unison (renameFile.impl.v3 old new)
82+
(rename-file-or-directory (chunked-string->string old)
83+
(chunked-string->string new))
84+
(unison-either-right none))
85+
4986
(define (threadCPUTime.v1)
5087
(right (current-process-milliseconds (current-thread))))
5188
(define (processCPUTime.v1)
@@ -55,7 +92,7 @@
5592
(define (monotonic.v1)
5693
(right (current-inexact-monotonic-milliseconds)))
5794

58-
;
95+
;
5996
(define (flt f) (fl->exact-integer (fltruncate f)))
6097

6198
(define (sec.v1 ts) (flt (/ ts 1000)))

scheme-libs/racket/unison/primops.ss

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,12 +72,19 @@
7272
builtin-IO.setBuffering.impl.v3
7373
builtin-IO.getBuffering.impl.v3
7474
builtin-IO.setEcho.impl.v1
75+
builtin-IO.isFileOpen.impl.v3
76+
builtin-IO.ready.impl.v1
7577
builtin-IO.process.call
7678
builtin-IO.getEcho.impl.v1
7779
builtin-IO.getArgs.impl.v1
7880
builtin-IO.getEnv.impl.v1
7981
builtin-IO.getChar.impl.v1
82+
builtin-IO.ready.impl.v1
8083
builtin-IO.getCurrentDirectory.impl.v3
84+
builtin-IO.removeDirectory.impl.v3
85+
builtin-IO.renameFile.impl.v3
86+
builtin-IO.createTempDirectory.impl.v3
87+
builtin-IO.createDirectory.impl.v3
8188
unison-FOp-IO.getFileSize.impl.v3
8289
unison-FOp-IO.getFileTimestamp.impl.v3
8390
unison-FOp-IO.fileExists.impl.v3

unison-src/builtin-tests/io-tests.u

Lines changed: 52 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,16 +15,65 @@ io.tests = Tests.main do
1515
!io.test_getSomeBytes
1616
!io.test_getChar
1717
!io.test_getCurrentDirectory
18+
!io.test_createTempDirectory
19+
!io.test_renameFile
20+
!io.test_isFileOpen
21+
!io.test_ready
1822

19-
testFile = do
20-
fp = FilePath ((FilePath.toText !getTempDirectory) ++ "/unison-test")
21-
() = if FilePath.exists fp
23+
rm_if_exists fp =
24+
if FilePath.exists fp
2225
then
2326
removeFile fp
2427
else
2528
()
29+
30+
testFile = do
31+
fp = FilePath ((FilePath.toText !getTempDirectory) ++ "/unison-test")
32+
rm_if_exists fp
2633
fp
2734

35+
io.test_createTempDirectory = do
36+
tmp = (createTempDirectory (FilePath "prefix-"))
37+
match tmp with
38+
FilePath text -> if Text.contains "/prefix-" text then
39+
if exists tmp then
40+
removeDirectory tmp
41+
Tests.pass "Tmp directory exists and contains prefix-"
42+
else
43+
Tests.fail "Tmp directory doesn't exist" text
44+
else
45+
Tests.fail "Tmp directory doesn't contain prefix-" text
46+
47+
io.test_isFileOpen = do
48+
fp = FilePath ((FilePath.toText !getTempDirectory) ++ "/unison-test")
49+
fhandle = open fp Write
50+
open1 = isOpen fhandle
51+
Handle.close fhandle
52+
open2 = isOpen fhandle
53+
rm_if_exists fp
54+
checkEqual "opened handle is open" open1 true
55+
checkEqual "closed handle is not open" open2 false
56+
57+
io.test_ready = do
58+
fp = !testFile
59+
_ = writeFile fp "What"
60+
fhandle = open fp Read
61+
ready1 = ready fhandle
62+
checkEqual "handle with text ready is ready" ready1 true
63+
64+
io.test_renameFile = do
65+
fp = FilePath ((FilePath.toText !getTempDirectory) ++ "/unison-test")
66+
rmp = FilePath ((FilePath.toText !getTempDirectory) ++ "/unison-test-renamed")
67+
rm_if_exists fp
68+
rm_if_exists rmp
69+
contents = "a file contents"
70+
_ = writeFile fp contents
71+
renameFile fp rmp
72+
got = (getText (open rmp Read))
73+
rm_if_exists fp
74+
rm_if_exists rmp
75+
checkEqual "renameFile" contents got
76+
2877
writeFile fp txt =
2978
fh = open fp Write
3079
putText fh txt

0 commit comments

Comments
 (0)