27
27
import bzrlib.errors
28
from bzrlib.errors import BzrCommandError
29
from bzrlib.bzrdir import BzrDir
28
from bzrlib.errors import (BzrCommandError, NotBranchError, NoSuchFile,
29
UnsupportedFormatError, TransportError,
30
NoWorkingTree, PermissionDenied)
31
from bzrlib.bzrdir import BzrDir, BzrDirFormat
32
34
dirname = tempfile.mkdtemp("temp-branch")
53
>>> tree.commit("added file")
55
>>> tree.commit("added file", rev_id='commit-id')
58
from bzrlib.diff import compare_trees
59
61
old_tree = cur_tree.basis_tree()
60
62
new_tree = cur_tree
62
64
for path, file_class, kind, file_id, entry in new_tree.list_files():
63
65
if file_class in ('?', 'I'):
64
66
non_source.append(path)
65
delta = compare_trees(old_tree, new_tree, want_unchanged=False)
67
delta = new_tree.changes_from(old_tree, want_unchanged=False)
66
68
return not delta.has_changed(), non_source
68
70
def set_push_data(tree, location):
69
push_file = file (tree.branch.control_files.controlfilename("x-push-data"), "wb")
70
push_file.write("%s\n" % location)
71
tree.branch.control_files.put_utf8("x-push-data", "%s\n" % location)
72
73
def get_push_data(tree):
77
78
>>> set_push_data(tree, 'http://somewhere')
78
79
>>> get_push_data(tree)
82
filename = tree.branch.control_files.controlfilename("x-push-data")
83
if not os.path.exists(filename):
84
location = tree.branch.control_files.get_utf8('x-push-data').read()
85
push_file = file (filename, "rb")
86
(location,) = [f.rstrip('\n') for f in push_file]
87
return location.rstrip('\n')
90
90
>>> shell_escape('hello')
239
239
except RsyncNoFile:
242
def push(tree, location=None, overwrite=False, working_tree=True):
242
def rspush(tree, location=None, overwrite=False, working_tree=True):
243
243
push_location = get_push_data(tree)
244
244
if location is not None:
245
245
if not location.endswith('/'):
247
247
push_location = location
249
249
if push_location is None:
250
if tree.branch.get_push_location() is None:
251
raise BzrCommandError("No push location known or specified.")
253
raise bzrlib.errors.MustUseDecorated
255
if push_location.find('://') != -1:
256
raise bzrlib.errors.MustUseDecorated
258
if push_location.find(':') == -1:
259
raise bzrlib.errors.MustUseDecorated
250
raise BzrCommandError("No rspush location known or specified.")
252
if (push_location.find('://') != -1 or
253
push_location.find(':') == -1):
254
raise BzrCommandError("Invalid rsync path %r." % push_location)
262
257
clean, non_source = is_clean(tree)
301
296
return new_committer
300
"""Screen-scrape Apache listings"""
301
apache_dir = '<img border="0" src="/icons/folder.gif" alt="[dir]">'\
304
expr = re.compile('<a[^>]*href="([^>]*)"[^>]*>', flags=re.I)
306
match = expr.search(line)
310
if url.startswith('http://') or url.startswith('/') or '../' in url:
314
yield url.rstrip('/')
317
def iter_branches(t, lister=None):
318
"""Iterate through all the branches under a transport"""
319
for bzrdir in iter_bzrdirs(t, lister):
321
branch = bzrdir.open_branch()
322
if branch.bzrdir is bzrdir:
324
except (NotBranchError, UnsupportedFormatError):
328
def iter_branch_tree(t, lister=None):
329
for bzrdir in iter_bzrdirs(t, lister):
331
wt = bzrdir.open_workingtree()
333
except NoWorkingTree, UnsupportedFormatError:
335
branch = bzrdir.open_branch()
336
if branch.bzrdir is bzrdir:
338
except (NotBranchError, UnsupportedFormatError):
342
def iter_bzrdirs(t, lister=None):
345
return t.list_dir('.')
347
bzrdir = bzrdir_from_transport(t)
349
except (NotBranchError, UnsupportedFormatError, TransportError,
353
for directory in lister(t):
354
if directory == ".bzr":
357
subt = t.clone(directory)
358
except UnicodeDecodeError:
360
for bzrdir in iter_bzrdirs(subt, lister):
362
except (NoSuchFile, PermissionDenied, TransportError):
366
def bzrdir_from_transport(t):
367
"""Open a bzrdir from a transport (not a location)"""
368
format = BzrDirFormat.find_format(t)
369
BzrDir._check_supported(format, False)
370
return format.open(t)
306
375
result = doctest.testmod()