nim_lk/src/nimblepkg/lockfile.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