~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to doc/design.txt

Merge bzr.dev to resolve conflicts

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
****************
2
 
Bazaar-NG design
3
 
****************
4
 
 
5
 
 
6
 
:Author:
7
 
  Martin Pool <mbp@sourcefrog.net>
8
 
 
9
 
:Date: December 2004, Noosa.
10
 
 
11
 
.. sectnum::
12
 
.. contents::
13
 
 
14
 
 
15
 
Abstract
16
 
--------
17
 
 
18
 
  *Bazaar-NG should be a joy to use.*
19
 
 
20
 
  What if we started from scratch and tried to take the best features
21
 
  from darcs, svn, arch, quilt, and bk?
22
 
 
23
 
  Don't get the sum of all features; rather get the minimum features
24
 
  that make it a joy to use.  Choose simplicity, in both interface and model.
25
 
  Do not multiply entities
26
 
  beyond necessity.
27
 
 
28
 
  *Make it work; make it correct; make it fast* -- Ritchie(?)
29
 
 
30
 
 
31
 
 
32
 
Design model
33
 
------------
34
 
 
35
 
* Unify archives and branches; one archive holds one branch.  If you
36
 
  want to publish multiple branches, just put up multiple directories.
37
 
 
38
 
* Explicitly add/remove files only; no names or tagline tagging.  If
39
 
  someone wants to do heuristic detection of renames that's fine, but
40
 
  it's not in the core model.
41
 
 
42
 
Quilt indicates an interesting approach: patches themselves are the
43
 
thing we're trying to build.  We don't just want a record of what
44
 
happened, but we want to build up a good description of the change
45
 
that will be implied when it's integrated.  This implies that we want
46
 
to be able to change history quite a lot before merging upstream; or
47
 
at least change our description of what will go up.
48
 
 
49
 
 
50
 
Principles
51
 
----------
52
 
 
53
 
* Unix design philosophy (via Peter Miller), tempered by modern
54
 
  expectations:
55
 
 
56
 
  - least unnecessary output
57
 
 
58
 
  - little dependence on *specific* external tools
59
 
 
60
 
  - short command lines
61
 
 
62
 
  - least overlap with cooperating tools
63
 
 
64
 
* `Worse is better`__
65
 
 
66
 
__ http://www.jwz.org/doc/worse-is-better.html
67
 
 
68
 
 - *Simplicity: the design must be simple, both in implementation and
69
 
   interface. It is more important for the implementation to be
70
 
   simple than the interface. Simplicity is the most important
71
 
   consideration in a design.*
72
 
 
73
 
 - *Correctness: the design must be correct in all observable
74
 
   aspects. It is slightly better to be simple than correct.*
75
 
 
76
 
 
77
 
 - *Consistency: the design must not be overly inconsistent. Consistency
78
 
   can be sacrificed for simplicity in some cases, but it is better to
79
 
   drop those parts of the design that deal with less common
80
 
   circumstances than to introduce either implementational complexity
81
 
   or inconsistency.*
82
 
 
83
 
 - *Completeness: the design must cover as many important situations as
84
 
   is practical. All reasonably expected cases should be
85
 
   covered. Completeness can be sacrificed in favor of any other
86
 
   quality. In fact, completeness must sacrificed whenever implementation
87
 
   simplicity is jeopardized. Consistency can be sacrificed to achieve
88
 
   completeness if simplicity is retained; especially worthless is
89
 
   consistency of interface.*
90
 
 
91
 
* Try to get a reasonably tasteful balance between having something
92
 
  that works out of the box but also has composable parts.  Provide
93
 
  mechanism rather than policy but not to excess.
94
 
 
95
 
* Files have ids to let us detect renames without having to walk the
96
 
  whole path.  
97
 
 
98
 
  If there are conflicts in ids they can in principle be resolved.
99
 
  There might be a ``merge --by-name`` to allow you to force two trees
100
 
  into agreement on IDs.  If the merge sees two files with the same
101
 
  name and text then it should conclude that the files merged.
102
 
 
103
 
  It would be nice if there were some way to make repeated imports of
104
 
  the same tree give the same ids, but I don't think there is a safe
105
 
  feasible way.  Sometimes files start out the same but really should
106
 
  diverge; boilerplate files are one example. 
107
 
 
108
 
* Archives are just directories; if you can read/write the files in
109
 
  them you can do what you need.  This works even over http/sftp/etc.
110
 
  Or at least this should work for read-only access; perhaps for
111
 
  writing it is reasonable to require a svn+ssh style server invoked
112
 
  over a socket.  
113
 
 
114
 
  Of course people should not edit the files in there by hand but in
115
 
  an emergency it should be possible.
116
 
 
117
 
* Storing archives in plain directories means making some special
118
 
  effort to make sure they can be rolled back if the commit is
119
 
  interrupted any time.  On truly malicious filesystems (NFS) this may
120
 
  be quite difficult, but at a minimum it should be possible to roll
121
 
  back whatever was uncommitted and get to a reasonable state.  It
122
 
  should also be reasonably possible to mirror branches using rsync,
123
 
  which may transfer files in arbitrary order and cannot handle files
124
 
  changing while in flight.  
125
 
 
126
 
  Recovering from an interrupted commit may require a special ``bzr
127
 
  fix`` command, which should write the results to a new branch to
128
 
  avoid losing anything.
129
 
 
130
 
* Branches carry enough information to recreate any previous state of
131
 
  the branch (including its ancestors).  
132
 
 
133
 
  This does not necessarily mean holding the complete text of all
134
 
  those patches, but we do store at least a globally unique identifier
135
 
  so that we can retrieve them.
136
 
 
137
 
* Commands should correspond to svn or cvs as much as possible: add,
138
 
  get, copy, commit, diff, status, log, merge. 
139
 
 
140
 
* We have all the power of mirroring, but without needing to introduce
141
 
  special concepts or commands.  If you want somebody's branch
142
 
  available offline just copy it and keep updating to pull in their
143
 
  changes; if you never make any changes the updates will always
