27
27
import bzrlib.errors
28
from bzrlib.errors import (BzrCommandError, NotBranchError, NoSuchFile,
29
UnsupportedFormatError, TransportError,
30
NoWorkingTree, PermissionDenied)
31
from bzrlib.bzrdir import BzrDir, BzrDirFormat
28
from bzrlib.errors import BzrCommandError
29
from bzrlib.bzrdir import BzrDir
34
32
dirname = tempfile.mkdtemp("temp-branch")
55
>>> tree.commit("added file", rev_id='commit-id')
53
>>> tree.commit("added file")
58
from bzrlib.diff import compare_trees
61
59
old_tree = cur_tree.basis_tree()
62
60
new_tree = cur_tree
64
62
for path, file_class, kind, file_id, entry in new_tree.list_files():
65
63
if file_class in ('?', 'I'):
66
64
non_source.append(path)
67
delta = new_tree.changes_from(old_tree, want_unchanged=False)
65
delta = compare_trees(old_tree, new_tree, want_unchanged=False)
68
66
return not delta.has_changed(), non_source
70
68
def set_push_data(tree, location):
71
tree.branch.control_files.put_utf8("x-push-data", "%s\n" % location)
69
push_file = file (tree._control_files.controlfilename("x-push-data"), "wb")
70
push_file.write("%s\n" % location)
73
72
def get_push_data(tree):
78
77
>>> set_push_data(tree, 'http://somewhere')
79
78
>>> get_push_data(tree)
84
location = tree.branch.control_files.get_utf8('x-push-data').read()
82
filename = tree._control_files.controlfilename("x-push-data")
83
if not os.path.exists(filename):
87
return location.rstrip('\n')
85
push_file = file (filename, "rb")
86
(location,) = [f.rstrip('\n') for f in push_file]
90
90
>>> shell_escape('hello')
121
121
>>> rsync("a", "b", silent=True)
122
122
Traceback (most recent call last):
123
123
RsyncNoFile: No such file...
124
>>> rsync(new_dir + "/a", new_dir + "/b", excludes=("*.py",), silent=True)
124
>>> rsync(tempdir + "/a", tempdir + "/b", excludes=("*.py",), silent=True) #doctest: +ELLIPSIS
125
125
Traceback (most recent call last):
126
126
RsyncNoFile: No such file...
127
>>> rsync(new_dir + "/a", new_dir + "/b", excludes=("*.py",), silent=True, rsync_name="rsyncc")
127
>>> rsync(tempdir + "/a", tempdir + "/b", excludes=("*.py",), silent=True, rsync_name="rsyncc")
128
128
Traceback (most recent call last):
129
129
NoRsync: rsyncc not found.
130
130
>>> os.chdir(old_dir)
189
189
raise RsyncUnknownStatus(proc.returncode)
190
190
return [l.split(' ')[-1].rstrip('\n') for l in result.splitlines(True)]
192
exclusions = ('.bzr/x-push-data', '.bzr/branch/x-push/data', '.bzr/parent',
193
'.bzr/branch/parent', '.bzr/x-pull-data', '.bzr/x-pull',
194
'.bzr/pull', '.bzr/stat-cache', '.bzr/x-rsync-data',
195
'.bzr/basis-inventory', '.bzr/inventory.backup.weave')
192
exclusions = ('.bzr/x-push-data', '.bzr/parent', '.bzr/x-pull-data',
193
'.bzr/x-pull', '.bzr/pull', '.bzr/stat-cache',
198
197
def read_revision_history(fname):
211
210
tempdir = tempfile.mkdtemp('push')
213
212
history_fname = os.path.join(tempdir, 'revision-history')
215
cmd = rsync(location+'.bzr/revision-history', history_fname,
218
cmd = rsync(location+'.bzr/branch/revision-history', history_fname,
213
cmd = rsync(location+'.bzr/revision-history', history_fname,
220
215
history = read_revision_history(history_fname)
222
217
shutil.rmtree(tempdir)
239
234
except RsyncNoFile:
242
def rspush(tree, location=None, overwrite=False, working_tree=True):
237
def push(tree, location=None, overwrite=False, working_tree=True):
243
238
push_location = get_push_data(tree)
244
239
if location is not None:
245
240
if not location.endswith('/'):
247
242
push_location = location
249
244
if push_location is None:
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)
245
if tree.branch.get_push_location() is None:
246
raise BzrCommandError("No push location known or specified.")
248
raise bzrlib.errors.MustUseDecorated
250
if push_location.find('://') != -1:
251
raise bzrlib.errors.MustUseDecorated
253
if push_location.find(':') == -1:
254
raise bzrlib.errors.MustUseDecorated
256
clean, non_source = is_clean(tree)
258
print """Error: This tree has uncommitted changes or unknown (?) files.
259
Use "bzr status" to list them."""
257
clean, non_source = is_clean(tree)
259
print """Error: This tree has uncommitted changes or unknown (?) files.
260
Use "bzr status" to list them."""
262
262
final_exclusions = non_source[:]
296
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)
375
301
result = doctest.testmod()