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.bzrdir import BzrDir
34
31
dirname = tempfile.mkdtemp("temp-branch")
55
>>> tree.commit("added file", rev_id='commit-id')
52
>>> tree.commit("added file")
57
from bzrlib.diff import compare_trees
61
58
old_tree = cur_tree.basis_tree()
62
59
new_tree = cur_tree
64
61
for path, file_class, kind, file_id, entry in new_tree.list_files():
65
62
if file_class in ('?', 'I'):
66
63
non_source.append(path)
67
delta = new_tree.changes_from(old_tree, want_unchanged=False)
64
delta = compare_trees(old_tree, new_tree, want_unchanged=False)
68
65
return not delta.has_changed(), non_source
70
67
def set_push_data(tree, location):
71
tree.branch.control_files.put_utf8("x-push-data", "%s\n" % location)
68
push_file = file (tree._control_files.controlfilename("x-push-data"), "wb")
69
push_file.write("%s\n" % location)
73
71
def get_push_data(tree):
78
76
>>> set_push_data(tree, 'http://somewhere')
79
77
>>> get_push_data(tree)
84
location = tree.branch.control_files.get_utf8('x-push-data').read()
81
filename = tree._control_files.controlfilename("x-push-data")
82
if not os.path.exists(filename):
87
return location.rstrip('\n')
84
push_file = file (filename, "rb")
85
(location,) = [f.rstrip('\n') for f in push_file]
90
89
>>> shell_escape('hello')
120
119
>>> os.chdir(new_dir)
121
120
>>> rsync("a", "b", silent=True)
122
121
Traceback (most recent call last):
123
RsyncNoFile: No such file...
124
>>> rsync(new_dir + "/a", new_dir + "/b", excludes=("*.py",), silent=True)
122
RsyncNoFile: No such file a
123
>>> rsync("a", "b", excludes=("*.py",), silent=True)
125
124
Traceback (most recent call last):
126
RsyncNoFile: No such file...
127
>>> rsync(new_dir + "/a", new_dir + "/b", excludes=("*.py",), silent=True, rsync_name="rsyncc")
125
RsyncNoFile: No such file a
126
>>> rsync("a", "b", excludes=("*.py",), silent=True, rsync_name="rsyncc")
128
127
Traceback (most recent call last):
129
128
NoRsync: rsyncc not found.
130
129
>>> os.chdir(old_dir)
189
188
raise RsyncUnknownStatus(proc.returncode)
190
189
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')
191
exclusions = ('.bzr/x-push-data', '.bzr/parent', '.bzr/x-pull-data',
192
'.bzr/x-pull', '.bzr/pull', '.bzr/stat-cache',
198
196
def read_revision_history(fname):
211
209
tempdir = tempfile.mkdtemp('push')
213
211
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,
212
cmd = rsync(location+'.bzr/revision-history', history_fname,
220
214
history = read_revision_history(history_fname)
222
216
shutil.rmtree(tempdir)
239
233
except RsyncNoFile:
242
def rspush(tree, location=None, overwrite=False, working_tree=True):
236
def push(tree, location=None, overwrite=False, working_tree=True):
243
237
push_location = get_push_data(tree)
244
238
if location is not None:
245
239
if not location.endswith('/'):
247
241
push_location = location
249
243
if push_location is None:
250
raise BzrCommandError("No rspush location known or specified.")
252
if (push_location.find('::') != -1):
257
if (push_location.find('://') != -1 or
258
push_location.find(':') == -1):
259
raise BzrCommandError("Invalid rsync path %r." % push_location)
244
raise bzrlib.errors.MustUseDecorated
246
if push_location.find('://') != -1:
247
raise bzrlib.errors.MustUseDecorated
249
if push_location.find(':') == -1:
250
raise bzrlib.errors.MustUseDecorated
252
clean, non_source = is_clean(tree)
254
print """Error: This tree has uncommitted changes or unknown (?) files.
255
Use "bzr status" to list them."""
262
clean, non_source = is_clean(tree)
264
print """Error: This tree has uncommitted changes or unknown (?) files.
265
Use "bzr status" to list them."""
267
258
final_exclusions = non_source[:]
288
279
" specified location. Please ensure that"
289
280
' "%s" is of the form "machine:/path".' % push_location)
290
281
print "Pushing to %s" % push_location
291
rsync(tree.basedir+'/', push_location, ssh=usessh,
282
rsync(tree.basedir+'/', push_location, ssh=True,
292
283
excludes=final_exclusions)
294
285
set_push_data(tree, push_location)
297
287
def short_committer(committer):
298
288
new_committer = re.sub('<.*>', '', committer).strip(' ')
299
289
if len(new_committer) < 2:
301
291
return new_committer
305
"""Screen-scrape Apache listings"""
306
apache_dir = '<img border="0" src="/icons/folder.gif" alt="[dir]">'\
309
expr = re.compile('<a[^>]*href="([^>]*)"[^>]*>', flags=re.I)
311
match = expr.search(line)
315
if url.startswith('http://') or url.startswith('/') or '../' in url:
319
yield url.rstrip('/')
322
def iter_branches(t, lister=None):
323
"""Iterate through all the branches under a transport"""
324
for bzrdir in iter_bzrdirs(t, lister):
326
branch = bzrdir.open_branch()
327
if branch.bzrdir is bzrdir:
329
except (NotBranchError, UnsupportedFormatError):
333
def iter_branch_tree(t, lister=None):
334
for bzrdir in iter_bzrdirs(t, lister):
336
wt = bzrdir.open_workingtree()
338
except NoWorkingTree, UnsupportedFormatError:
340
branch = bzrdir.open_branch()
341
if branch.bzrdir is bzrdir:
343
except (NotBranchError, UnsupportedFormatError):
347
def iter_bzrdirs(t, lister=None):
350
return t.list_dir('.')
352
bzrdir = bzrdir_from_transport(t)
354
except (NotBranchError, UnsupportedFormatError, TransportError,
358
for directory in lister(t):
359
if directory == ".bzr":
362
subt = t.clone(directory)
363
except UnicodeDecodeError:
365
for bzrdir in iter_bzrdirs(subt, lister):
367
except (NoSuchFile, PermissionDenied, TransportError):
371
def bzrdir_from_transport(t):
372
"""Open a bzrdir from a transport (not a location)"""
373
format = BzrDirFormat.find_format(t)
374
BzrDir._check_supported(format, False)
375
return format.open(t)
380
296
result = doctest.testmod()