144
 
  succeed.
145
 
 
146
 
* It is useful to be able to easily undo a previous change by
147
 
  committing the opposite.  I had previously imagined requiring all
148
 
  patches to be stored in a reversible form but it's enough to just do
149
 
  backwards three-way merges.
150
 
 
151
 
* Patches have globally unique IDs which uniquely identify them.
152
 
 
153
 
* As a general principle we separate identification (which must be
154
 
  globally unique) from naming (which must be meaningful to users).
155
 
  Arch fuses them, which makes the human names long and prevents them
156
 
  ever being reused.  Monotone doesn't have human-friendly names.
157
 
 
158
 
* Users are identified by something like an email address;
159
 
  ``user@domain``.  This need not actually be a working email
160
 
  address; the point is just to piggyback on domain names to get
161
 
  human-readable globally unique names.
162
 
 
163
 
* Everything will be designed from the beginning to be safe and
164
 
  reasonable on Windows and Unix.
165
 
 
166
 
* History is append-only.  Patches are recorded along with the time at
167
 
  which they were committed; if time steps backwards then we give a
168
 
  warning (but probably commit anyhow.)  This means we can reliably
169
 
  reproduce the state of the branch at any previous point, just by
170
 
  backing out patches until we get back there.
171
 
  
172
 
  This is also true at a physical level as much as possible; once a
173
 
  patch is committed we do not overwrite it.  This should make it less
174
 
  likely that a failure will corrupt past history.  However, we may
175
 
  need some indexes which are updated rather than replaced; they
176
 
  should probably be atomically updated.
177
 
 
178
 
