1
# Copyright (C) 2005, 2006, 2007 Aaron Bentley <aaron.bentley@utoronto.ca>
2
# Copyright (C) 2007 John Arbash Meinel
1
# Copyright (C) 2005 Aaron Bentley
2
# <aaron.bentley@utoronto.ca>
4
4
# This program is free software; you can redistribute it and/or modify
5
5
# it under the terms of the GNU General Public License as published by
27
27
import bzrlib.errors
28
28
from bzrlib.errors import (BzrCommandError, NotBranchError, NoSuchFile,
29
UnsupportedFormatError, TransportError,
29
UnsupportedFormatError, TransportError,
30
30
NoWorkingTree, PermissionDenied)
31
31
from bzrlib.bzrdir import BzrDir, BzrDirFormat
40
40
def is_clean(cur_tree):
42
42
Return true if no files are modifed or unknown
44
>>> tree = temp_tree()
47
>>> fooname = os.path.join(tree.basedir, "foo")
48
>>> file(fooname, "wb").write("bar")
51
>>> bzrlib.add.smart_add_tree(tree, [tree.basedir])
55
>>> tree.commit("added file")
60
from bzrlib.diff import compare_trees
44
61
old_tree = cur_tree.basis_tree()
45
62
new_tree = cur_tree
49
for path, file_class, kind, file_id, entry in new_tree.list_files():
50
if file_class in ('?', 'I'):
51
non_source.append(path)
52
delta = new_tree.changes_from(old_tree, want_unchanged=False)
64
for path, file_class, kind, file_id, entry in new_tree.list_files():
65
if file_class in ('?', 'I'):
66
non_source.append(path)
67
delta = compare_trees(old_tree, new_tree, want_unchanged=False)
55
68
return not delta.has_changed(), non_source
57
70
def set_push_data(tree, location):
58
tree.branch.control_files.put_utf8("x-push-data", "%s\n" % location)
71
push_file = file (tree.branch.control_files.controlfilename("x-push-data"), "wb")
72
push_file.write("%s\n" % location)
60
74
def get_push_data(tree):
65
79
>>> set_push_data(tree, 'http://somewhere')
66
80
>>> get_push_data(tree)
71
location = tree.branch.control_files.get_utf8('x-push-data').read()
84
filename = tree.branch.control_files.controlfilename("x-push-data")
85
if not os.path.exists(filename):
74
return location.rstrip('\n')
87
push_file = file (filename, "rb")
88
(location,) = [f.rstrip('\n') for f in push_file]
77
92
>>> shell_escape('hello')
99
114
def __init__(self, rsync_name):
100
115
Exception.__init__(self, "%s not found." % rsync_name)
102
def rsync(source, target, ssh=False, excludes=(), silent=False,
117
def rsync(source, target, ssh=False, excludes=(), silent=False,
103
118
rsync_name="rsync"):
105
120
>>> new_dir = tempfile.mkdtemp()
176
191
raise RsyncUnknownStatus(proc.returncode)
177
192
return [l.split(' ')[-1].rstrip('\n') for l in result.splitlines(True)]
179
exclusions = ('.bzr/x-push-data', '.bzr/branch/x-push/data', '.bzr/parent',
194
exclusions = ('.bzr/x-push-data', '.bzr/branch/x-push/data', '.bzr/parent',
180
195
'.bzr/branch/parent', '.bzr/x-pull-data', '.bzr/x-pull',
181
196
'.bzr/pull', '.bzr/stat-cache', '.bzr/x-rsync-data',
182
197
'.bzr/basis-inventory', '.bzr/inventory.backup.weave')
232
247
if not location.endswith('/'):
234
249
push_location = location
236
251
if push_location is None:
237
252
raise BzrCommandError("No rspush location known or specified.")
239
if (push_location.find('::') != -1):
244
254
if (push_location.find('://') != -1 or
245
255
push_location.find(':') == -1):
246
256
raise BzrCommandError("Invalid rsync path %r." % push_location)
275
285
" specified location. Please ensure that"
276
286
' "%s" is of the form "machine:/path".' % push_location)
277
287
print "Pushing to %s" % push_location
278
rsync(tree.basedir+'/', push_location, ssh=usessh,
288
rsync(tree.basedir+'/', push_location, ssh=True,
279
289
excludes=final_exclusions)
281
291
set_push_data(tree, push_location)
354
364
except (NoSuchFile, PermissionDenied, TransportError):
358
368
def bzrdir_from_transport(t):
359
369
"""Open a bzrdir from a transport (not a location)"""
360
370
format = BzrDirFormat.find_format(t)