1
1
=======================
2
Integrating with Breezy
2
Integrating with Bazaar
3
3
=======================
5
This document provides some general observations on integrating with
6
Breezy and some recipes for typical tasks. It is intended to be useful to
7
someone developing either a plugin or some other piece of software that
8
integrates with brz. If you want to know about a topic that's not covered
20
When using breezy within the ``brz`` program (for instance as a brz
21
plugin), breezy's global state is already available for use.
26
To use breezy outside of ``brz`` some global state needs to be setup.
27
breezy needs ways to handle user input, passwords, a place to emit
28
progress bars, logging setup appropriately for your program. The easiest
29
way to set all this up in the same fashion ``brz`` does is to call
30
``breezy.initialize``.
32
This returns a context manager within which breezy functions will work
33
correctly. See the pydoc for ``breezy.initialize`` for more information.
34
(You can get away without entering the context manager, because the setup
35
work happens directly from ``initialize``.)
41
To run command-line commands in-process::
43
from breezy.commands import get_command
45
cmd = get_command('version')
48
This will send output through the current UIFactory; you can redirect this
49
elsewhere through the parameters to `breezy.initialize`.
5
This page should hopefully become a quick guide to integrating other
6
(Python-based) software with Bazaar.
52
8
Manipulating the Working Tree
53
9
=============================
54
Most objects in Breezy are in files, named after the class they contain.
10
Most objects in Bazaar are in files, named after the class they contain.
55
11
To manipulate the Working Tree we need a valid WorkingTree object, which
56
12
is loaded from the workingtree.py file, eg::
58
from breezy import workingtree
59
wt = workingtree.WorkingTree.open('/home/jebw/brztest')
14
from bzrlib import workingtree
15
wt = workingtree.WorkingTree.open('/home/jebw/bzrtest')
62
18
This gives us a WorkingTree object, which has various methods spread over
63
itself, and its parent classes MutableTree and Tree - it's worth having a
19
itself, and its parent classes MutableTree and Tree - its worth having a
64
20
look through these three files (workingtree.py, mutabletree.py and tree.py)
65
21
to see which methods are available.
70
25
There are two methods for comparing trees: ``changes_from`` and
71
26
``iter_changes``. ``iter_changes`` is more regular and precise, but it is
72
27
somewhat harder to work with. See the API documentation for more details.
74
29
``changes_from`` creates a Delta object showing changes::
76
from breezy import delta
31
from bzrlib import delta
77
32
changes = wt.changes_from(wt.basis_tree())
79
34
This gives us a Delta object, which has several lists of files for each type of
104
If you want to add files the same way ``brz add`` does, you can use
59
If you want to add files the same way ``bzr add`` does, you can use
105
60
MutableTree.smart_add. By default, this is recursive. Paths can either be
106
61
absolute or relative to the workingtree::
108
63
wt.smart_add(['dir1/filea.txt', 'fileb.txt',
109
'/home/jebw/brztesttree/filec.txt'])
64
'/home/jebw/bzrtesttree/filec.txt'])
112
67
For more precise control over which files to add, use MutableTree.add::
114
wt.add(['dir1/filea.txt', 'fileb.txt', '/home/jebw/brztesttree/filec.txt'])
69
wt.add(['dir1/filea.txt', 'fileb.txt', '/home/jebw/bzrtesttree/filec.txt'])
120
75
You can remove multiple files at once. The file paths need to be relative
121
76
to the workingtree::
173
128
Generating a log is, in itself, simple. Grab a branch (see below) and pass
174
129
it to show_log together with a log formatter, eg::
176
from breezy import log
177
from breezy import branch
131
from bzrlib import log
132
from bzrlib import branch
179
134
b = branch.Branch.open('/path/to/bazaar/branch')
180
135
lf = log.LongLogFormatter(to_file=sys.stdout)
181
136
log.show_log(b, lf)
184
Three log formatters are included with breezy: LongLogFormatter,
139
Three log formatters are included with bzrlib: LongLogFormatter,
185
140
ShortLogFormatter and LineLogFormatter. These provide long, short and
186
141
single-line log output formats. It's also possible to write your own in
187
142
very little code.
227
182
To work with a branch you need a branch object, created from your branch::
229
from breezy import branch
184
from bzrlib import branch
231
b = branch.Branch.open('/home/jebw/brztest')
186
b = branch.Branch.open('/home/jebw/bzrtest')
234
189
Branching from an existing branch
235
---------------------------------
190
=================================
237
192
To branch you create a branch object representing the branch you are
238
193
branching from, and supply a path/url to the new branch location.
239
The following code clones the brz trunk branch (the latest copy of the Breezy
194
The following code clones the bzr.dev branch (the latest copy of the Bazaar
240
195
source code) - be warned it has to download 60meg so takes a while to run
241
196
with no feedback::
243
from breezy import branch
245
b = branch.Branch.open('bzr+ssh://bazaar.launchpad.net/+branch/brz/')
246
nb = b.controldir.sprout('/tmp/newBrzBzranch').open_branch()
249
This provides no feedback, since Breezy automatically uses the 'silent' UI.
198
from bzrlib import branch
200
b = branch.Branch.open('http://bazaar-vcs.org/bzr/bzr.dev')
201
nb = b.bzrdir.sprout('/tmp/newBzrBranch').open_branch()
204
This provides no feedback, since Bazaar automatically uses the 'silent' UI.
252
207
Pushing and pulling branches
253
----------------------------
208
============================
255
210
To push a branch you need to open the source and destination branches, then
256
211
just call push with the other branch as a parameter::
258
from breezy import branch
213
from bzrlib import branch
260
215
b1 = branch.Branch.open('file:///home/user/mybranch')
261
b2 = branch.Branch.open('bzr+ssh://bazaar.launchpad.net/+branch/brz/')
216
b2 = branch.Branch.open('http://bazaar-vcs.org/bzr/bzr.dev')
280
235
This performs a Lightweight checkout from an existing Branch::
282
from breezy import bzrdir
237
from bzrlib import bzrdir
284
239
accelerator_tree, source = bzrdir.BzrDir.open_tree_or_branch('http:URL')
285
source.create_checkout('/tmp/newBrzCheckout', None, True, accelerator_tree)
240
source.create_checkout('/tmp/newBzrCheckout', None, True, accelerator_tree)
288
243
To make a heavyweight checkout, change the last line to::
290
source.create_checkout('/tmp/newBrzCheckout', None, False, accelerator_tree
245
source.create_checkout('/tmp/newBzrCheckout', None, False, accelerator_tree
293
248
History Operations
294
249
==================
296
251
Finding the last revision number or id
297
--------------------------------------
252
======================================
299
254
To get the last revision number and id of a branch use::