* Storage should be reasonably transparent, as much as possible.  (ie
179
 
  don't use SQLite or BDB.)  At the same time it should be reasonably
180
 
  efficient on a wide range of systems (ie don't require reiserfs to
181
 
  work well.)
182
 
  
183
 
  Programmers who look behind the covers should feel comfortable that
184
 
  their data is safe, and hopefully pleased that the design is
185
 
  elegant.
186
 
 
187
 
* Unrecognized files cause a warning when you try to commit, but you
188
 
  can still commit.  (Same behavior as CVS/Subversion; less discipline
189
 
  than Arch.)
190
 
 
191
 
  If you wish, you can change this to fail rather than just warn; this
192
 
  can be done as tree policy or as an option (eg ``commit --strict``)
193
 
 
194
 
* Files may be ignored by a glob; this can be applied globally (across
195
 
  the whole tree) or for a particular directory.  As a special
196
 
  convenience there is ``bzr ignore``. 
197
 
 
198
 
* If branches move location (e.g. to a new host or a different
199
 
  directory), then everyone who uses them needs to know the new URL by
200
 
  some out-of-band method.
201
 
 
202
 
* All operations on a branch or pair of branches can be done entirely
203
 
  with the information stored in those branches.  Bazaar-NG never needs to
204
 
  go and look at another branch, so we don't need unique branch names
205
 
  or to remember the location of branches.
206
 
 
207
 
* Store SHA-1 hashes of all patches, also store hashes of the tree
208
 
  state in each revision.  (We need some defined way to make a hash of
209
 
  a tree of files; for a start we can just cat them together in order
210
 
  by filename.)
211
 
  
212
 
  Hashes are stored in such a way that we can switch hash algorithms
213
 
  later if needed if SHA-1 is insecure.
214
 
 
215
 
* You can also sign the hashes of patches or trees.
216
 
 
217
 
* All branches carry all the patches leading up to their current
218
 
  state, so you can recreate any previous state of that branch,
219
 
  including the branches leading up to it.
220
 
 
221
 
* A branch has an append-only history of patches committed on this
222
 
  branch, and also an append-only history of patches that have been
223
 
  merged in.
224
 
 
225
 
* A commit log message file is present in .bzr-log all the time; you
226
 
  can add notes to it as you go along.  Some commands automatically
227
 
  add information to this file, such as when merging or reversing
228
 
  changes. 
229
 
  
230
 
  The first line of the message is used as the summary.
231
 
 
232
 
* Commands that make changes to the working copy will by default baulk
233
 
  if you have any uncommitted changes.  Such commands include ``merge``
234
 
  and ``reverse``.  This is done for two reasons: to avoid losing your
235
 
  changes in the case where the merge causes problems, and to try to
236
 
  keep merges relatively pure.  You can force it if you wish.
237
 
 
238
 
  (*pull* is possibly a special case; perhaps it should set aside
239
 
  local changes, update, and then reapply them/remerge them?)
240
 
 
241
 
* Within a branch, you can refer to commits by their sequence number;
242
 
  it's nice and friendly for the common case of looking at your
243
 
  commits in order.
244
 
 
245
 
* You can generate a changelog any time by looking at only local
246
 
  files.  Automatically including a changelog in every commit is
247
 
  redundant and so can be eliminated.  Of course if you want to
248
 
  manually maintain a changelog you can do that too.
249
 
 
250
 
* At the very least we should have ``undo`` as a reversible
251
 
  ``revert``.  It might be even better to have a totally general undo
252
 
  which will undo any operation; this is possible by keeping a journal
253
 
  of all changes.
254
 
 
255
 
* Perhaps eventually move to storing changesets in single text files,
256
 
  containing file diffs and also information on renames, etc.  The
257
 
  format should be similar to that of ``tla show-changeset``, but
258
 
  lossless. 
259
 
 
260
 
* Pristines are kept in the control directory; pristines are
261
 
  relatively expensive to recreate so we might want to keep more than
262
 
  one.  
263
 
 
264
 
  (Robert says that keeping pristines under there can cause trouble
265
 
  with people running recursive commands across the source tree, so
266
 
  there should probably be some other way to do it.  If pristines are
267
 
  identified by their hash then we can have a revlib without needing
268
 
  unique branch names.)
269
 
  
270
 
* Can probably still have cacherevs for revisions; ideally
271
 
  autogenerated in some sensible way.  We know the tree checksum for
272
 
  each revision and can make sure we cached the right thing.
273
 
 
274
 
* Bazaar-NG should ideally combine the best merging features of
275
 
  Bitkeeper and Arch: both cherry-picking and arbitrary merging within
276
 
  a graph.  The metaphor of a bazaar or souk is appropriate: many
277
 
  independent agents, exchanging selected patches at will.
278
 
 
279
 
* Code should be structured as a library plus a command-line client;
280
 
  the library could be called from any other client.  Therefore
281
 
  communication with the user should go through a layer, the library
282
 
  should not arbitrarily exit() or abort(), etc.
283
 
 
284
 
* Any of these details are open to change.  If you disagree, write and
285
 
  say so, sooner rather than later.  There will be a day in the future
286
 
  where we commit to compatibility, but that is a while off.
287
 
 
288
 
* Timestamps obviously need to be in UTC to be meaningful on the
289
 
  network.  I guess they should be displayed in localtime by default
290
 
  and you can change that by setting $TZ or perhaps some option like
291
 
  ``--utc``.  It might be cool to also capture the local time as an
292
 
  indicator of what the committer was doing.
293
 
 
294
 
* Should probably have some kind of progress indicator like --showdots
295
 
  that is easy to ignore when run from a program (especially an
296
 
  editor); that probably means avoiding tricks with carriage return.
297
 
  (That might be a problem on Windows too.)
298
 
 
299
 
* What date should be present on restored files?  We don't remember
300
 
  the date of individual files, but we could set the date for the
301
 
  entire commit.
302
 
 
303
 
* One important layer is concerned with reproducing a previous
304
 
  revision from a given branch; either the whole thing or just a
305
 
  particular file or subdirectory.  This is used in many different
306
 
  places.  We can potentially plug in different storage mechanisms
307
 
  that can do this; either a very transparent and simple file-based
308
 
  store as in darcs and arch, or perhaps a more tricky/fast
309
 
  database-based system.         
310
 
 
311
 
 
312
 
Entities and terminology
313
 
------------------------
314
 
 
315
 
The name of the project is *Bazaar-NG*; the top-level command is
316
 
``bzr``.
317
 
 
318
 
Branch
319
 
''''''
320
 
 
321
 
Development in Bazaar-NG takes places on branches.  A branch records
322
 
the progress of a *tree* through various *revisions* by the
323
 
accumulation of a series of *patches*.
324
 
 
325
 
We can point to a branch by specifying its *location*.  At first this
326
 
will be just a local directory name but it might grow to allow remote
327
 
URLs with various schemes.
328
 
 
329
 
Branches have a *name* which is for human convenience only; changesets
330
 
are permanently labelled with the name of the branch on which they
331
 
originated.  Branch names complement change descriptions by providing
332
 
a broader context for the purpose of the change.  Typically the branch
333
 
name will be the same as the last component of the directory or path.
334
 
 
335
 
There is no higher-level grouping than branches.  (Nothing that
336
 
corresponds to repositories in CVS or Subversion, or
337
 
archives/categories/versions in Arch.)  Of course it may be a good
338
 
practice to keep your branches organized into directories for each
339
 
project, just as you might do with tarballs or cvs working
340
 
directories.  
341
 
 
342
 
Bazaar-NG makes forking branches very easy and common.  
343
 
 
344
 
 
345
 
 
346
 
Revision
347
 
''''''''
348
 
 
349
 
The tree in a branch at a particular moment, after applying all the
350
 
patches up to that point.
351
 
 
352
 
 
353
 
File id
354
 
'''''''
355
 
 
356
 
A UUID for a versioned file, assigned by ``bzr add``.
357
 
 
358
 
 
359
 
Delta
360
 
'''''
361
 
 
362
 
A smart diff, containing:
363
 
 
364
 
* unidiff hunks for textual changes
365
 
 
366
 
* for each affected file, the file id and the name of that file before
367
 
  and after the delta (they will be the same if the file was not renamed)
368
 
 
369
 
* in future, possibly other information describing symlinks,
370
 
  permissions, etc
371
 
 
372
 
A delta can be generated by comparing two trees without needing any
373
 
additional input. 
374
 
 
375
 
Although deltas have some diff context that would allow fuzzy
376
 
application they are (almost?) always exactly applied to the correct
377
 
predecessor. 
378
 
 
379
 
 
380
 
Changeset
381
 
'''''''''
382
 
 
383
 
(also known as a patch)
384
 
 
385
 
A changeset represents a commit to a particular branch; it
386
 
incorporates a *delta* plus some header information such as the name
387
 
of the committer, the date of the commit, and the commit message.
388
 
 
389
 
 
390
 
Tree
391
 
''''
392
 
 
393
 
A tree of files and directories.  A branch minus the Bazaar-NG control files.
394
 
 
395
 
 
396
 
 
397
 
 
398
 
Syntax
399
 
------
400
 
 
401
 
Branches
402
 
''''''''
403
 
 
404
 
Branches are identified by their directory name or URL::
405
 
 
406
 
  bzr branch http://kernel.org/bzr/linux/linux-2.6
407
 
  bzr branch ./linux-2.6 ./linux-2.6-mbp-partitions
408
 
 
409
 
Branches have human-specified names used for tracing patches to their
410
 
origin.  By default this is the last component of the directory name. 
411
 
 
412
 
 
413
 
Revisions
414
 
'''''''''
415
 
 
416
 
Revisions within a branch may be identified by their sequence number
417
 
on that branch, or by a tag name::
418
 
 
419
 
  bzr branch ./linux-2.6@43 ./linux-2.6-old
420
 
  bzr branch ./linux-2.6@rel6.8.1 ./linux-2.6.8.1
421
 
 
422
 
You may also use the UUID of the patch or by the hash of that
423
 
revision, though sane humans should never (need to) use these::
424
 
 
425
 
  bzr log ./linux-2.6@uuid:6eaa1c41-34b8-4e0e-8819-acb5dfcabb78
426
 
  bzr log ./linux-2.6@hash:4bf00930372cce9716411b266d2e03494f7fe7aa
427
 
 
428
 
Revision ranges are given as two revisions separated by a colon (same
429
 
as Svn):
430
 
 
431
 
  bzr merge ../distcc-doc@4:10 
432
 
 
433
 
 
434
 
Authors
435
 
'''''''
436
 
 
437
 
Authors are identified by their email address, taken from ``$EMAIL``
438
 
or ``$BZR_EMAIL``.
439
 
 
440
 
 
441
 
 
442
 
 
443
 
Tree inventory
444
 
--------------
445
 
 
446
 
When a revision is committed, Bazaar-NG records an "inventory"  which
447
 
essentially says which version of each file should be assembled into
448
 
which location in the tree.  It also includes the SHA-1 hash and the
449
 
size of each file.
450
 
 
451
 
 
452
 
 
453
 
Merging
454
 
-------
455
 
 
456
 
Merges are carried out in Bazaar-NG by a three-way merge of trees.  Users
457
 
can choose to merge all changes from another branch, or a particular
458
 
subset of changes.  In either case Bazaar-NG chooses an appropriate
459
 
common base appropriately, although there should perhaps also be an
460
 
option to specify a different base.
461
 
 
462
 
I have not solved all the merge problems here.  I do think that this
463
 
design preserves as much information as possible about the history of
464
 
the code and so gives a good foundation for smart merging.
465
 
The basic merge operation is a 3-way diff: we have three files *BASE*,
466
 
*OTHER* and *MINE* and want to produce a result.  There are many
467
 
different tools that could be used to resolve this interactively or
468
 
automatically. 
469
 
 
470
 
There are some cases where the best base is not a state that ever
471
 
occurred on the two branches.  One such case is when there are two
472
 
branches that have both tracked an upstream branch but have never
473
 
previously synced with each other.  In this case we suggest that
474
 
people manually specify the base::
475
 
 
476
 
  bzr merge --base linus-2.6 my-2.6 
477
 
 
478
 
Merges most commonly happen on files, but can also occur on metadata.
479
 
For example we may need to resolve a conflict between file ids to
480
 
decide what name a file should have, or conversely which id it should
481
 
have.
482
 
 
483
 
When merging an entire branch, the base is chosen as the last revision
484
 
in which the trees manifests were identical.
485
 
 
486
 
If merging only selected revisions from a branch (ie cherry picking)
487
 
then the base is set just before the revisions to be merged.
488
 
 
489
 
A three-way merge operates on three inputs: THIS, OTHER, and a BASE.
490
 
Any regions which have been changed in only one of THIS and OTHER, or
491
 
changed the same way in both will be carried across automatically.
492
 
Regions which differ in all three trees are conflicts and must be
493
 
manually resolved.
494
 
 
495
 
The merge does not depend upon any states the trees may have
496
 
passed through in between the revisions that are merged. 
497
 
 
498
 
After the merge, the destination tree incorporates all the patches
499
 
from the branch region that was merged in.  
500
 
 
501
 
 
502
 
 
503
 
Sending patches by email
504
 
------------------------
505
 
 
506
 
Patches can be sent to someone else by email, just by posting the
507
 
string representation of the changeset.  Could also post the GPG
508
 
signature.
509
 
 
510
 
The changeset cannot itself contain its uniquely-identifying hash.
511
 
Therefore I suppose it needs some kind of super-header which says what
512
 
the patch id is; this can be verified by comparing it to the hash of
513
 
the actual changeset.  This in turn applies that the text must be
514
 
exactly preserved in email, so possibly we need some kind of
515
 
quoted-printable or ascii-armoured form.
516
 
 
517
 
Another approach would be to not use the hash as the id, but rather
518
 
something else which allows us to check the patch is actually what it
519
 
claims to be.  For example giving a GPG key id and a UUID would do
520
 
just as well, and *would* allow the id to be included within the
521
 
patch, as would giving an arch-style revision ID, assuming we can
522
 
either map the userid to a GPG key and/or check against a trusted
523
 
archive. 
524
 
 
525
 
There are two ways to apply such a received patch.  Ideally it tells
526
 
us a revision of our branch from which it was based, probably by
527
 
specifying the content hash.  We can use that as the base, make a
528
 
branch there, apply the patch perfectly, and then merge that branch
529
 
back in through a 3-way merge.  This gives a clean reconciliation of
530
 
changes in the patch against any local changes in the branch since the
531
 
base.
532
 
 
533
 
If we do not have the base for the patch we can try apply it using
534
 
a similar mechanism to regular patch, which might cause conflicts.  Or
535
 
maybe it is not worth special-casing this; we could just require
536
 
people to have the right basis to accept a patch.
537
 
 
538
 
 
539
 
 
540
 
Rewriting history
541
 
-----------------
542
 
 
543
 
History is generally append-only; once something is committed it
544
 
cannot be undone.  We need this to make several important guarantees
545
 
about being able to reconstruct previous versions, about patches being
546
 
consistent, and so on and on.
547
 
 
548
 
However, pragmatically, there are a few cases where people will insist
549
 
on being able to fudge it.  We need to accommodate those as best we
550
 
can, within the limits of causality.  In other words, what is
551
 
physically and logically possible should not be arbitrarily forbidden
552
 
by the software (though it might be enormously discouraged).
553
 
 
554
 
The basic transaction is a changeset/patch/commit.  There is little
555
 
value and hellish complexity in introducing meta-changesets or trying
556
 
to update already-committed changes.
557
 
 
558
 
 
559
 
Wrong commit message
560
 
''''''''''''''''''''
561
 
 
562
 
*Oops, I pressed Save too soon, and the commit message is wrong.*  This
563
 
happens all the time.
564
 
 
565
 
If no other branch has taken that change, there is no harm in fixing
566
 
the message.  Noticing the problem right away is probably a very
567
 
common case.
568
 
 
569
 
Therefore, you can change the descriptive text (but not any other
570
 
metadata) of a changeset in your tree.  This will not propagate to
571
 
anyone else who has already accepted the change.  Nothing will break,
572
 
but they'll still see the original (incorrect/incomplete) commit.
573
 
 
574
 
 
575
 
Committed confidential information
576
 
''''''''''''''''''''''''''''''''''
577
 
 
578
 
If you just added a file you didn't mean to add then you can simply
579
 
commit a second changeset to remove it again.  However, sometimes
580
 
people will accidentally commit sensitive/confidential information,
581
 
and they need to remove it from the history. 
582
 
 
583
 
If anyone else has already taken the changeset we can't prevent them
584
 
seeing or keeping the information.  You need to find them and ask them
585
 
nicely to remove it as well.  Similarly, if you've mirrored your
586
 
branch elsewhere you need to fix it up by hand.  This additional
587
 
manual work is a feature because it gives you some protection against
588
 
accidentally destroying the wrong thing.
589
 
 
590
 
A similar but related case is accidentally committing an enormous
591
 
file; you don't want it to hang around in the archive for ever.  (In
592
 
fact, it would need to be stored twice, once for the original commit
593
 
and again for a reversible remove changeset.)
594
 
 
595
 
Here is our suggestion for how to fix this: make a second branch from
596
 
just before the undesired commit, typically by specifying a timestamp.
597
 
If there are any later commits that need to be preserved, they can be
598
 
merged in too.  Possibly that will cause conflicts if they depended on
599
 
the removed changeset, and those changes then need to be resolved.
600
 
 
601
 
 
602
 
 
603
 
 
604
 
 
605
 
 
606
 
History truncation
607
 
------------------
608
 
 
609
 
(I don't think we should implement this soon, if at all, but people
610
 
might want to know it's possible.)
611
 
 
612
 
Bazaar-NG relies on each branch being able to recreate any of its
613
 
predecessor states.  This is needed to do really intelligent merging.
614
 
 
615
 
However, you might eventually get sick of keeping all the history
616
 
around forever.  Therefore, we can set a history horizon, ignoring all
617
 
patches before that point. 
618
 
 
619
 
The patches are still recorded as being merged but we do not keep the
620
 
text of the patches.  Perhaps we add them to a special list.  
621
 
 
622
 
Merges with a tree that have no history in common since the horizon
623
 
will be somewhat harder.
624
 
 
625
 
 
626
 
A development path
627
 
------------------
628
 
 
629
 
**See also work-log.txt for what I'm currently doing.**
630
 
 
631
 
* Start by still using Arch changeset format, do-changeset and delta
632
 
  commands, possibly also for merge.
633
 
 
634
 
* Don't do any merges automatically at first but rather just build
635
 
  some trees and let the user run dirdiff or something.
636
 
 
637
 
* Don't handle renames at first.
638
 
 
639
 
* Don't worry about actually being distributed yet; just work between
640
 
  local directories.  There are no conceptual problems with accessing
641
 
  remote directories.
642
 
 
643
 
 
644
 
Compared to others
645
 
------------------
646
 
 
647
 
* History cannot be rewritten, aside from a couple of special
648
 
  pragmatic cases.
649
 
 
650
 
* Allows cherry-picking, which is not possible on bk or most others.
651
 
 
652
 
* Allows merges within an arbitrary graph (rather than a line, star or
653
 
  tree), which can be done by bk but not by arch or others.
654
 
 
655
 
* History-sensitive merges allow safe repeated merges and mutual
656
 
  merges between parallel lines.
657
 
 
658
 
* Patches are labelled with the history of branches they traversed to
659
 
  their current location, which is previously unique to Arch.
660
 
 
661
 
* Would aim to be almost as small and simple as Quilt.
662
 
 
663
 
* Does not need archives to be registered.  
664
 
 
665
 
* Like darcs and bk, remembers the last archive you pulled from and
666
 
  uses this as the default.  Also as a bonus remembers all branches
667
 
  you previously pulled and their name, so that it is as if they were
668
 
  registered.
669
 
 
670
 
* Because patches do not change when they move around (as in Darcs),
671
 
  they can be cryptographically signed.
672
 
 
673
 
* Recognizes that textually non-conflicting merges may not be a
674
 
  correct merge and may not work, and so should not be auto-committed.
675
 
  The developer must have a chance to intervene after the merge and
676
 
  before a commit.  (I think Monotone is wrong on this.)
677
 
 
678
 
 
679
 
 
680
 
 
681
 
Best practices
682
 
--------------
683
 
 
684
 
We recommend that people using Bazaar-NG follow these practices and
685
 
protocols:
686
 
 
687
 
* Develop independent features in separate branches.  It's easier to
688
 
  keep them separate and merge later than to mix things together and
689
 
  then try to separate them.  Although cherry picking is possible,
690
 
  it's generally harder than keeping the code separate in the first
691
 
  place.
692
 
 
693
 
* Although you can merge in a graph, it can be easier to understand
694
 
  things if you keep them roughly sorted into a star of downstream and
695
 
  upstream branches.
696
 
 
697
 
* Merge off your laptop/workstation into a personal stable tree at
698
 
  regular changes; this protects against accidentally losing your
699
 
  development branch for any reason. 
700
 
 
701
 
* Try to have relatively "pure" merges: a single changeset that merges
702
 
  changes should make only those merges and any edits needed to fix
703
 
  them up. 
704
 
 
705
 
* You can use reStructuredText (like this document) for commit
706
 
  messages to allow nicer formatting and automatic detection of URLs,
707
 
  email addreses, lists, etc.  Nothing requires this.
708
 
 
709
 
 
710
 
 
711
 
Mechanics
712
 
---------
713
 
 
714
 
Patch format
715
 
''''''''''''
716
 
 
717
 
A patch (i.e. commit to a branch) exists at three levels:
718
 
 
719
 
* the hash of the patch, which is used as its globally-unique name
720
 
 
721
 
* the headers of the patch, including:
722
 
 
723
 
  - the human-readable name of the branch to which the changeset was committed
724
 
 
725
 
  - free-form comments about the changeset
726
 
 
727
 
  - the email address and name of the user who committed the changeset
728
 
 
729
 
  - the date when the changeset was committed to the branch
730
 
 
731
 
  - the UUIDs of any patches merged by this change
732
 
 
733
 
  - the hash of the before and after trees
734
 
 
735
 
  - the IDs of any files affected by the change, and their names
736
 
    before and after the change, and their hash before and after the
737
 
    change
738
 
 
739
 
* the actual text of the patch, which may include
740
 
 
741
 
  - unidiff hunks
742
 
 
743
 
  - xdeltas (in reversible pairs?)
744
 
 
745
 
  - complete files for adds/deletes, or for binaries
746
 
 
747
 
At the simplest level a branch knows just the IDs of all of the
748
 
patches committed to it.  More usually it will also have all their
749
 
logs or all their text.
750
 
 
751
 
Using the IDs, it can retrieve the patches when necessary from a
752
 
shared or external store.  By this means we can have many checkouts,
753
 
each of which looks like it holds all of its history, without actually
754
 
using a lot of space.  When pulling down a remote branch by default
755
 
everything will be mirrored, but there might be an option to only get
756
 
the inventory or only the logs. 
757
 
 
758
 
Keeping the relatively small header separate from the text makes it
759
 
easy to get only the header information from a remote machine.  One
760
 
might also when offline like to see only the logs but not necessarily
761
 
have the text.
762
 
 
763
 
Only the basic policy (keep everything everywhere) needs to be done in
764
 
the first release of course.
765
 
 
766
 
The headers need to be stored in some format that allows moderately
767
 
structured data.  Ideally it would be both human readable and
768
 
accessible from various languages.  In the prototype I think I'll use
769
 
Python data format, but that's probably not good in the long term.  It
770
 
may be better to use XML (tasteless though that is) or perhaps YAML or
771
 
RFC-2822 style.  Python data is probably not secure in the face of
772
 
untrusted patches.
773
 
 
774
 
The date should probably be shown in ISO form (unoptimal though that
775
 
is in some ways.)
776
 
 
777
 
 
778
 
 
779
 
  
780
 
 
781
 
Unresolved questions and other ideas
782
 
------------------------------------
783
 
 
784
 
 
785
 
Pulling in inexact matches
786
 
''''''''''''''''''''''''''
787
 
 
788
 
If ``update`` pulls in patches noninteractively onto the history, then
789
 
there are some issues with patches that do not exactly match.  Some
790
 
consequences:
791
 
 
792
 
* You may pull in a patch which causes your tree to semantically
793
 
  break.  This might be avoided by having a test case which is checked
794
 
  before committing.
795
 
 
796
 
* The patch may fuzzily apply; this is OK. 
797
 
 
798
 
If we pull in a patch from elsewhere then we will have a signature on
799
 
the patch but not a signature for the whole cacherev. 
800
 
 
801
 
 
802
 
 
803
 
 
804
 
Have pristines/working directory by default?
805
 
''''''''''''''''''''''''''''''''''''''''''''
806
 
 
807
 
It seems a bit redundant to have two copies of the current version of
808
 
each file in every repository, even ones in which you'll never edit.
809
 
Some fixes are possible:
810
 
 
811
 
* don't create working copy files 
812
 
 
813
 
* hard link working copies into pristine directory (can detect
814
 
  corruption by having SHA-1 sums for all pristine files)
815
 
 
816
 
I think it's reasonable to have 
817
 
 
818
 
 
819
 
 
820
 
Directory name
821
 
''''''''''''''
822
 
 
823
 
We have a single metadata directory at the top-level of the tree: ``.bzr``.
824
 
There is no value in having it non-hidden, because it can't be seen
825
 
from subdirectories anyhow.  Apparently three-letter names after a dot
826
 
are fine on Windows -- it works for ``.svn``.
827
 
 
828
 
 
829
 
File encodings
830
 
''''''''''''''
831
 
 
832
 
Unicode, line endings, etc.  Ignore this for now?
833
 
 
834
 
Case-insensitive file names?  Maybe follow Darcs in forbidding files
835
 
that differ only in case.
836
 
 
837
 
 
838
 
Always use 3-way merge
839
 
''''''''''''''''''''''
840
 
 
841
 
I think using .rej files and fuzzy patches is confusing/unhelpful.  
842
 
 
843
 
I would like to use 3-way merges between appropriate coordinates as
844
 
the fundamental mechanism for all 'merge'-type operations.  
845
 
 
846
 
Is there any case where .rej files are more useful?  Why would you
847
 
ever want that?  Some people seem to `prefer them`__ in Arch.
848
 
 
849
 
__ http://wiki.gnuarch.org/moin.cgi/Process_20_2a_2erej_20files 
850
 
 
851
 
I guess when cherry-picking you might not be able to find an
852
 
appropriate ancestor for diff3?  I think you can; anyhow wiggle can
853
 
transform rejects into diff3-style conflicts so why not do that?
854
 
 
855
 
Miles says there that he prefers .rej files to conflict markers
856
 
because they give better results for complex conflicts. 
857
 
 
858
 
Perhaps we should just always produce both and let people use whatever
859
 
they want.
860
 
 
861
 
Another suggestion is the *rej_* tool, which helps fix up simple
862
 
rejects:
863
 
 
864
 
  There are four basic rejects fixable via rej.
865
 
 
866
 
  1) missing context at the top or bottom of the hunk
