- Moved the err_list* stuff here from log.c and renamed them msg_list*.
[rsync/rsync.git] / TODO
1 -*- indented-text -*-
2
3 BUGS ---------------------------------------------------------------
4 Fix progress indicator to not corrupt log
5 lchmod question 
6 Do not rely on having a group called "nobody"
7 Incorrect timestamps (Debian #100295)
8 Win32
9
10 FEATURES ------------------------------------------------------------
11 server-imposed bandwidth limits
12 rsyncd over ssh
13 Use chroot only if supported
14 Allow supplementary groups in rsyncd.conf                       2002/04/09
15 Handling IPv6 on old machines
16 Other IPv6 stuff:
17 Add ACL support                                                 2001/12/02
18 Lazy directory creation
19 Conditional -z for old protocols
20 proxy authentication                                            2002/01/23
21 SOCKS                                                           2002/01/23
22 FAT support
23 Allow forcing arbitrary permissions                             2002/03/12
24 --diff                                          david.e.sewell  2002/03/15
25 Add daemon --no-detach and --no-fork options
26 Create more granular verbosity                          jw      2003/05/15
27
28 DOCUMENTATION --------------------------------------------------------
29 Update README
30 Keep list of open issues and todos on the web site
31 Update web site from CVS
32 Perhaps redo manual as SGML
33
34 LOGGING --------------------------------------------------------------
35 Make dry run list all updates                                   2002/04/03
36 Memory accounting
37 Improve error messages
38 Better statistics:                                      Rasmus  2002/03/08
39 Perhaps flush stdout like syslog
40 Log deamon sessions that just list modules
41 Log child death on signal
42 Keep stderr and stdout properly separated (Debian #23626)
43 Log errors with function that reports process of origin
44 verbose output                                  David Stein     2001/12/20
45 Add reason for transfer to file logging
46 debugging of daemon                                             2002/04/08
47 internationalization
48
49 DEVELOPMENT --------------------------------------------------------
50 Handling duplicate names
51 Use generic zlib                                                2002/02/25
52 TDB:                                                            2002/03/12
53 Splint                                                          2002/03/12
54 Memory debugger
55 Create release script
56 Add machines to build farm
57
58 PERFORMANCE ----------------------------------------------------------
59 File list structure in memory
60 Traverse just one directory at a time
61 Hard-link handling
62 Allow skipping MD4 file_sum                                     2002/04/08
63 Accelerate MD4
64 String area code
65
66 TESTING --------------------------------------------------------------
67 Torture test
68 Cross-test versions                                             2001/08/22
69 Test on kernel source
70 Test large files
71 Create mutator program for testing
72 Create configure option to enable dangerous tests
73 If tests are skipped, say why.
74 Test daemon feature to disallow particular options.
75 Create pipe program for testing
76 Create test makefile target for some tests
77 Test "refuse options" works
78
79 RELATED PROJECTS -----------------------------------------------------
80 rsyncsh
81 http://rsync.samba.org/rsync-and-debian/
82 rsyncable gzip patch
83 rsyncsplit as alternative to real integration with gzip?
84 reverse rsync over HTTP Range
85
86
87
88 BUGS ---------------------------------------------------------------
89
90 Fix progress indicator to not corrupt log
91
92   Progress indicator can produce corrupt output when transferring directories:
93
94   main/binary-arm/
95   main/binary-arm/admin/
96   main/binary-arm/base/
97   main/binary-arm/comm/8.56kB/s    0:00:52
98   main/binary-arm/devel/
99   main/binary-arm/doc/
100   main/binary-arm/editors/
101   main/binary-arm/electronics/s    0:00:53
102   main/binary-arm/games/
103   main/binary-arm/graphics/
104   main/binary-arm/hamradio/
105   main/binary-arm/interpreters/
106   main/binary-arm/libs/6.61kB/s    0:00:54
107   main/binary-arm/mail/
108   main/binary-arm/math/
109   main/binary-arm/misc/
110
111                       --          --
112
113
114 lchmod question 
115
116   I don't think we handle this properly on systems that don't have the
117   call.  Are there any such?
118
119                       --          --
120
121
122 Do not rely on having a group called "nobody"
123
124   http://www.linuxbase.org/spec/refspecs/LSB_1.1.0/gLSB/usernames.html
125
126   On Debian it's "nogroup"
127
128                       --          --
129
130
131 Incorrect timestamps (Debian #100295)
132
133   A bit hard to believe, but apparently it happens.
134
135                       --          --
136
137
138 Win32
139
140   Don't detach, because this messes up --srvany.
141
142   http://sources.redhat.com/ml/cygwin/2001-08/msg00234.html
143
144
145
146                       --          --
147
148 FEATURES ------------------------------------------------------------
149
150 server-imposed bandwidth limits
151
152                       --          --
153
154
155 rsyncd over ssh
156
157   There are already some patches to do this.
158
159   BitKeeper uses a server whose login shell is set to bkd.  That's
160   probably a reasonable approach.
161
162                       --          --
163
164
165 Use chroot only if supported
166
167   If the platform doesn't support it, then don't even try.
168
169   If running as non-root, then don't fail, just give a warning.
170   (There was a thread about this a while ago?)
171
172     http://lists.samba.org/pipermail/rsync/2001-August/thread.html
173     http://lists.samba.org/pipermail/rsync/2001-September/thread.html
174
175                       --          --
176
177
178 Allow supplementary groups in rsyncd.conf                       2002/04/09
179
180   Perhaps allow supplementary groups to be specified in rsyncd.conf;
181   then make the first one the primary gid and all the rest be
182   supplementary gids.
183
184                       --          --
185
186
187 Handling IPv6 on old machines
188
189   The KAME IPv6 patch is nice in theory but has proved a bit of a
190   nightmare in practice.  The basic idea of their patch is that rsync
191   is rewritten to use the new getaddrinfo()/getnameinfo() interface,
192   rather than gethostbyname()/gethostbyaddr() as in rsync 2.4.6.
193   Systems that don't have the new interface are handled by providing
194   our own implementation in lib/, which is selectively linked in.
195
196   The problem with this is that it is really hard to get right on
197   platforms that have a half-working implementation, so redefining
198   these functions clashes with system headers, and leaving them out
199   breaks.  This affects at least OSF/1, RedHat 5, and Cobalt, which
200   are moderately improtant.
201
202   Perhaps the simplest solution would be to have two different files
203   implementing the same interface, and choose either the new or the
204   old API.  This is probably necessary for systems that e.g. have
205   IPv6, but gethostbyaddr() can't handle it.  The Linux manpage claims
206   this is currently the case.
207
208   In fact, our internal sockets interface (things like
209   open_socket_out(), etc) is much narrower than the getaddrinfo()
210   interface, and so probably simpler to get right.  In addition, the
211   old code is known to work well on old machines.
212
213   We could drop the rather large lib/getaddrinfo files.
214
215                       --          --
216
217
218 Other IPv6 stuff:
219   
220   Implement suggestions from http://www.kame.net/newsletter/19980604/
221   and ftp://ftp.iij.ad.jp/pub/RFC/rfc2553.txt
222
223   If a host has multiple addresses, then listen try to connect to all
224   in order until we get through.  (getaddrinfo may return multiple
225   addresses.)  This is kind of implemented already.
226
227   Possibly also when starting as a server we may need to listen on
228   multiple passive addresses.  This might be a bit harder, because we
229   may need to select on all of them.  Hm.
230
231   Define a syntax for IPv6 literal addresses.  Since they include
232   colons, they tend to break most naming systems, including ours.
233   Based on the HTTP IPv6 syntax, I think we should use
234  
235      rsync://[::1]/foo/bar [::1]::bar
236
237   which should just take a small change to the parser code.
238
239                       --          --
240
241
242 Add ACL support                                                 2001/12/02
243
244   Transfer ACLs.  Need to think of a standard representation.
245   Probably better not to even try to convert between NT and POSIX.
246   Possibly can share some code with Samba.
247
248                       --          --
249
250
251 Lazy directory creation
252
253   With the current common --include '*/' --exclude '*' pattern, people
254   can end up with many empty directories.  We might avoid this by
255   lazily creating such directories.
256
257                       --          --
258
259
260 Conditional -z for old protocols
261
262   After we get the @RSYNCD greeting from the server, we know it's
263   version but we have not yet sent the command line, so we could just
264   remove the -z option if the server is too old.
265
266   For ssh invocation it's not so simple, because we actually use the
267   command line to start the remote process.  However, we only actually
268   do compression in token.c, and we could therefore once we discover
269   the remote version emit an error if it's too old.  I'm not sure if
270   that's a good tradeoff or not.
271
272                       --          --
273
274
275 proxy authentication                                            2002/01/23
276
277   Allow RSYNC_PROXY to be http://user:pass@proxy.foo:3128/, and do
278   HTTP Basic Proxy-Authentication.
279
280   Multiple schemes are possible, up to and including the insanity that
281   is NTLM, but Basic probably covers most cases.
282
283                       --          --
284
285
286 SOCKS                                                           2002/01/23
287
288   Add --with-socks, and then perhaps a command-line option to put them
289   on or off.  This might be more reliable than LD_PRELOAD hacks.
290
291                       --          --
292
293
294 FAT support
295
296   rsync to a FAT partition on a Unix machine doesn't work very well at
297   the moment.  I think we get errors about invalid filenames and
298   perhaps also trying to do atomic renames.
299
300   I guess the code to do this is currently #ifdef'd on Windows;
301   perhaps we ought to intelligently fall back to it on Unix too.
302
303                       --          --
304
305
306 Allow forcing arbitrary permissions                             2002/03/12
307
308   On 12 Mar 2002, Dave Dykstra <dwd@bell-labs.com> wrote:
309   > If we would add an option to do that functionality, I
310   > would vote for one that was more general which could mask
311   > off any set of permission bits and possibly add any set of
312   > bits.  Perhaps a chmod-like syntax if it could be
313   > implemented simply.
314
315   I think that would be good too.  For example, people uploading files
316   to a web server might like to say
317
318   rsync -avzP --chmod a+rX ./ sourcefrog.net:/home/www/sourcefrog/
319
320   Ideally the patch would implement as many of the gnu chmod semantics
321   as possible.  I think the mode parser should be a separate function
322   that passes back something like (mask,set) description to the rest
323   of the program.  For bonus points there would be a test case for the
324   parser.
325
326   Possibly also --chown
327
328   (Debian #23628)
329
330                       --          --
331
332
333 --diff                                          david.e.sewell  2002/03/15
334
335   Allow people to specify the diff command.  (Might want to use wdiff,
336   gnudiff, etc.)
337
338   Just diff the temporary file with the destination file, and delete
339   the tmp file rather than moving it into place.
340
341   Interaction with --partial.
342
343   Security interactions with daemon mode?
344
345                       --          --
346
347
348 Add daemon --no-detach and --no-fork options
349
350   Very useful for debugging.  Also good when running under a
351   daemon-monitoring process that tries to restart the service when the
352   parent exits.
353
354                       --          --
355
356
357 Create more granular verbosity                          jw      2003/05/15
358
359   Control output with the --report option.
360
361   The option takes as a single argument (no whitespace) a
362   comma delimited lists of keywords.
363
364   This would separate debugging from "logging" as well as
365   fine grained selection of statistical reporting and what
366   actions are logged.
367
368   http://lists.samba.org/archive/rsync/2003-May/006059.html
369
370                       --          --
371
372 DOCUMENTATION --------------------------------------------------------
373
374 Update README
375
376                       --          --
377
378
379 Keep list of open issues and todos on the web site
380
381                       --          --
382
383
384 Update web site from CVS
385
386                       --          --
387
388
389 Perhaps redo manual as SGML
390
391   The man page is getting rather large, and there is more information
392   that ought to be added.
393
394   TexInfo source is probably a dying format.
395
396   Linuxdoc looks like the most likely contender.  I know DocBook is
397   favoured by some people, but it's so bloody verbose, even with emacs
398   support.
399
400                       --          --
401
402 LOGGING --------------------------------------------------------------
403
404 Make dry run list all updates                                   2002/04/03
405
406   --dry-run is too dry
407
408   Mark Santcroos points out that -n fails to list files which have
409   only metadata changes, though it probably should.
410
411   There may be a Debian bug about this as well.
412
413                       --          --
414
415
416 Memory accounting
417
418   At exit, show how much memory was used for the file list, etc.
419
420   Also we do a wierd exponential-growth allocation in flist.c.  I'm
421   not sure this makes sense with modern mallocs.  At any rate it will
422   make us allocate a huge amount of memory for large file lists.
423
424                       --          --
425
426
427 Improve error messages
428
429   If we hang or get SIGINT, then explain where we were up to.  Perhaps
430   have a static buffer that contains the current function name, or
431   some kind of description of what we were trying to do.  This is a
432   little easier on people than needing to run strace/truss.
433
434   "The dungeon collapses!  You are killed."  Rather than "unexpected
435   eof" give a message that is more detailed if possible and also more
436   helpful.
437
438   If we get an error writing to a socket, then we should perhaps
439   continue trying to read to see if an error message comes across
440   explaining why the socket is closed.  I'm not sure if this would
441   work, but it would certainly make our messages more helpful.
442
443   What happens if a directory is missing -x attributes.  Do we lose
444   our load?  (Debian #28416) Probably fixed now, but a test case would
445   be good.
446
447
448
449                       --          --
450
451
452 Better statistics:                                      Rasmus  2002/03/08
453
454   <Rasmus>
455       hey, how about an rsync option that just gives you the
456       summary without the list of files?  And perhaps gives
457       more information like the number of new files, number
458       of changed, deleted, etc. ?
459
460   <mbp>
461       nice idea there is --stats but at the moment it's very
462       tridge-oriented rather than user-friendly it would be
463       nice to improve it that would also work well with
464       --dryrun
465
466                       --          --
467
468
469 Perhaps flush stdout like syslog
470
471   Perhaps flush stdout after each filename, so that people trying to
472   monitor progress in a log file can do so more easily.  See
473   http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=48108
474
475                       --          --
476
477
478 Log deamon sessions that just list modules
479
480   At the connections that just get a list of modules are not logged,
481   but they should be.
482
483                       --          --
484
485
486 Log child death on signal
487
488   If a child of the rsync daemon dies with a signal, we should notice
489   that when we reap it and log a message.
490
491                       --          --
492
493
494 Keep stderr and stdout properly separated (Debian #23626)
495
496                       --          --
497
498
499 Log errors with function that reports process of origin
500
501   Use a separate function for reporting errors; prefix it with
502   "rsync:" or "rsync(remote)", or perhaps even "rsync(local
503   generator): ".
504
505                       --          --
506
507
508 verbose output                                  David Stein     2001/12/20
509   
510   Indicate whether files are new, updated, or deleted
511
512   At end of transfer, show how many files were or were not transferred
513   correctly.
514
515                       --          --
516
517
518 Add reason for transfer to file logging
519
520   Explain *why* every file is transferred or not (e.g. "local mtime
521   123123 newer than 1283198")
522
523                       --          --
524
525
526 debugging of daemon                                             2002/04/08
527
528   Add an rsyncd.conf parameter to turn on debugging on the server.
529
530                       --          --
531
532
533 internationalization
534
535   Change to using gettext().  Probably need to ship this for platforms
536   that don't have it.
537
538   Solicit translations.
539
540   Does anyone care?  Before we bother modifying the code, we ought to
541   get the manual translated first, because that's possibly more useful
542   and at any rate demonstrates desire.
543
544                       --          --
545
546 DEVELOPMENT --------------------------------------------------------
547
548 Handling duplicate names
549
550   We need to be careful of duplicate names getting into the file list.
551   See clean_flist().  This could happen if multiple arguments include
552   the same file.  Bad.
553
554   I think duplicates are only a problem if they're both flowing
555   through the pipeline at the same time.  For example we might have
556   updated the first occurrence after reading the checksums for the
557   second.  So possibly we just need to make sure that we don't have
558   both in the pipeline at the same time.
559
560   Possibly if we did one directory at a time that would be sufficient.
561
562   Alternatively we could pre-process the arguments to make sure no
563   duplicates will ever be inserted.  There could be some bad cases
564   when we're collapsing symlinks.
565
566   We could have a hash table.
567
568   The root of the problem is that we do not want more than one file
569   list entry referring to the same file.  At first glance there are
570   several ways this could happen: symlinks, hardlinks, and repeated
571   names on the command line.
572
573   If names are repeated on the command line, they may be present in
574   different forms, perhaps by traversing directory paths in different
575   ways, traversing paths including symlinks.  Also we need to allow
576   for expansion of globs by rsync.
577
578   At the moment, clean_flist() requires having the entire file list in
579   memory.  Duplicate names are detected just by a string comparison.
580
581   We don't need to worry about hard links causing duplicates because
582   files are never updated in place.  Similarly for symlinks.
583
584   I think even if we're using a different symlink mode we don't need
585   to worry.
586
587   Unless we're really clever this will introduce a protocol
588   incompatibility, so we need to be able to accept the old format as
589   well.
590
591                       --          --
592
593
594 Use generic zlib                                                2002/02/25
595
596   Perhaps don't use our own zlib.
597
598   Advantages:
599    
600     - will automatically be up to date with bugfixes in zlib
601
602     - can leave it out for small rsync on e.g. recovery disks
603
604     - can use a shared library
605
606     - avoids people breaking rsync by trying to do this themselves and
607       messing up
608
609   Should we ship zlib for systems that don't have it, or require
610   people to install it separately?
611
612   Apparently this will make us incompatible with versions of rsync
613   that use the patched version of rsync.  Probably the simplest way to
614   do this is to just disable gzip (with a warning) when talking to old
615   versions.
616
617                       --          --
618
619
620 TDB:                                                            2002/03/12
621
622   Rather than storing the file list in memory, store it in a TDB.
623
624   This *might* make memory usage lower while building the file list.
625
626   Hashtable lookup will mean files are not transmitted in order,
627   though... hm.
628
629   This would neatly eliminate one of the major post-fork shared data
630   structures.
631
632                       --          --
633
634
635 Splint                                                          2002/03/12
636
637   Build rsync with SPLINT to try to find security holes.  Add
638   annotations as necessary.  Keep track of the number of warnings
639   found initially, and see how many of them are real bugs, or real
640   security bugs.  Knowing the percentage of likely hits would be
641   really interesting for other projects.
642
643                       --          --
644
645
646 Memory debugger
647
648   jra recommends Valgrind:
649
650     http://devel-home.kde.org/~sewardj/
651
652                       --          --
653
654
655 Create release script
656   
657   Script would:
658
659      Update spec files
660
661      Build tar file; upload
662
663      Send announcement to mailing list and c.o.l.a.
664   
665      Make freshmeat announcement
666
667      Update web site
668
669                       --          --
670
671
672 Add machines to build farm
673
674   Cygwin (on different versions of Win32?)
675
676   HP-UX variants (via HP?)
677
678   SCO
679
680
681
682                       --          --
683
684 PERFORMANCE ----------------------------------------------------------
685
686 File list structure in memory
687
688   Rather than one big array, perhaps have a tree in memory mirroring
689   the directory tree.
690
691   This might make sorting much faster!  (I'm not sure it's a big CPU
692   problem, mind you.)
693
694   It might also reduce memory use in storing repeated directory names
695   -- again I'm not sure this is a problem.
696
697                       --          --
698
699
700 Traverse just one directory at a time
701
702   Traverse just one directory at a time.  Tridge says it's possible.
703
704   At the moment rsync reads the whole file list into memory at the
705   start, which makes us use a lot of memory and also not pipeline
706   network access as much as we could.
707
708                       --          --
709
710
711 Hard-link handling
712
713   At the moment hardlink handling is very expensive, so it's off by
714   default.  It does not need to be so.
715
716   Since most of the solutions are rather intertwined with the file
717   list it is probably better to fix that first, although fixing
718   hardlinks is possibly simpler.
719
720   We can rule out hardlinked directories since they will probably
721   screw us up in all kinds of ways.  They simply should not be used.
722
723   At the moment rsync only cares about hardlinks to regular files.  I
724   guess you could also use them for sockets, devices and other beasts,
725   but I have not seen them.
726
727   When trying to reproduce hard links, we only need to worry about
728   files that have more than one name (nlinks>1 && !S_ISDIR).
729
730   The basic point of this is to discover alternate names that refer to
731   the same file.  All operations, including creating the file and
732   writing modifications to it need only to be done for the first name.
733   For all later names, we just create the link and then leave it
734   alone.
735
736   If hard links are to be preserved:
737
738     Before the generator/receiver fork, the list of files is received
739     from the sender (recv_file_list), and a table for detecting hard
740     links is built.
741
742     The generator looks for hard links within the file list and does
743     not send checksums for them, though it does send other metadata.
744
745     The sender sends the device number and inode with file entries, so
746     that files are uniquely identified.
747
748     The receiver goes through and creates hard links (do_hard_links)
749     after all data has been written, but before directory permissions
750     are set.
751
752   At the moment device and inum are sent as 4-byte integers, which
753   will probably cause problems on large filesystems.  On Linux the
754   kernel uses 64-bit ino_t's internally, and people will soon have
755   filesystems big enough to use them.  We ought to follow NFS4 in
756   using 64-bit device and inode identification, perhaps with a
757   protocol version bump.
758
759   Once we've seen all the names for a particular file, we no longer
760   need to think about it and we can deallocate the memory.
761
762   We can also have the case where there are links to a file that are
763   not in the tree being transferred.  There's nothing we can do about
764   that.  Because we rename the destination into place after writing,
765   any hardlinks to the old file are always going to be orphaned.  In
766   fact that is almost necessary because otherwise we'd get really
767   confused if we were generating checksums for one name of a file and
768   modifying another.
769
770   At the moment the code seems to make a whole second copy of the file
771   list, which seems unnecessary.
772
773   We should have a test case that exercises hard links.  Since it
774   might be hard to compare ./tls output where the inodes change we
775   might need a little program to check whether several names refer to
776   the same file.
777
778                       --          --
779
780
781 Allow skipping MD4 file_sum                                     2002/04/08
782
783   If we're doing a local transfer, or using -W, then perhaps don't
784   send the file checksum.  If we're doing a local transfer, then
785   calculating MD4 checksums uses 90% of CPU and is unlikely to be
786   useful.
787
788   Indeed for transfers over zlib or ssh we can also rely on the
789   transport to have quite strong protection against corruption.
790
791   Perhaps we should have an option to disable this,
792   analogous to --whole-file, although it would default to
793   disabled.  The file checksum takes up a definite space in
794   the protocol -- we can either set it to 0, or perhaps just
795   leave it out.
796
797                       --          --
798
799
800 Accelerate MD4
801
802   Perhaps borrow an assembler MD4 from someone?
803
804   Make sure we call MD4 with properly-sized blocks whenever possible
805   to avoid copying into the residue region?
806
807                       --          --
808
809
810 String area code
811
812   Test whether this is actually faster than just using malloc().  If
813   it's not (anymore), throw it out.
814
815                       --          --
816
817 TESTING --------------------------------------------------------------
818
819 Torture test
820
821   Something that just keeps running rsync continuously over a data set
822   likely to generate problems.
823
824                       --          --
825
826
827 Cross-test versions                                             2001/08/22
828
829   Part of the regression suite should be making sure that we
830   don't break backwards compatibility: old clients vs new
831   servers and so on.  Ideally we would test both up and down
832   from the current release to all old versions.
833
834   Run current rsync versions against significant past releases.
835
836   We might need to omit broken old versions, or versions in which
837   particular functionality is broken
838
839   It might be sufficient to test downloads from well-known public
840   rsync servers running different versions of rsync.  This will give
841   some testing and also be the most common case for having different
842   versions and not being able to upgrade.
843
844   The new --protocol option may help in this.
845
846                       --          --
847
848
849 Test on kernel source
850
851   Download all versions of kernel; unpack, sync between them.  Also
852   sync between uncompressed tarballs.  Compare directories after
853   transfer.
854
855   Use local mode; ssh; daemon; --whole-file and --no-whole-file.
856
857   Use awk to pull out the 'speedup' number for each transfer.  Make
858   sure it is >= x.
859
860                       --          --
861
862
863 Test large files
864
865   Sparse and non-sparse
866
867                       --          --
868
869
870 Create mutator program for testing
871
872   Insert bytes, delete bytes, swap blocks, ...
873
874                       --          --
875
876
877 Create configure option to enable dangerous tests
878
879                       --          --
880
881
882 If tests are skipped, say why.
883
884                       --          --
885
886
887 Test daemon feature to disallow particular options.
888
889                       --          --
890
891
892 Create pipe program for testing
893
894   Create pipe program that makes slow/jerky connections for
895   testing Versions of read() and write() that corrupt the
896   stream, or abruptly fail
897
898                       --          --
899
900
901 Create test makefile target for some tests
902
903   Separate makefile target to run rough tests -- or perhaps
904   just run them every time?
905
906                       --          --
907
908
909 Test "refuse options" works
910
911   What about for --recursive?
912
913   If you specify an unrecognized option here, you should get an error.
914
915   We need a test case for this...
916
917   Was this broken when we changed to popt?
918
919                       --          --
920
921 RELATED PROJECTS -----------------------------------------------------
922
923 rsyncsh
924
925    Write a small emulation of interactive ftp as a Pythonn program
926    that calls rsync.  Commands such as "cd", "ls", "ls *.c" etc map
927    fairly directly into rsync commands: it just needs to remember the
928    current host, directory and so on.  We can probably even do
929    completion of remote filenames.
930
931                       --          --
932
933
934 http://rsync.samba.org/rsync-and-debian/
935
936
937                       --          --
938
939
940 rsyncable gzip patch
941
942   Exhaustive, tortuous testing
943
944   Cleanups?
945
946                       --          --
947
948
949 rsyncsplit as alternative to real integration with gzip?
950
951                       --          --
952
953
954 reverse rsync over HTTP Range
955
956   Goswin Brederlow suggested this on Debian; I think tridge and I
957   talked about it previous in relation to rproxy.
958
959                       --          --
960