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