import std / [ os, json, hashes, strformat ] import ./manager proc lockPath*(): string = let homeDir: string = getHomeDir() lockDir: string = homeDir / ".local" / "tesserae" ensureDir(lockDir) result = lockDir / "tesserae.lock" proc loadLock*(): JsonNode = let lockFile: string = lockPath() result = %*{} if fileExists(lockFile): try: result = parseFile(lockFile) except JsonParsingError: echo "JsonParsingError. Treating the lockfile as non existant" result = %*{} proc writeLock*(jsonObject: JsonNode) = let lockFile: string = lockPath() writeFile(lockFile, jsonObject.pretty()) proc updateLock*( packageName: string, sourceURL: string, chosenTag: string, configPath: string ) = ## Updates the lockfile var lock: JsonNode = loadLock() let config: string = readConfigFile(configPath) jsonObject: JsonNode = %*{ "source": { "url": sourceURL }, "tag": chosenTag, "config": config # I should probably add a sha256 thingy } lock[packageName] = jsonObject writeLock(lock) echo "Updated {packageName}".fmt proc needRebuildLock*( packageName: string, sourceURL: string, chosenTag: string, configPath: string ): bool = ## Checks whether the following have changed:\n ## - source (repo url) ## - tag (new release, manually updated, etc) result = false let lockFile = loadLock() if not lockFile.hasKey(packageName): echo "{packageName} added to queue" result = true else: let package = lockFile[packageName] if not package.hasKey("source"): echo "Could not find source for package {packageName}".fmt echo "{packageName} added to queue" result = true if package.hasKey("source") and package["source"].hasKey("url"): let packageSource: string = package["source"]["url"].getStr if packageSource != sourceURL: echo "Source URL for package {packageName} has changed".fmt echo "{packageName} added to queue" result = true if not package.hasKey("tag"): result = true else: if package["tag"].getStr != chosenTag: echo "Release tag has changed from {package["tag"]} -> {chosenTag}".fmt echo "{packageName} added to queue" result = true if not package.hasKey("config"): echo "Configuration file not found for package {packageName}".fmt echo "{packageName} added to queue" result = true else: let config: string = readConfigFile(configPath) if package["config"].getStr != config: echo "Configuration file changed for package {packageName}".fmt echo "{packageName} added to queue" result = true