mirror of
https://github.com/nim-lang/Nim.git
synced 2025-12-29 09:24:36 +00:00
57 lines
1.6 KiB
Nim
57 lines
1.6 KiB
Nim
#
|
|
#
|
|
# The Nim Compiler
|
|
# (c) Copyright 2016 Andreas Rumpf
|
|
#
|
|
# See the file "copying.txt", included in this
|
|
# distribution, for details about the copyright.
|
|
#
|
|
|
|
iterator myParentDirs(p: string): string =
|
|
# XXX os's parentDirs is stupid (multiple yields) and triggers an old bug...
|
|
var current = p
|
|
while true:
|
|
current = current.parentDir
|
|
if current.len == 0: break
|
|
yield current
|
|
|
|
template newPackageCache(): untyped =
|
|
newStringTable(when FileSystemCaseSensitive:
|
|
modeCaseInsensitive
|
|
else:
|
|
modeCaseSensitive)
|
|
|
|
var packageCache = newPackageCache()
|
|
|
|
proc resetPackageCache*() = packageCache = newPackageCache()
|
|
|
|
proc getPackageName*(path: string): string =
|
|
var parents = 0
|
|
block packageSearch:
|
|
for d in myParentDirs(path):
|
|
if packageCache.hasKey(d):
|
|
#echo "from cache ", d, " |", packageCache[d], "|", path.splitFile.name
|
|
return packageCache[d]
|
|
inc parents
|
|
for file in walkFiles(d / "*.nimble"):
|
|
result = file.splitFile.name
|
|
break packageSearch
|
|
for file in walkFiles(d / "*.babel"):
|
|
result = file.splitFile.name
|
|
break packageSearch
|
|
# we also store if we didn't find anything:
|
|
if result.isNil: result = ""
|
|
for d in myParentDirs(path):
|
|
#echo "set cache ", d, " |", result, "|", parents
|
|
packageCache[d] = result
|
|
dec parents
|
|
if parents <= 0: break
|
|
|
|
proc withPackageName*(path: string): string =
|
|
let x = path.getPackageName
|
|
if x.len == 0:
|
|
result = path
|
|
else:
|
|
let (p, file, ext) = path.splitFile
|
|
result = (p / (x & '_' & file)) & ext
|