-
Notifications
You must be signed in to change notification settings - Fork 12
/
Copy pathstorage_and_import.nim
189 lines (159 loc) · 6.01 KB
/
storage_and_import.nim
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
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
import
std/[os, json, strutils, strformat, sets, algorithm],
../../common/[trace_index, lang, types, paths],
../utilities/git,
../online_sharing/security_upload,
json_serialization
proc storeTraceFiles(paths: seq[string], traceFolder: string, lang: Lang) =
let filesFolder = traceFolder / "files"
createDir(filesFolder)
var sourcePaths = paths
if lang == LangNoir:
var baseFolder = ""
for path in paths:
if path.len > 0 and path.startsWith('/'):
let originalFolder = path.parentDir
if baseFolder.len == 0 or baseFolder.len > originalFolder.len and
baseFolder.startsWith(originalFolder):
baseFolder = originalFolder
# assuming or at least trying for something like `<noir-project>/src/`
if baseFolder.lastPathPart == "src":
baseFolder = baseFolder.parentDir
# adding baseFolder : if the top level of the noir project, hoping
# that we copy Prover.toml, Nargo.toml, readme etc
for pathData in walkDir(baseFolder):
if pathData.kind == pcFile:
sourcePaths.add(pathData.path)
# echo baseFolder, " ", sourcePaths
for path in sourcePaths:
if path.len > 0:
# echo "store path ", path
let traceFilePath = filesFolder / path
let traceFileFolder = traceFilePath.parentDir
try:
# echo "create ", traceFileFolder
createDir(traceFileFolder)
# echo "copy to ", traceFilePath
copyFile(path, traceFilePath)
except CatchableError as e:
echo fmt"WARNING: trying to copy trace file {path} error: ", e.msg
echo " skipping copying that file"
proc processSourceFoldersList*(folderSet: HashSet[string], programDir: string = ""): seq[string] =
var folders: seq[string] = @[]
let gitRoot = getGitTopLevel(programDir)
var i = 0
for potentialChild in folderSet:
var ok = true
# e.g. generated_not_to_break_here/ or relative/
if potentialChild.len == 0 or potentialChild[0] != '/':
ok = false
else:
var k = 0
for potentialParent in folderSet:
if i != k and potentialChild.startsWith(potentialParent):
ok = false
break
k += 1
if ok and not potentialChild.startsWith(gitRoot):
folders.add(potentialChild)
i += 1
# Add Git repository roots to the final result
if gitRoot != "":
folders.add(gitRoot)
if folders.len == 0:
folders.add(getAppFilename().parentDir)
# based on https://stackoverflow.com/a/24867480/438099
# credit to @DrCopyPaste https://stackoverflow.com/users/2186023/drcopypaste
var sortedFolders = sorted(folders)
result = sortedFolders
proc importDbTrace*(
traceMetadataPath: string,
traceIdArg: int,
lang: Lang = LangNoir,
selfContained: bool = true,
downloadKey: string = ""
): Trace =
let rawTraceMetadata = readFile(traceMetadataPath)
let untypedJson = parseJson(rawTraceMetadata)
let program = untypedJson{"program"}.getStr()
let args = untypedJson{"args"}.getStr().splitLines()
let workdir = untypedJson{"workdir"}.getStr()
let traceID = if traceIdArg != NO_TRACE_ID:
traceIdArg
else:
trace_index.newId(test=false)
let traceFolder = traceMetadataPath.parentDir
let tracePathsPath = traceFolder / "trace_paths.json"
let tracePath = traceFolder / "trace.json"
let outputFolder = fmt"{codetracerTraceDir}/trace-{traceID}/"
if traceIdArg == NO_TRACE_ID:
createDir(outputFolder)
copyFile(traceMetadataPath, outputFolder / "trace_metadata.json")
try:
copyFile(tracePathsPath, outputFolder / "trace_paths.json")
except CatchableError as e:
echo "WARNING: probably no trace_paths.json: no self-contained support in this case:"
echo " ", e.msg
echo " skipping trace_paths file"
copyFile(tracePath, outputFolder / "trace.json")
var rawPaths: string
try:
rawPaths = readFile(tracePathsPath)
except CatchableError as e:
echo "warn: probably no trace_paths.json: no self-contained support for now:"
echo " ", e.msg
echo " skipping trace_paths file"
var paths: seq[string] = @[]
if rawPaths.len > 0:
paths = Json.decode(rawPaths, seq[string])
if selfContained:
# for now assuming it happens on the original machine
# when the source files are still available and unchanged
if paths.len > 0:
storeTraceFiles(paths, outputFolder, lang)
var sourceFoldersInitialSet = initHashSet[string]()
for path in paths:
if path.len > 0 and path.startsWith('/'):
sourceFoldersInitialSet.incl(path.parentDir)
let sourceFolders = processSourceFoldersList(sourceFoldersInitialSet, workdir)
# echo sourceFolders
let sourceFoldersText = sourceFolders.join(" ")
trace_index.recordTrace(
traceID,
program = program,
args = args,
compileCommand = "",
env = "",
workdir = workdir,
lang = lang,
sourceFolders = sourceFoldersText,
lowLevelFolder = "",
outputFolder = outputFolder,
test = false,
imported = selfContained,
shellID = -1,
rrPid = -1,
exitCode = -1,
calltrace = true,
# for now always use FullRecord for db-backend
# and ignore possible env var override
calltraceMode = CalltraceMode.FullRecord,
downloadKey = downloadKey)
proc uploadTrace*(trace: Trace) =
let outputZip = trace.outputFolder / "tmp.zip"
let aesKey = generateSecurePassword()
zipFileWithEncryption(trace.outputFolder, outputZip, aesKey)
let (output, exitCode) = uploadEncyptedZip(outputZip)
let jsonMessage = parseJson(output)
let downloadKey = trace.program & "//" & jsonMessage["DownloadId"].getStr("") & "//" & aesKey
if jsonMessage["DownloadId"].getStr("") notin @["", "Errored"]:
updateField(trace.id, "remoteShareDownloadId", downloadKey, false)
updateField(trace.id, "remoteShareControlId", jsonMessage["ControlId"].getStr(""), false)
updateField(trace.id, "remoteShareExpireTime", jsonMessage["Expires"].getInt(), false)
echo downloadKey
echo jsonMessage["ControlId"].getStr("")
echo jsonMessage["Expires"].getInt()
else:
echo downloadKey
removeFile(outputZip & ".enc")
quit(exitCode)