Mercurial > hrm
annotate kharon.py @ 11:220a8a38dedd
Changed display strings a bit.
author | Atul Varma <varmaa@toolness.com> |
---|---|
date | Mon, 08 Dec 2008 15:41:38 -0800 |
parents | 0220e43e5d8e |
children | 97fb91f12cb7 |
rev | line source |
---|---|
0 | 1 #! /usr/bin/env python3.0 |
2 | |
1 | 3 ''' |
4 This is a drop-in replacement for rm, with support for undo. | |
5 ''' | |
6 | |
0 | 7 import os |
9
24388ad14e29
Added support for most traditional rm params.
Atul Varma <varmaa@toolness.com>
parents:
8
diff
changeset
|
8 import re |
0 | 9 import sys |
10 import json | |
11 import subprocess | |
12 import distutils.dir_util | |
13 from optparse import OptionParser | |
14 | |
15 HADES_DIR = os.path.expanduser('~/.Hades') | |
16 STATE_FILENAME = os.path.join(HADES_DIR, 'state.json') | |
17 | |
18 class Config(object): | |
19 def __init__(self, filename): | |
20 self.__filename = filename | |
21 self.nextid = 0 | |
22 if os.path.exists(self.__filename): | |
23 self.__dict__.update(json.load(open(self.__filename, 'r'))) | |
24 else: | |
25 self.save() | |
26 | |
27 def save(self): | |
28 state = {} | |
29 keys = [key for key in self.__dict__ | |
30 if not key.startswith('__')] | |
31 for key in keys: | |
32 state[key] = self.__dict__[key] | |
33 json.dump(state, open(self.__filename, 'w')) | |
34 | |
35 def shell(*params): | |
36 popen = subprocess.Popen(params) | |
37 popen.wait() | |
38 if popen.returncode: | |
39 raise Exception('Process failed: %s' % repr(params)) | |
40 | |
4
702b55be9030
Added more of an implementation for undo, although it's still unimplemented.
Atul Varma <varmaa@toolness.com>
parents:
3
diff
changeset
|
41 def dir_for_trans(transid): |
702b55be9030
Added more of an implementation for undo, although it's still unimplemented.
Atul Varma <varmaa@toolness.com>
parents:
3
diff
changeset
|
42 return os.path.join(HADES_DIR, '%.9d' % transid) |
702b55be9030
Added more of an implementation for undo, although it's still unimplemented.
Atul Varma <varmaa@toolness.com>
parents:
3
diff
changeset
|
43 |
0 | 44 if __name__ == '__main__': |
45 if not (os.path.exists(HADES_DIR) and os.path.isdir(HADES_DIR)): | |
46 shell('mkdir', HADES_DIR) | |
47 | |
8 | 48 parser = OptionParser(description=__import__(__name__).__doc__) |
2
05cece4371a4
Added an undo option, though it's not implemented yet.
Atul Varma <varmaa@toolness.com>
parents:
1
diff
changeset
|
49 parser.add_option('-u', '--undo', |
05cece4371a4
Added an undo option, though it's not implemented yet.
Atul Varma <varmaa@toolness.com>
parents:
1
diff
changeset
|
50 dest='undo', action='store_true', default=False, |
05cece4371a4
Added an undo option, though it's not implemented yet.
Atul Varma <varmaa@toolness.com>
parents:
1
diff
changeset
|
51 help='undo a transaction (default is latest).') |
10 | 52 parser.add_option('-v', '--verbose', |
53 dest='verbose', action='store_true', default=False, | |
54 help='be verbose.') | |
9
24388ad14e29
Added support for most traditional rm params.
Atul Varma <varmaa@toolness.com>
parents:
8
diff
changeset
|
55 |
24388ad14e29
Added support for most traditional rm params.
Atul Varma <varmaa@toolness.com>
parents:
8
diff
changeset
|
56 args = [] |
24388ad14e29
Added support for most traditional rm params.
Atul Varma <varmaa@toolness.com>
parents:
8
diff
changeset
|
57 for arg in sys.argv[1:]: |
24388ad14e29
Added support for most traditional rm params.
Atul Varma <varmaa@toolness.com>
parents:
8
diff
changeset
|
58 # Filter out redundant parameters to the traditional 'rm' |
24388ad14e29
Added support for most traditional rm params.
Atul Varma <varmaa@toolness.com>
parents:
8
diff
changeset
|
59 # command. |
10 | 60 if not re.match('-[dfiRrv]+', arg): |
9
24388ad14e29
Added support for most traditional rm params.
Atul Varma <varmaa@toolness.com>
parents:
8
diff
changeset
|
61 args.append(arg) |
10 | 62 elif 'v' in arg: |
63 args.append('-v') | |
9
24388ad14e29
Added support for most traditional rm params.
Atul Varma <varmaa@toolness.com>
parents:
8
diff
changeset
|
64 (options, args) = parser.parse_args(args) |
0 | 65 |
66 config = Config(STATE_FILENAME) | |
2
05cece4371a4
Added an undo option, though it's not implemented yet.
Atul Varma <varmaa@toolness.com>
parents:
1
diff
changeset
|
67 |
05cece4371a4
Added an undo option, though it's not implemented yet.
Atul Varma <varmaa@toolness.com>
parents:
1
diff
changeset
|
68 if options.undo: |
4
702b55be9030
Added more of an implementation for undo, although it's still unimplemented.
Atul Varma <varmaa@toolness.com>
parents:
3
diff
changeset
|
69 transactions = [] |
702b55be9030
Added more of an implementation for undo, although it's still unimplemented.
Atul Varma <varmaa@toolness.com>
parents:
3
diff
changeset
|
70 for arg in args: |
702b55be9030
Added more of an implementation for undo, although it's still unimplemented.
Atul Varma <varmaa@toolness.com>
parents:
3
diff
changeset
|
71 try: |
702b55be9030
Added more of an implementation for undo, although it's still unimplemented.
Atul Varma <varmaa@toolness.com>
parents:
3
diff
changeset
|
72 transid = int(arg) |
702b55be9030
Added more of an implementation for undo, although it's still unimplemented.
Atul Varma <varmaa@toolness.com>
parents:
3
diff
changeset
|
73 except ValueError: |
11
220a8a38dedd
Changed display strings a bit.
Atul Varma <varmaa@toolness.com>
parents:
10
diff
changeset
|
74 print('Unknown transaction ID: %s' % arg) |
4
702b55be9030
Added more of an implementation for undo, although it's still unimplemented.
Atul Varma <varmaa@toolness.com>
parents:
3
diff
changeset
|
75 sys.exit(-1) |
702b55be9030
Added more of an implementation for undo, although it's still unimplemented.
Atul Varma <varmaa@toolness.com>
parents:
3
diff
changeset
|
76 transactions.append(transid) |
702b55be9030
Added more of an implementation for undo, although it's still unimplemented.
Atul Varma <varmaa@toolness.com>
parents:
3
diff
changeset
|
77 if not transactions and config.nextid: |
702b55be9030
Added more of an implementation for undo, although it's still unimplemented.
Atul Varma <varmaa@toolness.com>
parents:
3
diff
changeset
|
78 transactions.append(config.nextid - 1) |
702b55be9030
Added more of an implementation for undo, although it's still unimplemented.
Atul Varma <varmaa@toolness.com>
parents:
3
diff
changeset
|
79 for transid in transactions: |
702b55be9030
Added more of an implementation for undo, although it's still unimplemented.
Atul Varma <varmaa@toolness.com>
parents:
3
diff
changeset
|
80 dirname = dir_for_trans(transid) |
702b55be9030
Added more of an implementation for undo, although it's still unimplemented.
Atul Varma <varmaa@toolness.com>
parents:
3
diff
changeset
|
81 if not os.path.exists(dirname): |
11
220a8a38dedd
Changed display strings a bit.
Atul Varma <varmaa@toolness.com>
parents:
10
diff
changeset
|
82 print('Transaction ID %d does not exist.' % transid) |
4
702b55be9030
Added more of an implementation for undo, although it's still unimplemented.
Atul Varma <varmaa@toolness.com>
parents:
3
diff
changeset
|
83 sys.exit(-1) |
702b55be9030
Added more of an implementation for undo, although it's still unimplemented.
Atul Varma <varmaa@toolness.com>
parents:
3
diff
changeset
|
84 |
6
9bffe9d72eac
Finished adding undo support, fixed a bug.
Atul Varma <varmaa@toolness.com>
parents:
5
diff
changeset
|
85 transactions.sort(reverse=True) |
9bffe9d72eac
Finished adding undo support, fixed a bug.
Atul Varma <varmaa@toolness.com>
parents:
5
diff
changeset
|
86 |
9bffe9d72eac
Finished adding undo support, fixed a bug.
Atul Varma <varmaa@toolness.com>
parents:
5
diff
changeset
|
87 for transid in transactions: |
9bffe9d72eac
Finished adding undo support, fixed a bug.
Atul Varma <varmaa@toolness.com>
parents:
5
diff
changeset
|
88 transdirname = dir_for_trans(transid) |
9bffe9d72eac
Finished adding undo support, fixed a bug.
Atul Varma <varmaa@toolness.com>
parents:
5
diff
changeset
|
89 for dirpath, dirnames, filenames in os.walk(transdirname): |
9bffe9d72eac
Finished adding undo support, fixed a bug.
Atul Varma <varmaa@toolness.com>
parents:
5
diff
changeset
|
90 relpath = dirpath[len(transdirname)+1:] |
9bffe9d72eac
Finished adding undo support, fixed a bug.
Atul Varma <varmaa@toolness.com>
parents:
5
diff
changeset
|
91 contents = dirnames + filenames |
9bffe9d72eac
Finished adding undo support, fixed a bug.
Atul Varma <varmaa@toolness.com>
parents:
5
diff
changeset
|
92 for name in contents: |
9bffe9d72eac
Finished adding undo support, fixed a bug.
Atul Varma <varmaa@toolness.com>
parents:
5
diff
changeset
|
93 srcpath = os.path.join(dirpath, name) |
9bffe9d72eac
Finished adding undo support, fixed a bug.
Atul Varma <varmaa@toolness.com>
parents:
5
diff
changeset
|
94 destpath = os.path.join('/', relpath, name) |
9bffe9d72eac
Finished adding undo support, fixed a bug.
Atul Varma <varmaa@toolness.com>
parents:
5
diff
changeset
|
95 if not os.path.exists(destpath): |
9bffe9d72eac
Finished adding undo support, fixed a bug.
Atul Varma <varmaa@toolness.com>
parents:
5
diff
changeset
|
96 if os.path.isdir(srcpath): |
9bffe9d72eac
Finished adding undo support, fixed a bug.
Atul Varma <varmaa@toolness.com>
parents:
5
diff
changeset
|
97 dirnames.remove(name) |
9bffe9d72eac
Finished adding undo support, fixed a bug.
Atul Varma <varmaa@toolness.com>
parents:
5
diff
changeset
|
98 print('Restoring %s.' % destpath) |
9bffe9d72eac
Finished adding undo support, fixed a bug.
Atul Varma <varmaa@toolness.com>
parents:
5
diff
changeset
|
99 shell('mv', srcpath, destpath) |
9bffe9d72eac
Finished adding undo support, fixed a bug.
Atul Varma <varmaa@toolness.com>
parents:
5
diff
changeset
|
100 print('Done.') |
2
05cece4371a4
Added an undo option, though it's not implemented yet.
Atul Varma <varmaa@toolness.com>
parents:
1
diff
changeset
|
101 else: |
5 | 102 if not args: |
103 parser.print_help() | |
104 sys.exit(-1) | |
105 | |
2
05cece4371a4
Added an undo option, though it's not implemented yet.
Atul Varma <varmaa@toolness.com>
parents:
1
diff
changeset
|
106 files = [] |
05cece4371a4
Added an undo option, though it's not implemented yet.
Atul Varma <varmaa@toolness.com>
parents:
1
diff
changeset
|
107 for arg in args: |
05cece4371a4
Added an undo option, though it's not implemented yet.
Atul Varma <varmaa@toolness.com>
parents:
1
diff
changeset
|
108 filename = os.path.abspath(os.path.expanduser(arg)) |
05cece4371a4
Added an undo option, though it's not implemented yet.
Atul Varma <varmaa@toolness.com>
parents:
1
diff
changeset
|
109 if not os.path.exists(filename): |
05cece4371a4
Added an undo option, though it's not implemented yet.
Atul Varma <varmaa@toolness.com>
parents:
1
diff
changeset
|
110 print('File does not exist: %s' % arg) |
05cece4371a4
Added an undo option, though it's not implemented yet.
Atul Varma <varmaa@toolness.com>
parents:
1
diff
changeset
|
111 sys.exit(-1) |
3
4734efec5732
Can't move fles in or above HADES_DIR now.
Atul Varma <varmaa@toolness.com>
parents:
2
diff
changeset
|
112 realpath = os.path.realpath(filename) |
4734efec5732
Can't move fles in or above HADES_DIR now.
Atul Varma <varmaa@toolness.com>
parents:
2
diff
changeset
|
113 if (realpath.startswith(HADES_DIR) or |
4734efec5732
Can't move fles in or above HADES_DIR now.
Atul Varma <varmaa@toolness.com>
parents:
2
diff
changeset
|
114 HADES_DIR.startswith(realpath)): |
4734efec5732
Can't move fles in or above HADES_DIR now.
Atul Varma <varmaa@toolness.com>
parents:
2
diff
changeset
|
115 print('Cannot move files in or above %s.' % HADES_DIR) |
4734efec5732
Can't move fles in or above HADES_DIR now.
Atul Varma <varmaa@toolness.com>
parents:
2
diff
changeset
|
116 sys.exit(-1) |
2
05cece4371a4
Added an undo option, though it's not implemented yet.
Atul Varma <varmaa@toolness.com>
parents:
1
diff
changeset
|
117 files.append(filename) |
0 | 118 |
2
05cece4371a4
Added an undo option, though it's not implemented yet.
Atul Varma <varmaa@toolness.com>
parents:
1
diff
changeset
|
119 thisid = config.nextid |
4
702b55be9030
Added more of an implementation for undo, although it's still unimplemented.
Atul Varma <varmaa@toolness.com>
parents:
3
diff
changeset
|
120 basedir = dir_for_trans(thisid) |
2
05cece4371a4
Added an undo option, though it's not implemented yet.
Atul Varma <varmaa@toolness.com>
parents:
1
diff
changeset
|
121 shell('mkdir', basedir) |
05cece4371a4
Added an undo option, though it's not implemented yet.
Atul Varma <varmaa@toolness.com>
parents:
1
diff
changeset
|
122 config.nextid = thisid + 1 |
05cece4371a4
Added an undo option, though it's not implemented yet.
Atul Varma <varmaa@toolness.com>
parents:
1
diff
changeset
|
123 config.save() |
0 | 124 |
11
220a8a38dedd
Changed display strings a bit.
Atul Varma <varmaa@toolness.com>
parents:
10
diff
changeset
|
125 print('The transaction ID for this operation is %s.' % thisid) |
0 | 126 |
2
05cece4371a4
Added an undo option, though it's not implemented yet.
Atul Varma <varmaa@toolness.com>
parents:
1
diff
changeset
|
127 for source in files: |
10 | 128 if options.verbose: |
129 print('Removing %s.' % source) | |
6
9bffe9d72eac
Finished adding undo support, fixed a bug.
Atul Varma <varmaa@toolness.com>
parents:
5
diff
changeset
|
130 dest = os.path.join(basedir, source[1:]) |
2
05cece4371a4
Added an undo option, though it's not implemented yet.
Atul Varma <varmaa@toolness.com>
parents:
1
diff
changeset
|
131 distutils.dir_util.mkpath(os.path.dirname(dest)) |
05cece4371a4
Added an undo option, though it's not implemented yet.
Atul Varma <varmaa@toolness.com>
parents:
1
diff
changeset
|
132 shell('mv', source, dest) |