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: 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 type
LangType = enum lNim, lNode LangType = enum lNim, lNode
@@ -85,9 +86,13 @@ type PackageVersion = object
# See also: # See also:
# https://regex101.com/r/Ly7O1x/3/ # 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-]+)*))?$" 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 = proc parseNimblePackage(dir: Path): PackageVersion =
result = PackageVersion(lang: lNim) result = PackageVersion(lang: lNim)
@@ -146,6 +151,25 @@ proc writePackage(pkg: PackageVersion) =
writeFile($pkg.file, pkg.nodePackage.pretty) 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 = proc incrementLastVersionPart(version: string): string =
let versionParts = toSeq(findIter(version, re"([^\d.]+)?\.?(\d+)")) let versionParts = toSeq(findIter(version, re"([^\d.]+)?\.?(\d+)"))
let lastVersionPartMatch = versionParts[^1] let lastVersionPartMatch = versionParts[^1]
@@ -171,7 +195,7 @@ proc incrementSemverPart(
result = "" result = ""
let matchOpt = match(version, SemVerPattern) let matchOpt = match(version, SemVerRegex)
if matchOpt.isNone: if matchOpt.isNone:
raise newException(ValueError, raise newException(ValueError,
@@ -241,6 +265,8 @@ when isMainModule:
else: else:
detectAndParsePackage(dir) detectAndParsePackage(dir)
let oldVersion = pkg.version
if args["bump"]: if args["bump"]:
if $args["<part>"] == "last": if $args["<part>"] == "last":
pkg.version = incrementLastVersionPart(pkg.version) pkg.version = incrementLastVersionPart(pkg.version)
@@ -249,10 +275,18 @@ when isMainModule:
pkg.version = incrementSemverPart(pkg.version, part) pkg.version = incrementSemverPart(pkg.version, part)
writePackage(pkg) writePackage(pkg)
for filePath in args["<src-file>"]:
replaceVersionInFile(Path(filePath), pkg, oldVersion)
echo pkg.version echo pkg.version
elif args["set"]: elif args["set"]:
pkg.version = $args["<new-version>"] pkg.version = $args["<new-version>"]
for filePath in args["<src-file>"]:
replaceVersionInFile(Path(filePath), pkg, oldVersion)
writePackage(pkg) writePackage(pkg)
echo pkg.version echo pkg.version
@@ -260,21 +294,18 @@ when isMainModule:
elif args["interactive"]: elif args["interactive"]:
var acceptNewVersion = false var acceptNewVersion = false
var newVersion = pkg.version
while not acceptNewVersion: while not acceptNewVersion:
stdout.writeLine "Current version is " & pkg.version stdout.writeLine "Current version is " & oldVersion
stdout.write "New version? " 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)? " stdout.write "New version will be set to '" & pkg.version & "'. Is this correct (yes/no)? "
let isCorrect = stdin.readLine 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 echo "Updating version definition in " & $pkg.file
writePackage(pkg) writePackage(pkg)
# TODO: for filePath in args["<src-file>"]:
# for f in filesToUpdate: echo "Updating version definition in " & $filePath
# echo "Updating version definition in " & $f replaceVersionInFile(Path(filePath), pkg, oldVersion)
# updateVersionInFile(f)
+1 -1
View File
@@ -1,6 +1,6 @@
# Package # Package
version = "1.0.1" version = "1.0.2"
author = "Jonathan Bernard" author = "Jonathan Bernard"
description = "Small util to update version consistently for nim and node packages." description = "Small util to update version consistently for nim and node packages."
license = "MIT" license = "MIT"