58 lines
1.5 KiB
Nim
58 lines
1.5 KiB
Nim
# Copyright (C) Dominik Picheta. All rights reserved.
|
|
# BSD License. Look at license.txt for more info.
|
|
|
|
import tables, os, json
|
|
import version, sha1hashes, packageinfotypes
|
|
|
|
type
|
|
LockFileJsonKeys* = enum
|
|
lfjkVersion = "version"
|
|
lfjkPackages = "packages"
|
|
lfjkPkgVcsRevision = "vcsRevision"
|
|
lfjkTasks = "tasks"
|
|
|
|
const
|
|
lockFileVersion = 2
|
|
|
|
proc initLockFileDep*: LockFileDep =
|
|
result = LockFileDep(
|
|
version: notSetVersion,
|
|
vcsRevision: notSetSha1Hash,
|
|
checksums: Checksums(sha1: notSetSha1Hash))
|
|
|
|
const
|
|
notSetLockFileDep* = initLockFileDep()
|
|
|
|
proc writeLockFile*(fileName: string, packages: AllLockFileDeps) =
|
|
## Saves lock file on the disk in topologically sorted order of the
|
|
## dependencies.
|
|
|
|
let mainJsonNode = %{
|
|
$lfjkVersion: %lockFileVersion,
|
|
$lfjkPackages: %packages[noTask]
|
|
}
|
|
# Store task graph seperate
|
|
mainJsonNode[$lfjkTasks] = newJObject()
|
|
for task, deps in packages:
|
|
if task != noTask:
|
|
mainJsonNode[$lfjkTasks][task] = %deps
|
|
|
|
var s = mainJsonNode.pretty
|
|
s.add '\n'
|
|
writeFile(fileName, s)
|
|
|
|
proc readLockFile*(filePath: string): AllLockFileDeps =
|
|
{.warning[UnsafeDefault]: off.}
|
|
{.warning[ProveInit]: off.}
|
|
let data = parseFile(filePath)
|
|
result[noTask] = data[$lfjkPackages].to(LockFileDeps)
|
|
if $lfjkTasks in data:
|
|
for task, deps in data[$lfjkTasks]:
|
|
result[task] = deps.to(LockFileDeps)
|
|
{.warning[ProveInit]: on.}
|
|
{.warning[UnsafeDefault]: on.}
|
|
|
|
proc getLockedDependencies*(lockFile: string): AllLockFileDeps =
|
|
if lockFile.fileExists:
|
|
result = lockFile.readLockFile
|