Revision history for App-FileSync

0.002.1	Sun Nov 15 03:36:05 PM EST 2026
	[ Enhancements ]
	- Block deltas are much faster to compute.  A changed file of 8 MiB or
	  more with no blocks in common took about 45 seconds to diff; it now
	  takes about 3.  Signatures (the receiver's description of its copy)
	  are computed about twice as fast.  The wire format is unchanged, so
	  old and new clients and servers still work together.
	- JSON now goes through JSON::MaybeXS (a new dependency), which
	  installs and uses Cpanel::JSON::XS wherever there is a compiler.
	  Reading a 100,000-file manifest took about 15 seconds with JSON::PP
	  and takes under half a second with Cpanel::JSON::XS.  Pure-Perl
	  installs still work, on JSON::PP, and either side of a sync may use
	  either backend.
	- Paths read back from JSON as hash keys (manifests are keyed by
	  path) kept Perl's UTF-8 flag, so a file test on a non-ASCII name
	  looked for a differently encoded file.  "verify" silently left such
	  files out of its random sample.  Keys are now byte strings, like
	  values.
	[ Bug Fixes ]
	- On Windows, a client whose session ended early (any error mid-sync)
	  hung for ever instead of reporting the error: the server or ssh it
	  started inherited the client's end of its own input pipe, so it never
	  saw end of file, and the client waited for it to exit.  The client's
	  pipe ends are no longer inheritable, and a server or ssh that has not
	  exited 30 seconds after the session ends is stopped.  The Windows test
	  runs had hung in t/regressions.t since 0.001.1.
	- "filesync settings" on Windows named an environment variable in the
	  spelling it was looked up with (App__FileSync__ssh_identity) rather
	  than the one the environment holds (APP__FILESYNC__SSH_IDENTITY):
	  Windows' %ENV lookups ignore case, so the exact-match test always
	  succeeded.

0.002.0	Wed Nov  4 09:44:06 PM EST 2026
	[ Enhancements ]
	- Created a website
	- "filesync sync --quiet" prints nothing for a repo where nothing
	  happened, instead of an all-zero summary and transfer line, so a
	  cron job that finds nothing to do stays silent.
	[ Bug Fixes ]
	- t/locales.t failed its three system-locale subtests on Windows: it
	  passed a multi-line child program to "perl -e", which Windows cut at
	  the first newline, and imported LC_MESSAGES, which Windows' POSIX
	  lacks.  The child is now a script file and falls back to LC_CTYPE.

0.001.5 Sun Oct 25 12:53:45 PM EDT 2026
	[ Bug Fixes ]
	- Log::Abstraction 0.36 is now required, because the client logs its
	  run summary as structured fields in a trailing hashref.  An older
	  copy, which the installer accepted, turned that into
	  "sync finishedHASH(0x...)" in the log file and an empty entry in an
	  array logger, so the counts were lost and t/settings.t failed its
	  seven logger assertions.

0.001.4	Sun Oct 25 09:31:17 AM EDT 2026
	[ Bug Fixes ]
	- t/ssh.t: the stand-in for ssh now names the perl running the tests on
	  its first line instead of "#!/usr/bin/env perl".  The transport starts
	  that file as a program, so the kernel picked whichever perl came first
	  on PATH - on a smoke tester the system perl, which cannot see the
	  modules the build installed - and the filesync-server it then ran died
	  with "Can't locate Params/Validate/Strict.pm" against a build that never
	  lacked it (GitHub issue #4).  The Windows wrapper already named $^X.
	[ Tests ]
	- t/ssh.t checks the interpreter line of the stand-in it writes, so the
	  PATH-dependent first line cannot come back unnoticed.

0.001.3	Sun Oct 25 07:25:08 AM EDT 2026
	[ Documentation ]
	- More improvements
	[ Bug Fixes ]
	- Bump minimim Config::Abstraction

0.001.2	Sat Oct 24 09:02:12 PM EDT 2026
	[ Bug Fixes ]
        - filesync-admin repo create names the server root and the directory
          that blocks it when the root cannot be written, and says to chown
          it to the running account or use --root elsewhere.  It used to
          report only "Permission denied" against a path below the root.
        - That advice is given only when a directory really is unwritable, so
          a full disk or a root that is a file keeps its own error.

	[ Documentation ]
        - The examples are split by machine - what to run on the
          server, on each client, and from cron - and keep the master in a
          home directory, so nothing needs sudo.
        - What a /srv/filesync root needs instead, the wrapper that
          adds --root to filesync-server, and the ssh key the first sync
          requires.
        - The backup and restore commands follow the example's master
          layout, and make the backup directory before cron mirrors into it.
        - The synopsis creates the repo first, so it runs as printed.

0.001.1 Sat Oct 24 09:52:47 AM EDT 2026
	[ Bug Fixes ]
        - Build: test on Windows with Perl 5.42 again.  Its B::Hooks::EndOfScope
          faults at exit, so the plain-Perl hook is used there.
        - filesync, filesync-server and filesync-admin select that hook for
          themselves on 5.42 for Windows, so it no longer has to be set to run
          them; an implementation already in the environment is left alone.
          A test checks the choice in a child process that starts without the
          variable.
        - Security: an ssh server of the form "-v@host" (or a program name
          starting with "-") is refused; it was passed to ssh as an option.
        - Security: client and repo names that are not plain ids ("../x",
          over 64 characters) are refused by the server, admin and client.
        - Server: a conflict copy is kept under the planned name whether or
          not the client names it, and any other name is refused; acks are
          accepted only for actions the client applies; get validates its
          offset and caps its size; an upload larger than announced is
          refused and discarded.
        - Ignore: building a matcher no longer modifies the caller's pattern
          list (which turned "!keep.tmp" into "keep.tmp" and could delete the
          file remotely); "/top" anchors to the root; "build/" matches at any
          depth.
        - Trash: same-day versions sort numerically and are no longer capped
          at .99.  Each client repo has its own local trash; restore still
          finds files in the old shared one.
        - Admin: journal_read works when the server root contains spaces.
        - All messages come from a catalogue (App::FileSync::I18N::en) and can
          be translated; errors no longer show Perl file and line numbers
          unless FILESYNC_TRACE is set.
        - Internals: new Args, Base, Constants, I18N, IO and Platform modules;
          private subs are enforced with Sub::Private; full POD.
        - Removed the unused POSIX and Encode prerequisites.
        - Build: requires Perl 5.14; declares ExtUtils::MakeMaker 6.64 as a
          configure prerequisite so test prerequisites are honoured; the
          gzip and (on macOS) gtar dist settings are now actually applied;
          t/ and xt/ are not indexed; bug tracker link added.
        - $VERSION is a version object (version->declare), so every tool
          reads 0.001.1 as the dotted version v0.1.1.
        - Every module and program carries the same GPL v2 licence notice.

0.001.0	Fri Oct 23 03:44:45 PM EDT 2026
        First draft
