Add support for updating const's defined in Nim source files.

This commit is contained in:
Jonathan Bernard
2025-06-15 05:10:59 -05:00
parent f5c641c1b0
commit f3ac85c834
2 changed files with 45 additions and 14 deletions
+44 -13
View File
@@ -57,10 +57,11 @@ Details:
Specifically it uses the following regexes:
TODO
Nim: ^\s*const\s+\S*VERSION\S*\*?\s*=\s*"(<old-version>)"\s*$
Node: ^\s*export\s+const\s+\S*VERSION\S*\s*=\s*"(<old-version>)"\s*;?$
"""
const UV_VERSION = "1.0.0"
const UV_VERSION = "1.0.2"
type
LangType = enum lNim, lNode
@@ -85,9 +86,13 @@ type PackageVersion = object
# See also:
# https://regex101.com/r/Ly7O1x/3/
#
let SemVerPattern =
let SemVerRegex =
re"^(?P<major>0|[1-9]\d*)\.(?P<minor>0|[1-9]\d*)\.(?P<patch>0|[1-9]\d*)(?:-(?P<prerelease>(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+(?P<buildmetadata>[0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$"
let NimConstPattern = "^\\s*const\\s+\\S*VERSION\\S*\\*?\\s*=\\s*\"($#)\"\\s*$"
let NodeConstPattern =
"^\\s*export\\s+const\\s+\\S*VERSION\\S*\\s*=\\s*\"($#)\"\\s*;?$"
proc parseNimblePackage(dir: Path): PackageVersion =
result = PackageVersion(lang: lNim)
@@ -146,6 +151,25 @@ proc writePackage(pkg: PackageVersion) =
writeFile($pkg.file, pkg.nodePackage.pretty)
proc replaceVersionInFile(file: Path, pkg: PackageVersion, vOld: string) =
let rgx =
case pkg.lang
of lNim: re(NimConstPattern % [vOld.replace(".", "\\.")])
of lNode: re(NodeConstPattern % [vOld.replace(".", "\\.")])
var newLines = newSeq[string]()
for l in lines($file):
let mOpt = l.match(rgx)
if mOpt.isSome:
let m = mOpt.get
newLines.add(
l[0..<m.captureBounds[0].a] &
pkg.version &
l[m.captureBounds[0].b+1 .. ^1])
else: newLines.add(l)
writeFile($file, newLines.join("\p"))
proc incrementLastVersionPart(version: string): string =
let versionParts = toSeq(findIter(version, re"([^\d.]+)?\.?(\d+)"))
let lastVersionPartMatch = versionParts[^1]
@@ -171,7 +195,7 @@ proc incrementSemverPart(
result = ""
let matchOpt = match(version, SemVerPattern)
let matchOpt = match(version, SemVerRegex)
if matchOpt.isNone:
raise newException(ValueError,
@@ -241,6 +265,8 @@ when isMainModule:
else:
detectAndParsePackage(dir)
let oldVersion = pkg.version
if args["bump"]:
if $args["<part>"] == "last":
pkg.version = incrementLastVersionPart(pkg.version)
@@ -249,10 +275,18 @@ when isMainModule:
pkg.version = incrementSemverPart(pkg.version, part)
writePackage(pkg)
for filePath in args["<src-file>"]:
replaceVersionInFile(Path(filePath), pkg, oldVersion)
echo pkg.version
elif args["set"]:
pkg.version = $args["<new-version>"]
for filePath in args["<src-file>"]:
replaceVersionInFile(Path(filePath), pkg, oldVersion)
writePackage(pkg)
echo pkg.version
@@ -260,21 +294,18 @@ when isMainModule:
elif args["interactive"]:
var acceptNewVersion = false
var newVersion = pkg.version
while not acceptNewVersion:
stdout.writeLine "Current version is " & pkg.version
stdout.writeLine "Current version is " & oldVersion
stdout.write "New version? "
newVersion = stdin.readLine
pkg.version = stdin.readLine
stdout.write "New version will be set to '" & pkg.version & "'. Is this correct (yes/no)? "
let isCorrect = stdin.readLine
let acceptNewVersion = "yes".startsWith(isCorrect.toLower)
acceptNewVersion = "yes".startsWith(isCorrect.toLower)
pkg.version = newVersion
echo "Updating version definition in " & $pkg.file
writePackage(pkg)
# TODO:
# for f in filesToUpdate:
# echo "Updating version definition in " & $f
# updateVersionInFile(f)
for filePath in args["<src-file>"]:
echo "Updating version definition in " & $filePath
replaceVersionInFile(Path(filePath), pkg, oldVersion)