867
 
  2) different context in the middle of the hunk
868
 
  3) slightly different lines removed by the hunk than exist in the file
869
 
  4) Large hunks that might apply if they were broken up into smaller ones.
870
 
 
871
 
.. _rej: ftp://ftp.suse.com/pub/people/mason/rej/
872
 
 
873
 
 
874
 
Mirroring
875
 
'''''''''
876
 
 
877
 
One reason people say they like archives is that all new work in that
878
 
archive will be automatically mirrored off your laptop, if it's
879
 
already set up to mirror that archive.
880
 
 
881
 
 
882
 
 
883
 
Control files out of tree
884
 
'''''''''''''''''''''''''
885
 
 
886
 
Some people would like to have absolutely no control files in their
887
 
tree.  This is conceptually easy as long as we can find both the
888
 
control files and working directory when a command is run.
889
 
 
890
 
As a first step, the ``.bzr`` directory can be replaced by a symlink,
891
 
which will prevent recursive commands looking into it.  Another
892
 
approach is to put all actual source in a subdirectory of the tree, so
893
 
that you never need to see the directory unless you look above the
894
 
ceiling.
895
 
 
896
 
If this is not enough, we might ask them to have an environment
897
 
variable point to the control files, or have a map somewhere
898
 
associating working directories with their control files.
899
 
Unfortunately both of those seem likely to come loose and whip around
900
 
dangerously.
901
 
 
902
 
 
903
 
Representation of changesets
904
 
''''''''''''''''''''''''''''
905
 
 
906
 
