22
22
import bzrlib.trace
23
23
from bzrlib.trace import mutter, note, log_error, warning
24
24
from bzrlib.errors import BzrError, BzrCheckError, BzrCommandError, NotBranchError
25
from bzrlib.branch import find_branch
25
from bzrlib.branch import Branch
26
26
from bzrlib import BZRDIR
27
27
from bzrlib.commands import Command
63
63
files or directories is reported. If a directory is given, status
64
64
is reported for everything inside that directory.
66
If a revision is specified, the changes since that revision are shown.
66
If a revision argument is given, the status is calculated against
67
that revision, or between two revisions if two are provided.
69
# XXX: FIXME: bzr status should accept a -r option to show changes
70
# relative to a revision, or between revisions
68
72
takes_args = ['file*']
69
73
takes_options = ['all', 'show-ids', 'revision']
70
74
aliases = ['st', 'stat']
72
def run(self, all=False, show_ids=False, file_list=None):
76
def run(self, all=False, show_ids=False, file_list=None, revision=None):
74
b = find_branch(file_list[0])
78
b = Branch.open_containing(file_list[0])
75
79
file_list = [b.relpath(x) for x in file_list]
76
80
# special case: only one path was given and it's the root
78
82
if file_list == ['']:
85
b = Branch.open_containing('.')
83
87
from bzrlib.status import show_status
84
88
show_status(b, show_unchanged=all, show_ids=show_ids,
85
specific_files=file_list)
89
specific_files=file_list, revision=revision)
88
92
class cmd_cat_revision(Command):
89
"""Write out metadata for a revision."""
93
"""Write out metadata for a revision.
95
The revision to print can either be specified by a specific
96
revision identifier, or you can use --revision.
92
takes_args = ['revision_id']
100
takes_args = ['revision_id?']
101
takes_options = ['revision']
94
def run(self, revision_id):
96
sys.stdout.write(b.get_revision_xml_file(revision_id).read())
103
def run(self, revision_id=None, revision=None):
104
from bzrlib.revisionspec import RevisionSpec
106
if revision_id is not None and revision is not None:
107
raise BzrCommandError('You can only supply one of revision_id or --revision')
108
if revision_id is None and revision is None:
109
raise BzrCommandError('You must supply either --revision or a revision_id')
110
b = Branch.open_containing('.')
111
if revision_id is not None:
112
sys.stdout.write(b.get_revision_xml_file(revision_id).read())
113
elif revision is not None:
116
raise BzrCommandError('You cannot specify a NULL revision.')
117
revno, rev_id = rev.in_history(b)
118
sys.stdout.write(b.get_revision_xml_file(rev_id).read())
99
121
class cmd_revno(Command):
100
122
"""Show current revision number.
102
124
This is equal to the number of revisions on this branch."""
104
print find_branch('.').revno()
126
print Branch.open_containing('.').revno()
107
129
class cmd_revision_info(Command):
111
133
takes_args = ['revision_info*']
112
134
takes_options = ['revision']
113
def run(self, revision=None, revision_info_list=None):
114
from bzrlib.branch import find_branch
135
def run(self, revision=None, revision_info_list=[]):
136
from bzrlib.revisionspec import RevisionSpec
117
139
if revision is not None:
118
140
revs.extend(revision)
119
141
if revision_info_list is not None:
120
revs.extend(revision_info_list)
142
for rev in revision_info_list:
143
revs.append(RevisionSpec(rev))
121
144
if len(revs) == 0:
122
145
raise BzrCommandError('You must supply a revision identifier')
147
b = Branch.open_containing('.')
127
print '%4d %s' % b.get_revision_info(rev)
150
revinfo = rev.in_history(b)
151
if revinfo.revno is None:
152
print ' %s' % revinfo.rev_id
154
print '%4d %s' % (revinfo.revno, revinfo.rev_id)
130
157
class cmd_add(Command):
145
172
Therefore simply saying 'bzr add' will version all files that
146
173
are currently unknown.
148
TODO: Perhaps adding a file whose directly is not versioned should
149
recursively add that parent, rather than giving an error?
175
Adding a file whose parent directory is not versioned will
176
implicitly add the parent, and so on up to the root. This means
177
you should never need to explictly add a directory, they'll just
178
get added when you add a file in the directory.
151
180
takes_args = ['file*']
152
181
takes_options = ['verbose', 'no-recurse']
191
220
takes_options = ['revision', 'show-ids']
193
222
def run(self, revision=None, show_ids=False):
223
b = Branch.open_containing('.')
196
225
inv = b.read_working_inventory()
198
227
if len(revision) > 1:
199
228
raise BzrCommandError('bzr inventory --revision takes'
200
229
' exactly one revision identifier')
201
inv = b.get_revision_inventory(b.lookup_revision(revision[0]))
230
inv = b.get_revision_inventory(revision[0].in_history(b).rev_id)
203
232
for path, entry in inv.entries():
317
340
print "Using last location: %s" % stored_loc
318
341
location = stored_loc
319
342
cache_root = tempfile.mkdtemp()
320
from bzrlib.branch import DivergedBranches
321
br_from = find_branch(location)
322
location = pull_loc(br_from)
343
from bzrlib.errors import DivergedBranches
344
br_from = Branch.open_containing(location)
345
location = br_from.base
323
346
old_revno = br_to.revno()
325
from branch import find_cached_branch, DivergedBranches
326
br_from = find_cached_branch(location, cache_root)
327
location = pull_loc(br_from)
348
from bzrlib.errors import DivergedBranches
349
br_from = Branch.open(location)
350
br_from.setup_caching(cache_root)
351
location = br_from.base
328
352
old_revno = br_to.revno()
330
354
br_to.update_revisions(br_from)
366
390
raise BzrCommandError(
367
391
'bzr branch --revision takes exactly 1 revision value')
369
br_from = find_cached_branch(from_location, cache_root)
393
br_from = Branch.open(from_location)
370
394
except OSError, e:
371
395
if e.errno == errno.ENOENT:
372
396
raise BzrCommandError('Source location "%s" does not'
373
397
' exist.' % to_location)
400
br_from.setup_caching(cache_root)
401
if len(revision) == 1 and revision[0] is not None:
402
revision_id = revision[0].in_history(br_from)[1]
376
405
if to_location is None:
377
406
to_location = os.path.basename(from_location.rstrip("/\\"))
680
709
direction = (forward and 'forward') or 'reverse'
683
b = find_branch(filename)
712
b = Branch.open_containing(filename)
684
713
fp = b.relpath(filename)
686
715
file_id = b.read_working_inventory().path2id(fp)
688
717
file_id = None # points to branch root
719
b = Branch.open_containing('.')
693
722
if revision is None:
696
725
elif len(revision) == 1:
697
rev1 = rev2 = b.get_revision_info(revision[0])[0]
726
rev1 = rev2 = revision[0].in_history(b).revno
698
727
elif len(revision) == 2:
699
rev1 = b.get_revision_info(revision[0])[0]
700
rev2 = b.get_revision_info(revision[1])[0]
728
rev1 = revision[0].in_history(b).revno
729
rev2 = revision[1].in_history(b).revno
702
731
raise BzrCommandError('bzr log --revision takes one or two values.')
889
918
takes_options = ['revision', 'format', 'root']
890
919
def run(self, dest, revision=None, format=None, root=None):
921
b = Branch.open_containing('.')
893
922
if revision is None:
894
923
rev_id = b.last_revision()
896
925
if len(revision) != 1:
897
926
raise BzrError('bzr export --revision takes exactly 1 argument')
898
revno, rev_id = b.get_revision_info(revision[0])
927
rev_id = revision[0].in_history(b).rev_id
899
928
t = b.revision_tree(rev_id)
900
929
root, ext = os.path.splitext(dest)
917
946
takes_args = ['filename']
919
948
def run(self, filename, revision=None):
921
950
raise BzrCommandError("bzr cat requires a revision number")
922
951
elif len(revision) != 1:
923
952
raise BzrCommandError("bzr cat --revision takes exactly one number")
925
b.print_file(b.relpath(filename), revision[0])
953
b = Branch.open_containing('.')
954
b.print_file(b.relpath(filename), revision[0].in_history(b).revno)
928
957
class cmd_local_time_offset(Command):
1128
1153
def run(self, branch, other):
1129
1154
from bzrlib.revision import common_ancestor, MultipleRevisionSources
1131
branch1 = find_branch(branch)
1132
branch2 = find_branch(other)
1156
branch1 = Branch.open_containing(branch)
1157
branch2 = Branch.open_containing(other)
1134
1159
history_1 = branch1.revision_history()
1135
1160
history_2 = branch2.revision_history()
1198
1223
other = [branch, -1]
1200
1225
if len(revision) == 1:
1201
other = [branch, revision[0]]
1202
1226
base = [None, None]
1227
other = [branch, revision[0].in_history(branch).revno]
1204
1229
assert len(revision) == 2
1205
1230
if None in revision:
1206
1231
raise BzrCommandError(
1207
1232
"Merge doesn't permit that revision specifier.")
1208
base = [branch, revision[0]]
1209
other = [branch, revision[1]]
1233
from bzrlib.branch import Branch
1234
b = Branch.open(branch)
1236
base = [branch, revision[0].in_history(b).revno]
1237
other = [branch, revision[1].in_history(b).revno]
1212
1240
merge(other, base, check_clean=(not force), merge_type=merge_type)
1240
1268
if len(file_list) == 0:
1241
1269
raise BzrCommandError("No files specified")
1242
1270
if revision is None:
1244
1272
elif len(revision) != 1:
1245
1273
raise BzrCommandError('bzr revert --revision takes exactly 1 argument')
1246
merge(('.', revision[0]), parse_spec('.'),
1275
b = Branch.open_containing('.')
1276
revno = revision[0].in_history(b).revno
1277
merge(('.', revno), parse_spec('.'),
1247
1278
check_clean=False,
1248
1279
ignore_zero=True,
1249
1280
backup_files=not no_backup,
1250
1281
file_list=file_list)
1251
1282
if not file_list:
1252
Branch('.').set_pending_merges([])
1283
Branch.open_containing('.').set_pending_merges([])
1255
1286
class cmd_assert_fail(Command):
1331
1362
print "Using last location: %s" % parent
1332
1363
remote = parent
1333
1364
elif parent is None:
1334
# We only update x-pull if it did not exist, missing should not change the parent
1335
b.controlfile('x-pull', 'wb').write(remote + '\n')
1336
br_remote = find_branch(remote)
1365
# We only update parent if it did not exist, missing
1366
# should not change the parent
1367
b.set_parent(remote)
1368
br_remote = Branch.open_containing(remote)
1338
1370
return show_missing(b, br_remote, verbose=verbose, quiet=quiet)