summaryrefslogtreecommitdiff
path: root/scripts/Scripts/goto
blob: e4180ad912ab04af4ee1544e3147aa8b7d5225d0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
#!/usr/bin/env python3

import argparse
import os
import sys
import os.path as path

class Bookmarks():
    def __init__(self, storepath=None):
        # Yeah XDG stuff does not really matter here
        self.storepath = storepath or path.join(os.getenv("HOME"), ".bookmarks")
        self.store = {}

        if not path.exists(self.storepath):
            return

        with open(self.storepath, "r") as f:
            for line in f:
                # This breaks support for spaces in name and path
                line = line.split(" ")
                self.store[line[0]] = line[1][:-1]

    def save(self, name, path):
        if not name in self.store:
            # Easy just append
            with open(self.storepath, "a") as f:
                f.write(f"{name} {path}\n")
            return

        # Truncate it
        with open(self.storepath, "w") as f:
            for (k, v) in self.store.items():
                # self.store should contain it's old values to we can jump to something we are saving to
                if k is name:
                    v = path
                f.write(f"{name} {path}\n")

    def load(self, name):
        return self.store[name]

    def list(self):
        for (k, v) in self.store.items():
            print(f"{k} => {v}")

parser = argparse.ArgumentParser()
parser.add_argument("--save", "-s", help="Save current location with name, if '.' pwd is used as name")
parser.add_argument("--path", "-p", help="Specifies if `dest` is a real path and not a bookmark", action="store_true")
parser.add_argument("--list", "-l", help="List bookmarks", action="store_true")
parser.add_argument("dest", nargs="?", help="Where to go")

args = parser.parse_args()

bm = Bookmarks()

if args.list:
    bm.list()

# Whether to save
if args.save:
    name = args.save if args.save is not "." else os.getcwd()
    bm.save(name, os.getcwd())

if args.dest:
    where = bm.load(args.dest) if not args.path else args.dest
    with open("/tmp/where", "w") as f:
        f.write(where)
    # This means zsh should go here
    sys.exit(3)