Store vcs revision in metadata

This commit is contained in:
Yuriy Glukhov 2016-09-21 13:58:07 +03:00
commit f29f21d2e0

View file

@ -326,11 +326,14 @@ proc buildFromDir(pkgInfo: PackageInfo, paths: seq[string], forRelease: bool) =
raise newException(BuildFailed, "Build failed for package: " &
pkgInfo.name)
proc saveNimbleMeta(pkgDestDir, url: string, filesInstalled: HashSet[string]) =
proc saveNimbleMeta(pkgDestDir, url, vcsRevision: string, filesInstalled: HashSet[string]) =
var nimblemeta = %{"url": %url}
nimblemeta["files"] = newJArray()
if not vcsRevision.isNil:
nimblemeta["vcsRevision"] = %vcsRevision
let files = newJArray()
nimblemeta["files"] = files
for file in filesInstalled:
nimblemeta["files"].add(%changeRoot(pkgDestDir, "", file))
files.add(%changeRoot(pkgDestDir, "", file))
writeFile(pkgDestDir / "nimblemeta.json", $nimblemeta)
proc removePkgDir(dir: string, options: Options) =
@ -358,6 +361,23 @@ proc removePkgDir(dir: string, options: Options) =
quit(QuitSuccess)
removeDir(dir)
proc vcsRevisionInDir(dir: string): string =
## Returns current revision number of HEAD if dir is inside VCS, or nil in
## case of failure.
var cmd = ""
if dirExists(dir / ".git"):
cmd = "git -C " & quoteShell(dir) & " rev-parse HEAD"
elif dirExists(dir / ".hg"):
cmd = "hg --cwd " & quoteShell(dir) & " id -i"
if cmd.len > 0:
try:
let res = doCmdEx(cmd)
if res.exitCode == 0:
result = string(res.output).strip()
except:
discard
proc installFromDir(dir: string, latest: bool, options: Options,
url: string): tuple[paths: seq[string], pkg: PackageInfo] =
## Returns where package has been installed to, together with paths
@ -458,8 +478,10 @@ proc installFromDir(dir: string, latest: bool, options: Options,
filesInstalled = copyFilesRec(realDir, realDir, pkgDestDir, options,
pkgInfo)
let vcsRevision = vcsRevisionInDir(realDir)
# Save a nimblemeta.json file.
saveNimbleMeta(pkgDestDir, url, filesInstalled)
saveNimbleMeta(pkgDestDir, url, vcsRevision, filesInstalled)
# Save the nimble data (which might now contain reverse deps added in
# processDeps).