Using patches is nice for plain text files.  In general we want the
907
 
old and new names to correspond, but these are only for decoration;
908
 
the file id determines where the patch really goes.
909
 
 
910
 
* Should they be reversible?
911
 
 
912
 
* How to represent binary diffs?
913
 
 
914
 
* How to represent adds/removes?
915
 
 
916
 
* How to zip up multiple changes into a single bundle?
917
 
 
918
 
Reversibility is very important.  We do not need it for regular
919
 
merges, since we can always recover the previous state.  We do need it
920
 
for application of isolated patches, since we may not be able to
921
 
recover the prior state.  It might also help when building a previous
922
 
tree state.  
923
 
 
924
 
Of course we can have an option to show deletes or to make the diff
925
 
reversible even if it normally is not.
926
 
 
927
 
It is very nice that plain diffs can be concatenated into a single
928
 
text file.  This is not easily possible with binary files, xdeltas,
929
 
etc.  Of course it is uncommon to display binary deltas directly or
930
 
mail them, but if mailing is really required we could use base64 or
931
 
MIME.
932
 
 
933
 
Perhaps it would be reasonable to just store xdeltas between versions.
934
 
 
935
 
Perhaps each changeset body should be a tar or zip holding the
936
 
patches, though in simpler form than Arch.
937
 
 
938
 
