source: tailor/README @ 1042

Revision 1042, 27.7 KB checked in by lele@…, 7 years ago (diff)

New option ignore-externals on svn source backend
This changes the default behaviour of Tailor svn source backend: now
it uses --ignore-externals to checkouts and updates. You can override
the default putting "ignore-externals = False" in the svn repository
section.

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 and Codeville 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 and Codeville are (currently) only supported as *target*;
270   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
423.. note:: If a particular option is missing from the project section,
424          its value is obtained looking up the same option in the
425          ``[DEFAULT]`` section.
426
427root-directory : string
428  This is where all the fun will happen: this directory will contain
429  the source and the target working copy, and usually the state and
430  the log file. It supports the conventional `~user` to indicate user's
431  home directory and defaults to the current working directory.
432
433subdir : string
434  This is the subdirectory, relative to the `root-directory`, where
435  tailor will extract the source working copy. It may be '.' for some
436  backend kinds. The source and target backends will use this value
437  if they don't explicitly override it.
438
439state-file : string
440  Name of the state file needed to store tailor last activity.
441
442source : string
443  The source repository: a repository name is something like
444  "darcs:somename", that will be loaded from the homonymous section
445  in the configuration.
446
447target : string
448  The counterpart of `source`, the repository that will receive the
449  changes coming from there.
450
451Non mandatory options:
452
453verbose : bool
454  Print the commands as they are executed.
455
456debug : bool
457  Print also their output.
458 
459before-commit : tuple
460  This is a function name, or a sequence of function names enclosed
461  by brackets, that will be executed on each changeset just before
462  it get replayed on the target system: this may be used to perform
463  any kind of alteration on the content of the changeset, or to skip
464  some of them.
465
466after-commit : tuple
467  This is a function name, or a sequence of function names enclosed
468  by brackets, that will be executed on each changeset just after
469  the commit on the target system: this may be used for example to
470  create a tag.
471
472subdir : string
473  The name of the subdirectory, under ``root-directory``, that will
474  contain the source and target repositories/working directories.
475
476start-revision : string
477  This identifies from when tailor should start the migration. It can
478  be either ``INITIAL``, to indicate the start of the history, or
479  ``HEAD`` to indicate the current latest changeset, or a backend
480  specific way of indicate a particular revision/tag in the history.
481  See also `CVS start-revision`_ above.
482
483patch-name-format : string
484  Some backends have a distinct notion of `patch name` and `change
485  log`, others just suggest a policy that the first line of the
486  message is a summary, the rest if present is a more detailed
487  description of the change.  With this option you can control the
488  format of the name, or of the first line of the changelog.
489
490  The prototype may contain ``%(keyword)s`` such as 'author', 'date',
491  'revision', 'firstlogline', 'remaininglog' or 'project'.  It
492  defaults to ``[%(project)s @ %(revision)s]``; setting it to the
493  empty string means that tailor will simply use the original
494  changelog.
495
496  When you set it empty, as in
497
498  ::
499
500    [project]
501    patch-name-format =
502
503  tailor will keep the original changelog as is.
504
505remove-first-log-line : bool
506  Remove the first line of the upstream changelog. This is intended to
507  go in pair with ``patch-name-format``, when using it's 'firstlogline'
508  variable to build the name of the patch.  By default is ``False``.
509 
510  A reasonable usage is::
511
512    [DEFAULT]
513    patch-name-format=[%(project)s @ %(revision)s]: %(firstlogline)s
514    remove-first-log-line=True
515
516refill-changelogs : bool
517  Off by default, when active tailor reformats every changelog before
518  committing on the target system.
519
520
521Repositories
522~~~~~~~~~~~~
523
524All the section whose name contains at least one colon character
525denote a repository.  A single repository may be shared by zero, one or
526more projects.  The first part of the name up to the first colon
527indicates the `kind` of the repository, one of ``arx``, ``baz``, ``bzr``,
528``cdv``, ``cvs``, ``darcs``, ``git``, ``hg``, ``hglib``, ``monotone``,
529``svn``, ``svndump`` and ``tla``.
530
531.. note:: If a particular option is missing from the repository section,
532          its value is obtained looking up the same option in the
533          section of the project *currently* using the repository,
534          falling back to the ``[DEFAULT]`` section.
535
536repository : string
537  When a repository is used as a `source`, it must indicate its origin
538  with ``repository``, and for some backends also a ``module``, but
539  are not required when it's a target system, even if some backend may
540  use the information to create the target repository (like ``svn``
541  backend does).
542
543subdir : string
544  When the `source` and `target` repositories use different
545  subdirectories, tailor uses ``rsync`` to copy the changes between
546  the two after each applied changeset.  When the source repository
547  basedir is a subdirectory of target basedir tailor prefixes all
548  paths coming from upstream to match the relative position.
549
550  This defaults to the project's setting.
551
552command : string
553  Backends based on external command line tool such as *svn* or
554  *darcs* offers this option to impose a particular external binary to
555  be used, as done in the example above for ``hg``.
556
557python-path : string
558  For pythonique backends such as *bzr* and *hglib* this indicates
559  where the respective library is located.
560
561encoding : string
562  States the charset encoding the particular repository uses, and it's
563  particularly important when it differs from local system setup, that
564  you may inspect executing::
565
566    python -m locale
567
568encoding-errors-policy : string
569  By default is *strict*, that means that Python will raise an
570  exception on Unicode conversion errors. Valid options are *ignore*
571  that simply skips offending glyphs and *replace* where unrecognized
572  entities are replaced with a place holder.
573
574delay-before-apply : integer
575  Sometime the migration is fast enough to put the upstream server
576  under an excessive load. When this is the case, you may specify
577  ``delay-before-apply = 5``, that is the number of seconds tailor
578  will wait before applying each changeset.
579
580  It defaults to *None*, ie no delay at all.
581
582arx
583%%%
584
585..
586
587baz
588%%%
589
590..
591
592bzr
593%%%
594
595..
596
597cdv
598%%%
599
600..
601
602cvs
603%%%
604
605tag-entries : bool
606  CVS and CVSPS repositories may turn off automatic tagging of
607  entries, that tailor does by default to prevent manual interventions
608  in the CVS working copy, using ``tag_entries = False``.
609
610  *True* by default.
611
612cvsps
613%%%%%
614
615tag-entries : bool
616  CVS and CVSPS repositories may turn off automatic tagging of
617  entries, that tailor does by default to prevent manual interventions
618  in the CVS working copy, using ``tag_entries = False``.
619
620  *True* by default.
621 
622darcs
623%%%%%
624
625..
626
627git
628%%%
629
630..
631
632hg
633%%
634
635..
636
637hglib
638%%%%%
639
640..
641
642monotone
643%%%%%%%%
644
645keyid : string
646  Monotone key id to use for commits. The specified key
647  must exist on keystore. Takes precedence
648  over keyfile and keygenid.
649
650keyfile : string
651  File containing a keypair to store in the repository.
652  The keypair is used for commits. Ignored if keyid is
653  specified.
654
655keygenid : string
656  Id of a new keypair to generate and store in the
657  repository.
658  The keypair is used for commits. Ignored if keyid is
659  specified.
660
661passphrase : string
662  Passphrase to use for commits. Must be specified.
663
664custom_lua : string
665  Optional custom lua script. If present, is written into MT/monotonerc.
666
667svn
668%%%
669
670filter-badchars : bool (or string)
671  Activate (with *True*) or activate and specify (with a *string*) the
672  filter on the svn log to eliminate illegal XML characters.
673
674  *False* by default.
675 
676use-propset : bool
677  Indicate that tailor is allowed to properly inject the upstream
678  changeset's author and timestamp into the target repository.  As
679  stated above, this requires a manual intervention on the repository
680  itself and thus is off by default, and tailor simply appends those
681  values to the changelog.  When active at bootstrap time and the
682  repository is local, tailor creates automatically a minimal
683  ``hooks/pre-revprop-change`` script inside the repository, so no
684  other intervention is needed.
685
686  *False* by default.
687
688use-limit : bool
689  By default *True*, should be set to *False* when using old
690  Subversion clients, since ``log --limit`` was introduced with
691  version 1.2. By using this option tailor can fetch just the
692  revision it needs, instead of transfering whole history log.
693
694trust-root : bool
695  Tailor by default verifies that the specified ``repository``
696  effectively points to the root of a Subversion repository,
697  eventually splitting it and adjusting ``module`` accordingly.  This
698  is sometimes undesiderable, for example when the root isn't public
699  and cannot be listed.  Setting this option to *True* disable the
700  check and tailor takes the given ``repository`` and ``module`` as-is.
701
702ignore-externals : bool
703  By default the Subversion backend does not consider the external
704  references defined in the source repository.  This option force
705  Tailor to behave as it did up to 0.9.20.
706
707svndump
708%%%%%%%
709
710..
711
712tla
713%%%
714
715..
716
717
718
719Using a Python script as configuration file
720-------------------------------------------
721
722Instead of executing ``tailor --configfile project.tailor.conf``
723you can prepend the following signature to the config itself::
724
725  #!/usr/bin/env /path/to/tailor
726
727Giving execute mode to it will permit the launch of the tailor
728process by running the config script directly::
729
730  $ ./project.tailor.conf
731
732When a config file is signed in this way [#]_, either you pass it as
733argument to ``--configfile`` or executed as above, tailor will
734actually execute it as a full fledged Python script, that may define
735functions that alter the behaviour of tailor itself.
736
737A common usage of this functionality is to define so called `hooks`,
738sequences of functions that are executed at particular points in
739the tailorization process.
740
741Just to illustrate the functionality, consider the following example::
742
743    #!/usr/bin/env tailor
744
745    """
746    [DEFAULT]
747    debug = False
748    verbose = True
749
750    [project]
751    target = bzr:target
752    root-directory = /tmp/prova
753    state-file = tailor.state
754    source = darcs:source
755    before-commit = before
756    after-commit = after
757    start-revision = Almost arbitrarily tagging this as version 0.8
758
759    [bzr:target]
760    python-path = /opt/src/bzr.dev
761    subdir = bzrside
762
763    [darcs:source]
764    repository = /home/lele/WiP/cvsync
765    subdir = darcside
766    """
767
768    def before(wd, changeset):
769        print "BEFORE", changeset
770        changeset.author = "LELE"
771        return changeset
772
773    def after(wd, changeset):
774        print "AFTER", changeset
775
776With the above in a `script` called say ``tester``, just doing::
777
778    $ chmod 755 tester
779    $ ./tester
780
781will migrate the history from a darcs repository to a bazaar-ng one,
782forcing the author to a well-known name :-)
783
784.. [#] Tailor does actually read just the first two bytes from the
785       file, and compare them with "#!", so you are free to choose
786       whatever syntax works in your environment.
787
788
789State file
790----------
791
792The state file stores two things: the last upstream revision that
793has been applied to the tree, and a sequence of pending (not yet
794applied) changesets, that may be empty. In the latter case, tailor
795will fetch latest changes from the upstream repository.
796
797
798Logging
799-------
800
801Tailor uses the Python's logging module to emit noise. It's basic
802configuration is hardwired and correspond to the following::
803
804    [formatters]
805    keys = console
806
807    [formatter_console]
808    format =  %(asctime)s [%(levelname).1s] %(message)s
809    datefmt = %H:%M:%S
810
811    [loggers]
812    keys = root
813
814    [logger_root]
815    level = INFO
816    handlers = console
817
818    [handlers]
819    keys = console
820
821    [handler_console]
822    class = StreamHandler
823    formatter = console
824    args = (sys.stdout,)
825    level = INFO
826
827However, you can completely override the default adding a
828*supersection* ``[[logging]]`` to the configuration file, something
829like::
830
831    # ... usual tailor config ...
832    [project]
833    source = bzr:source
834    target = hg:target
835
836    # Here ends tailor config, and start the one for the logging
837    # module
838
839    [[logging]]
840
841    [logger_tailor.BzrRepository]
842    level = DEBUG
843    handlers = tailor.source
844
845    [handler_tailor.source]
846    class = SMTPHandler
847    args = ('localhost', 'from@abc', ['tailor@abc'], 'Tailor log')
848
849Further help
850============
851
852See the output of ``tailor -h`` for some further tips.  There's
853also a `wiki page`_ that may give you some other hints.  The
854development of Tailor is mainly driven by user requests at this point,
855and the preferred comunication medium is the dedicated `mailing list`_
856[#]_.
857
858.. _wiki page:
859   http://www.darcs.net/DarcsWiki/Tailor
860
861.. _mailing list:
862   http://lists.zooko.com/mailman/listinfo/tailor
863   
864I will be more than happy to answer any doubt, question or suggestion
865you may have on it. I'm usually hanging out as "lelit" on the IRC
866channel devoted to darcs on the `freenode.net` network. Do not
867hesitate to contact me either by email or chatting there.
868
869.. [#] I wish to say a big `Thank you` to `Zooko <zooko@zooko.com>`_,
870       for hosting the ML and for supporting Tailor in several ways,
871       from suggestions to bug reporting and fixing.
872
873
874Authors
875=======
876
877Lele Gaifax <lele@nautilus.homeip.net>
878
879Since I'm not currently using all the supported systems (so little
880time, so many VCSs...) I'm not in position to test them out properly,
881but I'll do my best to keep them in sync, maybe with your support :-)
882
883ArX support
884-----------
885
886ArX_ support was contributed by `Walter Landry <wlandry@ucsd.edu>`_.
887
888Bazaar-NG support
889-----------------
890
891`Bazaar-NG`_ support was contributed by `Johan Rydberg
892<jrydberg@gnu.org>`_.
893
894Git support
895-----------
896
897`Git`_ support was contributed by `Todd Mokros
898<tmokros@tmokros.net>`_.
899
900Monotone support
901----------------
902
903Monotone_ support was kindly contributed by `Markus Schiltknecht
904<markus@bluegap.ch>`_ and further developed by `rghetta
905<birrachiara@tin.it>`_, that was able to linearize the multi-headed
906monotone history into something tailor groks. Kudos!
907
908Tla support
909-----------
910
911Tla_ support was contributed by `Robin Farine
912<robin.farine@terminus.org>`_.
913
914
915License
916=======
917
918Tailor is distribuited under the `GNU General Public License`__.
919
920__ http://www.fsf.org/licensing/licenses/gpl.html
921
922
923About this document
924===================
925
926This document and most of the internal documention use the
927reStructuredText format so that it can be easily converted into other
928formats, such as HTML.  For more information about this, please see:
929
930  http://docutils.sourceforge.net/rst.html
931
932
933.. vim:ft=rest
934.. Local Variables:
935.. mode: rst
936.. End:
Note: See TracBrowser for help on using the repository browser.