@@ -15,7 +15,7 @@ After we resolve nim, we try to resolve the dependencies for a root package. Roo
1515import std/ [sequtils, sets, options, os, strutils, tables, strformat, algorithm]
1616import nimblesat, packageinfotypes, options, version, declarativeparser, packageinfo, common,
1717 nimenv, lockfile, cli, downloadnim, packageparser, tools, nimscriptexecutor, packagemetadatafile,
18- displaymessages, packageinstaller, reversedeps, developfile, urls
18+ displaymessages, packageinstaller, reversedeps, developfile, urls, sha1hashes
1919
2020when defined (windows):
2121 import std/ strscans
@@ -658,10 +658,21 @@ proc packageExists(nimBin: string, pkgInfo: PackageInfo, options: Options):
658658 return some (oldPkgInfo)
659659
660660
661- proc installFromDirDownloadInfo (nimBin: string ,downloadDir: string , url: string , pv: PkgTuple , options: Options ): PackageInfo {.instrument .} =
661+ proc installFromDirDownloadInfo (nimBin: string ,downloadDir: string , url: string , pv: PkgTuple , options: Options ): PackageInfo {.instrument .} =
662662
663663 let dir = downloadDir
664664 var pkgInfo = getPkgInfo (dir, options, nimBin = nimBin)
665+
666+ # If we requested a specific VCS revision (verSpecial), ensure we use it as the checksum
667+ # This handles cases where getVcsRevision might have returned a stale value
668+ if pv.ver.kind == verSpecial:
669+ let speStr = $ pv.ver.spe
670+ let revStr = if speStr.startsWith (" #" ): speStr[1 ..^ 1 ] else : speStr
671+ let requestedRevision = initSha1Hash (revStr)
672+ if requestedRevision != notSetSha1Hash:
673+ pkgInfo.metaData.vcsRevision = requestedRevision
674+ pkgInfo.basicInfo.checksum = requestedRevision
675+
665676 var depsOptions = options
666677 depsOptions.depsOnly = false
667678
@@ -671,13 +682,26 @@ proc installFromDirDownloadInfo(nimBin: string,downloadDir: string, url: string,
671682
672683 let oldPkg = packageExists (nimBin, pkgInfo, options)
673684 if oldPkg.isSome:
674- # In the case we already have the same package in the cache then only merge
675- # the new package special versions to the old one.
676- displayWarning (pkgAlreadyExistsInTheCacheMsg (pkgInfo), MediumPriority )
677- var oldPkg = oldPkg.get
678- oldPkg.metaData.specialVersions.incl pkgInfo.metaData.specialVersions
679- saveMetaData (oldPkg.metaData, oldPkg.getNimbleFileDir, changeRoots = false )
680- return oldPkg
685+ # Check if checksums are different - if so, force reinstall (handles VCS revision upgrades)
686+ let isDifferentPackage = pkgInfo.basicInfo.checksum != oldPkg.get.basicInfo.checksum
687+
688+ if not isDifferentPackage:
689+ # In the case we already have the same package in the cache then only merge
690+ # the new package special versions to the old one.
691+ displayWarning (pkgAlreadyExistsInTheCacheMsg (pkgInfo), MediumPriority )
692+ var oldPkg = oldPkg.get
693+ oldPkg.metaData.specialVersions.incl pkgInfo.metaData.specialVersions
694+ saveMetaData (oldPkg.metaData, oldPkg.getNimbleFileDir, changeRoots = false )
695+ return oldPkg
696+ else :
697+ # Different checksum - reinstall (e.g., different VCS revision)
698+ display (" Upgrading" , " $1 from checksum $2 to $3" %
699+ [pkgInfo.basicInfo.name, $ oldPkg.get.basicInfo.checksum, $ pkgInfo.basicInfo.checksum],
700+ priority = MediumPriority )
701+ # Remove the old package directory to force reinstallation
702+ let oldPkgDir = oldPkg.get.getPkgDest (options)
703+ if dirExists (oldPkgDir):
704+ removeDir (oldPkgDir)
681705
682706 let pkgDestDir = pkgInfo.getPkgDest (options)
683707
0 commit comments