(Since these are free choices, perhaps stick closely to what Arch
939
 
does?)
940
 
 
941
 
 
942
 
Continuations
943
 
'''''''''''''
944
 
 
945
 
Do we need the generalized continuations currently present in Arch, or
946
 
will a more restricted type do?  
947
 
 
948
 
One use case for arch continuation tags is to make a release branch
949
 
which contains only tags from the development branch.
950
 
 
951
 
Maybe want darcs-style tags which just label the tree at various
952
 
points; more familiar to users perhaps?
953
 
 
954
 
::
955
 
 
956
 
    bzr fork http://samba.org/bzr/samba/main ./my-samba
957
 
 
958
 
1. creates directory my-samba
959
 
2. copies contents of samba main branch
960
 
3. the parent becomes samba-main
961
 
4. parent is the default place you'll pull from & push to
962
 
   
963
 
Is there a difference between "contains stuff from samba-main" and "is
964
 
branched from samba-main"?
965
 
 
966
 
 
967
 
 
968
 
File split/merge
969
 
''''''''''''''''
970
 
 
971
 
Is there any sense in having a command to copy a file, or to rejoin
972
 
several files with different IDs?
973
 
 
974
 
Joining might be useful when the same tree is imported several times,
975
 
or the same new-file operation is done in different trees.
976
 
 
977
 
 
978
 
 
979
 
Time skew
980
 
'''''''''
981
 
 
982
 
