diff --git a/.gitignore b/.gitignore index ca0961d..3a64253 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ bin *.toml +test diff --git a/norg/borg/borg.nim b/norg/borg/borg.nim index c631569..9af648c 100644 --- a/norg/borg/borg.nim +++ b/norg/borg/borg.nim @@ -47,8 +47,8 @@ proc backupSources(nc: NorgConfig, repo: Repository): int = let archivename = repo.path & "::" & genArchiveName() let res = run genCommand(cmd = "create", repo = archivename, others = others) let end_time = now() - let elapsed = (end_time - start_time) - let total = elapsed.inMilliSeconds() + let total = (end_time - start_time).inMilliSeconds() + case res of 0: notify(nc.notifiers, state=Success, runtime=total) of 1: @@ -62,7 +62,6 @@ proc listArchives(nc: NorgConfig, repo: Repository): int = proc mountArchive(nc: NorgConfig, repo: Repository): int = let archive = repo.path & "::" & nc.args.others[0] - echo archive let others = nc.args.others[1..^1] let ok = runDiscard genCommand(cmd = "mount", repo = archive, others = others) if ok == 0: @@ -70,7 +69,6 @@ proc mountArchive(nc: NorgConfig, repo: Repository): int = else: echo "Failed to mount ", archive - proc unmountArchive(nc: NorgConfig): int = let ok = runDiscard genCommand(cmd = "umount", repo = "", others = nc.args.others) if ok == 0: @@ -78,6 +76,26 @@ proc unmountArchive(nc: NorgConfig): int = else: echo "Failed to unmount ", nc.args.others[0] +proc isEmpty(dir: string): bool = + var count = 0 + for idx, f in walkDir(dir): return false + #count += 1 + return count == 0 + +proc extractArchive(nc: NorgConfig, repo: Repository): int = + let archive = repo.path & "::" & nc.args.others[0] + var others = nc.args.others[1..^1] + if nc.args.extract_destination != "": + discard existsOrCreateDir(nc.args.extract_destination) + setCurrentDir(nc.args.extract_destination) + let dir = getCurrentDir() + if dir.isEmpty(): + echo "Restoring..." + let ok = run(genCommand(cmd = "extract", repo = archive, others = others)) + return ok + else: + echo "Not restoring to non-empty destination\r\nPlease use the --destination flag" + proc execute*(nc: NorgConfig) = putEnv("BORG_PASSPHRASE", nc.getEncryptionPassword()) for repo in nc.repositories: @@ -94,4 +112,6 @@ proc execute*(nc: NorgConfig) = discard mountArchive(nc, repo) of "umount": discard unmountArchive(nc) + of "extract": + discard extractArchive(nc, repo) delEnv("BORG_PASSPHRASE") diff --git a/norg/config/args.nim b/norg/config/args.nim index 93810a3..6285f21 100644 --- a/norg/config/args.nim +++ b/norg/config/args.nim @@ -3,6 +3,7 @@ import argparse type NorgArgs* = object config_file*: string + extract_destination*: string borg_cmd*: string others*: seq[string] @@ -11,11 +12,13 @@ var norg_args*: NorgArgs = NorgArgs() proc parseArgs*() = var p = newParser: option("-c", "--config", help="Config file to use", required = true) - arg("borg_cmd", default=some("backup")) + option("-d", "--destination", help="Destination when extracting backup", required = false) + arg("borg_cmd", default=some("list")) arg("others", nargs = -1) try: var opts = p.parse(commandLineParams()) norg_args.config_file = opts.config + norg_args.extract_destination = opts.destination norg_args.borg_cmd = opts.borg_cmd norg_args.others = opts.others