source: tailor/README @ 832

Revision 832, 22.2 KB checked in by lele@…, 8 years ago (diff)

Explain subdir role in project sections

Line 
1Tailor 1.0
2##########
3
4.. contents::
5
6About
7=====
8
9Tailor is a tool to migrate changesets between ArX_, Bazaar_, `Bazaar-NG`_,
10CVS_, Codeville_, Darcs_, Git_, Mercurial_, Monotone_, Subversion_ and Tla_
11[#]_ repositories.
12
13This script makes it easier to keep the upstream changes merged in
14a branch of a product, storing needed information such as the upstream
15URI and revision in special properties on the branched directory.
16
17The following ascii-art illustrates the usual scenario::
18
19                           +------------+            +------------+
20  +--------------+         | Immutable  |            | Working    |
21  | Upstream CVS |-------->| darcs      |----------->| darcs      |
22  | repository   | tailor  | repository | darcs pull | repository |
23  +--------------+         +------------+            +------------+
24                                                           |^         
25                                                           ||
26                                                           ||
27                                                           v|
28                                                          User
29
30Ideally you should be able to swap and replace "CVS server" and "darcs
31repository" with any combination of the supported systems.
32
33A more convoluted setup shows how brave people are using it to get a
34two way sync::
35
36  +----------+        +--------+        +--------+       +---------+
37  |          | -----> | hybrid | darcs  |        | ----> |   my    |
38  | upstream | tailor |  CVS   | -----> | master | darcs | working |
39  |   CVS    | <----- | darcs  | <----- | darcs  | <---- |  darcs  |
40  |          |        |  sync  | tailor |        |       |         |
41  +----------+        +--------+        +--------+       +---------+
42               (cron)            (cron)
43
44
45.. [#] ArX, Baazar-NG, Codeville, Git and Mercurial systems may be
46       used only as the `target` backend, since the `source` support
47       isn't coded yet. Contributions on these backends will be very
48       appreciated, since I do not use them enough to figure out the
49       best way to get pending changes and build tailor ChangeSets out
50       of them.
51
52       To the opposite, Bazaar and Tla are supported only as source
53       systems.
54
55.. _arx: http://www.nongnu.org/arx/
56.. _bazaar: http://bazaar.canonical.com/
57.. _bazaar-ng: http://www.bazaar-ng.org/
58.. _codeville: http://www.codeville.org/
59.. _cvs: http://www.nongnu.org/cvs/
60.. _darcs: http://www.darcs.net/
61.. _git: http://git.or.cz/
62.. _mercurial: http://www.selenic.com/mercurial/
63.. _monotone: http://www.venge.net/monotone/
64.. _subversion: http://subversion.tigris.org/
65.. _tla: http://www.gnuarch.org/arch/index.html
66
67
68Installation
69============
70
71tailor is written in Python, and thus Python must be installed on
72your system to use it.  It has been successfully used with Python 2.3
73and 2.4.
74
75Since it relies on external tools to do the real work such as `cvs`,
76`darcs` [#]_ and `svn`, they need to be installed as well, although only
77those you will actually use.
78
79Make tailor executable::
80
81 $ chmod +x tailor
82
83You can either run tailor where it is currently located, or move it
84along with the vcpx directory to a location in your PATH.
85
86There's even a standard setup.py that you may use to install the
87script using Python's conventional distutils.
88
89.. [#] Darcs 1.0.2 is too old, 1.0.3 is good, 1.0.4 (the fourth
90       release candidate is under final testing) is recommended since
91       it's faster in most operations!
92
93
94Testing
95=======
96
97You can run the test suite with the following command line::
98
99 $ tailor test -v
100
101that runs all the tests in sequence, or::
102
103 $ tailor test -v TailorTest
104
105to trigger just a subset of them.
106
107
108Operation
109=========
110
111tailor needs now a configuration file that collects the various bits
112of information it needs to do it's job.
113
114The simplest way of starting out a new configuration is by omitting
115the --configfile command line option, and specifying the other as
116needed plus --verbose: in this situation, tailor will print out an
117equivalent configuration that you can redirect to a file, that you
118later will pass as --configfile.
119
120
121Examples
122--------
123
1241. Bootstrap a new tailored project, starting at upstream revision 10
125
126   a. First create a config file::
127   
128       $ tailor --verbose -s svn -R http://svn.server/path/to/svnrepo \
129                --module /Product/trunk -r 10 --subdir Product \
130                ~/darcs/MyProduct > myproject.tailor
131
132   b. Modify it as you like (mostly adjusting root-directories and the
133      like)::
134     
135       $ emacs myproject.tailor
136
137   c. Run tailor on it::
138   
139       $ tailor --configfile myproject.tailor
140
1412. Bootstrap a new product, fetching its whole CVS repository and
142   storing under SVN
143
144   a. First create a config file::
145
146       $ tailor --verbose --source-kind cvs --target-kind svn \
147                --repository :pserver:cvs.zope.org:/cvs-repository \
148                --module CMF/CMFCore --revision INITIAL \
149                --target-repository file:///some/where/svnrepo \
150                --target-module / cmfcore > cmfcore.tailor
151
152   b. Modify it as you like (mostly adjusting root-directories and the
153      like)::
154     
155       $ emacs cmfcore.tailor
156
157   c. Run tailor on it once, to bootstrap the project::
158   
159       $ tailor -D -v --configfile cmfcore.tailor
160
161      If the target repository is on the local filesystem (ie, it
162      starts with ``file:///``) and it does not exist, tailor
163      creates a new empty Subversion repository at the specified
164      location.
165     
166   .. note:: Before step d) below, you may want to install an
167             appropriate hook in the repository to enable the
168             propset command to operate on unversioned properties,
169             as described in the `svn manual`__. Then you can
170             specify '--use-svn-propset' option, and tailor will
171             put the original author and timestamp in the proper
172             svn metadata instead of appending them to the changelog.
173
174             Other than the annoying repository manual intervention,
175             this thread__ and this other__ explain why using
176             ``-r{DATE}`` may produce strange results with this setup.
177
178   d. Run tailor again and again, to sync up with latest changes::
179
180       $ tailor -D -v --configfile myproject.tailor
181   
182__ http://svnbook.red-bean.com/en/1.0/ch05s02.html#svn-ch-5-sect-2.1
183__ http://svn.haxx.se/users/archive-2005-07/0605.shtml
184__ http://svn.haxx.se/users/archive-2005-03/0596.shtml
185
186
1873. Given the configuration file shown below in `Config file format`_,
188   the following command::
189
190    $ tailor --configfile example.tailor
191
192   is equivalent to this one::
193
194    $ tailor --configfile example.tailor tailor
195
196   in that they operate respectively on the default project(s) or
197   the ones specified on the command line (and in this case there
198   is just a single default project, tailor).
199
200   This one instead::
201
202    $ tailor --configfile example.tailor tailor tailor-reverse
203
204   operates on both projects.
205
206
207CVS start-revision
208------------------
209
210With CVS, you can specify a particular *point in time* specifying
211a `start-revision` with a timestamp like ``2001-12-25 23:26:48 UTC``.
212
213To specify also a particular `branch`, prepend it before the
214timestamp, as in ``unstable-branch 2001-12-25 23:26:48 UTC``.
215
216To migrate the whole history of a specific `branch`, use something
217like ``somebranch INITIAL``.
218
219
220Resolving conflicts
221===================
222
223Should one of the replayed changes generate any conflict, tailor
224will prompt the user to correct them. This is done after the upstream
225patch has been applied and before the final commit on the target
226system, so that manually tweaking the conflict can produce a clean
227patch.
228
229
230Shortcomings
231============
232
233Tailor currently suffers of the following reported problems:
234
235a) It does not handle "empty" CVS checkouts, in other words you cannot
236   bootstrap a project that has nothing in its CVS upstream
237   repository, or from a point in time where this condition was true.
238
239b) It's completely unsupported under Windows, evenif it now uses
240   2.4's subprocess_ that seems able to hide Windows crazyness...
241
242c) ArX, Baazar-NG, Codeville, Git, and Mercurial are (currently) only
243   supported as *target*; Bazaar and Tla only as *source*.
244
245d) Specifying ``--subdir .`` may not work, in particular when dealing
246   with remote CVS repositories (it does when the CVS repository is
247   on local machine).
248   
249This list will always be incomplete, but I'll do my best to keep it
250short :-)
251
252.. _subprocess: http://www.lysator.liu.se/~astrand/popen5/
253
254
255Config file format
256==================
257
258When your project is composed by multiple upstream modules, it is
259easier to collect such information in a single file. This is done by
260specifying the `--configfile` option with a file name as argument. In
261this case, tailor will read the above information from a standard
262Python ConfigParser file.
263
264For example::
265
266    [DEFAULT]
267    verbose = True
268    projects = tailor
269
270    [tailor]
271    root-directory = /tmp/n9
272    source = darcs:tailor
273    target = svn:tailor
274    state-file = tailor.state
275
276    [tailor-reverse]
277    root-directory = /tmp/n9
278    source = svn:tailor
279    target = darcs:tailor
280    state-file = reverse.state
281   
282    [svn:tailor]
283    repository = file:///tmp/testtai
284    module = /project1
285    subdir = svnside
286   
287    [darcs:tailor]
288    repository = ~/WiP/cvsync
289    subdir = darcside
290
291The configuration may hold one or more `projects`_ and two or more
292`repositories`_: project names do not contains colons ":",
293repository names must and the first part of the name before the
294colon specify the kind of the repository.  So, the above example
295contains two projects, one that goes from `darcs` to `subversion`, the
296other in the opposite direction.
297
298The ``[DEFAULT]`` section contains the default values, that will be
299used when a specific setting is missing from the particular section.
300
301You can specify on which project tailor should operate by
302giving its name on the command line, even more than one. When not
303explicitly given, tailor will look at ``projects`` in the
304``[DEFAULT]`` section, and if its missing it will loop over all
305projects in the configuration.
306
307The following simpler config just go in one direction, for a single
308project, so no need neither for ``[DEFAULT].projects`` nor command
309line arguments::
310
311    [pxlib]
312    source = cvs:pxlib
313    target = hg:pxlib
314    root-directory = ~/mypxlib
315    start-revision = INITIAL
316    subdir = pxlib
317   
318    [cvs:pxlib]
319    repository = :pserver:anonymous@cvs.sf.net:/cvsroot/pxlib
320    module = pxlib
321
322    [hg:pxlib]
323    hg-command = /usr/local/bin/hg
324
325This will use a single directory, ``pxlib`` to contain both the source
326and the target system. If you prefer keeping the separated, you just
327need to specify a different directory for each repository [#]_, as in::
328
329    [pxlib]
330    source = cvs:pxlib
331    target = hg:pxlib
332    root-directory = ~/mypxlib
333    start-revision = INITIAL
334   
335    [cvs:pxlib]
336    repository = :pserver:anonymous@cvs.sf.net:/cvsroot/pxlib
337    module = pxlib
338    subdir = original
339
340    [hg:pxlib]
341    hg-command = /usr/local/bin/hg
342    subdir = migrated
343
344This will extract upstream CVS sources into ``~/mypxlib/original``,
345and create a new Mercurial repository in ``~/mypxlib/migrated``.
346
347On final example to show the syntax of Bazaar sources::
348
349    [project]
350    target = hg:target
351    start-revision = base-0
352    root-directory = /tmp/calife
353    state-file = tailor.state
354    source = baz:source
355
356    [baz:source]
357    module = calife--pam--3.0
358    repository = roberto@keltia.net--2003-depot
359    subdir = tla
360
361    [hg:target]
362    repository = /tmp/HG/calife-pam
363    subdir = hg
364
365.. [#] NB: when the source and the target repositories specify
366       different directories with the ``subdir`` option, tailor
367       uses ``rsync`` to keep them in sync, so that tool needs
368       to be installed.
369
370
371Configuration sections
372----------------------
373
374Default
375~~~~~~~
376
377The ``[DEFAULT]`` section in the configuration file may set the
378default value for any of the recognized options: when a value is
379missing from a specific section it is looked up in this section.
380
381One particular option, ``projects``, is meaningful only in the
382``[DEFAULT]`` section: it's a comma separated list of project names,
383the one that will be operated on by tailor when no project is
384specified on the command line.  When the there are no ``projects``
385setting nor any on the command line, tailor activates all configured
386projects, in order of appearance in the config file.
387
388
389Projects
390~~~~~~~~
391
392A project is identified by a section whose name does not contain any
393colon (":") character, and configured with the following values:
394
395root-directory
396  This is where all the fun will happen: this directory will contain
397  the source and the target working copy, and usually the state and
398  the log file. It supports the conventional `~user` to indicate user's
399  home directory and defaults to the current working directory.
400
401subdir
402  This is the subdirectory, relative to the `root-directory`, where
403  tailor will extract the source working copy. It may be '.' for some
404  backend kinds. The source and target backends will use this value
405  if they don't explicitly override it.
406
407state-file
408  Name of the state file needed to store tailor last activity.
409
410source
411  The source repository: a repository name is something like
412  "darcs:somename", that will be loaded from the homonymous section
413  in the configuration.
414
415target
416  The counterpart of `source`, the repository that will receive the
417  changes coming from there.
418
419Non mandatory options:
420
421verbose
422  Print the commands as they are executed.
423
424debug
425  Print also their output.
426 
427before-commit
428  This is a function name, or a sequence of function names enclosed
429  by brackets, that will be executed on each changeset just before
430  it get replayed on the target system: this may be used to perform
431  any kind of alteration on the content of the changeset, or to skip
432  some of them.
433
434after-commit
435  This is a function name, or a sequence of function names enclosed
436  by brackets, that will be executed on each changeset just after
437  the commit on the target system: this may be used for example to
438  create a tag.
439
440subdir
441  The name of the subdirectory, under ``root-directory``, that will
442  contain the source and target repositories/working directories.
443
444start-revision
445  This identifies from when tailor should start the migration. It can
446  be either ``INITIAL``, to indicate the start of the history, or
447  ``HEAD`` to indicate the current latest changeset, or a backend
448  specific way of indicate a particular revision/tag in the history.
449  See also `CVS start-revision`_ above.
450
451patch-name-format
452  Some backends have a distinct notion of `patch name` and `change
453  log`, others just suggest a policy that the first line of the
454  message is a summary, the rest if present is a more detailed
455  description of the change.  With this option you can control the
456  format of the name, or of the first line of the changelog.
457
458  The prototype may contain ``%(keyword)s`` such as 'author', 'date',
459  'revision', 'firstlogline', 'remaininglog'.  It defaults to
460  `Tailorized "%(revision)s"`; setting it to the empty string means
461  that tailor will simply use the original changelog.
462
463  When you set it empty, as in
464
465  ::
466
467    [project]
468    patch-name-format =
469
470  tailor will keep the original changelog as is.
471
472remove-first-log-line
473  Remove the first line of the upstream changelog. This is intended to
474  go in pair with ``patch-name-format``, when using it's 'firstlogline'
475  variable to build the name of the patch.  By default is ``False``.
476
477refill-changelogs
478  Off by default, when active tailor reformats every changelog before
479  committing on the target system.
480
481Repositories
482~~~~~~~~~~~~
483
484All the section whose name contains at least one colon character
485denote a repository.  A single repository may be shared by zero, one or
486more projects.  The first part of the name up to the first colon
487indicates the `kind` of the repository, one of ``arx``, ``baz``, ``bzr``,
488``bzrng``, ``cdv``, ``cvs``, ``darcs``, ``git``, ``hg``, ``hglib``,
489``monotone``, ``svn``, ``svndump`` and ``tla``.
490
491When a repository is used as a `source`, it must indicate its origin
492with ``repository``, and for some backends also a ``module``, but are
493not required when it's a target system, even if some backend may use
494the information to create the target repository (like ``svn`` backend
495does).
496
497Each repository may then impose a particular external binary to be
498used, as done in the example above for ``hg``. Actually two of them,
499`bzrng` and `hglib`, accept an option ``python-path`` to indicate
500where the BazaarNG Python library is located.
501
502A repository may also have it's own ``subdir``: when the `source` and
503`target` repositories use different subdirectories, tailor uses
504``rsync`` to copy the changes between the two after each applied
505changeset.  When the source repository basedir is a subdirectory of
506target basedir tailor prefixes all paths coming from upstream to match
507the relative position.
508
509Another option is ``encoding``, which states the charset encoding the
510particular repository uses, and it's particularly important when it
511differs from local system setup, that you may inspect executing::
512
513  python -m locale
514
515CVS and CVSPS repositories may turn off automatic tagging of entries,
516that tailor does by default to prevent manual interventions in the
517CVS working copy, using ``tag_entries = False``.
518
519Subversion repositories may specify ``use-propset = True``, to
520indicate that tailor is allowed to properly inject the upstream
521changeset's author and timestamp into the target repository.  As
522stated above, this requires a manual intervention on the repository
523itself and thus is off by default, and tailor simply appends those
524values to the changelog.  When active at bootstrap time and the
525repository is local, tailor creates automatically a minimal
526``hooks/pre-revprop-change`` script inside the repository, so no other
527intervention is needed.
528
529
530Using a Python script as configuration file
531-------------------------------------------
532
533Instead of executing ``tailor --configfile project.tailor.conf``
534you can prepend the following signature to the config itself::
535
536  #!/usr/bin/env /path/to/tailor
537
538Giving execute mode to it will permit the launch of the tailor
539process by running the config script directly::
540
541  $ ./project.tailor.conf
542
543When a config file is signed in this way [#]_, either you pass it as
544argument to ``--configfile`` or executed as above, tailor will
545actually execute it as a full fledged Python script, that may define
546functions that alter the behaviour of tailor itself.
547
548A common usage of this functionality is to define so called `hooks`,
549sequences of functions that are executed at particular points in
550the tailorization process.
551
552Just to illustrate the functionality, consider the following example::
553
554    #!/usr/bin/env tailor
555
556    """
557    [DEFAULT]
558    debug = False
559    verbose = True
560
561    [project]
562    target = bzrng:target
563    root-directory = /tmp/prova
564    state-file = tailor.state
565    source = darcs:source
566    before-commit = before
567    after-commit = after
568    start-revision = Almost arbitrarily tagging this as version 0.8
569
570    [bzrng:target]
571    python-path = /opt/src/bzr.dev
572    subdir = bzrside
573
574    [darcs:source]
575    repository = /home/lele/WiP/cvsync
576    subdir = darcside
577    """
578
579    def before(wd, changeset):
580        print "BEFORE", changeset
581        changeset.author = "LELE"
582        return changeset
583
584    def after(wd, changeset):
585        print "AFTER", changeset
586
587With the above in a `script` called say ``tester``, just doing::
588
589    $ chmod 755 tester
590    $ ./tester
591
592will migrate the history from a darcs repository to a bazaar-ng one,
593forcing the author to a well-known name :-)
594
595.. [#] Tailor does actually read just the first two bytes from the
596       file, and compare them with "#!", so you are free to choose
597       whatever syntax works in your environment.
598
599
600State file
601----------
602
603The state file stores two things: the last upstream revision that
604has been applied to the tree, and a sequence of pending (not yet
605applied) changesets, that may be empty. In the latter case, tailor
606will fetch latest changes from the upstream repository.
607
608       
609Further help
610============
611
612See the output of ``tailor -h`` for some further tips.  There's
613also a `wiki page`_ that may give you some other hints.  The
614development of Tailor is mainly driven by user requests at this point,
615and the preferred comunication medium is the dedicated `mailing list`_
616[#]_.
617
618.. _wiki page:
619   http://www.darcs.net/DarcsWiki/Tailor
620
621.. _mailing list:
622   http://lists.zooko.com/mailman/listinfo/tailor
623   
624I will be more than happy to answer any doubt, question or suggestion
625you may have on it. I'm usually hanging out as "lelit" on the IRC
626channel devoted to darcs on the `freenode.net` network. Do not
627hesitate to contact me either by email or chatting there.
628
629.. [#] I wish to say a big `Thank you` to `Zooko <zooko@zooko.com>`_,
630       for hosting the ML and for supporting Tailor in several ways,
631       from suggestions to bug reporting and fixing.
632
633
634Authors
635=======
636
637Lele Gaifax <lele@nautilus.homeip.net>
638
639Since I'm not currently using all the supported systems (so little
640time, so many VCSs...) I'm not in position to test them out properly,
641but I'll do my best to keep them in sync, maybe with your support :-)
642
643ArX support
644-----------
645
646ArX_ support was contributed by `Walter Landry <wlandry@ucsd.edu>`_.
647
648Bazaar-NG support
649-----------------
650
651`Bazaar-NG`_ support was contributed by `Johan Rydberg
652<jrydberg@gnu.org>`_.
653
654Git support
655-----------
656
657`Git`_ support was contributed by `Todd Mokros
658<tmokros@tmokros.net>`_.
659
660Monotone support
661----------------
662
663Monotone_ support was kindly contributed by `Markus Schiltknecht
664<markus@bluegap.ch>`_ and further developed by `rghetta
665<birrachiara@tin.it>`_, that was able to linearize the multi-headed
666monotone history into something tailor groks. Kudos!
667
668Tla support
669-----------
670
671Tla_ support was contributed by `Robin Farine
672<robin.farine@terminus.org>`_.
673
674
675License
676=======
677
678Tailor is distribuited under the `GNU General Public License`__.
679
680__ http://www.fsf.org/licensing/licenses/gpl.html
681
682
683About this document
684===================
685
686This document and most of the internal documention use the
687reStructuredText format so that it can be easily converted into other
688formats, such as HTML.  For more information about this, please see:
689
690  http://docutils.sourceforge.net/rst.html
691
692
693.. vim:ft=rest
694.. Local Variables:
695.. mode: rst
696.. End:
Note: See TracBrowser for help on using the repository browser.