Local clocks can be wrong when they record a commit.  This means that
983
 
changes may be irrevocably recorded with the wrong time, and that in
984
 
turn means that later changes may seem to come from before earlier
985
 
changes.  We can give a warning at the later time, but short of
986
 
refusing the commit there is not much we can do about it.
987
 
 
988
 
 
989
 
Annotate/blame/praise
990
 
---------------------
991
 
 
992
 
``cvs annotate`` is pretty useful for understanding the history of
993
 
development.  At the same time it is not quite trivial to implement,
994
 
so I plan to make sure all the necessary data is easily accessible and
995
 
then defer actually writing it.  Possibly the most complicated part is
996
 
something to read in a diff and find which lines came from where. 
997
 
 
998
 
What we need is a way to easily follow back through the history of a
999
 
file, this is easily done by walking back along the branch.  Since we
1000
 
have revision numbers within a branch we have a short label which can
1001
 
be put against each line; we can also put a key at the bottom with
1002
 
some fields from each revision showing the committer and comment.
1003
 
 
1004
 
For the case of merge commits people might be interested to know which
1005
 
merged patch brought in a change.  We cannot do this completely
1006
 
accurately since we don't know what the person did during the manual
1007
 
resolution of the merge, but by looking for identical lines we can
1008
 
probably get very close.  We can at the very least tell people the
1009
 
hash of all patches that were merged in so they can go and have a look
1010
 
at them.
1011
 
 
1012
 
 
1013
 
 
1014
 
Performance
1015
 
-----------
1016
 
 
1017
 
I think nothing here requires loading the whole tree into memory, as
1018
 
Darcs does.  We can detect renames and then diff files one by one.
1019
 
 
1020
 
Because patches cannot change or be removed once they are committed or
1021
 
merged, we do not need to diff the patch-log, which is a problem in
1022
 
Arch.
1023
 
 
1024
 
We do need to hold the whole list of patches in memory at various
1025
 
points but that should be at most perhaps 100,000 commits.
1026
 
 
1027
 
We do need to pull down all patches since forever but that's not too
1028
 
unreasonable.
1029
 
 
1030
 
Most heavy lifting can be done by GNU diff, patch and diff3, which are
1031
 
hopefully fast.
1032
 
 
1033
 
