summaryrefslogtreecommitdiff
path: root/admin/notes/bzr
blob: db9e6e0dcdaa45f09801ff11dba636f206d69d37 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
NOTES ON COMMITTING TO EMACS'S BAZAAR REPO    -*- outline -*-

* Install changes only on one branch, let them get merged elsewhere if needed.
In particular, install bug-fixes only on the release branch (if there
is one) and let them get synced to the trunk; do not install them by
hand on the trunk as well.  E.g. if there is an active "emacs-23" branch
and you have a bug-fix appropriate for the next Emacs-23.x release,
install it only on the emacs-23 branch, not on the trunk as well.

Installing things manually into more than one branch makes merges more
difficult.

http://lists.gnu.org/archive/html/emacs-devel/2010-03/msg01124.html

* Backporting a bug-fix from the trunk to a branch (e.g. "emacs-23").
Label the commit as a backport, e.g. by starting the commit message with
"Backport:".  This is helpful for the person merging the release branch
to the trunk.

http://lists.gnu.org/archive/html/emacs-devel/2010-05/msg00262.html

* Installing changes from your personal branches.
If your branch has only a single commit, or many different real
commits, it is fine to do a merge.  If your branch has only a very
small number of "real" commits, but several "merge from trunks", it is
preferred that you take your branch's diff, apply it to the trunk, and
commit directly, not merge.  This keeps the history cleaner.

In general, when working on some feature in a separate branch, it is
preferable not to merge from trunk until you are done with the
feature.  Unless you really need some change that was done on the
trunk while you were developing on the branch, you don't really need
those merges; just merge once, when you are done with the feature, and
Bazaar will take care of the rest.  Bazaar is much better in this than
CVS, so interim merges are unnecessary.

Or use shelves; or rebase; or do something else.  See the thread for
yet another fun excursion into the exciting world of version control.

http://lists.gnu.org/archive/html/emacs-devel/2010-04/msg00086.html

* Installing changes from gnulib
Some of the files in Emacs are copied from gnulib.  To synchronize
these files from the version of gnulib that you have checked out into
a sibling directory of your branch, type "make sync-from-gnulib"; this
will check out the latest version of gnulib if there is no sibling
directory already.  It is a good idea to run "bzr status" afterwards,
so that if a gnulib module added a file, you can record the new file
using "bzr add".  After synchronizing from gnulib, do a "make" in the
usual way.

To change the set of gnulib modules, change the GNULIB_MODULES
variable in the top-level Makefile.in, and then run:

  ./config.status
  make sync-from-gnulib
  bzr status

The last command will mention files that may need to be added using
"bzr add".  If you remove a gnulib module, or if a gnulib module
removes a file, then remove the corresponding files by hand.

* How to merge changes from emacs-23 to trunk

The following description uses bound branches, presumably it works in
a similar way with unbound ones.

0) (First time only) Get the bzr changelog_merge plugin:

cd ~/.bazaar/plugins
bzr branch lp:bzr-changelog-merge
mv bzr-changelog-merge changelog_merge

This will make merging ChangeLogs a lot smoother.  It merges new
entries to the top of the file, rather than trying to fit them in
mid-way through.

Sigh.  This plugin has a drawback.  People often like to edit older
ChangeLog entries, not at the head of the file.  Frequently they do
this in the same commit as making new entries.  Using this plugin
will merge ALL changed entries (including older ones) to the top of
the destination file.

Maybe the default Emacs behavior without this plugin is better, I dunno.

1) Get clean, up-to-date copies of the emacs-23 and trunk branches.
Check for any uncommitted changes with bzr status.

2) M-x cd /path/to/trunk

The first time only, do this:
cd .bzr/branch
Add the following line to branch.conf:
changelog_merge_files = ChangeLog

3) load admin/bzrmerge.el

4) M-x bzrmerge RET /path/to/emacs-23 RET

It will prompt about revisions that should be skipped, based on the
regexp in bzrmerge-missing.  If there are more revisions that you know
need skipping, you'll have to do that by hand.

5) It will stop if there are any conflicts.  Resolve them.
Using smerge-mode, there are menu items to skip to the next conflict,
and to take either the trunk, branch, or both copies.

6) After resolving all conflicts, you might need to run the bzmerge
command again if there are more revisions still to merge.

Do not commit (or exit Emacs) until you have run bzrmerge to completion.

Before committing, check bzr status and bzr diff output.
If you have run bzrmerge enough times, the "pending merge tip" in bzr
status should be the last revision from the emacs-23 branch, and
bzr status -v should show all the revisions you expect to merge.

(Note that it will also show "skipped" revisions.  This is expected,
and is due to a technical limitation of bzr.  The log data for those
revisions gets merged, the actual changes themselves do not.
http://lists.gnu.org/archive/html/emacs-devel/2011-01/msg00609.html )

In particular, check the ChangeLog entries (eg in case too many
entries have been included or whitespace between entries needs fixing).
bzrmerge tries to fix up the dates to today's date, but it only does
this where there are conflicts.  If you used the changelog_merge plugin,
there won't be any conflicts, and (at time of writing) you will need
to adjust dates by hand.  In any case, if someone made multiple
ChangeLog entries on different days in the branch, you may wish to
collapse them all to a single entry for that author in the trunk
(because in the trunk they all appear under the same date).
Obviously, if there are multiple changes to the same file by different
authors, don't break the logical ordering in doing this.

Notes:

1) A lot that was in tramp.el in emacs-23 has moved to tramp-sh.el in
the trunk.  If you end up with a conflict in tramp.el, the changes may
need to go to tramp-sh.el instead.  Remember to update the file name in
the ChangeLog.

2) If a file is modified in emacs-23, and deleted in the trunk, you
get a "contents conflict".  Assuming the changes don't need to be in
the trunk at all, use `bzr resolve path/to/file --take-this' to keep the
trunk version.  Prior to bzr 2.2.3, this may fail.  You can just
delete the .OTHER etc files by hand and use bzr resolve path/to/file.

3) Conflicts in autoload md5sums in comments.  Strictly speaking, the
right thing to do is merge everything else, resolve the conflict by
choosing either the trunk or branch version, then run `make -C lisp
autoloads' to update the md5sums to the correct trunk value before
committing.

* Re-adding a file that has been removed from the repository

It's easy to get this wrong. Let's suppose you've done:

bzr remove file; bzr commit

and now, sometime later, you realize this was a mistake and file needs
to be brought back.  DON'T just do:

bzr add file; bzr commit

This restores file, but without its history (`bzr log file' will be
very short).  This is because file gets re-added with a new file-id
(use `bzr file-id file' to see the id).

Insteading of adding the file, try:

bzr revert -rN file; bzr commit

where revision N+1 is the one where file was removed.

You could also try `bzr add --file-ids-from', if you have a copy of
another branch where file still exists.