Dedupe output parts

This commit is contained in:
Tomek Wójcik 2024-01-19 22:00:49 +01:00
parent 96a20b9278
commit 23e043fee2
2 changed files with 48 additions and 10 deletions

View File

@ -1,4 +1,4 @@
import std/[algorithm, dirs, logging, options, paths, strutils, syncio] import std/[algorithm, dirs, envvars, logging, options, paths, strutils, syncio]
import strformat import strformat
import commandant import commandant
@ -19,6 +19,7 @@ Usage:
pathsd [options] search_path ... pathsd [options] search_path ...
Options: Options:
-s --shell target shell (defaults to bash) -s --shell target shell (defaults to bash)
-d --dedupe deduplicate the final paths
-v --verbose turn debugging messages on -v --verbose turn debugging messages on
-q --quiet supress all logging messages -q --quiet supress all logging messages
--version show the version --version show the version
@ -63,7 +64,7 @@ proc readPart(path: Path): seq[string] =
return result return result
proc main*(searchPaths: seq[string]): MainResult = proc main*(searchPaths: seq[string], envParts: seq[string], dedupe: bool): MainResult =
var parts: seq[string] = @[] var parts: seq[string] = @[]
logger.log(lvlDebug, fmt"Processing search paths: {searchPaths}") logger.log(lvlDebug, fmt"Processing search paths: {searchPaths}")
@ -84,6 +85,16 @@ proc main*(searchPaths: seq[string]): MainResult =
for partPath in partPaths: for partPath in partPaths:
parts = parts & readPart(partPath) parts = parts & readPart(partPath)
parts = parts & envParts
if dedupe == true:
var dedupedParts: seq[string] = @[]
for part in parts:
if dedupedParts.contains(part) == false:
dedupedParts.add(part)
parts = dedupedParts
return MainResult(output: parts, errorCode: QuitSuccess) return MainResult(output: parts, errorCode: QuitSuccess)
@ -93,6 +104,7 @@ when isMainModule:
commandant.option(shell, string, "shell", "s", "bash") commandant.option(shell, string, "shell", "s", "bash")
flag(verbose, "verbose", "v") flag(verbose, "verbose", "v")
flag(quiet, "quiet", "q") flag(quiet, "quiet", "q")
flag(dedupe, "dedupe", "d")
exitoption("help", "h", help_string, QuitFailure) exitoption("help", "h", help_string, QuitFailure)
exitoption("version", "", version_string, QuitFailure) exitoption("version", "", version_string, QuitFailure)
errorproc(handleCommandantError) errorproc(handleCommandantError)
@ -105,7 +117,11 @@ when isMainModule:
logger.levelThreshold = loggerLevel logger.levelThreshold = loggerLevel
var mainResult = main(searchPaths) var envParts: seq[string] = @[]
var envPath = envvars.getEnv("PATH")
envParts = envPath.split(":")
var mainResult = main(searchPaths, envParts, dedupe)
if mainResult.output != @[] and mainResult.errorCode == QuitSuccess: if mainResult.output != @[] and mainResult.errorCode == QuitSuccess:
var output: string = "" var output: string = ""
@ -113,7 +129,7 @@ when isMainModule:
case shell case shell
of "bash": of "bash":
let pathComponents = join(mainResult.output, ":") let pathComponents = join(mainResult.output, ":")
output = fmt"""export PATH="{pathComponents}":$PATH""" output = fmt"""export PATH="{pathComponents}""""
if output != "": if output != "":
echo(output) echo(output)

View File

@ -7,13 +7,17 @@ suite "Test main() proc":
setup: setup:
const fixturesPath = Path(currentSourcePath) / Path("..") / Path("..") / Path("fixtures") const fixturesPath = Path(currentSourcePath) / Path("..") / Path("..") / Path("fixtures")
const pathsdFixturePath = fixturesPath / Path("paths.d") const pathsdFixturePath = fixturesPath / Path("paths.d")
const expectedOutput = @["/Users/bilbo/opt/bin", "/opt/homebrew/bin", "/opt/homebrew/sbin"] const envParts = @["/usr/local/bin", "/usr/bin"]
const expectedOutput = @[
"/Users/bilbo/opt/bin", "/opt/homebrew/bin", "/opt/homebrew/sbin",
"/usr/local/bin", "/usr/bin",
]
pathsd.logger.levelThreshold = lvlNone pathsd.logger.levelThreshold = lvlNone
test "Test happy path": test "Test happy path":
# When # When
var mainResult = pathsd.main(@[pathsdFixturePath.string]) var mainResult = pathsd.main(@[pathsdFixturePath.string], envParts, false)
# Then # Then
check mainResult.output == expectedOutput check mainResult.output == expectedOutput
@ -21,10 +25,28 @@ suite "Test main() proc":
test "Test skipping search paths that don't exist": test "Test skipping search paths that don't exist":
# When # When
var mainResult = pathsd.main(@[ var mainResult = pathsd.main(
@[
pathsdFixturePath.string, pathsdFixturePath.string,
(fixturesPath / Path("idontexist")).string, (fixturesPath / Path("idontexist")).string,
]) ],
envParts,
false,
)
# Then
check mainResult.output == expectedOutput
test "Test dedupe":
# Given
const localEnvParts = @[
"/usr/local/bin", "/usr/bin", "/Users/bilbo/opt/bin",
]
# When
var mainResult = pathsd.main(
@[pathsdFixturePath.string], localEnvParts, true,
)
# Then # Then
check mainResult.output == expectedOutput check mainResult.output == expectedOutput