Patches should be reasonably proportionate to the actual size of
1034
 
changes, not to the total size of the tree -- we should only list the
1035
 
hash and id for files that were touched by the change.  This implies
1036
 
that generating the manifest for any given revision means walking from
1037
 
the start of history to that revision.   Of course we can cache that
1038
 
manifest without necessarily caching the whole revision.
1039
 
 
1040
 
* The dominant effect on performance in many cases will be network
1041
 
  round-trips; as Tom says "every one is like punching your user in
1042
 
  the face."
1043
 
 
1044
 
  The network protocol can/should try to avoid them.
1045
 
 
1046
 
  However, here's an even lazier idea: by making it possible to use
1047
 
  rsync for moving trees around, we get an insanely pipelined protocol
1048
 
  *for free*.
1049
 
 
1050
 
  It's not always suitable (as when committing to a central tree), but
1051
 
  it will often work.  Cool!
1052
 
 
1053
 
  Safely using rsync probably requires user intervention to make sure
1054
 
  that the tree is idle at the time the command runs; otherwise the
1055
 
  ordering of files arriving makes it really hard to know that we have
1056
 
  a consistent state.  I guess we can just ignore patches that are
1057
 
  missing...
1058
 
 
1059
 
 
1060
 
Hashing
1061
 
-------
1062
 
 
1063
 
It might be nice to present hashes in BubbleBabble or some similar
1064
 
form to make it a bit easier on humans who have to see them.  This can
1065
 
of course be translated to and from binary.  On the other hand there
1066
 
is something in favour of regular strings that can be easily verified
1067
 
with other tools.
1068
 
 
1069
 
We can have a Henson Mode in which it never trusts that files with the
1070
 
same hash are identical but always checks it.  Of course if SHA-1 is
1071
 
broken then GPG will probably be broken too...
1072
 
 
1073
 
Comparison:
1074
 
 
1075
 
binary:
1076
 
  20 bytes
1077
 
bubblebabble
1078
 
  > xizif-segim-vipyz-dyzak-gatas-sifet-dynir-gegon-borad-cetit-tixux
1079
 
  65 bytes
1080
 
base64:
1081
 
  > qvTGHdzF6KLavt4PO0gs2a6pQ00=
1082
 
  28 bytes
1083
 
hex:
1084
 
  > aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d
1085
 
  40 bytes
1086
 
 
1087
 
Hex is probably the most reasonable tradeoff.
1088
 
 
1089
 
 
1090
 
File metadata
1091
 
-------------
1092
 
 
1093
 
I don't want to get into general versioning of file metadata like
1094
 
permissions, at least in the first version; it's hard to say what
1095
 
should be propagated and what should not be.  This is a source code
1096
 
control system.
1097
 
 
1098
 
It may be useful to carry some very restricted bits, like *read only*
1099
 
or *executable*; I think these are harmless.
1100
 
 
1101
 
The only case where people generally want to remember permissions and
1102
 
ownership is when versioning ``/etc``, which is quite a special case.
1103
 
Perhaps this should be deferred to a special script such as the
1104
 
``cvs-conf`` package.
1105
 
 
1106
 
 
1107
 
Faster comparisons
1108
 
------------------
1109
 
 
1110
 
There are many cases where we need to compare trees; perhaps the most
1111
 
common is just diffing the tree to see what changed.  For small to
1112
 
medium trees it is OK to just diff everything in the tree, and we can
1113
 
do just this in the first version.  This runs into trouble for
1114
 
kernel-sized trees, where reading every 
1115
 
 
1116
 
 
1117
 
Fear of forking
1118
 
---------------
1119
 
 
1120
 
There is some fear that distributed version control (many branches)
1121
 
will encourage projects to fork.  I don't think this is necessarily
1122
 
true of Bazaar.
1123
 
 
1124
 
A fundamental principle of Bazaar is that is not the tool's place to
1125
 
make you run a project a particular way.  The tool enables you to do
1126
 
what you want.  The documentation and community might suggest some
1127
 
practices that have been useful for other projects, but the choice is
1128
 
up to you.  There are principles for running open source projects that
1129
 
are useful regardless of tool, and Bazaar supports them.  They include
1130
 
encouraging new contributors, building community, managing a good
1131
 
release schedule and so on, but I won't enumerate them all here (and I
1132
 
don't claim to know them all.)
1133
 
 
1134
 
Bazaar reduces some pressures that can lead to forking.  There need
1135
 
not be fights about who gets commit access: everyone can have a branch
1136
 
and they can contribute their changes.  Radical new development can
1137
 
occur on one branch while stabilization occurs on another and a new
1138
 
feature or port on a third.  Both creating the branches and merging
1139
 
between them should be easier in the Bazaar than with existing
1140
 
systems.  (Though of course there may be technical difficulties that
1141
 
no tool can totally remove.)
1142
 
 
1143
 
Sometimes there really is a time for a fork, for various reasons:
1144
 
irreconcilable differences on technical direction or personality.  If
1145
 
that happens, Bazaar makes the break less total: the projects can
1146
 
still merge patches, share bug fixes and features, and even eventually
1147
 
reunite.
1148
 
 
1149
 
 
1150
 
Why a new project?
1151
 
------------------
1152
 
 
1153
 
A key goal is simplicity and user-friendliness; this is easier to
1154
 
build into a new tool than to fix in an existing tool.  Nevertheless
1155
 
we want to provide a smooth upgrade path from Arch, CVS, and other
1156
 
systems.
1157
 
 
1158
 
 
1159
 
References
1160
 
----------
1161
 
 
1162
 
* http://www.dwheeler.com/essays/scm.html
1163
 
 
1164
 
  Good analysis; should try to address everything there in a way he will like.
1165
 
 
1166
 
 
1167
 
.. Local variables:
1168
 
.. mode: indented-text
1169
 
.. End:
1170
 
 
1171
 
.. Would like to use rst-mode, but it's too slow on a document of this
1172
 
.. size.
 
 
b'\\ No newline at end of file'