-
Notifications
You must be signed in to change notification settings - Fork 62
/
file_system_link.gd
109 lines (92 loc) · 3.19 KB
/
file_system_link.gd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
class_name FileSystemLink
extends Reference
# author: willnationsdev
# description: A utility for creating links (file/directory, symbolic/hard).
# API details:
# - All methods' parameters are ordered in Unix fashion, {<target>,<linkpath>}
# - Methods are aliased so that the parameters are implied by the method name.
enum LinkTypes {
SOFT,
HARD
}
enum TargetTypes {
FILE,
DIR,
WINDOWS_JUNCTION
}
static func mk_hard_file(p_target: String, p_linkpath: String = "") -> int:
return _make_link(p_target, p_linkpath, TargetTypes.FILE, LinkTypes.HARD)
static func mk_soft_file(p_target: String, p_linkpath: String = "") -> int:
return _make_link(p_target, p_linkpath, TargetTypes.FILE, LinkTypes.SOFT)
static func mk_hard_dir(p_target: String, p_linkpath: String = "") -> int:
return _make_link(p_target, p_linkpath, TargetTypes.DIR, LinkTypes.HARD)
static func mk_soft_dir(p_target: String, p_linkpath: String = "") -> int:
return _make_link(p_target, p_linkpath, TargetTypes.DIR, LinkTypes.SOFT)
static func mk_windows_junction(p_target: String, p_linkpath: String = "") -> int:
return _make_link(p_target, p_linkpath, TargetTypes.WINDOWS_JUNCTION, LinkTypes.SOFT)
static func _make_link(p_target: String, p_linkpath: String = "", p_target_type = TargetTypes.FILE, p_link_type: int = LinkTypes.SOFT) -> int:
var params := PoolStringArray()
var dir := Directory.new()
var output := []
var target := ProjectSettings.globalize_path(p_target)
var linkpath := ProjectSettings.globalize_path(p_linkpath)
match p_target_type:
TargetTypes.FILE:
if not dir.file_exists(target):
return ERR_FILE_NOT_FOUND
TargetTypes.DIR, TargetTypes.WINDOWS_JUNCTION:
if not dir.dir_exists(target):
return ERR_FILE_NOT_FOUND
match OS.get_name():
"Windows":
match p_link_type:
LinkTypes.SOFT:
pass
LinkTypes.HARD:
params.append("/H")
_:
printerr("Unknown link type passed to FileSystemLink.make_link: ", p_link_type)
return ERR_INVALID_PARAMETER
#warning-ignore:unreachable_code
match p_target_type:
TargetTypes.FILE:
pass
TargetTypes.DIR:
params.append("/D")
TargetTypes.WINDOWS_JUNCTION:
params.append("/J")
_:
printerr("Unknown target type passed to FileSystemLink.make_link: ", p_target_type)
return ERR_INVALID_PARAMETER
params.append(linkpath)
params.append(target)
#warning-ignore:return_value_discarded
OS.execute("mklink", params, true, output)
return OK
"X11", "OSX", "LinuxBSD":
match p_link_type:
LinkTypes.SOFT:
params.append("-s")
LinkTypes.HARD:
pass
_:
printerr("Unknown link type passed to FileSystemLink.make_link", p_link_type)
return ERR_INVALID_PARAMETER
match p_target_type:
TargetTypes.FILE:
pass
TargetTypes.DIR:
params.append("-d")
TargetTypes.WINDOWS_JUNCTION:
printerr("Junctions are a Windows feature")
return ERR_INVALID_PARAMETER
_:
printerr("Unknown target type passed to FileSystemLink.make_link: ", p_target_type)
return ERR_INVALID_PARAMETER
params.append(target)
params.append(linkpath)
#warning-ignore:return_value_discarded
OS.execute("ln", params, true, output)
return OK
_:
return ERR_UNAVAILABLE