implement --enable-threads and a thread-less mode
[emacs.git] / admin / notes / bzr
blob8f7d0d94fa8411f7cef35e7a00e06443f0d1cf82
1 NOTES ON COMMITTING TO EMACS'S BAZAAR REPO    -*- outline -*-
3 * Install changes only on one branch, let them get merged elsewhere if needed.
4 In particular, install bug-fixes only on the release branch (if there
5 is one) and let them get synced to the trunk; do not install them by
6 hand on the trunk as well.  E.g. if there is an active "emacs-23" branch
7 and you have a bug-fix appropriate for the next Emacs-23.x release,
8 install it only on the emacs-23 branch, not on the trunk as well.
10 Installing things manually into more than one branch makes merges more
11 difficult.
13 http://lists.gnu.org/archive/html/emacs-devel/2010-03/msg01124.html
15 The exception is, if you know that the change will be difficult to
16 merge to the trunk (eg because the trunk code has changed a lot).
17 In that case, it's helpful if you can apply the change to both trunk
18 and branch yourself (when committing the branch change, indicate
19 in the commit log that it should not be merged to the trunk; see below).
21 * Backporting a bug-fix from the trunk to a branch (e.g. "emacs-23").
22 Indicate in the commit log that there is no need to merge the commit
23 to the trunk.  Anything that matches `bzrmerge-skip-regexp' will do;
24 eg start the commit message with "Backport:".  This is helpful for the
25 person merging the release branch to the trunk.
27 http://lists.gnu.org/archive/html/emacs-devel/2010-05/msg00262.html
29 * Installing changes from your personal branches.
30 If your branch has only a single commit, or many different real
31 commits, it is fine to do a merge.  If your branch has only a very
32 small number of "real" commits, but several "merge from trunks", it is
33 preferred that you take your branch's diff, apply it to the trunk, and
34 commit directly, not merge.  This keeps the history cleaner.
36 In general, when working on some feature in a separate branch, it is
37 preferable not to merge from trunk until you are done with the
38 feature.  Unless you really need some change that was done on the
39 trunk while you were developing on the branch, you don't really need
40 those merges; just merge once, when you are done with the feature, and
41 Bazaar will take care of the rest.  Bazaar is much better in this than
42 CVS, so interim merges are unnecessary.
44 Or use shelves; or rebase; or do something else.  See the thread for
45 yet another fun excursion into the exciting world of version control.
47 http://lists.gnu.org/archive/html/emacs-devel/2010-04/msg00086.html
49 * Installing changes from gnulib
50 Some of the files in Emacs are copied from gnulib.  To synchronize
51 these files from the version of gnulib that you have checked out into
52 a sibling directory of your branch, type "make sync-from-gnulib"; this
53 will check out the latest version of gnulib if there is no sibling
54 directory already.  It is a good idea to run "bzr status" afterwards,
55 so that if a gnulib module added a file, you can record the new file
56 using "bzr add".  After synchronizing from gnulib, do a "make" in the
57 usual way.
59 To change the set of gnulib modules, change the GNULIB_MODULES
60 variable in the top-level Makefile.in, and then run:
62   ./config.status
63   make sync-from-gnulib
64   bzr status
66 The last command will mention files that may need to be added using
67 "bzr add".  If you remove a gnulib module, or if a gnulib module
68 removes a file, then remove the corresponding files by hand.
70 * How to merge changes from emacs-23 to trunk
72 The following description uses bound branches, presumably it works in
73 a similar way with unbound ones.
75 0) (This step is only necessary if using bzr older than 2.4.0.)
76 Get the bzr changelog_merge plugin:
78 cd ~/.bazaar/plugins
79 bzr branch http://bazaar.launchpad.net/~spiv/bzr-changelog-merge/trunk changelog_merge
81 This plugin should make merging ChangeLogs smoother.  It merges new
82 entries to the top of the file, rather than trying to fit them in
83 mid-way through.  Newer versions of the plugin should also be able to
84 deal with changes to *old* ChangeLog entries, that should not be
85 floated to the head of the file (see launchpad#723968).
87 It is included in bzr from 2.4.0 onwards, so remember to delete the
88 copy in ~/.bazaar if you upgrade bzr.
90 Maybe the default Emacs behavior without this plugin is better,
91 though, it's not clear yet.
93 1) Get clean, up-to-date copies of the emacs-23 and trunk branches.
94 Check for any uncommitted changes with bzr status.
96 2) M-x cd /path/to/trunk
98 The first time only, do this:
99 cd .bzr/branch
100 Add the following line to branch.conf:
101 changelog_merge_files = ChangeLog
103 3) load admin/bzrmerge.el
105 4) M-x bzrmerge RET /path/to/emacs-23 RET
107 It will prompt about revisions that should be skipped, based on the
108 regexp in bzrmerge-missing.  If there are more revisions that you know
109 need skipping, you'll have to do that by hand.
111 5) It will stop if there are any conflicts.  Resolve them.
112 Using smerge-mode, there are menu items to skip to the next conflict,
113 and to take either the trunk, branch, or both copies.
115 6) After resolving all conflicts, you might need to run the bzmerge
116 command again if there are more revisions still to merge.
118 Do not commit (or exit Emacs) until you have run bzrmerge to completion.
120 Before committing, check bzr status and bzr diff output.
121 If you have run bzrmerge enough times, the "pending merge tip" in bzr
122 status should be the last revision from the emacs-23 branch, and
123 bzr status -v should show all the revisions you expect to merge.
125 (Note that it will also show "skipped" revisions.  This is expected,
126 and is due to a technical limitation of bzr.  The log data for those
127 revisions gets merged, the actual changes themselves do not.
128 http://lists.gnu.org/archive/html/emacs-devel/2011-01/msg00609.html )
130 In particular, check the ChangeLog entries (eg in case too many
131 entries have been included or whitespace between entries needs fixing).
132 bzrmerge tries to fix up the dates to today's date, but it only does
133 this where there are conflicts.  If you used the changelog_merge plugin,
134 there won't be any conflicts, and (at time of writing) you will need
135 to adjust dates by hand.  In any case, if someone made multiple
136 ChangeLog entries on different days in the branch, you may wish to
137 collapse them all to a single entry for that author in the trunk
138 (because in the trunk they all appear under the same date).
139 Obviously, if there are multiple changes to the same file by different
140 authors, don't break the logical ordering in doing this.
142 Notes:
144 1) A lot that was in tramp.el in emacs-23 has moved to tramp-sh.el in
145 the trunk.  If you end up with a conflict in tramp.el, the changes may
146 need to go to tramp-sh.el instead.  Remember to update the file name in
147 the ChangeLog.
149 2) If a file is modified in emacs-23, and deleted in the trunk, you
150 get a "contents conflict".  Assuming the changes don't need to be in
151 the trunk at all, use `bzr resolve path/to/file --take-this' to keep the
152 trunk version.  Prior to bzr 2.2.3, this may fail.  You can just
153 delete the .OTHER etc files by hand and use bzr resolve path/to/file.
155 3) Conflicts in autoload md5sums in comments.  Strictly speaking, the
156 right thing to do is merge everything else, resolve the conflict by
157 choosing either the trunk or branch version, then run `make -C lisp
158 autoloads' to update the md5sums to the correct trunk value before
159 committing.
161 * Re-adding a file that has been removed from the repository
163 It's easy to get this wrong. Let's suppose you've done:
165 bzr remove file; bzr commit
167 and now, sometime later, you realize this was a mistake and file needs
168 to be brought back.  DON'T just do:
170 bzr add file; bzr commit
172 This restores file, but without its history (`bzr log file' will be
173 very short).  This is because file gets re-added with a new file-id
174 (use `bzr file-id file' to see the id).
176 Instead of adding the file, try:
178 bzr revert -rN file; bzr commit
180 where revision N+1 is the one where file was removed.
182 You could also try `bzr add --file-ids-from', if you have a copy of
183 another branch where file still exists.
185 * Undoing a commit (uncommitting)
187 It is possible to undo/remove a bzr commit (ie, to uncommit).
188 Only do this if you really, really, need to.  For example, if you
189 somehow made a commit that triggers a bug in bzr itself.
190 Don't do it because you made a typo in a commit or the log.
192 If you do need to do this, do it as soon as possible, because the
193 longer you leave it, the more work is involved.
195 0. First, tell emacs-devel that you are going to do this, and suggest
196 people not commit anything to the affected branch for the duration.
198 In the following, replace USER with your Savannah username, and
199 BRANCH with the name of the branch.
200 Let's assume that revno 100 is the bad commit, and that there have
201 been two more commits after that (because nothing is ever easy).
203 1. Ensure your copy of the branch is up-to-date (for a bound
204 branch, bzr up; for an unbound branch, bzr pull) and has no local
205 changes (bzr st).
207 2. Make a record of the commits you are going to undo:
208 bzr diff -c 102 > /tmp/102.diff
211 Also record the commit message, author, and any --fixes information.
213 3. Most Emacs branches are set up to prevent just this kind of thing.
214 So we need to disable that protection:
216 bzr config append_revisions_only=False \
217   -d bzr+ssh://USER@bzr.savannah.gnu.org/emacs/BRANCH/
219 4. Undo the commits:
220 bzr uncommit -r -4
222 This will show the commits it is going to undo, and prompt you to confirm.
224 5. If using an unbound branch:
225 bzr push --overwrite
227 6. Now, replay the commits you just undid (obviously, fix whatever it
228 was in the bad commit that caused the problem):
230 patch -p0 < /tmp/100.diff
231 bzr commit --author ... --fixes ... -F /tmp/100.log
234 7. If using an unbound branch:
235 bzr push
237 8. Finally, re-enable the branch protection:
238 bzr config append_revisions_only=True \
239   -d bzr+ssh://USER@bzr.savannah.gnu.org/emacs/BRANCH/
241 9. Tell emacs-devel that it is ok to use the branch again.
242 Anyone with local changes should back them up before doing anything.
244 For a bound branch, bzr up will convert any of the undone commits to a
245 pending merge. Just bzr revert these away.
247 For an unbound branch, bzr pull will complain about diverged branches
248 and refuse to do anything.  Use bzr pull --overwrite.
250 * Loggerhead
252 Loggerhead is the bzr tool for viewing a repository over http (similar
253 to ViewVC).  The central version is at http://bzr.savannah.gnu.org/lh/emacs,
254 but if you just like the way this interface presents data, then if
255 you have your own copy of the repository, you can operate your own
256 Loggerhead server in stand-alone mode, and so help to reduce the load
257 on Savannah:
259   bzr branch lp:loggerhead ~/.bazaar/plugins/loggerhead
260   cd /path/to/emacs/bzr
261   bzr serve --http
263 You may need to install some Python dependencies to get this command to work.
264 For example, on RHEL6 I needed:
266   yum install python-paste python-simplejson
267   yum --enablerepo=epel install python-simpletal
269 Then point your web-browser to http://127.0.0.1:8080/ .
271 * Bisecting
273 This is a semi-automated way to find the revision that introduced a bug.
275 First, get the bzr bisect plugin if you do not have it already:
277   cd ~/.bazaar/plugins
278   bzr branch lp:bzr-bisect bisect
280 `bzr help bisect' should work now.
282 It's probably simplest to make a new copy of the branch to work in
283 from this point onwards.
285 Identify the last known "good" revision where the relevant issue is
286 NOT present (e.g. maybe Emacs 24.1).  Let's say this is revision 1000.
288   bzr bisect start
289   bzr bisect no -r 1000
291 At this point, bzr will switch to the mid-point of revision 1000 and
292 the current revision.  If you know that the issue was definitely
293 present in some specific revision (say 2000), you can use:
295   bzr bisect yes -r 2000
297 Now bzr switches to revision 1500.
299 Now test whether the issue is present.  You might need to rebuild
300 Emacs to do this, or if you know the problem is in a specific Lisp
301 file, you might be able to get away with just loading that one file in
302 current Emacs.
304 If the issue is present, use
306   bzr bisect yes
308 If it is not, use
310   bzr bisect no
312 Repeat until you zero-in on the specific revision.
314 When finished, use
316   bzr bisect reset
318 or simply delete the entire branch if you created it just for this.
320 * Commit emails
322 ** Old method: bzr-hookless-email
323 https://launchpad.net/bzr-hookless-email
325 Runs hourly via cron.  Must ask Savannah admins to enable/disable it
326 for each branch.  Stores the last revision that it mailed as
327 last_revision_mailed in branch.conf on the server.  Breaks with bzr 2.6:
329 http://lists.gnu.org/archive/html/savannah-hackers-public/2013-05/msg00000.html
331 Fix from https://bugs.launchpad.net/bzr-hookless-email/+bug/988195
332 only partially works.  Breaks again on every merge commit:
334 https://lists.ubuntu.com/archives/bazaar/2013q2/075520.html
335 http://lists.gnu.org/archive/html/savannah-hackers-public/2013-05/msg00024.html
337 You can force it to skip the merge commit by changing the value for
338 last_revision_mailed, eg:
340 bzr config last_revision_mailed=xfq.free@gmail.com-20130603233720-u1aumaxvf3o0rlai -d bzr+ssh://USERNAME@bzr.savannah.gnu.org/emacs/trunk/
342 ** New method: bzr-email plugin
343 https://launchpad.net/bzr-email
344 http://lists.gnu.org/archive/html/savannah-hackers-public/2013-06/msg00007.html
346 Runs on commit.  Projects can enable it themselves by using `bzr
347 config' to set post_commit_to option for a branch.  See `bzr help email'
348 (if you have the plugin installed) for other options.
350 Note: if you have the bzr-email plugin installed locally, then when
351 you commit to the Emacs repository it will also try to send a commit
352 email from your local machine.  If your machine is not configured to
353 send external mail, this will just fail.  In any case, you may prefer
354 to either remove the plugin from your machine, or disable it for Emacs
355 branches.  You can do this either by editing branch.conf in your Emacs
356 branches, to override the server setting (untested; not sure this
357 works), or by adding an entry to ~/.bazaar/locations.conf:
359   [bzr+ssh://USERNAME@bzr.savannah.gnu.org/emacs/*/]
360   post_commit_to = ""
362 You have to use locations.conf rather than bazaar.conf because the
363 latter has a lower priority than branch.conf.