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