2 import sys, os, stat, fnmatch
3 from bup import options, git, shquote, vfs
4 from bup.helpers import *
9 def node_name(text, n):
10 if stat.S_ISDIR(n.mode):
12 elif stat.S_ISLNK(n.mode):
18 class OptionError(Exception):
25 a,all include hidden files in the listing
27 ls_opt = options.Options(ls_optspec, onabort=OptionError)
31 (opt, flags, extra) = ls_opt.parse(cmd_args)
32 except OptionError, e:
37 for path in (extra or ['.']):
38 n = pwd.try_resolve(path)
40 if stat.S_ISDIR(n.mode):
43 if opt.all or not len(name)>1 or not name.startswith('.'):
45 L.append(node_name(name, sub))
47 print node_name(name, sub)
50 L.append(node_name(path, n))
52 print node_name(path, n)
53 sys.stdout.write(columnate(L, ''))
56 def write_to_file(inf, outf):
57 for blob in chunkyreader(inf):
62 if os.isatty(sys.stdin.fileno()):
65 yield raw_input('bup> ')
67 print '' # Clear the line for the terminal's next prompt
70 for line in sys.stdin:
74 def _completer_get_subs(line):
75 (qtype, lastword) = shquote.unfinished_word(line)
76 (dir,name) = os.path.split(lastword)
77 #log('\ncompleter: %r %r %r\n' % (qtype, lastword, text))
80 subs = list(filter(lambda x: x.name.startswith(name),
82 except vfs.NoSuchFile, e:
84 return (dir, name, qtype, lastword, subs)
87 def find_readline_lib():
88 """Return the name (and possibly the full path) of the readline library
89 linked to the given readline module.
92 f = open(readline.__file__, "rb")
98 m = re.search('\0([^\0]*libreadline[^\0]*)\0', data)
104 def init_readline_vars():
105 """Work around trailing space automatically inserted by readline.
106 See http://bugs.python.org/issue5833"""
110 # python before 2.5 didn't have the ctypes module; but those
111 # old systems probably also didn't have this readline bug, so
114 lib_name = find_readline_lib()
115 if lib_name is not None:
116 lib = ctypes.cdll.LoadLibrary(lib_name)
117 global rl_completion_suppress_append
118 rl_completion_suppress_append = ctypes.c_int.in_dll(lib,
119 "rl_completion_suppress_append")
122 rl_completion_suppress_append = None
125 def completer(text, state):
128 global rl_completion_suppress_append
129 if rl_completion_suppress_append is not None:
130 rl_completion_suppress_append.value = 1
132 line = readline.get_line_buffer()[:readline.get_endidx()]
133 if _last_line != line:
134 _last_res = _completer_get_subs(line)
136 (dir, name, qtype, lastword, subs) = _last_res
137 if state < len(subs):
139 sn1 = sn.try_resolve() # find the type of any symlink target
140 fullname = os.path.join(dir, sn.name)
141 if stat.S_ISDIR(sn1.mode):
142 ret = shquote.what_to_add(qtype, lastword, fullname+'/',
145 ret = shquote.what_to_add(qtype, lastword, fullname,
146 terminate=True) + ' '
152 traceback.print_tb(sys.exc_traceback)
153 except Exception, e2:
154 log('Error printing traceback: %s\n' % e2)
155 log('\nError in completion: %s\n' % e)
159 bup ftp [commands...]
161 o = options.Options(optspec)
162 (opt, flags, extra) = o.parse(sys.argv[1:])
164 git.check_repo_or_die()
166 top = vfs.RefList(None)
176 log('* readline module not available: line editing disabled.\n')
180 readline.set_completer_delims(' \t\n\r/')
181 readline.set_completer(completer)
182 readline.parse_and_bind("tab: complete")
189 words = [word for (wordstart,word) in shquote.quotesplit(line)]
190 cmd = words[0].lower()
191 #log('execute: %r %r\n' % (cmd, parm))
197 for parm in words[1:]:
198 np = np.resolve(parm)
199 if not stat.S_ISDIR(np.mode):
200 raise vfs.NotDir('%s is not a directory' % parm)
205 for parm in words[1:]:
206 write_to_file(pwd.resolve(parm).open(), sys.stdout)
208 if len(words) not in [2,3]:
210 raise Exception('Usage: get <filename> [localname]')
212 (dir,base) = os.path.split(rname)
213 lname = len(words)>2 and words[2] or base
214 inf = pwd.resolve(rname).open()
215 log('Saving %r\n' % lname)
216 write_to_file(inf, open(lname, 'wb'))
218 for parm in words[1:]:
219 (dir,base) = os.path.split(parm)
220 for n in pwd.resolve(dir).subs():
221 if fnmatch.fnmatch(n.name, base):
223 log('Saving %r\n' % n.name)
225 outf = open(n.name, 'wb')
226 write_to_file(inf, outf)
230 log(' error: %s\n' % e)
231 elif cmd == 'help' or cmd == '?':
232 log('Commands: ls cd pwd cat get mget help quit\n')
233 elif cmd == 'quit' or cmd == 'exit' or cmd == 'bye':
237 raise Exception('no such command %r' % cmd)
240 log('error: %s\n' % e)