source: tailor/README @ 996

Revision 996, 26.7 KB checked in by Brendan Cully <brendan@…>, 8 years ago (diff)

Mercurial source support via hglib

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, Codeville and Git systems may be used only as the `target`
46       backend, since the `source` support isn't coded yet.
47       Contributions on these backends will be very appreciated,
48       since I do not use them enough to figure out the best way to
49       get pending changes and build tailor ChangeSets out of them.
50
51       To the opposite, Bazaar (1.0, not Bazaar-NG) and Tla are
52       supported only as source systems.
53
54.. _arx: http://www.nongnu.org/arx/
55.. _bazaar: http://bazaar.canonical.com/
56.. _bazaar-ng: http://www.bazaar-ng.org/
57.. _codeville: http://www.codeville.org/
58.. _cvs: http://www.nongnu.org/cvs/
59.. _darcs: http://www.darcs.net/
60.. _git: http://git.or.cz/
61.. _mercurial: http://www.selenic.com/mercurial/
62.. _monotone: http://www.venge.net/monotone/
63.. _subversion: http://subversion.tigris.org/
64.. _tla: http://www.gnuarch.org/arch/index.html
65
66
67Installation
68============
69
70tailor is written in Python, and thus Python must be installed on
71your system to use it.  It has been successfully used with Python 2.3
72and 2.4.
73
74Since it relies on external tools to do the real work such as `cvs`,
75`darcs` [#]_ and `svn`, they need to be installed as well, although only
76those you will actually use.
77
78Make tailor executable::
79
80 $ chmod +x tailor
81
82You can either run tailor where it is currently located, or move it
83along with the vcpx directory to a location in your PATH.
84
85There's even a standard setup.py that you may use to install the
86script using Python's conventional distutils.
87
88.. [#] Darcs 1.0.2 is too old, 1.0.3 is good, 1.0.4 (the fourth
89       release candidate is under final testing) is recommended since
90       it's faster in most operations!
91
92
93Testing
94=======
95
96Tailor has more than 50 unit and operational tests, that you can
97run with the following command line::
98
99 $ tailor test -v
100
101Since some tests take very long to complete, in particular the
102operational tests, you may prefer the execution of a single suite::
103
104 $ tailor test -v Darcs
105
106or even a single test within a suite::
107
108 $ tailor test StateFile.testJournal
109
110To obtain a list of the test, use ``--list`` option.  As usual with::
111
112 $ tailor test --help
113
114you will get some more details.
115
116
117Operation
118=========
119
120tailor needs now a configuration file that collects the various bits
121of information it needs to do it's job.
122
123The simplest way of starting out a new configuration is by omitting
124the --configfile command line option, and specifying the other as
125needed plus --verbose: in this situation, tailor will print out an
126equivalent configuration that you can redirect to a file, that you
127later will pass as --configfile.
128
129
130Examples
131--------
132
1331. Bootstrap a new tailored project, starting at upstream revision 10
134
135   a. First create a config file::
136   
137       $ tailor --verbose -s svn -R http://svn.server/path/to/svnrepo \
138                --module /Product/trunk -r 10 --subdir Product \
139                ~/darcs/MyProduct > myproject.tailor
140
141   b. Modify it as you like (mostly adjusting root-directories and the
142      like)::
143     
144       $ emacs myproject.tailor
145
146   c. Run tailor on it::
147   
148       $ tailor --configfile myproject.tailor
149
1502. Bootstrap a new product, fetching its whole CVS repository and
151   storing under SVN
152
153   a. First create a config file::
154
155       $ tailor --verbose --source-kind cvs --target-kind svn \
156                --repository :pserver:cvs.zope.org:/cvs-repository \
157                --module CMF/CMFCore --revision INITIAL \
158                --target-repository file:///some/where/svnrepo \
159                --target-module / cmfcore > cmfcore.tailor
160
161   b. Modify it as you like (mostly adjusting root-directories and the
162      like)::
163
164       $ emacs cmfcore.tailor
165
166   .. note:: By default, tailor uses "." as ``subdir``, to mean that
167             it will extract upstream source directly inside the
168             ``root-directory``.
169
170             This is known to cause problems with CVS as source, with
171             which you could see some wierd error like
172
173             ::
174
175               $ cvs -q -d ...:/cvsroot/mymodule checkout -d . ... mymodule
176               cvs checkout: existing repository /cvsroot/mymodule does not match /cvsroot/mymodule/mymodule
177               cvs checkout: ignoring module mymodule
178
179             When this is the case, the culprit may be a CVS
180             shortcoming not being able to handle ``-d .`` in the
181             right way.  Specify a different ``subdir`` option to
182             avoid the problem.
183
184   c. Run tailor on it once, to bootstrap the project::
185   
186       $ tailor -D -v --configfile cmfcore.tailor
187
188      If the target repository is on the local filesystem (ie, it
189      starts with ``file:///``) and it does not exist, tailor
190      creates a new empty Subversion repository at the specified
191      location.
192     
193   .. note:: Before step d) below, you may want to install an
194             appropriate hook in the repository to enable the
195             propset command to operate on unversioned properties,
196             as described in the `svn manual`__. Then you can
197             specify '--use-svn-propset' option, and tailor will
198             put the original author and timestamp in the proper
199             svn metadata instead of appending them to the changelog.
200
201             Other than the annoying repository manual intervention,
202             this thread__ and this other__ explain why using
203             ``-r{DATE}`` may produce strange results with this setup.
204
205   d. Run tailor again and again, to sync up with latest changes::
206
207       $ tailor -D -v --configfile myproject.tailor
208   
209__ http://svnbook.red-bean.com/en/1.0/ch05s02.html#svn-ch-5-sect-2.1
210__ http://svn.haxx.se/users/archive-2005-07/0605.shtml
211__ http://svn.haxx.se/users/archive-2005-03/0596.shtml
212
213
2143. Given the configuration file shown below in `Config file format`_,
215   the following command::
216
217    $ tailor --configfile example.tailor
218
219   is equivalent to this one::
220
221    $ tailor --configfile example.tailor tailor
222
223   in that they operate respectively on the default project(s) or
224   the ones specified on the command line (and in this case there
225   is just a single default project, tailor).
226
227   This one instead::
228
229    $ tailor --configfile example.tailor tailor tailor-reverse
230
231   operates on both projects.
232
233
234CVS start-revision
235------------------
236
237With CVS, you can specify a particular *point in time* specifying
238a `start-revision` with a timestamp like ``2001-12-25 23:26:48 UTC``.
239
240To specify also a particular `branch`, prepend it before the
241timestamp, as in ``unstable-branch 2001-12-25 23:26:48 UTC``.
242
243To migrate the whole history of a specific `branch`, use something
244like ``somebranch INITIAL``.
245
246
247Resolving conflicts
248===================
249
250Should one of the replayed changes generate any conflict, tailor
251will prompt the user to correct them. This is done after the upstream
252patch has been applied and before the final commit on the target
253system, so that manually tweaking the conflict can produce a clean
254patch.
255
256
257Shortcomings
258============
259
260Tailor currently suffers of the following reported problems:
261
262a) It does not handle "empty" CVS checkouts, in other words you cannot
263   bootstrap a project that has nothing in its CVS upstream
264   repository, or from a point in time where this condition was true.
265
266b) It's completely unsupported under Windows, evenif it now uses
267   2.4's subprocess_ that seems able to hide Windows crazyness...
268
269c) ArX, Baazar-NG, Codeville and Git are (currently) only
270   supported as *target*; Bazaar and Tla only as *source*.
271
272d) Specifying ``--subdir .`` may not work, in particular when dealing
273   with remote CVS repositories (it does when the CVS repository is
274   on local machine).
275   
276This list will always be incomplete, but I'll do my best to keep it
277short :-)
278
279.. _subprocess: http://www.lysator.liu.se/~astrand/popen5/
280
281
282Config file format
283==================
284
285When your project is composed by multiple upstream modules, it is
286easier to collect such information in a single file. This is done by
287specifying the `--configfile` option with a file name as argument. In
288this case, tailor will read the above information from a standard
289Python ConfigParser file.
290
291For example::
292
293    [DEFAULT]
294    verbose = True
295    projects = tailor
296
297    [tailor]
298    root-directory = /tmp/n9
299    source = darcs:tailor
300    target = svn:tailor
301    state-file = tailor.state
302
303    [tailor-reverse]
304    root-directory = /tmp/n9
305    source = svn:tailor
306    target = darcs:tailor
307    state-file = reverse.state
308   
309    [svn:tailor]
310    repository = file:///tmp/testtai
311    module = /project1
312    subdir = svnside
313   
314    [darcs:tailor]
315    repository = ~/WiP/cvsync
316    subdir = darcside
317
318The configuration may hold one or more `projects`_ and two or more
319`repositories`_: project names do not contains colons ":",
320repository names must and the first part of the name before the
321colon specify the kind of the repository.  So, the above example
322contains two projects, one that goes from `darcs` to `subversion`, the
323other in the opposite direction.
324
325The ``[DEFAULT]`` section contains the default values, that will be
326used when a specific setting is missing from the particular section.
327
328You can specify on which project tailor should operate by
329giving its name on the command line, even more than one. When not
330explicitly given, tailor will look at ``projects`` in the
331``[DEFAULT]`` section, and if its missing it will loop over all
332projects in the configuration.
333
334The following simpler config just go in one direction, for a single
335project, so no need neither for ``[DEFAULT].projects`` nor command
336line arguments::
337
338    [pxlib]
339    source = cvs:pxlib
340    target = hg:pxlib
341    root-directory = ~/mypxlib
342    start-revision = INITIAL
343    subdir = pxlib
344   
345    [cvs:pxlib]
346    repository = :pserver:anonymous@cvs.sf.net:/cvsroot/pxlib
347    module = pxlib
348
349    [hg:pxlib]
350    hg-command = /usr/local/bin/hg
351
352This will use a single directory, ``pxlib`` to contain both the source
353and the target system. If you prefer keeping the separated, you just
354need to specify a different directory for each repository [#]_, as in::
355
356    [pxlib]
357    source = cvs:pxlib
358    target = hg:pxlib
359    root-directory = ~/mypxlib
360    start-revision = INITIAL
361   
362    [cvs:pxlib]
363    repository = :pserver:anonymous@cvs.sf.net:/cvsroot/pxlib
364    module = pxlib
365    subdir = original
366    delay-before-apply = 10
367
368    [hg:pxlib]
369    hg-command = /usr/local/bin/hg
370    subdir = migrated
371
372This will extract upstream CVS sources into ``~/mypxlib/original``,
373and create a new Mercurial repository in ``~/mypxlib/migrated``.
374
375On final example to show the syntax of Bazaar sources::
376
377    [project]
378    target = hg:target
379    start-revision = base-0
380    root-directory = /tmp/calife
381    state-file = tailor.state
382    source = baz:source
383
384    [baz:source]
385    module = calife--pam--3.0
386    repository = roberto@keltia.net--2003-depot
387    subdir = tla
388
389    [hg:target]
390    repository = /tmp/HG/calife-pam
391    subdir = hg
392
393.. [#] NB: when the source and the target repositories specify
394       different directories with the ``subdir`` option, tailor
395       uses ``rsync`` to keep them in sync, so that tool needs
396       to be installed.
397
398
399Configuration sections
400----------------------
401
402Default
403~~~~~~~
404
405The ``[DEFAULT]`` section in the configuration file may set the
406default value for any of the recognized options: when a value is
407missing from a specific section it is looked up in this section.
408
409One particular option, ``projects``, is meaningful only in the
410``[DEFAULT]`` section: it's a comma separated list of project names,
411the one that will be operated on by tailor when no project is
412specified on the command line.  When the there are no ``projects``
413setting nor any on the command line, tailor activates all configured
414projects, in order of appearance in the config file.
415
416
417Projects
418~~~~~~~~
419
420A project is identified by a section whose name does not contain any
421colon (":") character, and configured with the following values:
422
423root-directory : string
424  This is where all the fun will happen: this directory will contain
425  the source and the target working copy, and usually the state and
426  the log file. It supports the conventional `~user` to indicate user's
427  home directory and defaults to the current working directory.
428
429subdir : string
430  This is the subdirectory, relative to the `root-directory`, where
431  tailor will extract the source working copy. It may be '.' for some
432  backend kinds. The source and target backends will use this value
433  if they don't explicitly override it.
434
435state-file : string
436  Name of the state file needed to store tailor last activity.
437
438source : string
439  The source repository: a repository name is something like
440  "darcs:somename", that will be loaded from the homonymous section
441  in the configuration.
442
443target : string
444  The counterpart of `source`, the repository that will receive the
445  changes coming from there.
446
447Non mandatory options:
448
449verbose : bool
450  Print the commands as they are executed.
451
452debug : bool
453  Print also their output.
454 
455before-commit : tuple
456  This is a function name, or a sequence of function names enclosed
457  by brackets, that will be executed on each changeset just before
458  it get replayed on the target system: this may be used to perform
459  any kind of alteration on the content of the changeset, or to skip
460  some of them.
461
462after-commit : tuple
463  This is a function name, or a sequence of function names enclosed
464  by brackets, that will be executed on each changeset just after
465  the commit on the target system: this may be used for example to
466  create a tag.
467
468subdir : string
469  The name of the subdirectory, under ``root-directory``, that will
470  contain the source and target repositories/working directories.
471
472start-revision : string
473  This identifies from when tailor should start the migration. It can
474  be either ``INITIAL``, to indicate the start of the history, or
475  ``HEAD`` to indicate the current latest changeset, or a backend
476  specific way of indicate a particular revision/tag in the history.
477  See also `CVS start-revision`_ above.
478
479patch-name-format : string
480  Some backends have a distinct notion of `patch name` and `change
481  log`, others just suggest a policy that the first line of the
482  message is a summary, the rest if present is a more detailed
483  description of the change.  With this option you can control the
484  format of the name, or of the first line of the changelog.
485
486  The prototype may contain ``%(keyword)s`` such as 'author', 'date',
487  'revision', 'firstlogline', 'remaininglog' or 'project'.  It
488  defaults to ``[%(project)s @ %(revision)s]``; setting it to the
489  empty string means that tailor will simply use the original
490  changelog.
491
492  When you set it empty, as in
493
494  ::
495
496    [project]
497    patch-name-format =
498
499  tailor will keep the original changelog as is.
500
501remove-first-log-line : bool
502  Remove the first line of the upstream changelog. This is intended to
503  go in pair with ``patch-name-format``, when using it's 'firstlogline'
504  variable to build the name of the patch.  By default is ``False``.
505 
506  A reasonable usage is::
507
508    [DEFAULT]
509    patch-name-format=[%(project)s @ %(revision)s]: %(firstlogline)s
510    remove-first-log-line=True
511
512refill-changelogs : bool
513  Off by default, when active tailor reformats every changelog before
514  committing on the target system.
515
516
517Repositories
518~~~~~~~~~~~~
519
520All the section whose name contains at least one colon character
521denote a repository.  A single repository may be shared by zero, one or
522more projects.  The first part of the name up to the first colon
523indicates the `kind` of the repository, one of ``arx``, ``baz``, ``bzr``,
524``cdv``, ``cvs``, ``darcs``, ``git``, ``hg``, ``hglib``, ``monotone``,
525``svn``, ``svndump`` and ``tla``.
526
527repository : string
528  When a repository is used as a `source`, it must indicate its origin
529  with ``repository``, and for some backends also a ``module``, but
530  are not required when it's a target system, even if some backend may
531  use the information to create the target repository (like ``svn``
532  backend does).
533
534subdir : string
535  When the `source` and `target` repositories use different
536  subdirectories, tailor uses ``rsync`` to copy the changes between
537  the two after each applied changeset.  When the source repository
538  basedir is a subdirectory of target basedir tailor prefixes all
539  paths coming from upstream to match the relative position.
540
541  This defaults to the project's setting.
542
543command : string
544  Backends based on external command line tool such as *svn* or
545  *darcs* offers this option to impose a particular external binary to
546  be used, as done in the example above for ``hg``.
547
548python-path : string
549  For pythonique backends such as *bzr* and *hglib* this indicates
550  where the respective library is located.
551
552encoding : string
553  States the charset encoding the particular repository uses, and it's
554  particularly important when it differs from local system setup, that
555  you may inspect executing::
556
557    python -m locale
558
559delay-before-apply : integer
560  Sometime the migration is fast enough to put the upstream server
561  under an excessive load. When this is the case, you may specify
562  ``delay-before-apply = 5``, that is the number of seconds tailor
563  will wait before applying each changeset.
564
565  It defaults to *None*, ie no delay at all.
566
567arx
568%%%
569
570..
571
572baz
573%%%
574
575..
576
577bzr
578%%%
579
580..
581
582cdv
583%%%
584
585..
586
587cvs
588%%%
589
590tag-entries : bool
591  CVS and CVSPS repositories may turn off automatic tagging of
592  entries, that tailor does by default to prevent manual interventions
593  in the CVS working copy, using ``tag_entries = False``.
594
595  *True* by default.
596
597cvsps
598%%%%%
599
600tag-entries : bool
601  CVS and CVSPS repositories may turn off automatic tagging of
602  entries, that tailor does by default to prevent manual interventions
603  in the CVS working copy, using ``tag_entries = False``.
604
605  *True* by default.
606 
607darcs
608%%%%%
609
610..
611
612git
613%%%
614
615..
616
617hg
618%%
619
620..
621
622hglib
623%%%%%
624
625..
626
627monotone
628%%%%%%%%
629
630keyid : string
631  Monotone key id to use for commits. The specified key
632  must exist on keystore. Takes precedence
633  over keyfile and keygenid.
634
635keyfile : string
636  File containing a keypair to store in the repository.
637  The keypair is used for commits. Ignored if keyid is
638  specified.
639
640keygenid : string
641  Id of a new keypair to generate and store in the
642  repository.
643  The keypair is used for commits. Ignored if keyid is
644  specified.
645
646passphrase : string
647  Passphrase to use for commits.
648
649svn
650%%%
651
652filter-badchars : bool (or string)
653  Activate (with *True*) or activate and specify (with a *string*) the
654  filter on the svn log to eliminate illegal XML characters.
655
656  *False* by default.
657 
658use-propset : bool
659  Indicate that tailor is allowed to properly inject the upstream
660  changeset's author and timestamp into the target repository.  As
661  stated above, this requires a manual intervention on the repository
662  itself and thus is off by default, and tailor simply appends those
663  values to the changelog.  When active at bootstrap time and the
664  repository is local, tailor creates automatically a minimal
665  ``hooks/pre-revprop-change`` script inside the repository, so no
666  other intervention is needed.
667
668  *False* by default.
669
670use-limit : bool
671  By default *True*, should be set to *False* when using old
672  Subversion clients, since ``log --limit`` was introduced with
673  version 1.2. By using this option tailor can fetch just the
674  revision it needs, instead of transfering whole history log.
675
676trust-root : bool
677  Tailor by default verifies that the specified ``repository``
678  effectively points to the root of a Subversion repository,
679  eventually splitting it and adjusting ``module`` accordingly.  This
680  is sometimes undesiderable, for example when the root isn't public
681  and cannot be listed.  Setting this option to *True* disable the
682  check and tailor takes the given ``repository`` and ``module`` as-is.
683
684
685svndump
686%%%%%%%
687
688..
689
690tla
691%%%
692
693..
694
695
696
697Using a Python script as configuration file
698-------------------------------------------
699
700Instead of executing ``tailor --configfile project.tailor.conf``
701you can prepend the following signature to the config itself::
702
703  #!/usr/bin/env /path/to/tailor
704
705Giving execute mode to it will permit the launch of the tailor
706process by running the config script directly::
707
708  $ ./project.tailor.conf
709
710When a config file is signed in this way [#]_, either you pass it as
711argument to ``--configfile`` or executed as above, tailor will
712actually execute it as a full fledged Python script, that may define
713functions that alter the behaviour of tailor itself.
714
715A common usage of this functionality is to define so called `hooks`,
716sequences of functions that are executed at particular points in
717the tailorization process.
718
719Just to illustrate the functionality, consider the following example::
720
721    #!/usr/bin/env tailor
722
723    """
724    [DEFAULT]
725    debug = False
726    verbose = True
727
728    [project]
729    target = bzr:target
730    root-directory = /tmp/prova
731    state-file = tailor.state
732    source = darcs:source
733    before-commit = before
734    after-commit = after
735    start-revision = Almost arbitrarily tagging this as version 0.8
736
737    [bzr:target]
738    python-path = /opt/src/bzr.dev
739    subdir = bzrside
740
741    [darcs:source]
742    repository = /home/lele/WiP/cvsync
743    subdir = darcside
744    """
745
746    def before(wd, changeset):
747        print "BEFORE", changeset
748        changeset.author = "LELE"
749        return changeset
750
751    def after(wd, changeset):
752        print "AFTER", changeset
753
754With the above in a `script` called say ``tester``, just doing::
755
756    $ chmod 755 tester
757    $ ./tester
758
759will migrate the history from a darcs repository to a bazaar-ng one,
760forcing the author to a well-known name :-)
761
762.. [#] Tailor does actually read just the first two bytes from the
763       file, and compare them with "#!", so you are free to choose
764       whatever syntax works in your environment.
765
766
767State file
768----------
769
770The state file stores two things: the last upstream revision that
771has been applied to the tree, and a sequence of pending (not yet
772applied) changesets, that may be empty. In the latter case, tailor
773will fetch latest changes from the upstream repository.
774
775
776Logging
777-------
778
779Tailor uses the Python's logging module to emit noise. It's basic
780configuration is hardwired and correspond to the following::
781
782    [formatters]
783    keys = console
784
785    [formatter_console]
786    format =  %(asctime)s [%(levelname).1s] %(message)s
787    datefmt = %H:%M:%S
788
789    [loggers]
790    keys = root
791
792    [logger_root]
793    level = INFO
794    handlers = console
795
796    [handlers]
797    keys = console
798
799    [handler_console]
800    class = StreamHandler
801    formatter = console
802    args = (sys.stdout,)
803    level = INFO
804
805However, you can completely override the default adding a
806*supersection* ``[[logging]]`` to the configuration file, something
807like::
808
809    # ... usual tailor config ...
810    [project]
811    source = bzr:source
812    target = hg:target
813
814    # Here ends tailor config, and start the one for the logging
815    # module
816
817    [[logging]]
818
819    [logger_tailor.BzrRepository]
820    level = DEBUG
821    handlers = tailor.source
822
823    [handler_tailor.source]
824    class = SMTPHandler
825    args = ('localhost', 'from@abc', ['tailor@abc'], 'Tailor log')
826
827Further help
828============
829
830See the output of ``tailor -h`` for some further tips.  There's
831also a `wiki page`_ that may give you some other hints.  The
832development of Tailor is mainly driven by user requests at this point,
833and the preferred comunication medium is the dedicated `mailing list`_
834[#]_.
835
836.. _wiki page:
837   http://www.darcs.net/DarcsWiki/Tailor
838
839.. _mailing list:
840   http://lists.zooko.com/mailman/listinfo/tailor
841   
842I will be more than happy to answer any doubt, question or suggestion
843you may have on it. I'm usually hanging out as "lelit" on the IRC
844channel devoted to darcs on the `freenode.net` network. Do not
845hesitate to contact me either by email or chatting there.
846
847.. [#] I wish to say a big `Thank you` to `Zooko <zooko@zooko.com>`_,
848       for hosting the ML and for supporting Tailor in several ways,
849       from suggestions to bug reporting and fixing.
850
851
852Authors
853=======
854
855Lele Gaifax <lele@nautilus.homeip.net>
856
857Since I'm not currently using all the supported systems (so little
858time, so many VCSs...) I'm not in position to test them out properly,
859but I'll do my best to keep them in sync, maybe with your support :-)
860
861ArX support
862-----------
863
864ArX_ support was contributed by `Walter Landry <wlandry@ucsd.edu>`_.
865
866Bazaar-NG support
867-----------------
868
869`Bazaar-NG`_ support was contributed by `Johan Rydberg
870<jrydberg@gnu.org>`_.
871
872Git support
873-----------
874
875`Git`_ support was contributed by `Todd Mokros
876<tmokros@tmokros.net>`_.
877
878Monotone support
879----------------
880
881Monotone_ support was kindly contributed by `Markus Schiltknecht
882<markus@bluegap.ch>`_ and further developed by `rghetta
883<birrachiara@tin.it>`_, that was able to linearize the multi-headed
884monotone history into something tailor groks. Kudos!
885
886Tla support
887-----------
888
889Tla_ support was contributed by `Robin Farine
890<robin.farine@terminus.org>`_.
891
892
893License
894=======
895
896Tailor is distribuited under the `GNU General Public License`__.
897
898__ http://www.fsf.org/licensing/licenses/gpl.html
899
900
901About this document
902===================
903
904This document and most of the internal documention use the
905reStructuredText format so that it can be easily converted into other
906formats, such as HTML.  For more information about this, please see:
907
908  http://docutils.sourceforge.net/rst.html
909
910
911.. vim:ft=rest
912.. Local Variables:
913.. mode: rst
914.. End:
Note: See TracBrowser for help on using the repository browser.