chiark / gitweb /
Import from Arch revision:
authorrjk@greenend.org.uk <>
Tue, 23 Jan 2007 21:23:45 +0000 (21:23 +0000)
committerrjk@greenend.org.uk <>
Tue, 23 Jan 2007 21:23:45 +0000 (21:23 +0000)
rjk@greenend.org.uk--2004/disorder--mainline--0.1--patch-328

252 files changed:
BUGS [new file with mode: 0644]
CHANGES [new file with mode: 0644]
ChangeLog.d/cvs--ChangeLog [new file with mode: 0644]
ChangeLog.d/disorder--mainline--0.1 [new file with mode: 0644]
Makefile.am [new file with mode: 0644]
README [new file with mode: 0644]
README.client [new file with mode: 0644]
README.raw [new file with mode: 0644]
README.streams [new file with mode: 0644]
README.upgrades [new file with mode: 0644]
TODO [new file with mode: 0644]
acinclude.m4 [new file with mode: 0644]
clients/Makefile.am [new file with mode: 0644]
clients/authorize.c [new file with mode: 0644]
clients/authorize.h [new file with mode: 0644]
clients/disorder.c [new file with mode: 0644]
clients/disorderfm.c [new file with mode: 0644]
clients/filename-bytes.c [new file with mode: 0644]
clients/test-eclient.c [new file with mode: 0644]
configure.ac [new file with mode: 0644]
debian/Makefile.am [new file with mode: 0644]
debian/README.Debian [new file with mode: 0644]
debian/autorules.m4 [new file with mode: 0644]
debian/changelog [new file with mode: 0644]
debian/conffiles [new file with mode: 0644]
debian/config [new file with mode: 0755]
debian/control [new file with mode: 0644]
debian/copyright [new file with mode: 0644]
debian/disorder.config [new file with mode: 0644]
debian/htaccess [new file with mode: 0644]
debian/options.debian [new file with mode: 0644]
debian/postinst [new file with mode: 0755]
debian/postrm [new file with mode: 0755]
debian/prerm [new file with mode: 0755]
debian/rules.m4 [new file with mode: 0644]
debian/templates [new file with mode: 0644]
disobedience/Makefile.am [new file with mode: 0644]
disobedience/TODO [new file with mode: 0644]
disobedience/choose.c [new file with mode: 0644]
disobedience/client.c [new file with mode: 0644]
disobedience/control.c [new file with mode: 0644]
disobedience/disobedience.c [new file with mode: 0644]
disobedience/disobedience.h [new file with mode: 0644]
disobedience/disobedience.rc [new file with mode: 0644]
disobedience/menu.c [new file with mode: 0644]
disobedience/misc.c [new file with mode: 0644]
disobedience/properties.c [new file with mode: 0644]
disobedience/queue.c [new file with mode: 0644]
doc/Makefile.am [new file with mode: 0644]
doc/checklist.txt [new file with mode: 0644]
doc/disobedience.1.in [new file with mode: 0644]
doc/disorder-deadlock.8.in [new file with mode: 0644]
doc/disorder-dump.8.in [new file with mode: 0644]
doc/disorder-rescan.8.in [new file with mode: 0644]
doc/disorder.1.in [new file with mode: 0644]
doc/disorder.3 [new file with mode: 0644]
doc/disorder_config.5.in [new file with mode: 0644]
doc/disorder_protocol.5.in [new file with mode: 0644]
doc/disorderd.8.in [new file with mode: 0644]
doc/disorderfm.1.in [new file with mode: 0644]
doc/tkdisorder.1 [new file with mode: 0644]
driver/Makefile.am [new file with mode: 0644]
driver/disorder.c [new file with mode: 0644]
examples/Makefile.am [new file with mode: 0644]
examples/config.sample.in [new file with mode: 0644]
examples/disorder-log [new file with mode: 0755]
examples/disorder.init.in [new file with mode: 0644]
images/Makefile.am [new file with mode: 0644]
images/cross.png [new file with mode: 0644]
images/down.png [new file with mode: 0644]
images/downdown.png [new file with mode: 0644]
images/edit.png [new file with mode: 0644]
images/nocross.png [new file with mode: 0644]
images/nodown.png [new file with mode: 0644]
images/nodowndown.png [new file with mode: 0644]
images/notes.png [new file with mode: 0644]
images/notescross.png [new file with mode: 0644]
images/noup.png [new file with mode: 0644]
images/noupup.png [new file with mode: 0644]
images/pause.png [new file with mode: 0644]
images/play.png [new file with mode: 0644]
images/random.png [new file with mode: 0644]
images/randomcross.png [new file with mode: 0644]
images/tick.png [new file with mode: 0644]
images/up.png [new file with mode: 0644]
images/upup.png [new file with mode: 0644]
lib/Makefile.am [new file with mode: 0644]
lib/addr.c [new file with mode: 0644]
lib/addr.h [new file with mode: 0644]
lib/asprintf.c [new file with mode: 0644]
lib/authhash.c [new file with mode: 0644]
lib/authhash.h [new file with mode: 0644]
lib/basen.c [new file with mode: 0644]
lib/basen.h [new file with mode: 0644]
lib/cache.c [new file with mode: 0644]
lib/cache.h [new file with mode: 0644]
lib/casefold.h [new file with mode: 0644]
lib/charset.c [new file with mode: 0644]
lib/charset.h [new file with mode: 0644]
lib/client-common.c [new file with mode: 0644]
lib/client-common.h [new file with mode: 0644]
lib/client.c [new file with mode: 0644]
lib/client.h [new file with mode: 0644]
lib/configuration.c [new file with mode: 0644]
lib/configuration.h [new file with mode: 0644]
lib/defs.c [new file with mode: 0644]
lib/defs.h [new file with mode: 0644]
lib/disorder.h [new file with mode: 0644]
lib/eclient.c [new file with mode: 0644]
lib/eclient.h [new file with mode: 0644]
lib/event.c [new file with mode: 0644]
lib/event.h [new file with mode: 0644]
lib/eventlog.c [new file with mode: 0644]
lib/eventlog.h [new file with mode: 0644]
lib/filepart.c [new file with mode: 0644]
lib/filepart.h [new file with mode: 0644]
lib/fprintf.c [new file with mode: 0644]
lib/hash.c [new file with mode: 0644]
lib/hash.h [new file with mode: 0644]
lib/hex.c [new file with mode: 0644]
lib/hex.h [new file with mode: 0644]
lib/inputline.c [new file with mode: 0644]
lib/inputline.h [new file with mode: 0644]
lib/kvp.c [new file with mode: 0644]
lib/kvp.h [new file with mode: 0644]
lib/log-impl.h [new file with mode: 0644]
lib/log.c [new file with mode: 0644]
lib/log.h [new file with mode: 0644]
lib/logfd.c [new file with mode: 0644]
lib/logfd.h [new file with mode: 0644]
lib/mem-impl.h [new file with mode: 0644]
lib/mem.c [new file with mode: 0644]
lib/mem.h [new file with mode: 0644]
lib/mime.c [new file with mode: 0644]
lib/mime.h [new file with mode: 0644]
lib/mixer.c [new file with mode: 0644]
lib/mixer.h [new file with mode: 0644]
lib/plugin.c [new file with mode: 0644]
lib/plugin.h [new file with mode: 0644]
lib/printf.c [new file with mode: 0644]
lib/printf.h [new file with mode: 0644]
lib/queue.c [new file with mode: 0644]
lib/queue.h [new file with mode: 0644]
lib/regsub.c [new file with mode: 0644]
lib/regsub.h [new file with mode: 0644]
lib/selection.c [new file with mode: 0644]
lib/selection.h [new file with mode: 0644]
lib/signame.c [new file with mode: 0644]
lib/signame.h [new file with mode: 0644]
lib/sink.c [new file with mode: 0644]
lib/sink.h [new file with mode: 0644]
lib/snprintf.c [new file with mode: 0644]
lib/speaker.c [new file with mode: 0644]
lib/speaker.h [new file with mode: 0644]
lib/split.c [new file with mode: 0644]
lib/split.h [new file with mode: 0644]
lib/syscalls.c [new file with mode: 0644]
lib/syscalls.h [new file with mode: 0644]
lib/table.c [new file with mode: 0644]
lib/table.h [new file with mode: 0644]
lib/test.c [new file with mode: 0644]
lib/trackname.c [new file with mode: 0644]
lib/trackname.h [new file with mode: 0644]
lib/types.h [new file with mode: 0644]
lib/unicodegc.h [new file with mode: 0644]
lib/user.c [new file with mode: 0644]
lib/user.h [new file with mode: 0644]
lib/utf8.c [new file with mode: 0644]
lib/utf8.h [new file with mode: 0644]
lib/vacopy.h [new file with mode: 0644]
lib/vector.c [new file with mode: 0644]
lib/vector.h [new file with mode: 0644]
lib/words.c [new file with mode: 0644]
lib/words.h [new file with mode: 0644]
lib/wstat.c [new file with mode: 0644]
lib/wstat.h [new file with mode: 0644]
plugins/Makefile.am [new file with mode: 0644]
plugins/exec.c [new file with mode: 0644]
plugins/execraw.c [new file with mode: 0644]
plugins/fs.c [new file with mode: 0644]
plugins/mad.c [new file with mode: 0644]
plugins/madshim.h [new file with mode: 0644]
plugins/notify.c [new file with mode: 0644]
plugins/shell.c [new file with mode: 0644]
plugins/tracklength.c [new file with mode: 0644]
prepare [new file with mode: 0755]
python/Makefile.am [new file with mode: 0644]
python/disorder.py.in [new file with mode: 0644]
python/tkdisorder [new file with mode: 0755]
scripts/Makefile.am [new file with mode: 0644]
scripts/check [new file with mode: 0755]
scripts/completion.bash [new file with mode: 0644]
scripts/copyright.exceptions [new file with mode: 0644]
scripts/dist [new file with mode: 0755]
scripts/htmlman [new file with mode: 0755]
scripts/inst [new file with mode: 0755]
scripts/makedeb [new file with mode: 0755]
scripts/oggrename [new file with mode: 0644]
scripts/sedfiles.make [new file with mode: 0644]
scripts/text2c [new file with mode: 0755]
server/Makefile.am [new file with mode: 0644]
server/api-client.c [new file with mode: 0644]
server/api-client.h [new file with mode: 0644]
server/api-server.c [new file with mode: 0644]
server/api.c [new file with mode: 0644]
server/cgi.c [new file with mode: 0644]
server/cgi.h [new file with mode: 0644]
server/cgimain.c [new file with mode: 0644]
server/daemonize.c [new file with mode: 0644]
server/daemonize.h [new file with mode: 0644]
server/dcgi.c [new file with mode: 0644]
server/dcgi.h [new file with mode: 0644]
server/deadlock.c [new file with mode: 0644]
server/disorderd.c [new file with mode: 0644]
server/dump.c [new file with mode: 0644]
server/play.c [new file with mode: 0644]
server/play.h [new file with mode: 0644]
server/rescan.c [new file with mode: 0644]
server/server.c [new file with mode: 0644]
server/server.h [new file with mode: 0644]
server/speaker.c [new file with mode: 0644]
server/state.c [new file with mode: 0644]
server/state.h [new file with mode: 0644]
server/trackdb-int.h [new file with mode: 0644]
server/trackdb.c [new file with mode: 0644]
server/trackdb.h [new file with mode: 0644]
server/trackname.c [new file with mode: 0644]
sounds/Makefile.am [new file with mode: 0644]
sounds/scratch.ogg [new file with mode: 0644]
sounds/slap.ogg [new file with mode: 0644]
templates/Makefile.am [new file with mode: 0644]
templates/about.html [new file with mode: 0644]
templates/choose.html [new file with mode: 0644]
templates/choosealpha.html [new file with mode: 0644]
templates/credits.html [new file with mode: 0644]
templates/disorder.css [new file with mode: 0644]
templates/error.html [new file with mode: 0644]
templates/help.html [new file with mode: 0644]
templates/options [new file with mode: 0644]
templates/options.columns [new file with mode: 0644]
templates/options.labels [new file with mode: 0644]
templates/playing.html [new file with mode: 0644]
templates/prefs.html [new file with mode: 0644]
templates/recent.html [new file with mode: 0644]
templates/search.html [new file with mode: 0644]
templates/sidebar.html [new file with mode: 0644]
templates/sidebarend.html [new file with mode: 0644]
templates/stdhead.html [new file with mode: 0644]
templates/stylesheet.html [new file with mode: 0644]
templates/topbar.html [new file with mode: 0644]
templates/topbarend.html [new file with mode: 0644]
templates/volume.html [new file with mode: 0644]

diff --git a/BUGS b/BUGS
new file mode 100644 (file)
index 0000000..78e4a86
--- /dev/null
+++ b/BUGS
@@ -0,0 +1,42 @@
+* Compilation Bugs
+
+The configure script make pointless checks for C++ and Fortran compilers.  This
+is a bug in Libtool not in DisOrder.  See: http://bugs.debian.org/221873
+
+* Server Bugs
+
+* Other Problems
+
+** Wrongly Specified Character Encoding
+
+A problem was reported where DisOrder was misconfigured to believe a UTF-8
+filesystem was actually an ISO-8859-1 filesystem.  When it was reconfigured
+correctly, the old (mangled) filenames remain in the database.
+
+This is not a bug as such, it is a configuration error.  However recovering
+from it can be painful if many filenames are involved.  If this mistake is
+widespread then it may be worth adding support for automatic recovery, but for
+now the easiest answer is to stop the server, remove the databases and start
+again.
+
+** Poor Sound Quality
+
+Poor sound quality may be a result of (hitherto unknown!) bugs in DisOrder, or
+may be a problem with other software or hardware.  Specific combinations that
+have produced problems in the past are listed here.
+
+*** Stutter with VIA 82C686
+
+Hardware: "VT82C686 AC97 Audio Controller"
+Software: Linux via82cxxx_audio driver
+Symptom: Stuttering playback with raw format play.
+Solution: Use snd-via82xx driver instead (from ALSA).
+
+ALSA drivers can be found in Linux 2.6.x; for 2.4.x they must be built
+separately.
+
+Local Variables:
+mode:outline
+fill-column:79
+End:
+arch-tag:32a95f730a93f0073f62873ebae245f8
diff --git a/CHANGES b/CHANGES
new file mode 100644 (file)
index 0000000..04abd31
--- /dev/null
+++ b/CHANGES
@@ -0,0 +1,321 @@
+See ChangeLog.d/* for detailed revision history.
+
+* Changes up to version 1.6
+
+** General
+
+There is a new client, 'Disobedience', that depends on the GTK+ library.
+Feedback on the interface would be very welcome.
+
+Tracks can now have tags associated with them.  See tags in disorder(1)
+or the preferences documentation for the web interface or Disobedience.
+
+The search facility knows how to limit results by tag (see search
+documentation for any interface) as well as by word search.  It is
+possible to limit random play by tag (see required-tags and
+prohibited-tags in disorder_config(5)).
+
+** Server
+
+Cache slow file lookups in the server.  Should help installations with
+large collections and/or slow platforms.
+
+The communications protocol has changed, for the benefit of
+Disobedience.
+
+The 'enabled' and 'random_enabled' configuration options are now gone.
+Instead the state survives from one run of the server to the next.
+'disable now' is gone as well - if you want to emulate it disable
+playing and then scratch the current track.
+
+The 'pick' plugin has been abolished.  All the logic formerly done there
+is now built into the server, where it can be done much more
+efficiently.
+
+** disorderfm
+
+There is a new command line tool called 'disorderfm' which is designed
+for filename translation on (for instance) digital audio repositories.
+It is not yet feature-complete.  See its man page for additional
+details.
+
+** Build And Configuration
+
+You can control which components are built with new --with options.  See
+README.
+
+options.transform and the 'transform' web option have gone, replaced
+with a 'transform' configuration command.  Both this and 'namepart' are
+now optional.
+
+* Changes up to version 1.5.1
+
+** Web Interface
+
+Correct regexp for non-alpha tracks.
+
+* Changes up to version 1.5
+
+** Web Interface
+
+Regexp-based filtering of tracks (for instance as used by the initial
+'Choose' page) now does the regexp matching in the server, limiting the
+amount of data transferred to the web interface only to be discarded.
+
+** Client
+
+Regexp-base filtering of tracks is now available to the command line
+client.
+
+** Server
+
+New server_nice, speaker_nice and rescan_nice configuration options
+allow independent control of process priorities.
+
+Scratches are now attributed to the user who requested them.
+
+Bugs fixed:
+  A file descriptor was leaked for each track played.
+  The amount of a track played so far was not reported.
+  The speaker process could crash on underrun.
+  The server would crash if you paused a non-pause capable track.
+  Regexp matching in the file and directory list commands was not
+  reliable.
+  Handling of variable-argument commands in the client was broken.
+
+* Changes up to version 1.4
+
+** General
+
+Raw format players are now supported.  See README.upgrades and
+README.raw for details.  This allows pausing and eliminating the
+inter-track gap.
+
+Pausing is also supported with suitably modified standalone player
+plugins, though none of the supplied ones are capable of this.
+
+When random play is enabled the randomly picked track now appears in the
+queue, and can be moved around the queue, removed from it, etc.
+
+** Web Interface
+
+Switches (random play, pause, ...) are now presented as a
+fixed-appearance switch with an adjacent state indicator.
+
+The 'Manage' screen has new buttons to move tracks to the head or tail
+of the queue.
+
+You can now edit the preferences for all the tracks in an album in a
+single screen, rather than having to visit each separately.  For the
+time being the raw preferences editing has gone; it can be reintroduced
+on some form if there is demand.  (You can still edit raw preferences
+from the command line.)
+
+Labels are now documented in options.labels rather than
+disorder_config(5).
+
+** Server
+
+If you tried to start up on any empty database with random play enabled
+the server would exit with an error.
+
+The server no longer risks failing if you strace its player
+subprocesses.
+
+It was possible for the server to hang when a 'reconfigure' command was
+issued.  This should no longer be the case.
+
+The default signal to forcibly terminate players is now SIGKILL.
+
+** Plugins
+
+Plugins must now declare a type word.  This allows them to document
+whether they are a standalone player or a raw-format player, and whether
+they support pausing.  They can also arrange to get setup and cleanup
+calls in the main server.  See disorder(3) for more details.
+
+* Changes up to version 1.3
+
+** Dependencies
+
+Berkeley DB 4.2 is no longer supported.  Use 4.3.
+
+** Client
+
+There is a new 'authorize' command to simplify the addition of local
+users.  Please report successes as well as failures.
+
+There is a new 'resolve' command to return the real track name behind an
+alias.
+
+The 'rescan' command no longer takes an argument.
+
+** Server
+
+The track database code has been largely rewritten to improve
+maintainability.
+
+There is a new 'lock' directive.  By default the server uses a lockfile
+to prevent multiple copies of itself running simultaneously; this can be
+inhibited e.g. if you are using a filesystem that does not support
+locking and are confident you can prevent concurrent running yourself.
+
+Aliases for track names, constructed from trackname_display_
+preferences, now appear in the virtual filesystem.  
+
+The server now executes a subprocess for the rescan operation.  It also
+runs a separate deadlock manager.
+
+Standard output and standard error from subprocesses are now logged.
+This is handy if you need to figure out why a player failed unexpectedly
+but might lead to huge log files if you have needlessly verbose players.
+
+** Web Interface
+
+Enable/disable buttons are now colored to reflect current state.
+
+Entering numeric volume values (rather than clicking on the arrows) now
+works.
+
+Connection errors are reported more gracefuly.
+
+** Plugins
+
+Scanner plugins are now always invoked in a subprocess.
+
+disorder_track_count() and disorder_track_getn() are no longer
+available.  Instead use disorder_track_random().
+
+Plugins are now opened with RTLD_NOW, so link errors are detected
+immediately.
+
+** Tools
+
+disorder-dump now insists on the input/output file being a named regular
+file, rather than using stdin or stdout.
+
+** Other
+
+Some missing files have been added, and some notes added regarding
+getting text encoding right.
+
+* Changes up to version 1.2
+
+See README.upgrades when upgrading to this version.
+
+** Bugs Fixed
+
+Avoid accumulating overlarge recently played list.
+
+When the server was stopped, the currently playing track would not be
+added to the recently played list.  This has been fixed.
+
+Reloading the 'volume' page no longer repeats the last volume-changing
+action.
+
+The search facility now works properly for multiple hits within a single
+artist or album.
+
+** Server
+
+New namepart directive replaces web interface's trackname-part.  There
+are associated changes to the protocol and clients.
+
+The number of database queries per candidate match required when
+searching has been reduced.
+
+The operator can control the signal used to scratch playing tracks.  The
+default has been changed to SIGINT from SIGKILL.
+
+The 'log' command now provides a formalised event log, rather than raw
+access to the server's ordinary log output.
+
+** Web Interface Changes
+
+*** Choosing Tracks
+
+When picking a track the client now stays on the same screen rather than
+redirecting back to the 'Playing' screen.  So that the user gets
+feedback from their action, playing and queued tracks are now marked as
+such in the track picking screen.
+
+It is possible to revert to the old behaviour by removing the back=
+argument from the choose.html and search.html templates (and optionally
+the trackstate lines).
+
+*** Search
+
+Non-ASCII characters are now properly supported in search terms.
+
+*** Syntax
+
+The template syntax has been changed slightly to ignore whitespace in
+certain places.
+
+*** Miscellaneous
+
+Some formerly textual buttons are now replaced by images (with ALT text
+reflecting the old value).  The stylesheet is now a .css file (installed
+in the same place as the images) rather than being embedded into every
+template.
+
+Artist and album names in the playing and recently-played lists are now
+links to the corresponding directory.
+
+More functions are now available from the 'manage' screen.
+
+The menus are now (by default) across the top of the screen instead of
+down the side.  Set the 'menu' label to 'sidebar' to restore the old
+appearance.  'Volume' is not present in this new menu, use 'Manage'
+instead (or edit the template).
+
+** tkdisorder
+
+tkdisorder now displays artist, album and title in the queue and
+recently played widgets, rather than just the title (as formerly).
+
+* Changes up to version 1.1
+
+** Bugs Fixed
+
+Corrected various problems with UTF-8 parsing.
+
+In the web interface, "The Beatles" (etc) are now grouped under 'B' not
+'T' when grouping tracks by initial letter.
+
+** Server
+
+The list of recently played tracks is now preserved across server
+restarts.
+
+Track IDs are more compact.
+
+Versions of libdb before 4.2 are no longer supported.  4.2 and 4.3 both
+work now.  4.2 support will be removed in some future release.
+
+Prehistoric backwards-compatibility logic removed.  Only affects people
+upgrading from long before 1.0 (who should upgrade to 1.0 and then to
+1.1.)
+
+** Command Line
+
+Tracks can be moved in the queue from the command line.
+
+'disorder queue' now reports track IDs.
+
+$pkgdatadir/completion.bash provides tab completion over commands and
+options.
+
+** Web Interface
+
+New 'cooked' preferences interface saves users having to know arcane
+details of trackname preferences and so on.  Non-ASCII characters are
+now properly supported in this context.
+
+CGI arguments to the web interface are now checked for UTF-8 compliance.
+
+Local Variables:
+mode:outline
+fill-column:72
+End:
+arch-tag:9dfc21f4428056e647e3656822342956
diff --git a/ChangeLog.d/cvs--ChangeLog b/ChangeLog.d/cvs--ChangeLog
new file mode 100644 (file)
index 0000000..050c274
--- /dev/null
@@ -0,0 +1,881 @@
+2004-10-04 00:59:42 +0100  Richard Kettlewell  <rjk@greenend.org.uk>
+
+        * dcgi.c: proper track ordering in search.
+        
+        * regsub.c, tracks.c: chattier error messages
+        
+        * utf8.h: stricter UTF-8 parsing
+        
+2004-09-26 10:47:45 +0100  Richard Kettlewell  <rjk@greenend.org.uk>
+
+        * Makefile.am, plugins/Makefile.am: tidy up to build in separate
+          object directory
+        
+2004-09-25 17:47:23 +0100  Richard Kettlewell  <rjk@greenend.org.uk>
+
+        * version 0.11
+        
+2004-09-25 17:41:21 +0100  Richard Kettlewell  <rjk@greenend.org.uk>
+
+        * BUGS: some known bugs
+        
+2004-09-25 17:25:49 +0100  Richard Kettlewell  <rjk@greenend.org.uk>
+
+        * tracks.c: chattier errors
+        
+2004-09-25 17:17:25 +0100  Richard Kettlewell  <rjk@greenend.org.uk>
+
+        * api-client.c, cgi.c, cgimain.c, disorder.c, server.c: EXIT_FAILURE
+          pedantry
+        
+2004-09-18 17:28:32 +0100  Richard Kettlewell  <rjk@greenend.org.uk>
+
+        * client.c: rework handling of commands that get lists back,
+          unbreaking 'stats' in the process.
+        
+2004-09-18 16:54:58 +0100  Richard Kettlewell  <rjk@greenend.org.uk>
+
+        * tracks.c: add a lockfile to prevent concurrent access to databases.
+        
+2004-07-31 19:05:38 +0100  Richard Kettlewell  <rjk@greenend.org.uk>
+
+        * debian/postinst, prerm: hopefuly better upgrade handling
+        
+2004-07-31 18:44:52 +0100  Richard Kettlewell  <rjk@greenend.org.uk>
+
+        * queue.c: don't reverse the queue on restart
+        
+        * Document queue/recent ordering a bit better.
+        
+2004-07-20 20:22:09 +0100  Richard Kettlewell  <rjk@greenend.org.uk>
+
+        * tkdisorder: primitive queue widget, simplify MonitorStateThread
+        
+2004-07-20 19:42:52 +0100  Richard Kettlewell  <rjk@greenend.org.uk>
+
+        * tkdisorder: python + tkinter gui, still under development
+        
+2004-07-18 14:21:12 +0100  Richard Kettlewell  <rjk@greenend.org.uk>
+
+        * Extra navigation links in 'Choose' screen allow easier navigation
+          back up the directory tree.  It's not quite right yet because
+          track names are relative to the filesystem root rather than the root
+          of their collection.
+        
+          New @navigate@, @fullname@, @dirname@, @basename@, @ne@ and @eq@
+          expansions.
+        
+2004-07-18 13:22:53 +0100  Richard Kettlewell  <rjk@greenend.org.uk>
+
+        * use new label sidebar.choosewhich to determine which 'Choose' screen
+          to pick, rather than making operator edit sidebar.html
+        
+        * mention config.USERNAME in README
+        
+2004-07-18 13:05:45 +0100  Richard Kettlewell  <rjk@greenend.org.uk>
+
+        * debian/control: more detailed build deps
+        
+2004-07-18 13:03:56 +0100  Richard Kettlewell  <rjk@greenend.org.uk>
+
+        * README: dependency version notes
+        
+2004-07-18 12:57:55 +0100  Richard Kettlewell  <rjk@greenend.org.uk>
+
+        * cope with gcrypt version skew
+        
+2004-07-18 02:46:07 +0100  Richard Kettlewell  <rjk@greenend.org.uk>
+
+        * Control connections can go over the net (using anything that
+          getaddrinfo() knows about) using the new 'listen' and 'connect'
+          options.
+        
+2004-07-17 19:01:25 +0100  Richard Kettlewell  <rjk@greenend.org.uk>
+
+        * Increase/decrease volume buttons
+        
+2004-07-17 16:35:18 +0100  Richard Kettlewell  <rjk@greenend.org.uk>
+
+        * templates/help.html: document 'Manage'
+        
+        * templates/playing.html: extra empty buttons
+        
+2004-07-17 16:24:12 +0100  Richard Kettlewell  <rjk@greenend.org.uk>
+
+        * Any track that had a filesystem encoding that differed from itself
+          when converted to UTF-8 track (that is to say, any non-ASCII track in
+          a non-UTF-8 filesystem) would not be played, as only the UTF-8
+          version of the name was passed to the player.
+        
+        * The disorder_play_track plugin interface now takes both the path and
+          the track name (the former being the raw bytes from the filesystem,
+          the latter being the UTF-8 version).
+        
+        * Document that scratch names must be UTF-8 (or ASCII).
+        
+2004-07-17 16:11:21 +0100  Richard Kettlewell  <rjk@greenend.org.uk>
+
+        * 'move' command in control protocol to move tracks around
+        
+        * New 'Manage' page allows tracks to be moved around in the queue.
+        
+2004-07-17 14:56:04 +0100  Richard Kettlewell  <rjk@greenend.org.uk>
+
+        * disorder.c: teach 'disorder play' to take multile tracks.  Hence for
+          instance you could do:
+            disorder play /path/to/some/album/*.ogg
+        
+2004-07-17 14:45:55 +0100  Richard Kettlewell  <rjk@greenend.org.uk>
+
+        * templates/help.html: mention choosealpha
+        
+2004-07-17 14:37:18 +0100  Richard Kettlewell  <rjk@greenend.org.uk>
+
+        * Use regexp-filtered file listings to implement choosealpha.html,
+          which split the top-level 'Choose' page up according to the initial
+          letter of the filenames.
+        
+2004-07-17 14:19:33 +0100  Richard Kettlewell  <rjk@greenend.org.uk>
+
+        * files and directory listings can now be filtered using regexps (you
+          could do this in your client anyway but now the server does it for
+          you, thus causing less data to be transferred from server to
+          client).
+        
+        * correct disorder.py's quoting of empty strings
+        
+2004-07-17 13:07:51 +0100  Richard Kettlewell  <rjk@greenend.org.uk>
+
+        * disorder.py.in: correct exception-to-string functions
+        
+2004-07-17 13:05:06 +0100  Richard Kettlewell  <rjk@greenend.org.uk>
+
+        * disorder.py.in: add another example
+        
+2004-07-17 12:57:57 +0100  Richard Kettlewell  <rjk@greenend.org.uk>
+
+        * disorder.py.in: better docs and error handling
+        
+2004-07-17 01:06:59 +0100  Richard Kettlewell  <rjk@greenend.org.uk>
+
+        * disorder.py.in: add a full set of methods
+        
+2004-07-17 01:06:31 +0100  Richard Kettlewell  <rjk@greenend.org.uk>
+
+        * plugins/tracklength.c: quieten compiler
+        
+2004-07-16 22:31:31 +0100  Richard Kettlewell  <rjk@greenend.org.uk>
+
+        * rudimentary Python client support
+        
+2004-07-15 00:55:08 +0100  Richard Kettlewell  <rjk@greenend.org.uk>
+
+        * configuration.c: stricter syntax check for 'url'
+        
+2004-07-15 00:41:22 +0100  Richard Kettlewell  <rjk@greenend.org.uk>
+
+        * disorder_config.5.in: clarify 'url' syntax
+        
+        * templates/help.html: link to DisOrder control protocol page
+        
+2004-07-14 19:46:38 +0100  Richard Kettlewell  <rjk@greenend.org.uk>
+
+        * config.sample.in, debian/disorder.config: play WAV files correctly
+        
+        * debian/control: depend on sox
+        
+        * scratches are now *.ogg files
+        
+2004-07-11 19:45:24 +0100  Richard Kettlewell  <rjk@greenend.org.uk>
+
+        * plugins/tracklength.c: build fix
+        
+2004-07-11 19:39:40 +0100  Richard Kettlewell  <rjk@greenend.org.uk>
+
+        * add notify_queue to notify plugin
+        
+2004-07-11 19:01:26 +0100  Richard Kettlewell  <rjk@greenend.org.uk>
+
+        * tracks.c: always sync log after replay, so that upgrade works
+        
+2004-07-11 18:54:33 +0100  Richard Kettlewell  <rjk@greenend.org.uk>
+
+        * new prefs.log file records all preferences in ASCII and guarantess
+          to be up to date.  So provided you back up this file the rest of the
+          databases can be lost completely.
+        
+        * document the use and properties of the various database files
+        
+        * new prefsync configuration command controls interval between
+          minimization of prefs.log.
+        
+        * event.c, event.h: timeouts get an associated handle which can be
+          used to cancel them.
+        
+        * don't remove the search database at the drop of a hat as that would
+          require it to be rebuilt more frequently than is sensible.
+        
+2004-07-11 18:38:52 +0100  Richard Kettlewell  <rjk@greenend.org.uk>
+
+        * disorder.c: missing 'break', oops!
+        
+2004-07-10 19:43:42 +0100  Richard Kettlewell  <rjk@greenend.org.uk>
+
+        * plugins/tracklength.c: binary search over extensions
+                                 round up WAV duration
+        
+2004-07-10 19:22:50 +0100  Richard Kettlewell  <rjk@greenend.org.uk>
+
+        * plugins/tracklength.c: tracklength plugin now knows about WAV files
+                                 remember to unmap files after parsing them!
+        
+        * sounds/slap.wav: correct broken encoding (was two WAVs concatenated,
+          is now a single WAV; it worked with 'cat > /dev/audio' but doesn't
+          work with things that expect a single correctly formatted WAV file.)
+        
+2004-07-10 18:11:26 +0100  Richard Kettlewell  <rjk@greenend.org.uk>
+
+        * 'disorder --length' allows command-line access to tracklength plugin
+        
+2004-07-10 14:47:41 +0100  Richard Kettlewell  <rjk@greenend.org.uk>
+
+        * server.c: use libgcrypt for random numbers
+        
+        * configure.ac: don't need dev/[u]random any more
+        
+2004-07-10 13:33:16 +0100  Richard Kettlewell  <rjk@greenend.org.uk>
+
+        * add log command to stream logs to clients
+        
+        * disorder_protocol.5.in: new man page documenting internal
+          communications protocol
+        
+2004-07-10 11:51:54 +0100  Richard Kettlewell  <rjk@greenend.org.uk>
+
+        * use URL-encoding in dumps because it's more convenient to duck
+          encoding issues that way.  It also looks more consistent with the
+          use of URL-encoding elsewhere in DisOrder.
+        
+        * change logging interface so that messages are formatted only once.
+        
+2004-07-10 11:40:13 +0100  Richard Kettlewell  <rjk@greenend.org.uk>
+
+        * printf.c: correct number bases!
+        
+2004-07-10 00:00:33 +0100  Richard Kettlewell  <rjk@greenend.org.uk>
+
+        * send back our URL in Refresh HTTP header to work around weird Apache
+          behaviour
+        
+        * log to (in theory) multiple outputs
+        
+        * '#define NO_MEMORY_ALLOCATION' allows us to enforce rules about
+          files that shouldn't perform memory allocation
+        
+        * split *printf frontends into separate files since some need memory
+          allocation and some do not
+        
+2004-06-12 11:37:37 +0100  Richard Kettlewell  <rjk@greenend.org.uk>
+
+        * Use a sink to handle writing to an ev_writer
+        
+        * disorder-dump --dump now works against a running server, so it is
+          not necessary to take the server down to back up the preference
+          data.
+        
+        * printf.c: correct handling of flags (which were completely broken)
+        
+2004-05-24 15:56:30 +0100  Richard Kettlewell  <rjk@greenend.org.uk>
+
+        * new help page, plus HTML-ized versions of man pages
+        
+        * de-dupe code in Makefile
+        
+        * template names can't have / in and can't be dot-files
+          (previously they weren't allowed . in)
+        
+        * @ is &#64; not &#40;
+        
+2004-05-24 14:00:38 +0100  Richard Kettlewell  <rjk@greenend.org.uk>
+
+        * templates/playing.html: put track title in <TITLE> element
+        
+2004-05-24 13:58:29 +0100  Richard Kettlewell  <rjk@greenend.org.uk>
+
+        * dcgi.c: remove dead code
+        
+2004-05-23 19:29:16 +0100  Richard Kettlewell  <rjk@greenend.org.uk>
+
+        * Makefile.am: distribute missing files
+        
+        * dcgi.c: quiten compiler
+        
+        * printf.c: missing base and padding settings
+        
+2004-05-23 19:08:40 +0100  Richard Kettlewell  <rjk@greenend.org.uk>
+
+        * disorder.3: update for disorder_snprintf
+        
+2004-05-23 19:01:31 +0100  Richard Kettlewell  <rjk@greenend.org.uk>
+
+        * New *printf implementation, which is guaranteed to behave reliable
+          in the face of strange encoding games (standard *printf insist on
+          MBC strings in the current encoding, which isn't great for us).
+          We don't support floating point yet.
+        
+        * Log output is always ASCII (non-ASCII characters are escaped) so we
+          don't have to rely on the encoding of stderr or syslog.
+        
+        * No longer depend on the target providing a working snprintf.
+        
+        * Corrected a few broken *printf calls
+        
+2004-05-22 16:55:02 +0100  Richard Kettlewell  <rjk@greenend.org.uk>
+
+        * reach preferences edit from 'Recent'
+        
+2004-05-22 16:30:56 +0100  Richard Kettlewell  <rjk@greenend.org.uk>
+
+        * @search@ converted to new template infrastructure
+        
+2004-05-21 21:55:55 +0100  Richard Kettlewell  <rjk@greenend.org.uk>
+
+        * optionally restrict scratch and/or remove to submitting user
+        
+        * export 'become' command to command-line client
+        
+        * determine username from UID, not environment
+        
+2004-05-21 21:13:30 +0100  Richard Kettlewell  <rjk@greenend.org.uk>
+
+        * disorder_config.5.in: minor improvements
+        
+2004-05-21 21:00:05 +0100  Richard Kettlewell  <rjk@greenend.org.uk>
+
+        * disorder_config.5.in: rearrange into alpha order
+        
+2004-05-18 23:14:11 +0100  Richard Kettlewell  <rjk@greenend.org.uk>
+
+        * disorder.c: add {enable,disable}-random as synonyms for
+          random-{enable,disable}
+        
+2004-05-18 20:18:02 +0100  Richard Kettlewell  <rjk@greenend.org.uk>
+
+        * dcgi.c: prevent rapid web refresh is all playing is disabled
+
+2004-05-18 00:30:28 +0100  Richard Kettlewell  <rjk@greenend.org.uk>
+
+        * support libdb 4.2 as well as 3.2.  Versions inbetween might well work
+          but this hasn't been tested.
+        
+2004-05-16 23:43:34 +0100  Richard Kettlewell  <rjk@greenend.org.uk>
+        
+        * debian/control: list build depends
+        
+2004-05-16 23:34:40 +0100  Richard Kettlewell  <rjk@greenend.org.uk>
+
+        * #include <db.h> when checking libdb, to cope with variants that
+          redefine all the symbols.
+        
+2004-05-16 23:28:55 +0100  Richard Kettlewell  <rjk@greenend.org.uk>
+
+        * new disorder-dump program to read/write prefs in text format
+          (e.g. for backup, database upgrade, replication)
+
+2004-05-16 10:37:10 +0100  Richard Kettlewell  <rjk@greenend.org.uk>
+
+        * Makefile.am: clean generated files
+        
+        * debian/autorules.m4: fix clean target
+        
+        * debian/rules.m4: man pages in /usr/share/man
+        
+2004-04-26 23:28:18 +0100  Richard Kettlewell  <rjk@greenend.org.uk>
+
+        * eliminate dependency on <inttypes.h>
+        
+2004-04-26 20:59:20 +0100  Richard Kettlewell  <rjk@greenend.org.uk>
+
+        * convert UTF-8 -> UCS-4 directly, rather than relying on iconv (which
+          doesn't always know how to do it).
+        
+2004-04-26 20:47:12 +0100  Richard Kettlewell  <rjk@greenend.org.uk>
+
+        * Do not expand dcgi-generated txet in expansion argument values (as
+          it'll get expanded properly later on anyway).
+        
+        * Add @urlquote@ expansion.
+        
+2004-04-25 20:47:26 +0100  Richard Kettlewell  <rjk@greenend.org.uk>
+
+        * arg:directory, not arg:dir
+          Include containing directory name in choose.html
+        
+2004-04-25 20:11:49 +0100  Richard Kettlewell  <rjk@greenend.org.uk>
+
+        * disorder_config.5.in: minor docs improvements.
+        
+2004-04-25 19:53:19 +0100  Richard Kettlewell  <rjk@greenend.org.uk>
+
+        * unify transform- web options, and make them available via the
+          @transform@ expansion.
+        
+2004-04-25 19:52:13 +0100  Richard Kettlewell  <rjk@greenend.org.uk>
+
+        * tracks.c: setting a trackname_ pref would cause a crash.
+        
+2004-04-25 18:51:56 +0100  Richard Kettlewell  <rjk@greenend.org.uk>
+
+        * Bring documentation up to date a bit.
+        
+2004-04-25 18:29:49  Richard Kettlewell  <rjk@greenend.org.uk>
+
+        * @choose@ converted to new template infrastructure.
+        
+2004-04-25 17:14:56  Richard Kettlewell  <rjk@greenend.org.uk>
+
+        * @prefs@ now takes a template argument, shifting the preferences
+          table furniture into the template file.
+        
+2004-04-25 15:44:38  Richard Kettlewell  <rjk@greenend.org.uk>
+
+        * Portability hacks of various degrees of nastiness in the interest of
+          building on FreeBSD.
+        
+2004-04-18 19:00:52  Richard Kettlewell  <rjk@greenend.org.uk>
+
+        * disorder_config.5.in: add some missing bits.
+        
+2004-04-18 18:05:17  Richard Kettlewell  <rjk@greenend.org.uk>
+
+        * @playing@ and @recent@ now take a template argument, allowing the
+          template file to contain the table furniture rather than having it
+          generated from inside dcgi.  Templates updated accordingly.
+          Documentation updated.
+        
+        * Moved the calculation of expected start times into the server.
+        
+2004-04-18 13:45:19  Richard Kettlewell  <rjk@greenend.org.uk>
+
+        * dcgi.c: booleans for the expansion language
+        
+2004-04-18 13:13:46  Richard Kettlewell  <rjk@greenend.org.uk>
+
+        * Expansions can now take multiple parameters using a new quoting
+          syntax.  Parameters are (for all current expansions, but not for
+          some future one) recursively expanded before use.
+        
+        * sink.c: interface for things that accept output (current
+          implementations being stdio and dynstrs)
+        
+        * vacopy.h: find a va_copy somewhere.
+        
+2004-04-17 16:48:00  Richard Kettlewell  <rjk@greenend.org.uk>
+
+       * version 0.10
+
+2004-04-17 16:25:59  Richard Kettlewell  <rjk@greenend.org.uk>
+
+        * Typo fixes.
+        
+2004-04-17 16:03:45  Richard Kettlewell  <rjk@greenend.org.uk>
+        
+        * README: recommend basic authentication instead of digest auth, as
+          the latter seems too poorly supported.
+        
+        * configure.ac: don't check for things that are very standard
+        
+        * debian/control: add Section and Priority fields
+        
+2004-04-04 17:45:34  Richard Kettlewell  <rjk@greenend.org.uk>
+
+        * Build GNU getopt for systems where libc doesn't have it
+        
+2004-04-04 15:11:49  Richard Kettlewell  <rjk@greenend.org.uk>
+
+        * configure.ac: check that various things are available and work at
+          configure time, rather than build or (worse still!) run time.  More
+          library checks.
+        
+        * charset.c: <wchar.h> no longer needed
+        
+2004-04-04 12:06:16  Richard Kettlewell  <rjk@greenend.org.uk>
+
+        * server.c: attempt to play tracks when they are added to the queue.
+          Otherwise they wouldn't be played at all nothing was already
+          playing.
+        
+2004-04-03 13:39:30  Richard Kettlewell  <rjk@greenend.org.uk>
+
+        * Use libiconv if libc doesn't have iconv
+        
+2004-04-03 12:42:05  Richard Kettlewell  <rjk@greenend.org.uk>
+
+        * configure.ac: check for both libdb and libdb3
+                        report all missing libs at once
+        
+2004-04-02 23:42:13  Richard Kettlewell  <rjk@greenend.org.uk>
+
+        * Only use __attribute__ syntax under GNU C.
+        
+2004-04-02 23:16:41  Richard Kettlewell  <rjk@greenend.org.uk>
+
+        * configure.ac: use whatever libdb the system defaults to.
+        
+2004-04-02 23:06:50  Richard Kettlewell  <rjk@greenend.org.uk>
+
+        * disorder.c: add a --help-commands option giving a one-line summary
+          of each command.
+        
+        * Updated documentation a bit.
+        
+2004-04-02 20:20:47  Richard Kettlewell  <rjk@greenend.org.uk>
+
+        * Ship another scratch sound.
+        
+2004-04-02 20:10:10  Richard Kettlewell  <rjk@greenend.org.uk>
+
+        * Debianization fixes:
+          + distribute postrm
+          + call Libtool correctly
+          + fix shared library dependencies
+        
+        * Quieten compiler when optimization turned on.
+        
+2004-04-02 19:27:59  Richard Kettlewell  <rjk@greenend.org.uk>
+
+        * Tidy up appearance of preferences screen
+        
+2004-03-28 20:01:40  Richard Kettlewell  <rjk@greenend.org.uk>
+
+        * Track prefs editor in web interface.  Rather rough-edged for now.
+        
+2004-03-28 17:41:43  Richard Kettlewell  <rjk@greenend.org.uk>
+
+        * dcgi.c: add @shell@ expansion
+        
+2004-03-28 15:02:02  Richard Kettlewell  <rjk@greenend.org.uk>
+
+        * dcgi.c: handle empty search result lists correctly.
+        
+2004-03-28 14:38:01  Richard Kettlewell  <rjk@greenend.org.uk>
+
+        * split.c: quote empty strings properly
+        
+2004-03-28 14:35:39  Richard Kettlewell  <rjk@greenend.org.uk>
+
+        * README.streams: how to play streams with DisOrder
+        
+2004-03-28 14:10:51  Richard Kettlewell  <rjk@greenend.org.uk>
+
+        * play.c: unpick wait status of failed players
+        
+2004-03-28 14:07:49  Richard Kettlewell  <rjk@greenend.org.uk>
+
+        * play.c: put players in their own process group and send SIGKILL
+          rather than SIGTERM (the latter because ogg123 doesn't seem to honor
+          SIGTERM when playing streams).
+        
+2004-03-28 13:57:12  Richard Kettlewell  <rjk@greenend.org.uk>
+
+        * Handle directories that contain both files and directories better
+          + dcgi.c: headings for directory/track lists
+                    correct output for choose.playall label
+          + server.c: support file listing in the root
+          + Associated label and style sheet additions
+        
+2004-03-28 12:35:20  Richard Kettlewell  <rjk@greenend.org.uk>
+
+        * New 'shell' player plugin executes a shell command with an environment
+          variable identifying the track.  Optionally, the user can control what
+          shell is used.
+        
+        * The sample config file knows how to play .wav files now.
+        
+        * Ship a default scratch sound.
+        
+2004-03-27 20:48:13  Richard Kettlewell  <rjk@greenend.org.uk>
+
+        * Play tracks via a plugin.  'exec' plugin module provides previous
+          behaviour.
+        
+2004-03-27 20:28:57  Richard Kettlewell  <rjk@greenend.org.uk>
+
+        * log interesting events if a username is attached (see previous
+          change)
+        
+2004-03-27 19:30:44  Richard Kettlewell  <rjk@greenend.org.uk>
+
+        * server.c: don't log auth data any more - with the Refresh: HTTP
+          header causing disorder.cgi to run every few seconds you end up with
+          vast amounts of useless information.  It would be more sensible to
+          log actions instead.
+        
+2004-03-27 18:41:22  Richard Kettlewell  <rjk@greenend.org.uk>
+
+        * Add a sidebar to the web interface, making everything available from
+          everywhere.  Tidy up the default stylesheet.
+        
+2004-03-27 18:19:40  Richard Kettlewell  <rjk@greenend.org.uk>
+
+        * dcgi.c: eliminate a spurious </div>
+        
+2004-03-27 17:17:16  Richard Kettlewell  <rjk@greenend.org.uk>
+
+        * When updating the track list, only process one track per select().
+          This makes the server much more responsive to clients during
+          rescans.
+        
+2004-03-27 16:20:30  Richard Kettlewell  <rjk@greenend.org.uk>
+
+        * Don't need file extensions in stopword list by default any more.
+        
+2004-03-27 16:07:53  Richard Kettlewell  <rjk@greenend.org.uk>
+
+        * Common code now lives in a shared library.
+          This library is not intended for other programs to link against,
+          so no ABI guarantees exist for it.
+        
+        * The disorder(3) API is now implemented by shim functions rather than
+          aliases.  These are always part of the executable that imports the
+          plugin, never the shared library.  Varargs functions are a bit messy
+          as you can't just write a forwarding function for them.
+        
+2004-03-27 14:22:22  Richard Kettlewell  <rjk@greenend.org.uk>
+
+        * Volume control support.
+          + new 'mixer' and 'channel' configuration commands
+          + 'volume' server command
+          + disorder_set_volume and disorder_get_volume client functions
+          + get-volume and set-volume command-line client commands
+          + @volume:SPEAKER@ expansion to get current volumes
+          + 'volume' action to set volume
+          + volume.html template (a bit primitive still)
+        
+2004-03-26 19:15:09  Richard Kettlewell  <rjk@greenend.org.uk>
+
+        * Bring back 'Play all' button in @choose@, and fix track selection
+        
+        * Scratch by ID, so that late scratches don't get the wrong track
+        
+2004-03-25 00:40:12  Richard Kettlewell  <rjk@greenend.org.uk>
+
+        * tracks.c: report top 10 search words in server stats
+        
+2004-03-24 23:24:45  Richard Kettlewell  <rjk@greenend.org.uk>
+
+        * dcgi.c: de-dupe track/directory code in @choose@
+        
+2004-03-22 23:31:55  Richard Kettlewell  <rjk@greenend.org.uk>
+
+        * dcgi.c: fine-tune sort order.  Now we try the 'sort' transformation
+          or part context first - once case-folded, once raw; then we try the
+          'display' version, again case-folded then raw; and finally we use
+          the unprocessed track name as as tie-breaker.
+        
+          Repeated calls to casefold aren't very efficient, this should be
+          fixed.
+        
+        * templates/options.transform: correct transform-track replacement
+          string
+        
+2004-03-22 19:58:42  Richard Kettlewell  <rjk@greenend.org.uk>
+
+        * Global and case-independent regexp replacement.
+        
+        * Strip out punctuation for sorting directories in @choose@.
+        
+2004-03-21 19:30:39  Richard Kettlewell  <rjk@greenend.org.uk>
+
+        * tracks.c: remove search database in track_sync().  It'll be removed
+          when we re-open anyway, and there's no point occupying the disk
+          space longer than necessary.
+        
+          By the same token, we don't bother syncing it in track_sync().
+        
+2004-03-21 18:47:31  Richard Kettlewell  <rjk@greenend.org.uk>
+
+        * Sort strings are now case-folded before comparison.
+        
+        * words.c: casefold now returns the original string if it was
+          malformed, rather than a null pointer.
+        
+2004-03-21 17:04:48  Richard Kettlewell  <rjk@greenend.org.uk>
+
+        * disorder.h: new function disorder_track_set_data allows plugins to
+          set preferences as well as query them.
+        
+        * disorder.3: document the above and add some general notes
+        
+        * plugins/notify.c: record time and count tracks are played at
+        
+        * plugins/pick.c: don't pick recently played tracks
+        
+2004-03-21 16:06:21  Richard Kettlewell  <rjk@greenend.org.uk>
+
+        * tracks.c: server stats had the database types all wrong, leading to
+          a crash.  Fixed.
+        
+2004-03-21 15:14:12  Richard Kettlewell  <rjk@greenend.org.uk>
+
+        * Separate sorting and display with new context arguments in
+          configuration and trackname_ preferences.
+        
+        * By default track numbers take part in sorting, but are not displayed
+        
+        * By default "The" is display unmodified but moved to the end for
+          sorting
+        
+2004-03-21 14:37:36  Richard Kettlewell  <rjk@greenend.org.uk>
+
+        * Group search results according to 'columns search' configuration.
+        
+2004-03-21 14:25:35  Richard Kettlewell  <rjk@greenend.org.uk>
+
+        cvs -Q up -j mergepoint-0-9-bugfixes-1 -j mergepoint-0-9-bugfixes-2
+        
+2004-03-21 14:21:34  Richard Kettlewell  <rjk@greenend.org.uk>
+
+        * templates/search.html: fix broken HTML.
+
+2004-03-20 21:11:30  Richard Kettlewell  <rjk@greenend.org.uk>
+
+        * Include trackname_ preferences in searches, and rebuild search
+          database from scratch on startup (to completely eliminate any
+          contamination due to prior configuration).
+        
+2004-03-20 18:50:36  Richard Kettlewell  <rjk@greenend.org.uk>
+
+        * words.c: more characters are separators
+        
+2004-03-20 18:44:45  Richard Kettlewell  <rjk@greenend.org.uk>
+
+        * Split preferences into a separate database, and automatically
+          convert the old one.
+
+2004-03-18 00:11:26  Richard Kettlewell  <rjk@greenend.org.uk>
+
+        * tracks.c: correct scanning for directories, to correctly handle
+          cases where you have <path>/<prefix> and <path>/<prefix><suffix>.
+        
+2004-03-17 00:20:55  Richard Kettlewell  <rjk@greenend.org.uk>
+
+        * config.sample.in: prefer mpg321 to mpg123
+        
+2004-03-16 23:45:54  Richard Kettlewell  <rjk@greenend.org.uk>
+
+        * Server statistics support:
+          o track_stats() reports stats from databases
+          o disorder_stats() reports stats in client
+          o stats command to command line interface
+          o @stats@ expansion in web interface
+        
+        * about.html: provides information about DisOrder
+        
+        * client.c: correct list parsing in client interface
+        
+        * disorder_config.5.in: add missing docs for @arg@ and @search@
+        
+2004-03-16 23:16:12  Richard Kettlewell  <rjk@greenend.org.uk>
+
+        * Do all database writes synchronously and add some missing
+          transaction IDs.  In fact the missing transaction IDs probably
+          ameliorated problems caused by the asynchronous writes (which leave
+          the database actually unusable, rather than merely with bits
+          missing).
+
+2004-03-16 20:30:00  Richard Kettlewell  <rjk@greenend.org.uk>
+
+        * Improved track search:
+          o Instead of encoding all track names into a single db item, we use
+            sorted duplicate data items.  libdb does all the work for us.
+          o Strip collection root and extensions from filenames
+          o Delete stopwords from search db at startup (in case new ones have
+            been added)
+          o Rename search db to search2.db so it doesn't conflict with the old
+            one
+          o Always update search db even if we've seen the track, so that
+            database format/name changes don't trash searching
+        
+        * Add a few missing transaction ID arguments.
+        
+2004-03-16 20:24:25  Richard Kettlewell  <rjk@greenend.org.uk>
+
+        * rescan.c: rescan would crash on shut down
+        
+2004-03-16 12:43:54  Richard Kettlewell  <rjk@greenend.org.uk>
+
+        * quieten compiler when optimization turned on
+        
+2004-03-16 12:12:40  Richard Kettlewell  <rjk@greenend.org.uk>
+
+        * disorder_config.5.in: complete renaming of trackinfo.* to heading.*
+        
+2004-03-15 23:18:02  Richard Kettlewell  <rjk@greenend.org.uk>
+
+        * version 0.9
+        
+2004-03-15 19:56:50  Richard Kettlewell  <rjk@greenend.org.uk>
+
+        * Define table columns with a new 'columns' web option, rather than by
+          relying on the ordering of trackinfo.* labels.  trackinfo.* labels
+          are thus only used as headings and are renamed accordingly.  The
+          button column is no longer magical.
+        
+        * Always search the config directory and data directory for templates
+          and web options (after any explicitly configured directories).
+        
+2004-03-15 19:17:02  Richard Kettlewell  <rjk@greenend.org.uk>
+
+        * make table classes more consistent
+        
+2004-03-15 18:13:39  Richard Kettlewell  <rjk@greenend.org.uk>
+
+        * tracks.c: log closing databases.  Checkpoint database at shutdown.
+        
+2004-03-15 18:03:35  Richard Kettlewell  <rjk@greenend.org.uk>
+
+        * tracks.c: issue log messages from database checkpointing, since we
+          don't know how long they'll take.
+        
+2004-03-15 17:31:35  Richard Kettlewell  <rjk@greenend.org.uk>
+
+        * disorder.init.in: make 'stop' work even if server not running.
+        
+2004-03-15 14:37:59  Richard Kettlewell  <rjk@greenend.org.uk>
+
+        Added debianization files.
+        
+2004-03-15 13:51:12  Richard Kettlewell  <rjk@greenend.org.uk>
+
+        * cgi.c: avoid UB if template path is empty
+        
+2004-03-14 16:33:12  Richard Kettlewell  <rjk@greenend.org.uk>
+
+        * Makefile.am: correct dependencies on version script
+                       distribute version script
+        
+2004-03-14 16:30:56  Richard Kettlewell  <rjk@greenend.org.uk>
+
+        * eliminate zombie rescans.
+        
+2004-03-14 16:25:37  Richard Kettlewell  <rjk@greenend.org.uk>
+
+        * eliminate clash with glibc error().
+        
+2004-03-14 16:19:55  Richard Kettlewell  <rjk@greenend.org.uk>
+
+        * Use a version script to limit the exported symbols.  There's a glibc
+          naming clash with error() which should work around.  Also this
+          should be conditional on the linker actually supporting this
+          feature.
+        
+2004-03-14 15:37:56  Richard Kettlewell  <rjk@greenend.org.uk>
+
+        * configure.ac: correct wrong handling of <gc.h>
+        
+2004-03-14 15:04:44  Richard Kettlewell  <rjk@greenend.org.uk>
+
+        * DisOrder has been rewritten in C.
+        
+arch-tag:b64f2a539d1621207b46b5bd202244e9
diff --git a/ChangeLog.d/disorder--mainline--0.1 b/ChangeLog.d/disorder--mainline--0.1
new file mode 100644 (file)
index 0000000..2daf877
--- /dev/null
@@ -0,0 +1,6487 @@
+# do not edit -- automatically generated by arch changelog
+# arch-tag: automatic-ChangeLog--rjk@greenend.org.uk--2004/disorder--mainline--0.1
+#
+
+2006-11-11 18:04:40 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-328
+
+    Summary:
+      Missing ship
+    Revision:
+      disorder--mainline--0.1--patch-328
+
+    * scripts/Makefile.am: Remember to ship oggrename.
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 scripts/Makefile.am
+
+
+2006-11-11 13:13:27 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-327
+
+    Summary:
+      oggrename
+    Revision:
+      disorder--mainline--0.1--patch-327
+
+    * scripts/oggrename: Script to rename OGG files according to embedded
+      title information.
+
+    new files:
+     scripts/oggrename
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1
+
+
+2006-11-04 15:56:52 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-326
+
+    Summary:
+      disorderfm filename converter
+    Revision:
+      disorder--mainline--0.1--patch-326
+
+    * clients/disorderfm.c: New filename management tool.
+    * doc/disorderfm.1.in: Documentation.
+    * lib/charset.c: New entry points required for disorderfm.
+    * lib/eclient.c: Quieten compiler.
+    * clients/filename-bytes.c: Grotty utility for examining byte strings in
+      filenames.
+
+    new files:
+     clients/disorderfm.c clients/filename-bytes.c
+     doc/disorderfm.1.in
+
+    modified files:
+     CHANGES ChangeLog.d/disorder--mainline--0.1
+     clients/Makefile.am doc/Makefile.am lib/charset.c
+     lib/charset.h lib/eclient.c
+
+
+2006-10-08 21:26:01 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-325
+
+    Summary:
+      Update CHANGES
+    Revision:
+      disorder--mainline--0.1--patch-325
+
+    * CHANGES: Update change description
+
+    modified files:
+     CHANGES ChangeLog.d/disorder--mainline--0.1
+
+
+2006-10-08 21:20:31 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-324
+
+    Summary:
+      Copyright dates.
+    Revision:
+      disorder--mainline--0.1--patch-324
+
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 server/trackname.c
+     templates/prefs.html
+
+
+2006-10-08 21:12:53 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-323
+
+    Summary:
+      Search by tag
+    Revision:
+      disorder--mainline--0.1--patch-323
+
+    * server/trackdb.c: Search for tags using tag: syntax.
+    
+    * templates/help.html: Mention tag: syntax.
+    * doc/disobedience.1.in: Mention tag: syntax.
+    * doc/disorder.1.in: Mention tag: syntax.
+    * doc/disorder_protocol.5.in: Mention tag: syntax.
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 doc/disobedience.1.in
+     doc/disorder.1.in doc/disorder_protocol.5.in server/trackdb.c
+     templates/help.html
+
+
+2006-10-08 19:17:44 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-322
+
+    Summary:
+      Avoid needless redraws.
+    Revision:
+      disorder--mainline--0.1--patch-322
+
+    * disobedience/choose.c: Don't issue a redraw on an empty search result
+      if we were already displaying the right thing.
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 disobedience/choose.c
+
+
+2006-10-08 19:01:22 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-321
+
+    Summary:
+      Docs + window title.
+    Revision:
+      disorder--mainline--0.1--patch-321
+
+    * disobedience/disobedience.c: Correct window title.
+    * doc/disobedience.1.in: Document search box.
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1
+     disobedience/disobedience.c doc/disobedience.1.in
+
+
+2006-10-08 18:56:29 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-320
+
+    Summary:
+      Better search responsiveness.
+    Revision:
+      disorder--mainline--0.1--patch-320
+
+    * disobedience/choose.c: More efficient initial construction of search
+      results tree.  The display of the tree is now the expensive bit (e.g
+      0.2s for 300 hits on my Athlon).  The old logic remains for expanding
+      individual items in the tree, but it does much less work in that
+      context and so isn't a performance problem.
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 disobedience/choose.c
+
+
+2006-10-08 18:35:13 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-319
+
+    Summary:
+      Cancel search button
+    Revision:
+      disorder--mainline--0.1--patch-319
+
+    * disobedience/choose.c: Add a cancel button to clear the current search.
+      You can do this by deleting all the text but having an obvious button
+      for it seems friendlier.
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 disobedience/choose.c
+
+
+2006-10-08 17:58:28 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-318
+
+    Summary:
+      Search cleanup
+    Revision:
+      disorder--mainline--0.1--patch-318
+
+    'search-parse' makes much more sense as it means we guarantee a uniform
+    interpretation of search strings across all clients.  So we make 'search'
+    do that.
+    
+    * server/server.c: 'search' takes on the meaning of 'search-parse' now.
+    * lib/eclient.c: Keep up with changed 'search' names.
+    * lib/client.c: Use new search interface.
+    * server/dcgi.c: Use new search interface.
+    * clients/disorder.c: Use new search interface.
+    
+    * doc/disorder_protocol.5.in: Document resolved search semantics
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 clients/disorder.c
+     disobedience/TODO doc/disorder_protocol.5.in lib/client.c
+     lib/client.h lib/eclient.c server/dcgi.c server/server.c
+
+
+2006-10-08 17:45:28 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-317
+
+    Summary:
+      Search in Disobedience
+    Revision:
+      disorder--mainline--0.1--patch-317
+
+    Lots of cleanup and documentation to do.
+    
+    * disobedience/choose.c: Track searching.  This is implemented as a text
+      entry in the choose window.  Whenever contains a valid search string
+      then the choose tree is replaced with the search results.
+    * disobedience/choose.c: Disable breakdown by initial letter.  The code
+      is still there and available via --choosealpha.
+    * disobedience/disobedience.c: Make report window available earlier.
+    * disobedience/disobedience.c: --choosealpha option to re-enable initial
+      letter breakup of choose tree.
+    
+    * server/server.c: search-parse parses search string instead of expecting
+      caller to do so.
+    
+    * lib/eclient.c: Implement search.
+    * lib/hash.c: Constness.
+    * lib/split.c: Cope with an absent error handler.
+    * server/trackdb.c: Directory-tree-order comparison moved to lib/trackname.c.
+    * lib/trackname.c: Export directory-tree-order comparison as compare_path().
+    
+    * doc/disorder_protocol.5.in: Document search-parse.
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 disobedience/choose.c
+     disobedience/disobedience.c disobedience/disobedience.h
+     disobedience/disobedience.rc doc/disobedience.1.in
+     doc/disorder_protocol.5.in lib/eclient.c lib/eclient.h
+     lib/hash.c lib/hash.h lib/split.c lib/trackname.c
+     lib/trackname.h server/server.c server/trackdb.c
+     server/trackname.c
+
+
+2006-09-17 14:53:57 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-316
+
+    Summary:
+      Support for obsolete GCC.
+    Revision:
+      disorder--mainline--0.1--patch-316
+
+    * configure.ac: Turn off -Werror for GCC 2.95.
+    
+    Not sure how worthwhile this is...
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 configure.ac
+     disobedience/TODO
+
+
+2006-09-17 10:24:35 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-315
+
+    Summary:
+      Fix popup menu behaviour.
+    Revision:
+      disorder--mainline--0.1--patch-315
+
+    * disobedience/queue.c: Pop up menu on button press, not release, giving
+      more traditional behaviour.
+    * disobedience/choose.c: Pop up menu on button press.
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 disobedience/choose.c
+     disobedience/queue.c
+
+
+2006-09-17 10:21:22 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-314
+
+    Summary:
+      Document Disobedience tag support.
+    Revision:
+      disorder--mainline--0.1--patch-314
+
+    * doc/disobedience.1.in: Document tag support.
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 doc/disobedience.1.in
+
+
+2006-09-17 10:18:19 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-313
+
+    Summary:
+      Tags in Disobedience
+    Revision:
+      disorder--mainline--0.1--patch-313
+
+    * disobedience/properties.c: Edit tags.  Also fix boolean prefs to work
+      for prefs other than pick_at_random, not that there are any yet.
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 disobedience/properties.c
+
+
+2006-09-17 10:04:16 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-312
+
+    Summary:
+      Web editing for tags
+    Revision:
+      disorder--mainline--0.1--patch-312
+
+    * server/dcgi.c: Accept tags in a prefs response.
+    * templates/prefs.html: Edit tags in web prefs screen.
+    * templates/options.labels: Label for tags field.
+    * templates/help.html: Mention tags in html help.
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 server/dcgi.c
+     templates/help.html templates/options.labels
+     templates/prefs.html
+
+
+2006-09-17 09:50:43 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-311
+
+    Summary:
+      Tags fiddling and documntation.
+    Revision:
+      disorder--mainline--0.1--patch-311
+
+    * server/trackdb.c: Tags are now separated by commas and can contain
+      spaces.
+    * doc/disorder.1.in: Mention tags in track preferences.
+    * doc/disorder_config.5.in; Mention tag list syntax.
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 doc/disorder.1.in
+     doc/disorder_config.5.in server/trackdb.c
+
+
+2006-09-17 09:28:24 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-310
+
+    Summary:
+      Update copyright dates
+    Revision:
+      disorder--mainline--0.1--patch-310
+
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 doc/disorder.3
+     lib/client.h lib/disorder.h lib/plugin.c lib/plugin.h
+     plugins/Makefile.am server/play.h
+
+
+2006-09-17 09:22:24 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-309
+
+    Summary:
+      Fix missing events bugs (hooray)
+    Revision:
+      disorder--mainline--0.1--patch-309
+
+    * disobedience/queue.c: Only create drag target widgets when actually
+      dragging, as otherwise they sometimes(!) steal events from the widgets
+      they overlap.
+      The padding cell at the RHS of every row is now sensitive to input.
+      Add a comment describing widget hierarchy.
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 disobedience/queue.c
+
+
+2006-09-15 21:46:30 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-308
+
+    Summary:
+      Minor fixups
+    Revision:
+      disorder--mainline--0.1--patch-308
+
+    * server/play.c: Close the spare writing end of the player's log pipe -
+      it only needs to be visible as stdout/err.
+    
+    * disobedience/queue.c: Conditioned out diagnostic code for lost clicks.
+    
+    * scripts/completion.bash: Update completeions for current command set.
+
+    modified files:
+     CHANGES ChangeLog.d/disorder--mainline--0.1
+     disobedience/queue.c scripts/completion.bash server/play.c
+
+
+2006-05-14 16:49:56 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-307
+
+    Summary:
+      Heartbeat
+    Revision:
+      disorder--mainline--0.1--patch-307
+
+    * disobedience/disobedience.c: Add a (conditioned-out) heartbeat in
+      pursuit of unresponsiveness.
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1
+     disobedience/disobedience.c
+
+
+2006-05-03 23:11:14 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-306
+
+    Summary:
+      Tags and global preferences.
+    Revision:
+      disorder--mainline--0.1--patch-306
+
+    Higher-level user interfaces have yet to be written and not much testing
+    has been done but the basics seem to be working.
+    
+    * server/trackdb.c: Tags.  Global preferences for recording long-term
+      server state.  This is relatively involved; although the logic for
+      maintaining tags is very simple, being similar to search, picking a
+      track at random when it must have particular tags is more annoying and
+      we don't use the database to help us much, but instead keep a cache and
+      remember to blow it in various places.
+    * server/play.c: playing_enable and random_enabled are now database
+      entries.
+    * server/disorderd.c: Need to do initial setup more directly now.
+    * server/server.c: Track protocol changes.
+    
+    * server/dcgi.c: Abolish disable-now.
+    
+    * lib/client.c: Track protocol changes.
+    * lib/configuration.c: enabled/random_enabled config options abolished in
+      favour of new global prefs.
+    * lib/hash.c: Start with a 256-slot hash.  Cope with null values.  New
+      hash_keys() returns a list of keys in no particular order.
+    
+    * clients/disorder.c: Kill disable-now.
+      Add tags, get-global, set-global, unset-global.
+    
+    * plugins/pick.c: Removed.
+    * lib/plugin.c: Pick plugin abolished.
+    
+    * doc/disorder.1.in: Document new command line options.
+    * doc/disorder.3: Document removal of pick plugin.
+    * doc/disorder_config.5.in: Document global prefs and removal of
+      enabled/random_enabled config options and disable-now CGI action.
+    * doc/disorder_protocol.5.in: Document get-global, set-global,
+      unset-global, tags.
+
+    removed files:
+     plugins/pick.c
+
+    modified files:
+     CHANGES ChangeLog.d/disorder--mainline--0.1 README.upgrades
+     clients/disorder.c doc/disorder.1.in doc/disorder.3
+     doc/disorder_config.5.in doc/disorder_protocol.5.in
+     lib/client.c lib/client.h lib/configuration.c
+     lib/configuration.h lib/disorder.h lib/hash.c lib/hash.h
+     lib/plugin.c lib/plugin.h plugins/Makefile.am server/dcgi.c
+     server/disorderd.c server/play.c server/play.h server/server.c
+     server/trackdb.c server/trackdb.h
+
+
+2006-05-01 17:38:20 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-305
+
+    Summary:
+      Drag+drop fixing.
+    Revision:
+      disorder--mainline--0.1--patch-305
+
+    * disobedience/queue.c: Cope with dragging to the head of the queue.
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 disobedience/queue.c
+
+
+2006-05-01 17:32:38 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-304
+
+    Summary:
+      Quieten compiler
+    Revision:
+      disorder--mainline--0.1--patch-304
+
+    * disobedience/queue.c: Rename 'time' args to keep gcc happy.
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 disobedience/queue.c
+
+
+2006-05-01 17:31:14 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-303
+
+    Summary:
+      Drag+drop queue rearrangement
+    Revision:
+      disorder--mainline--0.1--patch-303
+
+    * disobedience/queue.c: Drag+drop queue rearrangement.  Use button
+      release events, not press, as the latter get confused with drag starts.
+    * disobedience/choose.c: Use button release events, not press.
+    * disobedience/disobedience.c: New log_moved() signature.
+    * disobedience/disobedience.rc: Colors for drag target zones
+    
+    * doc/disorder_protocol.5.in: Document moveafter and 'moved' log change.
+    
+    * lib/queue.c: queue_moveafter() is the underlying implementation of the
+      'moveafter' command.
+    * server/server.c: New 'moveafter' command moves a bunch of tracks to a
+      single ocation in the queue.
+    * lib/eclient.c: Support moveafter and 'moved' log change.
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 disobedience/TODO
+     disobedience/choose.c disobedience/disobedience.c
+     disobedience/disobedience.rc disobedience/queue.c
+     doc/disorder_protocol.5.in lib/eclient.c lib/eclient.h
+     lib/queue.c lib/queue.h server/server.c
+
+
+2006-05-01 14:33:27 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-302
+
+    Summary:
+      Reduce accidental scratching.
+    Revision:
+      disorder--mainline--0.1--patch-302
+
+    * disobedience/queue.c: Only make scratch item in popup sensitive if the
+      playing track is selected, to cut down on accidental scratching.
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 disobedience/TODO
+     disobedience/queue.c
+
+
+2006-05-01 12:15:02 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-301
+
+    Summary:
+      Cache fixes.
+    Revision:
+      disorder--mainline--0.1--patch-301
+
+    * lib/hash.c: Remember to actually save value.
+    * lib/cache.c: Pass correct time when expiring.
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 disobedience/TODO
+     lib/cache.c lib/hash.c
+
+
+2006-05-01 12:01:48 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-300
+
+    Summary:
+      More administrivia
+    Revision:
+      disorder--mainline--0.1--patch-300
+
+    More copyright dates and exceptions.
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 scripts/check
+     scripts/completion.bash scripts/copyright.exceptions
+
+
+2006-05-01 11:57:48 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-299
+
+    Summary:
+      Default transform/namepart.
+    Revision:
+      disorder--mainline--0.1--patch-299
+
+    * lib/configuration.c: Default transform/namepart.
+    
+    * debian/disorder.config: Commment out transform/namepart.
+    * examples/config.sample.in: Commment out transform/namepart.
+    
+    * README.client: more notes.
+    * README.upgrades: Mention that transform/namepart are optional now.
+
+    modified files:
+     CHANGES ChangeLog.d/disorder--mainline--0.1 README.client
+     README.upgrades debian/disorder.config
+     doc/disorder_config.5.in examples/config.sample.in
+     lib/configuration.c
+
+
+2006-05-01 11:21:02 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-298
+
+    Summary:
+      Administrivia
+    Revision:
+      disorder--mainline--0.1--patch-298
+
+    * scripts/check: Easier invocation.
+    * scripts/completion.bash: Option completion for Disobedience.
+    
+    Also updated copyright dates on a bunch of files.
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 debian/rules.m4
+     disobedience/disobedience.rc doc/Makefile.am
+     images/Makefile.am lib/asprintf.c lib/authhash.c
+     lib/authhash.h lib/hash.c lib/hash.h lib/log.c lib/mem.c
+     lib/mem.h lib/printf.h lib/queue.c lib/queue.h lib/split.c
+     lib/trackname.c lib/trackname.h prepare scripts/Makefile.am
+     scripts/check scripts/completion.bash
+     scripts/copyright.exceptions server/cgi.c server/server.h
+     server/trackdb.h templates/Makefile.am templates/help.html
+
+
+2006-05-01 11:07:54 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-297
+
+    Summary:
+      Fix queue column width
+    Revision:
+      disorder--mainline--0.1--patch-297
+
+    * disobedience/queue.c: Columns should shrink to fit, not stay at their
+      maximum extent indefinitely.
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 disobedience/queue.c
+
+
+2006-04-30 23:22:53 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-296
+
+    Summary:
+      Memory optimization.
+    Revision:
+      disorder--mainline--0.1--patch-296
+
+    * lib/hash.c: Less memory-heavy hash implementation.
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 lib/hash.c
+
+
+2006-04-30 19:53:08 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-295
+
+    Summary:
+      More documentation.
+    Revision:
+      disorder--mainline--0.1--patch-295
+
+    * README: mention --without-* options.
+    * README.client: how to set up a standalone client install.
+
+    new files:
+     README.client
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 Makefile.am README
+     disobedience/TODO
+
+
+2006-04-30 19:42:54 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-294
+
+    Summary:
+      Documentation updates.
+    Revision:
+      disorder--mainline--0.1--patch-294
+
+    * doc/disorder.1.in: Mention the automatic rescan.
+      Add a troubleshooting section.
+    
+    * doc/disobedience.1.in: Hide --sync.  Document keyboard shortcuts and
+      recent changes to 'Choose'.
+    
+    * templates/help.html: Add a troubleshooting section.  Possibly this
+      should just be a link to the equivalent disorder(1) section.
+    
+    * CHANGES: Updated.
+
+    modified files:
+     CHANGES ChangeLog.d/disorder--mainline--0.1
+     doc/disobedience.1.in doc/disorder.1.in templates/help.html
+
+
+2006-04-30 19:05:29 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-293
+
+    Summary:
+      debian policy fixup
+    Revision:
+      disorder--mainline--0.1--patch-293
+
+    * debian/autorules.m4: Make binary targets depend on build target.
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 debian/autorules.m4
+
+
+2006-04-30 18:55:26 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-292
+
+    Summary:
+      Don't forget queue selection on update
+    Revision:
+      disorder--mainline--0.1--patch-292
+
+    * disobedience/queue.c: Use new selection_*() functions to record
+      selection so that it survives updates to the queue reliably.
+    
+    * lib/selection.c: Selection management functions using a hash.
+    
+    * lib/hash.c: hash_count() to count the number of items in a hash.
+    
+    * lib/queue.h: queue_entry.selected is gone.
+
+    new files:
+     lib/selection.c lib/selection.h
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1
+     disobedience/disobedience.h disobedience/queue.c
+     lib/Makefile.am lib/hash.c lib/hash.h lib/queue.c lib/queue.h
+
+
+2006-04-30 16:42:07 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-291
+
+    Summary:
+      Faster startup
+    Revision:
+      disorder--mainline--0.1--patch-291
+
+    * lib/eclient.c: Batch up command writes once authenticated.  This
+      improves Disobedience performance, in particular it fills in the track
+      names faster at startup if the server is over a network, by reducing
+      the number of round trip times.
+    * lib/log.c: DISORDER_DEBUG_ONLY allows you to limit debug output to that
+      from a single file.
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 lib/eclient.c lib/log.c
+
+
+2006-04-30 15:02:27 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-290
+
+    Summary:
+      Fix playing indicator for aliased tracks.
+    Revision:
+      disorder--mainline--0.1--patch-290
+
+    * lib/choose.c: Resolve filenames (so that the playing indicator and
+      properties window work).
+    
+    * lib/eclient.c: disorder_eclient_resolve().
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 disobedience/choose.c
+     lib/eclient.c lib/eclient.h
+
+
+2006-04-30 14:40:31 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-289
+
+    Summary:
+      Popup menu and selection in choose tab
+    Revision:
+      disorder--mainline--0.1--patch-289
+
+    * disobedience/choose.c: Abolish buttons and just use labels and do our
+      own click parsing.  Maintain a selection in the same way as queue.c.
+      Popup menu to play/edit tracks, middle click to play straight away.
+    
+    * disobedience/disobedience.rc: Supply bg whenever we supply fg.
+    
+    * disobedience/menu.c: Edit menu uses callbacks to deal with different
+      kinds of tabs rather than explicit knowledge.
+    
+    * disobedience/queue.c: Callbacks for edit menu.
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 disobedience/TODO
+     disobedience/choose.c disobedience/disobedience.h
+     disobedience/disobedience.rc disobedience/menu.c
+     disobedience/queue.c
+
+
+2006-04-30 11:59:49 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-288
+
+    Summary:
+      Set sensitivity of main menu items.
+    Revision:
+      disorder--mainline--0.1--patch-288
+
+    * disobedience/menu.c: Move out main menu code.  Set sensitivity of
+      Properties and Select All appropriately from menu_update().
+    
+    * disobedience/queue.c: Call menu_update() when queue/recent changes.
+      Provide queue-counting functions queue_count_*() to set sensitivity of
+      main menu items.  Fix 'remove' option.
+    
+    * disobedience/disobedience.c: Move main menu out to menu.c.  Call
+      menu_update() when the user switches tabs.
+    
+    * disobedience/disobedience.h: Include almost all headers from here.
+      Organize function prototypes into logical groups.
+
+    new files:
+     disobedience/menu.c
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 disobedience/Makefile.am
+     disobedience/choose.c disobedience/client.c
+     disobedience/control.c disobedience/disobedience.c
+     disobedience/disobedience.h disobedience/misc.c
+     disobedience/properties.c disobedience/queue.c
+
+
+2006-04-30 11:21:54 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-287
+
+    Summary:
+      Edit>Properties starts working.
+    Revision:
+      disorder--mainline--0.1--patch-287
+
+    * disobedience/disobedience.c: Edit>Properties menu item now works for
+      queues.
+    
+    * disobedience/queue.c: queue_properties() entry point for the above.
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1
+     disobedience/disobedience.c disobedience/disobedience.h
+     disobedience/queue.c
+
+
+2006-04-29 18:00:36 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-286
+
+    Summary:
+      Document properties window.
+    Revision:
+      disorder--mainline--0.1--patch-286
+
+    * doc/disobedience.1.in: Document properties window.
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 doc/disobedience.1.in
+
+
+2006-04-29 16:04:00 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-285
+
+    Summary:
+      Stock buttons in properties window
+    Revision:
+      disorder--mainline--0.1--patch-285
+
+    * disobedience/properties.c: Use stock items for properties window buttons.
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 disobedience/properties.c
+
+
+2006-04-29 13:46:31 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-284
+
+    Summary:
+      Stop badness if user closes progress bar window
+    Revision:
+      disorder--mainline--0.1--patch-284
+
+    * disobedience/properties.c: Cope with progress bar window being
+      destroyed part way through.
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 disobedience/properties.c
+
+
+2006-04-29 13:38:28 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-283
+
+    Summary:
+      Properties window
+    Revision:
+      disorder--mainline--0.1--patch-283
+
+    Only usable from queue/recent so far - need to do select and the menu bar
+    properties item too.  Also search when that is done.
+    
+    * disobedience/properties.c: New properties popup window.
+    * disobedience/queue.c: Pass queue definition as well as item to menu
+      item activation.
+      namepart_update() notifies that a namepart might have changed.
+      If we right click away from any selected item, select just the hovered
+      item.
+      Make properties menu item in popup sensitive if anything is selected,
+      and call properties() with the selected tracks when it is activated.
+      Include formerly missing backlink from first queued track to playing
+      track.
+    * lib/eclient.c: get, set and unset.
+    * disobedience/client.c: Split out popup_error().
+    * disobedience/misc.c: popup_error().
+    * disobedience/disobedience.c: Rename function to avoid collision.
+
+    new files:
+     disobedience/properties.c
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 disobedience/Makefile.am
+     disobedience/client.c disobedience/disobedience.c
+     disobedience/disobedience.h disobedience/misc.c
+     disobedience/queue.c lib/eclient.c lib/eclient.h
+
+
+2006-04-26 20:24:36 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-282
+
+    Summary:
+      Rename gdisorder to 'Disobedience'
+    Revision:
+      disorder--mainline--0.1--patch-282
+
+    Name suggested by Owen Dunn.
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 configure.ac
+     disobedience/Makefile.am disobedience/choose.c
+     disobedience/client.c disobedience/control.c
+     disobedience/disobedience.c disobedience/disobedience.h
+     disobedience/disobedience.rc disobedience/misc.c
+     disobedience/queue.c doc/Makefile.am doc/disobedience.1.in
+
+    renamed files:
+     doc/gdisorder.1.in
+       ==> doc/disobedience.1.in
+     gdisorder/.arch-ids/=id
+       ==> disobedience/.arch-ids/=id
+     gdisorder/gdisorder.c
+       ==> disobedience/disobedience.c
+     gdisorder/gdisorder.h
+       ==> disobedience/disobedience.h
+     gdisorder/gdisorder.rc
+       ==> disobedience/disobedience.rc
+
+    new directories:
+     disobedience/.arch-ids
+
+    removed directories:
+     gdisorder/.arch-ids
+
+    renamed directories:
+     gdisorder
+       ==> disobedience
+
+
+2006-04-17 18:29:49 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-281
+
+    Summary:
+      Build fixes
+    Revision:
+      disorder--mainline--0.1--patch-281
+
+    * gdisorder/Makefile.am: ship gdisorder.c
+    * server/server.c: Quieten compiler.
+    * lib/eclient.c: Quieten stupid compiler.
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 debian/changelog
+     gdisorder/Makefile.am lib/eclient.c server/server.c
+
+
+2006-04-17 11:18:34 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-280
+
+    Summary:
+      Install gdisorder
+    Revision:
+      disorder--mainline--0.1--patch-280
+
+    * gdisorder/Makefile.am: Install gdisorder.
+    * doc/gdisorder.1.in: Update man page.
+    * doc/Makefile.am: Install gdisorder man page
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 doc/Makefile.am
+     doc/gdisorder.1.in gdisorder/Makefile.am
+
+
+2006-04-17 11:02:51 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-279
+
+    Summary:
+      Popup improvements, multi-track remove.
+    Revision:
+      disorder--mainline--0.1--patch-279
+
+    * gdisorder/queue.c: Table driven popup menus.  The menu items are now
+      fixed but the sensitivity changes according to context.  Multi-track
+      remove now works.
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 gdisorder/TODO
+     gdisorder/queue.c
+
+
+2006-04-16 23:39:34 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-278
+
+    Summary:
+      gdisorder tidying
+    Revision:
+      disorder--mainline--0.1--patch-278
+
+    * gdisorder/gdisorder.c: Remove bogus underlines.
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 gdisorder/gdisorder.c
+
+
+2006-04-16 23:37:58 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-277
+
+    Summary:
+      Selection in queue/recent.
+    Revision:
+      disorder--mainline--0.1--patch-277
+
+    * gdisorder/queue.c: Show and maintain the selection.  You can't do
+      anything useful with the selection yet, however.
+    * lib/eclient.c: Fill in backlinks in queue lists.
+    * gdisorder/gdisorder.c: New Edit menu.  Just a placeholder right now.
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 gdisorder/gdisorder.c
+     gdisorder/queue.c lib/eclient.c
+
+
+2006-04-16 22:47:58 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-276
+
+    Summary:
+      Popup menu in queue/recent.
+    Revision:
+      disorder--mainline--0.1--patch-276
+
+    * lib/eclient.c: disorder_eclient_scratch() now takes an ID.
+      disorder_eclient_scratch_playing() provides the old scratch-anything
+      interface for the benefit of control.c.
+    * lib/queue.h: Add a 'ql' field to the queue so gdisorder can remember
+      which queue each entry belongs to.
+    * gdisorder/queue.c: Popup menus on right button in queues.  Currently
+      only scratch and remove work, though 'properties' appears in the menu
+      for the sake of show.
+    * gdisorder/control.c: Keep up with eclient.c.
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 gdisorder/control.c
+     gdisorder/queue.c lib/eclient.c lib/eclient.h lib/queue.c
+     lib/queue.h
+
+
+2006-04-16 18:28:04 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-275
+
+    Summary:
+      Show how much of the currently playing track has played.
+    Revision:
+      disorder--mainline--0.1--patch-275
+
+    * gdisorder/queue.c: Show how much of the currently playing track has
+      been played.  Destroy queue label widgets as well as their containing
+      eventbox.
+    
+    * gdisorder/gdisorder.c: Refetch currently playing track data whenever
+      the track is paused or resumed.
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 gdisorder/TODO
+     gdisorder/gdisorder.c gdisorder/queue.c
+
+
+2006-04-16 17:17:27 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-274
+
+    Summary:
+      New gdisorder buttons to enable/disable play/random play
+    Revision:
+      disorder--mainline--0.1--patch-274
+
+    * gdisorder/control.c: New buttons to enable/disable play/random play.
+    
+    * lib/eclient.c: New calls to enable/disable play/random play.
+    
+    * images/random.png: Question-mark icon to enable random play.
+    * images/randomcross.png: Crossed question-mark icon to disable random play
+    * images/notescross.png: Notes icon to enable play.  We use the existing
+      notes.png to disable play.
+
+    new files:
+     images/.arch-ids/notescross.png.id
+     images/.arch-ids/random.png.id
+     images/.arch-ids/randomcross.png.id images/notescross.png
+     images/random.png images/randomcross.png
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 gdisorder/control.c
+     images/Makefile.am lib/eclient.c lib/eclient.h
+
+
+2006-04-14 17:06:26 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-273
+
+    Summary:
+      Volume control for gdisorder
+    Revision:
+      disorder--mainline--0.1--patch-273
+
+    * gdisorder/control.c: Volume control.  Visually rather ugly but the
+      feature is now there.
+    * gdisorder/gdisorder.c: Monitor volume.
+    * lib/eclient.c: Volume support.
+    * server/disorderd.c: Check the current volume from time to time in case
+      it's changed outside the server's control.
+    * server/server.c: Remember the (believed) current volume.
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 gdisorder/TODO
+     gdisorder/control.c gdisorder/gdisorder.c
+     gdisorder/gdisorder.h lib/eclient.c lib/eclient.h
+     server/disorderd.c server/server.c server/server.h
+
+
+2006-04-14 10:45:35 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-272
+
+    Summary:
+      Split out icon code to control.c
+    Revision:
+      disorder--mainline--0.1--patch-272
+
+    * gdisorder/control.c: Split icon code out to a control.c.
+    * gdisorder/gdisorder.c: Split icon code out to a control.c.
+    * gdisorder/queue.c: Rename 'playing' to 'playing_track' to avoid
+      conflict with now-global playing boolean.
+
+    new files:
+     gdisorder/control.c
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 gdisorder/Makefile.am
+     gdisorder/gdisorder.c gdisorder/gdisorder.h gdisorder/queue.c
+
+
+2006-04-12 19:45:13 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-271
+
+    Summary:
+      Fix queue/recent title truncation.
+    Revision:
+      disorder--mainline--0.1--patch-271
+
+    * gdisorder/queue.c: Determine title cell width each time round rather
+      than stashing it.  Eliminates truncation of rightmost title.
+
+    new files:
+     gdisorder/TODO
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 gdisorder/queue.c
+
+
+2006-04-12 18:36:05 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-270
+
+    Summary:
+      Pause and scratch buttons for gdisorder
+    Revision:
+      disorder--mainline--0.1--patch-270
+
+    The scratch button doesn't currently use the same trick as the GUI to be
+    sure it's scratching exactly the right thing.  Since the display is much
+    more likely to be up to date that's less of an issue here.  Still, it
+    would be good to fix it sometime.
+    
+    * gdisorder/gdisorder.c: Icon bar between menu bar and tabs containing
+      pause/resume buttons and a scratch button.  Pause and resume are
+      actually separate buttons but exactly one is ever visible at any given
+      time.
+    
+    * lib/eclient.c: Implement _pause/_resume/_scratch commands.
+      protocol_error() takes an operation not a client, since the operation
+      pointer in the client may be the wrong one by the point it gets called.
+      Support the 'state' log entry.
+    
+    * server/server.c: The 'log' command now issues some initial lines to
+      synchronize the current state.
+    
+    * images/pause.png: Pause icon.
+    
+    * images/play.png: Play icon.
+
+    new files:
+     images/.arch-ids/pause.png.id images/.arch-ids/play.png.id
+     images/pause.png images/play.png
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 gdisorder/gdisorder.c
+     images/Makefile.am lib/eclient.c lib/eclient.h server/server.c
+
+
+2006-04-11 19:30:38 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-269
+
+    Summary:
+      Display track lengths
+    Revision:
+      disorder--mainline--0.1--patch-269
+
+    * lib/eclient.c: disorder_eclient_length()
+    * gdisorder/queue.c: Include track lengths in queue/recent.
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 gdisorder/queue.c
+     lib/eclient.c lib/eclient.h
+
+
+2006-04-11 19:10:35 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-268
+
+    Summary:
+      Minor gdisorder fixes.
+    Revision:
+      disorder--mainline--0.1--patch-268
+
+    * lib/mem.c: Reverse test in xcalloc.  You can ask for count=0 but size=0
+      will give silly results.
+    
+    * gdisorder/choose.c: Build fixes for Mac.
+    
+    * gdisorder/queue.c: Cope with completely empty queue.
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 gdisorder/choose.c
+     gdisorder/queue.c lib/mem.c
+
+
+2006-04-09 22:12:57 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-267
+
+    Summary:
+      More concise logging
+    Revision:
+      disorder--mainline--0.1--patch-267
+
+    * server/server.c: Don't log boring errors (EPIPE when talking to a
+      client in particular).  When we do log an error make sure it's the
+      correct one (though it usually was anyway).
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 server/server.c
+
+
+2006-04-09 22:11:42 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-266
+
+    Summary:
+      Kill a recently introduced crash...
+    Revision:
+      disorder--mainline--0.1--patch-266
+
+    * lib/cache.c: Don't try to clean the cache if it does not exist yet!
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 lib/cache.c
+
+
+2006-04-09 22:03:52 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-265
+
+    Summary:
+      Title bar for gdisorder queue/recent listing
+    Revision:
+      disorder--mainline--0.1--patch-265
+
+    * gdisorder/queue.c: Rewrite in terms of layouts.  This proved to be the
+      least painful way of getting a title bar which panned in synch.
+    * gdisorder/gdisorder.rc: gdisorder-title style is (by default) white on
+      black in a bold font.  *.row-title is bound to it.
+    * lib/mem.c: xcalloc().
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 gdisorder/gdisorder.rc
+     gdisorder/queue.c lib/mem.c lib/mem.h
+
+
+2006-04-08 11:44:00 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-264
+
+    Summary:
+      Update CHANGES.
+    Revision:
+      disorder--mainline--0.1--patch-264
+
+    * CHANGES: updated.
+
+    modified files:
+     CHANGES ChangeLog.d/disorder--mainline--0.1
+
+
+2006-04-08 11:42:31 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-263
+
+    Summary:
+      Cache track lookups that use regexps.
+    Revision:
+      disorder--mainline--0.1--patch-263
+
+    Top-level track lookups generally involve scanning over the whole
+    database and filtering.  This is significantly slower than any other
+    lookup - noticably slow in one slightly underpowered installation - so
+    well worthwhile caching the results.
+    
+    Note that we do not have a call to cache_expire anywhere in the server
+    yet.  It doesn't matter: there is a daily automatic rescan, and all the
+    cached file lookups are junked at the end of any rescan, so a cache entry
+    never has a lifetime much greater than a day anyway.
+    
+    * lib/cache.c: cache_clean() allows selective or total elimination of
+      cache elements.
+    * server/trackdb.c: Clean out track lookup cache when a rescan completes.
+    * server/server.c: Cache track lookups that use regexps.
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 lib/cache.c lib/cache.h
+     server/server.c server/trackdb.c server/trackdb.h
+
+
+2006-04-05 22:37:10 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-262
+
+    Summary:
+      Better reporting.
+    Revision:
+      disorder--mainline--0.1--patch-262
+
+    * lib/eclient.c: 'report' callback to signal what's going on to the
+      application.
+    * gdisorder/choose.c, gdisorder/queue.c: Set report line when we start a
+      command.
+    * lib/client.c: Clear the report line when the client goes idle.
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 clients/test-eclient.c
+     gdisorder/choose.c gdisorder/client.c gdisorder/queue.c
+     lib/eclient.c lib/eclient.h
+
+
+2006-04-05 22:24:37 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-261
+
+    Summary:
+      Tidying up
+    Revision:
+      disorder--mainline--0.1--patch-261
+
+    * templates/options.transform: Removed because now obsolete.
+    * CHANGES: Note the move here too.
+
+    removed files:
+     templates/options.transform
+
+    modified files:
+     CHANGES ChangeLog.d/disorder--mainline--0.1
+     templates/Makefile.am
+
+
+2006-04-05 21:34:37 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-260
+
+    Summary:
+      Correct text and sorting in track choice tab
+    Revision:
+      disorder--mainline--0.1--patch-260
+
+    * lib/configuration.c: 'transform' directive moved here from web options.
+    * lib/trackname.c: trackname_transform() and compare_tracks() moved from
+      CGI code.
+    * server/cgi.c: Don't parse 'transform' directive.  cgi_transform() moved
+      to trackname.c.
+    * server/dcgi.c: compare_multi() moved to trackname.c.
+    
+    * gdisorder/choose.c: Display and sort directory and track names using
+      'transform' directive, as the web interface.
+    
+    * README.upgrades: Mention move of 'transform'.
+    * doc/disorder_config.5.in: Move documentation for 'transform' to its new
+      section.
+    
+    * examples/config.sample.in: 'transform' directives moved to config file.
+    * debian/disorder.config: 'transform' directives moved to config file.
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 README.upgrades
+     debian/disorder.config doc/disorder_config.5.in
+     examples/config.sample.in gdisorder/choose.c
+     lib/configuration.c lib/configuration.h lib/trackname.c
+     lib/trackname.h server/cgi.c server/dcgi.c
+
+
+2006-04-05 20:23:12 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-259
+
+    Summary:
+      Queue fixes
+    Revision:
+      disorder--mainline--0.1--patch-259
+
+    * gdisorder/queue.c: Queue now expands to fill horizontal space
+      available.  Kill a GTK+ error message when there is nothing in the
+      queue.
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 gdisorder/queue.c
+
+
+2006-04-02 18:58:23 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-258
+
+    Summary:
+      Memory leak
+    Revision:
+      disorder--mainline--0.1--patch-258
+
+    * gdisorder/choose.c: Don't leak tree widgets.  It seems GTK+ remembers
+      pointers to them somewhere even after thay have been deparented,
+      frustrating the garbage collector.
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 gdisorder/choose.c
+
+
+2006-04-02 18:50:54 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-257
+
+    Summary:
+      Prettier colors
+    Revision:
+      disorder--mainline--0.1--patch-257
+
+    * gdisorder/choose.c: Don't set colors explicitly, just set widget names
+      instead.
+    
+    * gdisorder/gdisorder.c: Apply a default style.
+    
+    * gdisorder/misc.c: scroll_widget() adds a GtkViewport to non-GtkLayout
+      widgets and sets the name of the scrolled window's child (i.e. the
+      GtkViewport or the GtkLayout).
+    
+    * gdisorder/queue.c: Use a GtkTable instead of a list store in order to
+      colorize rows conveniently.  Still not happy with the queue views but
+      they look better than they did.
+    
+    * doc/gdisorder.1.in: Start of a man page for gdisorder.
+    
+    * gdisorder/gdisorder.rc: Default style information for gdisorder.
+    
+    * scripts/text2c: Script to convert gdisorder.rc (or other files) into a
+      variable in C.
+
+    new files:
+     doc/gdisorder.1.in gdisorder/gdisorder.rc scripts/text2c
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 doc/Makefile.am
+     gdisorder/Makefile.am gdisorder/choose.c gdisorder/gdisorder.c
+     gdisorder/gdisorder.h gdisorder/misc.c gdisorder/queue.c
+     scripts/Makefile.am
+
+
+2006-04-02 14:55:02 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-256
+
+    Summary:
+      State reporting to event log.
+    Revision:
+      disorder--mainline--0.1--patch-256
+
+    * server/play.c: Report state changes to event log.
+    * server/server.c: Report volume changes to event log.
+    
+    * doc/disorder_protocol.5.in: Document the above.
+    
+    * scripts/inst: Correct path to CGI.
+    * debian/rules.m4: Correct path to CGI.
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 debian/rules.m4
+     doc/disorder_protocol.5.in scripts/inst server/play.c
+     server/server.c
+
+
+2006-04-02 14:43:19 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-255
+
+    Summary:
+      Tidying up
+    Revision:
+      disorder--mainline--0.1--patch-255
+
+    * gdisorder/Makefile.am: Lose 'gtk' prefix from source files.
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 gdisorder/Makefile.am
+
+    renamed files:
+     gdisorder/gtkchoose.c
+       ==> gdisorder/choose.c
+     gdisorder/gtkclient.c
+       ==> gdisorder/client.c
+     gdisorder/gtkmisc.c
+       ==> gdisorder/misc.c
+     gdisorder/gtkqueue.c
+       ==> gdisorder/queue.c
+
+
+2006-04-02 14:42:14 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-254
+
+    Summary:
+      Make scroll bar arrows work.
+    Revision:
+      disorder--mainline--0.1--patch-254
+
+    * gdisorder/gtkmisc.c: Fix up scroll step increments for layouts, which
+      for some reason default to 0.
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 gdisorder/gtkmisc.c
+
+
+2006-04-02 11:52:52 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-253
+
+    Summary:
+      Mark currently playing tracks in the choose track widget.
+    Revision:
+      disorder--mainline--0.1--patch-253
+
+    * gdisorder/gtkchoose.c: Display the notes icon next to tracks that are
+      queued or playing.
+    * gdisorder/gtkqueue.c: Notify Choose tab when then the queue or playing
+      track change.  New queued() function to tell whether a track is queued
+      or playing.
+    * gdisorder/gtkmisc.c: find_image() loads images into the cache as
+      pixbufs.
+    * lib/cache.c: More careful checking for cache expiry, since we may have
+      very large lifetimes.
+    * images/notes.png: New notes icon to mark currently playing tracks.
+    * configure.ac: Build and install images/ for GTK+ builds as well as
+      server builds.  We share the images between the two.
+    
+    * gdisorder/gtkchoose.c: If the Choose layout shrinks then invalidate the
+      regions outside it, since they are not redrawn otherwise.
+
+    new files:
+     images/.arch-ids/notes.png.id images/notes.png
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 configure.ac
+     gdisorder/gdisorder.h gdisorder/gtkchoose.c
+     gdisorder/gtkmisc.c gdisorder/gtkqueue.c images/Makefile.am
+     lib/cache.c
+
+
+2006-04-01 19:00:06 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-252
+
+    Summary:
+      Client-only (and Mac) fixups
+    Revision:
+      disorder--mainline--0.1--patch-252
+
+    The result of this works on my Mac with a minimal configuration file,
+    connecting to the server on a Linux box using TCP/IP.
+    
+    * configure.ac: Don't search fink db4 includes if not building server.
+      Fix bad test for want_server when checking db version.
+    * lib/log.c: Use explicit casts and wide types when printing timestamps
+      in debug messages.
+    * lib/configuration.c: Removed server-specific configuration checks.
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 configure.ac
+     lib/configuration.c lib/log.c
+
+
+2006-04-01 18:20:39 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-251
+
+    Summary:
+      Split up clients from server and allow configure-time selection.
+    Revision:
+      disorder--mainline--0.1--patch-251
+
+    The command line clients are split into their own directory, clients/ and
+    everything else that used to be in progs/ is now in server.  You can
+    control what is built with --without-python, --without-gtk and
+    --without-server.
+    
+    * configure.ac: Tell the top-level makefile what subdirectories to build
+      based on --with/--without options.  We also only ask for libraries that
+      we actually need.
+      The shipped getopt is abolished until someone wants it enough to figure
+      out a convenient way of having it used from multiple directories.
+    * clients/disorder.c: Abolish --length option.  It was always in the
+      wrong place anyway and the client/server build split makes it even
+      siller as well as inconvenient.
+
+    new files:
+     clients/.arch-ids/=id clients/Makefile.am
+
+    removed files:
+     DESIGN2
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 Makefile.am
+     clients/disorder.c configure.ac prepare server/Makefile.am
+
+    renamed files:
+     progs/.arch-ids/=id
+       ==> server/.arch-ids/=id
+     progs/authorize.c
+       ==> clients/authorize.c
+     progs/authorize.h
+       ==> clients/authorize.h
+     progs/disorder.c
+       ==> clients/disorder.c
+     progs/test-eclient.c
+       ==> clients/test-eclient.c
+
+    new directories:
+     clients clients/.arch-ids server/.arch-ids
+
+    removed directories:
+     progs/.arch-ids
+
+    renamed directories:
+     progs
+       ==> server
+
+
+2006-04-01 14:46:11 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-250
+
+    Summary:
+      Minor fixes.
+    Revision:
+      disorder--mainline--0.1--patch-250
+
+    * gdisorder/gdisorder.c: Refetch server state once every 10m.
+    * gdisorder/gtkchoose.c: Make background white.  Probably the wrong
+      answer - we really want to make it do whatever the standard tree view
+      widget does.
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 gdisorder/gdisorder.c
+     gdisorder/gtkchoose.c
+
+
+2006-04-01 14:27:41 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-249
+
+    Summary:
+      Show currently playing track
+    Revision:
+      disorder--mainline--0.1--patch-249
+
+    * lib/eclient.c: disorder_eclient_playing() reports currently playing
+      track.
+    * gdisorder/gtkqueue.c: Bung currently playing track at top of queue.  It
+      could really do with being a separate color or something.
+    * gdisorder/gdisorder.c: Call playing_update() when the currently playing
+      track might have changed.
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 gdisorder/gdisorder.c
+     gdisorder/gdisorder.h gdisorder/gtkqueue.c lib/eclient.c
+     lib/eclient.h
+
+
+2006-04-01 12:57:47 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-248
+
+    Summary:
+      Pick tracks in gdisorder.
+    Revision:
+      disorder--mainline--0.1--patch-248
+
+    * gdisorder/gtkchoose.c: Choose tracks from a tree structure.
+    
+    * gdisorder/gdisorder.c: choose_widget() moved to new gtkchoose.c.
+    * gdisorder/gtkqueue.c: Use scroll_widget().
+    * gdisorder/gtkclient.c: Split out popup_protocol_error().
+    * gdisorder/gtkmisc.c: Split out scroll_widget().
+    
+    * lib/eclient.c: Support null callbacks.
+
+    new files:
+     gdisorder/gtkchoose.c gdisorder/gtkmisc.c
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 gdisorder/Makefile.am
+     gdisorder/gdisorder.c gdisorder/gdisorder.h
+     gdisorder/gtkclient.c gdisorder/gtkqueue.c lib/eclient.c
+     lib/eclient.h
+
+
+2006-03-30 22:29:29 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-247
+
+    Summary:
+      Starting blocks for a GTK+ client
+    Revision:
+      disorder--mainline--0.1--patch-247
+
+    Currently the client can display the queue and recently played list and
+    keep up to date with them, and not much else.  Hence it's noinst_ for
+    now.
+    
+    It's in a separate directory so that we can easily turn it on or off from
+    the configure with --with arguments.  At some point the server and its
+    helpers will have to be moved to a new directory for the same reason so
+    you can conveniently do a client-only build.
+    
+    * lib/cache.c: Generic cache.
+    * lib/asprintf.c: New byte_xvasprintf().
+    * lib/authhash.c: const-correct.
+    * lib/client.c: Split with_sockaddr() out to client-common.c
+    * lib/hash.c: New hash_foreach()  (used by cache expiry)
+    * lib/queue.h: New selected field in queue entries for use by client.
+      Not in marshalled form!
+    * lib/queue.c: queue_unmarshall_vec() for parsing pre-split queue
+      descriptions.
+    * lib/client-common.c: Common code for the two C client implementations.
+    * lib/eclient.c: New asynchronous C client.
+    
+    * gdisorder/gdisorder.c: Main program for GTK+ client.  Not finished!
+    * gdisorder/gtkqueue.c: Queue management in GTK+.
+    * gdisorder/gtkclient.c: Wrap an eclient up so it can be used in a GTK+
+      program.
+    * gdisorder/gdisorder.h: Header file for GTK+ client.
+    
+    * progs/test-eclient.c: Test rig for eclient.c
+    
+    * doc/disorder_protocol.5.in: XX4 description was missing from last
+      commit.
+    
+    * configure.ac: Find GTK+/Glib includes; we need to fix them up to use
+      -isystem as they can provoke warnings.
+
+    new files:
+     gdisorder/.arch-ids/=id gdisorder/Makefile.am
+     gdisorder/gdisorder.c gdisorder/gdisorder.h
+     gdisorder/gtkclient.c gdisorder/gtkqueue.c lib/cache.c
+     lib/cache.h lib/client-common.c lib/client-common.h
+     lib/eclient.c lib/eclient.h progs/test-eclient.c
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 Makefile.am configure.ac
+     doc/disorder_protocol.5.in lib/Makefile.am lib/asprintf.c
+     lib/authhash.c lib/authhash.h lib/client.c lib/hash.c
+     lib/hash.h lib/printf.h lib/queue.c lib/queue.h
+     progs/Makefile.am {arch}/=tagging-method
+
+    new directories:
+     gdisorder gdisorder/.arch-ids
+
+
+2006-03-30 21:50:14 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-246
+
+    Summary:
+      Log changes
+    Revision:
+      disorder--mainline--0.1--patch-246
+
+    Required for work that isn't checked in yet.
+    
+    * progs/server.c: Log returns 254 to indicate an indefinite body.
+    * doc/disorder_protocol.5.in: Document xx4 responses and log namespace
+      change.
+    * lib/queue.c: Change log tags so that they are valid C identifiers.
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 doc/disorder_protocol.5.in
+     lib/queue.c progs/server.c
+
+
+2006-03-26 23:28:22 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-245
+
+    Summary:
+      Tidier debug output.
+    Revision:
+      disorder--mainline--0.1--patch-245
+
+    * lib/log.c: Strip ../ from filenames in debug output.
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 lib/log.c
+
+
+2006-03-26 19:36:32 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-244
+
+    Summary:
+      Quoting bug and response code sanity
+    Revision:
+      disorder--mainline--0.1--patch-244
+
+    * lib/split.c: Quote strings containing newlines properly.
+    * progs/server.c: Coherent response code policy.
+    * doc/disorder_protocol.5.in: Document response code policy and also the
+      authentication protocol.
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 doc/disorder_protocol.5.in
+     lib/split.c progs/server.c
+
+
+2006-03-25 18:28:17 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-243
+
+    Summary:
+      Release 1.5.1
+    Revision:
+      disorder--mainline--0.1--patch-243
+
+    * configure.ac: Release 1.5.1
+    * CHANGES: Bring up to date
+
+    modified files:
+     CHANGES ChangeLog.d/disorder--mainline--0.1 configure.ac
+     debian/changelog
+
+
+2006-03-22 20:38:03 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-242
+
+    Summary:
+      Buglet in choose page
+    Revision:
+      disorder--mainline--0.1--patch-242
+
+    * templates/choosealpha.html: correct '*' link.
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 templates/choosealpha.html
+
+
+2006-03-20 22:43:46 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-241
+
+    Summary:
+      Documentation setting
+    Revision:
+      disorder--mainline--0.1--patch-241
+
+    * doc/disorder_config.5.in: Trivial formatting fix.
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 doc/disorder_config.5.in
+
+
+2006-03-20 22:41:00 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-240
+
+    Summary:
+      Release 1.5
+    Revision:
+      disorder--mainline--0.1--patch-240
+
+    * lib/configuration.c: Compatibility alias 'nice' for 'nice_rescan' to
+      keep old config files working (it was in the example even if it wasn't
+      documented).
+    * examples/config.sample.in: Remove 'nice' from sample config.
+    * configure.ac: Release 1.5
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 configure.ac
+     debian/changelog debian/disorder.config
+     examples/config.sample.in lib/configuration.c
+
+
+2006-03-20 22:30:00 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-239
+
+    Summary:
+      Administrivia
+    Revision:
+      disorder--mainline--0.1--patch-239
+
+    * templates/help.html: Eliminate 'just'.
+    * doc/checklist.txt: More checklist items.
+    * templates/about.html: Copyright dates
+    * scripts/dist: Copyright dates
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 doc/checklist.txt
+     scripts/dist templates/about.html templates/help.html
+
+
+2006-03-20 21:55:48 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-238
+
+    Summary:
+      Bug blame
+    Revision:
+      disorder--mainline--0.1--patch-238
+
+    * BUGS: Point a finger of blame at Libtool.
+
+    modified files:
+     BUGS ChangeLog.d/disorder--mainline--0.1
+
+
+2006-03-19 20:04:48 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-237
+
+    Summary:
+      Attribute scratches properly.
+    Revision:
+      disorder--mainline--0.1--patch-237
+
+    * progs/play.c: Attribute scratches to the user who requested the scratch.
+
+    modified files:
+     CHANGES ChangeLog.d/disorder--mainline--0.1 progs/play.c
+
+
+2006-03-19 20:03:26 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-236
+
+    Summary:
+      Administrivia
+    Revision:
+      disorder--mainline--0.1--patch-236
+
+    * progs/rescan.c: Copyright date.
+    * progs/play.c: Copyright date.
+    * README: Copyright date.
+    * scripts/dist: cd into =build if it exists.
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 README progs/play.c
+     progs/rescan.c scripts/dist
+
+
+2006-03-19 00:19:32 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-235
+
+    Summary:
+      New speaker_nice option.
+    Revision:
+      disorder--mainline--0.1--patch-235
+
+    * lib/configuration.c: New speaker_nice option.
+    * progs/disorderd.c: Start speaker process as root.
+    * progs/speaker.c: Set nice value, ignore SIGPIPE and become mortal.
+    * progs/trackdb.c: Reset subprocess priority to zero.  (Ineffectual if
+      the main server is already at positive niceness.)
+    * lib/user.c: Moved to lib since shared between several programs.
+    
+    * doc/disorder_config.5.in: Document speaker_nice.
+
+    modified files:
+     CHANGES ChangeLog.d/disorder--mainline--0.1
+     doc/disorder_config.5.in lib/Makefile.am lib/configuration.c
+     lib/configuration.h progs/Makefile.am progs/disorderd.c
+     progs/speaker.c progs/trackdb.c templates/credits.html
+
+    renamed files:
+     progs/user.c
+       ==> lib/user.c
+     progs/user.h
+       ==> lib/user.h
+
+
+2006-03-18 23:52:04 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-234
+
+    Summary:
+      Move deployed filtering of track names closer to the right place
+    Revision:
+      disorder--mainline--0.1--patch-234
+
+    * progs/dcgi.c: Use the server's regexp filtering rather than getting all
+      the files and throwing away the ones that do not match.
+    
+    * progs/disorder.c: Correct handling of variable-argument commands
+      Make regexp support available to files/allfiles/dirs.
+    
+    * progs/trackdb.c: Correct handling of pcre_exec() return value, so we
+      don't report no match if there are subpatterns.  We still log
+      unexpected errors.
+    
+    * templates/choosealpha.html: With server-based regexp filtering, we need
+      slightly more subtle regexps to keep the initial 'the' out.  Perhaps
+      better still (for choosealpha) would be some kind of server-held cache,
+      but we'll see what performance is like in reality.
+    
+    * doc/disorder.1.in: Document regexp support in the command line client.
+
+    modified files:
+     CHANGES ChangeLog.d/disorder--mainline--0.1 doc/disorder.1.in
+     doc/disorder_config.5.in progs/dcgi.c progs/disorder.c
+     progs/trackdb.c templates/choosealpha.html
+
+
+2006-03-18 21:00:33 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-233
+
+    Summary:
+      First round of process priority changes.
+    Revision:
+      disorder--mainline--0.1--patch-233
+
+    * progs/disorderd.c: Apply nice_server config setting at startup.
+    * progs/rescan.c: nice_rescan applies to whole rescan process, not just
+      to collection scanner subprocesses.
+    * lib/configuration.c: 'nice' renamed to nice_rescan.  Added
+      nice_server.
+    * doc/disorder_config.5.in: Document nice_rescan and nice_server.  (The
+      former was never documented in its old guise as 'nice'.)
+
+    modified files:
+     CHANGES ChangeLog.d/disorder--mainline--0.1
+     doc/disorder_config.5.in lib/configuration.c
+     lib/configuration.h progs/disorderd.c progs/rescan.c
+
+
+2006-03-18 20:43:50 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-232
+
+    Summary:
+      update CHANGES
+    Revision:
+      disorder--mainline--0.1--patch-232
+
+    * CHANGES: missing CHANGES note for the last commit.
+
+    modified files:
+     CHANGES ChangeLog.d/disorder--mainline--0.1
+
+
+2006-03-18 20:42:17 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-231
+
+    Summary:
+      Don't crash when the user tries to pause a non-pausible track.
+    Revision:
+      disorder--mainline--0.1--patch-231
+
+    * progs/play.c: Correct test for pause-capable players, which contained
+      an embarassing parenthesization error.  Because of this mistake, if you
+      tried to pause a track using a non-pause-capable player, the server
+      would immediately crash.
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 progs/play.c
+
+
+2006-03-18 20:36:01 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-230
+
+    Summary:
+      Fix a disorder-speaker crash
+    Revision:
+      disorder--mainline--0.1--patch-230
+
+    * progs/speaker.c: If the speaker process detects underrun then it should
+      not later treat written_bytes as a byte count!  This could lead to the
+      speaker process crashing.
+
+    modified files:
+     CHANGES ChangeLog.d/disorder--mainline--0.1 progs/speaker.c
+     scripts/inst
+
+
+2006-02-19 11:39:46 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-229
+
+    Summary:
+      Missing build dependencies
+    Revision:
+      disorder--mainline--0.1--patch-229
+
+    * debian/control (Build-Depends): Was missing libao-dev.
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 debian/control
+
+
+2005-11-15 19:28:43 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-228
+
+    Summary:
+      Report track played so far properly.
+    Revision:
+      disorder--mainline--0.1--patch-228
+
+    * progs/speaker.c: Record (and therefore report) amount of a track played
+      so far, which got lost in the ALSA transition.
+
+    modified files:
+     CHANGES ChangeLog.d/disorder--mainline--0.1 doc/checklist.txt
+     progs/speaker.c
+
+    renamed files:
+     doc/ui-checklist.txt
+       ==> doc/checklist.txt
+
+
+2005-11-15 19:14:45 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-227
+
+    Summary:
+      Clean up logging FD leaks.
+    Revision:
+      disorder--mainline--0.1--patch-227
+
+    * lib/logfd.c: Don't leak reader end of log pipe when it's finished.
+    * progs/play.c: Don't leak writer end of log pipe if fork fails.
+
+    modified files:
+     CHANGES ChangeLog.d/disorder--mainline--0.1 configure.ac
+     lib/logfd.c progs/play.c
+
+
+2005-11-05 15:38:53 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-226
+
+    Summary:
+      Release 1.4
+    Revision:
+      disorder--mainline--0.1--patch-226
+
+    * BUGS: Document past problems with VIA OSS driver.
+    * configure.ac: Change version number.
+    * debian/changelog: New version number.
+
+    modified files:
+     BUGS CHANGES ChangeLog.d/disorder--mainline--0.1 configure.ac
+     debian/changelog
+
+
+2005-11-05 15:01:16 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-225
+
+    Summary:
+      Update copyright dates and testing
+    Revision:
+      disorder--mainline--0.1--patch-225
+
+    * doc/ui-checklist.txt: More checks.
+    * scripts/check: Ignore certain files.
+
+    new files:
+     scripts/copyright.exceptions
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 doc/ui-checklist.txt
+     lib/syscalls.c lib/syscalls.h plugins/Makefile.am
+     plugins/exec.c plugins/shell.c scripts/check
+
+
+2005-11-05 14:36:15 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-224
+
+    Summary:
+      New stopwords
+    Revision:
+      disorder--mainline--0.1--patch-224
+
+    * examples/config.sample.in: Add 'for' and 'is' to stopwords.
+    * debian/disorder.config: Add 'for' and 'is' to stopwords.
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 debian/disorder.config
+     examples/config.sample.in
+
+
+2005-11-05 14:34:09 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-223
+
+    Summary:
+      Documentation cleanups.
+    Revision:
+      disorder--mainline--0.1--patch-223
+
+    * templates/help.html: Missing words.
+    * doc/disorder-dump.8.in: Typo.
+    * doc/disorder.3: Catch up with reality.
+    * doc/disorder_protocol.5.in: Document 'pause' and 'resume'.
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 doc/disorder-dump.8.in
+     doc/disorder.3 doc/disorder_protocol.5.in doc/ui-checklist.txt
+     templates/help.html
+
+
+2005-11-05 14:19:53 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-222
+
+    Summary:
+      Make @nfiles@ consistent.
+    Revision:
+      disorder--mainline--0.1--patch-222
+
+    * progs/dcgi.c: In @nfiles@, if cgi arg files is not set then default to
+      1 (to be consistent with everywhere else).
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 progs/dcgi.c
+
+
+2005-11-05 14:15:52 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-221
+
+    Summary:
+      No Darwin support for now.
+    Revision:
+      disorder--mainline--0.1--patch-221
+
+    Remove references to Darwin, since ALSA dependency breaks it.  You could
+    still build without support for raw players, but it won't work "out of
+    the box".
+
+    removed files:
+     README.darwin
+
+    modified files:
+     BUGS ChangeLog.d/disorder--mainline--0.1 Makefile.am
+
+
+2005-11-04 12:49:51 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-220
+
+    Summary:
+      disorder-speaker now uses ALSA.
+    Revision:
+      disorder--mainline--0.1--patch-220
+
+    This seems to work better than the various libao attempts.  We still use
+    a libao plugin to capture decoded audio from ogg123 etc.
+    
+    * progs/speaker.c: Use ALSA directly rather than libao.
+    * lib/configuration.c: Configurable ALSA device.
+    * lib/log.c: Timestamp debug messages.
+    * configure.ac: Chheck for ALSA library.
+    * doc/disorder_config.5.in: Document 'device' option.
+    * README: Mention ALSA dependency.
+    * debian/control: Depend on alsa development library package.
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 README configure.ac
+     debian/changelog debian/control doc/disorder_config.5.in
+     lib/configuration.c lib/configuration.h lib/log.c
+     progs/Makefile.am progs/speaker.c
+
+
+2005-11-02 17:58:28 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-219
+
+    Summary:
+      Log speaker stderr.
+    Revision:
+      disorder--mainline--0.1--patch-219
+
+    * progs/play.c: log speaker stderr
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 debian/changelog
+     progs/play.c
+
+
+2005-11-01 15:54:37 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-218
+
+    Summary:
+      Typo fixes
+    Revision:
+      disorder--mainline--0.1--patch-218
+
+    * doc/disorder.1.in: Typo fixes.
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 doc/disorder.1.in
+
+
+2005-10-23 13:59:59 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-217
+
+    Summary:
+      Fix process-management problems.
+    Revision:
+      disorder--mainline--0.1--patch-217
+
+    * lib/hash.c: Grow array correctly so we don't lose PIDs.
+    * lib/queue.h: Abolish per-track signal.  Too much hassle for not enough
+      gain.
+    * progs/play.c: Abolish per-track signal.  Log failures to find PIDs.
+    * progs/speaker.c: Log too-short grace periods.
+    
+    * doc/disorder_config.5.in: Document the above.
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 README.raw
+     debian/changelog doc/disorder_config.5.in lib/hash.c
+     lib/queue.c lib/queue.h progs/play.c progs/speaker.c
+
+
+2005-10-22 16:22:16 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-216
+
+    Summary:
+      Various shutdown fixes
+    Revision:
+      disorder--mainline--0.1--patch-216
+
+    * progs/play.c: Terminate all players on shutdown, not just the one for
+      the currently playing track.
+    * lib/configuration.c: Default signal to forcibly terminate players is
+      now SIGKILL.
+    * examples/config.sample.in: Don't use --signal=SIGKILL any more.
+    * debian/disorder.config: Don't use --signal=SIGKILL any more.
+    * doc/disorder_config.5.in: Document change to SIGKILL.
+
+    modified files:
+     CHANGES ChangeLog.d/disorder--mainline--0.1 README.raw
+     debian/disorder.config doc/disorder_config.5.in
+     examples/config.sample.in lib/configuration.c progs/play.c
+
+
+2005-10-22 16:03:27 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-215
+
+    Summary:
+      Stop web UI refreshing like mad
+    Revision:
+      disorder--mainline--0.1--patch-215
+
+    * progs/dcgi.c: Don't clamp refresh to gap if next track in queue is a
+      random track and random play is not enabled.
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 debian/changelog
+     progs/dcgi.c
+
+
+2005-10-16 20:16:30 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-214
+
+    Summary:
+      Don't forget PIDs across reconfiguration.
+    Revision:
+      disorder--mainline--0.1--patch-214
+
+    This change moves PIDs out of queue entries and instead uses a hash table
+    to map IDs to PIDs.  The reason is that on reconfigure the queue is saved
+    and reloaded, losing the PID along the way.
+    
+    * lib/hash.c: Simple hash table.
+    * lib/queue.h: Don't keep PID in queue data structure.
+    * progs/play.c: Move PID records to a hash table.
+
+    new files:
+     lib/hash.c lib/hash.h
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 lib/Makefile.am
+     lib/queue.c lib/queue.h progs/play.c
+
+
+2005-10-16 18:12:13 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-213
+
+    Summary:
+      Clean up rescan abort.
+    Revision:
+      disorder--mainline--0.1--patch-213
+
+    * progs/trackdb.c: reap_rescan() no longer trashes PID of new rescanner.
+      trackdb_scan() is now interruptible.  Propagate debug status to
+      subprocesses.
+    * progs/deadlock.c: --no-debug option.
+    * progs/rescan.c: Cleaner abort.  --no-debug option.
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 progs/deadlock.c
+     progs/rescan.c progs/trackdb-int.h progs/trackdb.c
+
+
+2005-10-16 17:38:20 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-212
+
+    Summary:
+      Don't forget lookahead on reconfigure.
+    Revision:
+      disorder--mainline--0.1--patch-212
+
+    * progs/play.c: Commit queue after adding a random track.
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 progs/play.c
+
+
+2005-10-16 17:33:18 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-211
+
+    Summary:
+      More on disorder-rescan interruption.
+    Revision:
+      disorder--mainline--0.1--patch-211
+
+    * progs/rescan.c: SA_RESTART for SIGINT/SIGTERM.
+    * CHANGES: Mention the reconfigure hang bug as fixed.
+
+    modified files:
+     CHANGES ChangeLog.d/disorder--mainline--0.1 progs/rescan.c
+
+
+2005-10-16 17:24:05 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-210
+
+    Summary:
+      Propagate reconfigure requests to the speaker process.
+    Revision:
+      disorder--mainline--0.1--patch-210
+
+    This is more work than it sounds because previously the reconfigure code
+    would leak memory in the absence of a garbage collector.  It still will
+    on error, but this should be rather rare - if the server fails to parse
+    the configuration it doesn't tell the speaker to reload it.
+    
+    Along the way fixed a logging bug and a rescan bug than could hang the
+    server in a db close operation.
+    
+    * progs/state.c: Transmit reconfiguration requests to the speaker process.
+    * progs/play.c: Transmit reconfiguration requests to the speaker process.
+    * progs/speaker.c: Log configuration reloads.
+    * lib/configuration.c: Free old configs when new ones are installed.
+      This implies taking a bit more care over when we strdup.
+      Also put in VALUE/ADDRESS macros for less typo-prone access to
+      configuration struct members.
+    * lib/mem.c: xfree() calls free/GC_free as appropriate.  
+    * lib/charset.c: Use realloc rather than malloc to avoid leaking memory
+      in non-GC case
+    * progs/rescan.c: Shut down cleanly on SIGTERM/SIGINT to keep db happy.
+      Also use stderr rather than stdout to determine whether to log to
+      syslog or stderr.
+    * progs/trackdb.c: Only redirect subprogram output if we're not on a
+      terminal.  Also stomp db_deadlock_pid on a just-in-case basis.
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 lib/charset.c
+     lib/configuration.c lib/configuration.h lib/mem.c lib/mem.h
+     progs/play.c progs/play.h progs/rescan.c progs/speaker.c
+     progs/state.c progs/trackdb.c
+
+
+2005-10-16 15:44:40 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-209
+
+    Summary:
+      More careful checking for track termination in speaker.
+    Revision:
+      disorder--mainline--0.1--patch-209
+
+    * progs/speaker.c: Cope with player being interrupted part way through a
+      frame.
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 debian/changelog
+     progs/speaker.c
+
+
+2005-10-16 13:53:34 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-208
+
+    Summary:
+      Workarounds for various external bugs.
+    Revision:
+      disorder--mainline--0.1--patch-208
+
+    * README.raw: Document ogg123 braindamage.
+    * examples/config.sample.in: --signal=SIGKILL for ogg123.
+    * debian/disorder.config: --signal=SIGKILL for ogg123.
+    * driver/disorder.c: Call exit instead of _exit, to allow for player
+      cleanup.
+    * lib/event.c: Work around ptrace braindamage.
+
+    modified files:
+     CHANGES ChangeLog.d/disorder--mainline--0.1 README.raw
+     debian/changelog debian/disorder.config driver/disorder.c
+     examples/config.sample.in lib/event.c
+
+
+2005-10-15 19:20:46 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-207
+
+    Summary:
+      Fix crash in speaker process.
+    Revision:
+      disorder--mainline--0.1--patch-207
+
+    * progs/speaker.c: Check the number of bits per sample in the incoming
+      data, not the currently playing track.  This could not only cause the
+      answer to be potentially wrong, but would crash if there was no playing
+      track.
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 progs/speaker.c
+
+
+2005-10-15 15:59:11 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-206
+
+    Summary:
+      Catch up.
+    Revision:
+      disorder--mainline--0.1--patch-206
+
+    * CHANGES: Mention multi-track editing.
+
+    modified files:
+     CHANGES ChangeLog.d/disorder--mainline--0.1
+
+
+2005-10-15 15:44:37 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-205
+
+    Summary:
+      Edit prefs for a whole directory at once.
+    Revision:
+      disorder--mainline--0.1--patch-205
+
+    * progs/dcgi.c: Support editing prefs for multiple track simultaneously.
+    * templates/choose.html: Link to whole-directory prefs edit.
+    * templates/prefs.html: Support editing prefs for multiple track
+      simultaneously.  We lose the raw prefs interface for the time being; it
+      remains available via the command line however.
+    * templates/recent.html: New prefs args.
+    * templates/options.labels: New labels for whole-directory prefs-editing.
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 doc/disorder_config.5.in
+     progs/dcgi.c templates/choose.html templates/options.labels
+     templates/prefs.html templates/recent.html
+
+
+2005-10-15 13:07:00 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-204
+
+    Summary:
+      Random track lookahead.
+    Revision:
+      disorder--mainline--0.1--patch-204
+
+    * lib/queue.c: Support adding queue entries just before the final random
+      track.  Cope with reading back in randomly pick tracks from a saved
+      queue (they have no submitter which was previously not allowed).
+    * progs/dcgi.c: @who@ now just reports an empty string if there was no
+      submitter rather than &nbsp;.  Also correct the order of the table of
+      expansions.
+    * progs/play.c: add_random_track() adds a random track if random play is
+      enabled and there is no such track in the queue.  play() now uses that
+      instead of doing it itself, and doesn't play random tracks found in the
+      queue if random play is disabled.  It also adds a new random track just
+      after playing the old one.
+      If necessary add a random track when play/random play are enabled.
+    * progs/server.c: Add a new random track if the old one is removed.  Also
+      when random track is moved to a non-final position in the queue then we
+      make it into a normal track and add a new random track.
+    * templates/playing.html: Indicate the random track in the queue and if
+      playing, using new labels.
+
+    modified files:
+     CHANGES ChangeLog.d/disorder--mainline--0.1 lib/queue.c
+     lib/queue.h progs/dcgi.c progs/play.c progs/play.h
+     progs/server.c templates/options.labels templates/playing.html
+
+
+2005-10-15 12:28:15 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-203
+
+    Summary:
+      Cope with randomly chosen tracks in the queue.
+    Revision:
+      disorder--mainline--0.1--patch-203
+
+    At the moment nothing adds such tracks to the queue, so this is just
+    laying foundations.
+    
+    * lib/queue.h: New 'random' track state indicates that the track was a
+      randomly chosen track in the queue rather than explicitly requested.
+    * progs/dcgi.c: @state@ expansion provides access to track state field in
+      queue.  Process random tracks just as unplayed ones.
+    * progs/play.c: Handle 'random' state just like 'unplayed'.
+    * doc/disorder_config.5.in: Document @state@ expansion and track states.
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 doc/disorder_config.5.in
+     lib/queue.c lib/queue.h progs/dcgi.c progs/play.c
+
+
+2005-10-15 11:58:37 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-202
+
+    Summary:
+      Complete label docs.
+    Revision:
+      disorder--mainline--0.1--patch-202
+
+    * templates/options.labels: Document links.css, missed in previous pass.
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 templates/options.labels
+
+
+2005-10-15 11:56:27 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-201
+
+    Summary:
+      More change detail.
+    Revision:
+      disorder--mainline--0.1--patch-201
+
+    * CHANGES: More detail.
+
+    modified files:
+     CHANGES ChangeLog.d/disorder--mainline--0.1
+
+
+2005-10-15 11:39:22 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-200
+
+    Summary:
+      Move documentation of labels to options.labels.
+    Revision:
+      disorder--mainline--0.1--patch-200
+
+    * templates/options.labels: Document labels.
+    * doc/disorder_config.5.in: No longer document labels here.
+
+    modified files:
+     CHANGES ChangeLog.d/disorder--mainline--0.1
+     doc/disorder_config.5.in templates/options.labels
+
+
+2005-10-15 11:16:15 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-199
+
+    Summary:
+      New buttons to move to head/tail of queue.
+    Revision:
+      disorder--mainline--0.1--patch-199
+
+    * images/Makefile.am: Install new images.
+    * templates/playing.html: New buttons to move to head/tail.
+    * templates/options.labels: Labels to configure new buttons.
+    * debian/options.debian: Keep up to date.
+    * templates/help.html: Document new queue management.
+    * doc/disorder_config.5.in: Document new labels (at least as well as the
+      old ones; I am starting to think that the options.* files would be a
+      better place for this stuff.)
+
+    modified files:
+     CHANGES ChangeLog.d/disorder--mainline--0.1
+     debian/options.debian doc/disorder_config.5.in
+     images/Makefile.am templates/help.html
+     templates/options.labels templates/playing.html
+
+
+2005-10-15 10:55:34 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-198
+
+    Summary:
+      new images
+    Revision:
+      disorder--mainline--0.1--patch-198
+
+    New {no,}{upup,downdown}.png images for sending a track right to the end
+    of the queue.
+
+    new files:
+     images/.arch-ids/downdown.png.id
+     images/.arch-ids/nodowndown.png.id
+     images/.arch-ids/noupup.png.id images/.arch-ids/upup.png.id
+     images/downdown.png images/nodowndown.png images/noupup.png
+     images/upup.png
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1
+
+
+2005-10-14 18:33:18 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-197
+
+    Summary:
+      more debian catchup
+    Revision:
+      disorder--mainline--0.1--patch-197
+
+    * debian/options.debian: bring images up to date
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 debian/changelog
+     debian/options.debian
+
+
+2005-10-14 18:14:56 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-196
+
+    Summary:
+      debian config catchup
+    Revision:
+      disorder--mainline--0.1--patch-196
+
+    * debian/disorder.config: no gap between tracks
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 debian/changelog
+     debian/disorder.config
+
+
+2005-10-09 13:31:20 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-195
+
+    Summary:
+      Documentation.
+    Revision:
+      disorder--mainline--0.1--patch-195
+
+    * templates/help.html: Bring help up to date with UI changes.
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 templates/help.html
+
+
+2005-10-09 13:24:58 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-194
+
+    Summary:
+      Release notes.
+    Revision:
+      disorder--mainline--0.1--patch-194
+
+    * CHANGES: More coherent change description.
+
+    modified files:
+     CHANGES ChangeLog.d/disorder--mainline--0.1
+
+
+2005-10-09 13:07:48 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-193
+
+    Summary:
+      More release notes.
+    Revision:
+      disorder--mainline--0.1--patch-193
+
+    * README.raw: mpg321 is less buggy than ogg123.
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 README.raw
+
+
+2005-10-09 13:05:17 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-192
+
+    Summary:
+      Fix plugin interface.
+    Revision:
+      disorder--mainline--0.1--patch-192
+
+    * lib/disorder.h: Missing 'extern'.
+    * lib/speaker.c: Build fixes (for Darwin).
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 doc/disorder.3
+     lib/disorder.h lib/speaker.c
+
+
+2005-10-09 12:59:44 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-191
+
+    Summary:
+      Pre-decode raw tracks; better support for buggy players; tidy-ups.
+    Revision:
+      disorder--mainline--0.1--patch-191
+
+    * progs/play.c: prepare() and abandon() allow tracks to be prepared for
+      play (and abandoned when they are removed from the queue) before they
+      are actually to be played.
+    * progs/server.c: Call prepare() and abandon() when appropriate.
+    * driver/disorder.c: New 'fragile' option to work around players that
+      ignore write errors.
+    
+    * doc/disorder_config.5.in: Document libao driver properly.
+    * README.raw: Bring notes on raw players up to date.
+    
+    * examples/config.sample.in: Use fragile driver option for ogg213.
+    * debian/disorder.config: Use disorder libao driver.
+    * debian/control: Depend on mpg321 directly as we address its command
+      line syntax now.
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 README.raw debian/control
+     debian/disorder.config doc/disorder_config.5.in
+     driver/disorder.c examples/config.sample.in progs/play.c
+     progs/play.h progs/server.c
+
+
+2005-10-09 10:52:47 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-190
+
+    Summary:
+      cleanfiles
+    Revision:
+      disorder--mainline--0.1--patch-190
+
+    * progs/Makefile.am: clean up temprary files
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 progs/Makefile.am
+
+
+2005-10-09 10:41:23 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-189
+
+    Summary:
+      miscellaneous command-line fixups
+    Revision:
+      disorder--mainline--0.1--patch-189
+
+    * progs/Makefile.am: check that command completions are up to date
+    * scripts/completion.bash: bring command completions up to date
+    * progs/disorder.c: fix help for scratch-id
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 progs/Makefile.am
+     progs/disorder.c scripts/completion.bash
+
+
+2005-10-08 17:00:04 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-188
+
+    Summary:
+      more web pause
+    Revision:
+      disorder--mainline--0.1--patch-188
+
+    Sort out pausing labels and use thereof.
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 templates/options.labels
+     templates/playing.html
+
+
+2005-10-08 16:55:32 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-187
+
+    Summary:
+      pausing from the web
+    Revision:
+      disorder--mainline--0.1--patch-187
+
+    * progs/dcgi.c: new @paused@ expansion and pause/resume actions.
+    * templates/playing.html: pausing.  State buttons now have a uniform
+      button and a tick/cross by them to indicate state.
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 doc/disorder_config.5.in
+     progs/dcgi.c templates/disorder.css templates/options.labels
+     templates/playing.html
+
+
+2005-10-08 16:32:49 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-186
+
+    Summary:
+      Images again
+    Revision:
+      disorder--mainline--0.1--patch-186
+
+    More coherent image naming.
+
+    removed files:
+     images/.arch-ids/cross.png.id images/cross.png
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 images/Makefile.am
+     templates/options.labels templates/playing.html
+
+    renamed files:
+     images/.arch-ids/noscratch.png.id
+       ==> images/.arch-ids/nocross.png.id
+     images/.arch-ids/scratch.png.id
+       ==> images/.arch-ids/cross.png.id
+     images/noscratch.png
+       ==> images/nocross.png
+     images/scratch.png
+       ==> images/cross.png
+
+
+2005-10-08 16:29:54 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-185
+
+    Summary:
+      new images
+    Revision:
+      disorder--mainline--0.1--patch-185
+
+    Tick and cross images.
+
+    new files:
+     images/.arch-ids/cross.png.id images/.arch-ids/tick.png.id
+     images/cross.png images/tick.png
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 images/Makefile.am
+
+
+2005-10-08 15:08:51 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-184
+
+    Summary:
+      release notes
+    Revision:
+      disorder--mainline--0.1--patch-184
+
+    * CHANGES: mention pausing
+
+    modified files:
+     CHANGES ChangeLog.d/disorder--mainline--0.1
+
+
+2005-10-08 15:05:57 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-183
+
+    Summary:
+      more pausing work
+    Revision:
+      disorder--mainline--0.1--patch-183
+
+    * lib/plugin.c: fix a rather disastrous typo
+    * lib/queue.c: new 'paused' state for a track.  queue_fix_sofar() broken
+      out as a separate function.
+    * progs/dcgi.c: cope with paused tracks
+    * progs/server.c: call queue_fix_sofar() before sending currently playing
+      track or calculating expected start times.
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 lib/plugin.c lib/queue.c
+     lib/queue.h progs/dcgi.c progs/disorder.c progs/play.c
+     progs/server.c
+
+
+2005-10-08 14:38:22 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-182
+
+    Summary:
+      support pausers that don't know how much played
+    Revision:
+      disorder--mainline--0.1--patch-182
+
+    * lib/queue.c: support a played-so-far return of -1, as described in
+      disorder.h
+    * doc/disorder.3: document played-so-far of -1.
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 doc/disorder.3 lib/queue.c
+
+
+2005-10-08 14:26:20 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-181
+
+    Summary:
+      typo
+    Revision:
+      disorder--mainline--0.1--patch-181
+
+    * progs/disorder.c: typo fix
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 progs/disorder.c
+
+
+2005-10-08 14:24:01 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-180
+
+    Summary:
+      more docs
+    Revision:
+      disorder--mainline--0.1--patch-180
+
+    * doc/disorder.3: note that prefork/pause functions mustn't block.
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 doc/disorder.3
+
+
+2005-10-08 14:15:28 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-179
+
+    Summary:
+      more pause/resume work
+    Revision:
+      disorder--mainline--0.1--patch-179
+
+    * lib/play.c: Pausing is now a capabality (of standalone players) not
+      a new player type.  New notify calls for pausing/resuming.
+    * python/disorder.py.in: Python bindings for pause/resume.
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 doc/disorder.3
+     lib/disorder.h lib/plugin.c lib/plugin.h plugins/notify.c
+     progs/play.c python/disorder.py.in
+
+
+2005-10-08 14:05:16 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-178
+
+    Summary:
+      docs + minor fixes
+    Revision:
+      disorder--mainline--0.1--patch-178
+
+    * doc/disorder.3: document updated player plugin interface
+    * doc/disorder.1.in: document pause/resume commands
+    * lib/disorder.h: correct sifnature of disorder_play_resume
+    * progs/disorder.c: correct order of commands
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 doc/disorder.1.in
+     doc/disorder.3 lib/disorder.h progs/disorder.c
+
+
+2005-10-08 13:49:04 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-177
+
+    Summary:
+      typo fix
+    Revision:
+      disorder--mainline--0.1--patch-177
+
+    * progs/disorder.c: typo
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 progs/disorder.c
+
+
+2005-10-08 13:48:42 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-176
+
+    Summary:
+      implement pausing support
+    Revision:
+      disorder--mainline--0.1--patch-176
+
+    _PLAYER_PAUSES is not really tested since I don't have any playes that
+    support that protocol.  Also the web interface does not know anything
+    about this yet, and it is not documented.
+    
+    * progs/play.c: Implement pausing.  
+    
+    * lib/queue.c: Pause/resume tracking for _PLAYER_PAUSES players.
+    * lib/client.c: C pause/resume bindings.
+    * lib/plugin.c: Pause/resume stubs.
+    * progs/disorder.c: Pause/resume commands.
+    * progs/server.c: Pause/resume commands.  Automatically resumes under
+      conditions.
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 lib/client.c lib/client.h
+     lib/plugin.c lib/plugin.h lib/queue.c lib/queue.h
+     progs/disorder.c progs/play.c progs/play.h progs/server.c
+
+
+2005-10-05 21:53:29 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-175
+
+    Summary:
+      documentation catchup
+    Revision:
+      disorder--mainline--0.1--patch-175
+
+    First pass at documenting the latest batch of changes.  Also updated the
+    sample config file to use raw players for OGG and MP3, and to remove the
+    inter-track gap.
+
+    new files:
+     README.raw
+
+    modified files:
+     CHANGES ChangeLog.d/disorder--mainline--0.1 README
+     README.upgrades doc/disorder_config.5.in
+     examples/config.sample.in
+
+
+2005-10-05 20:58:25 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-174
+
+    Summary:
+      implement and use the speaker process.
+    Revision:
+      disorder--mainline--0.1--patch-174
+
+    No documentation yet!
+    
+    * driver/disorder.c: Look at ${DISORDER_RAW_FD} for default output file
+      descriptor.
+    * lib/plugin.c: New play_get_type().  Tidy up.
+    * lib/queue.h: Correct order of enum constants.
+                   New queue entry fields:
+                   * type - type word from plugin
+                   * pid - process ID of decoder/player
+                   * sofar - how many seconds played so far
+              * signal - signal to kill decoder/player
+    * lib/queue.c: fake up sofar field where it's not filled in by the
+      speaker process
+    * lib/syscalls.c: we never use chdir, so remove it.
+    * plugins/execraw.c: exec plugin for decoders, uses modified exec.c
+    * progs/deadlock.c: use stderr not stdout to determine whether we're a
+      daemon
+    * progs/disorder.c: report sofar
+    * progs/disorderd.c: start speaker process
+    * progs/play.c: use the speaker process for _RAW players.
+      + send the speaker an SM_PLAY if a _RAW player
+      + support --wait-for-device and --signal player options
+      + act on incoming messages from the speaker
+      + split player-finished logic into process-finished and generic halves
+      + still scratch even if subprocess terminated
+      + disconnect from speaker when quitting
+    * lib/signame.c: split out of configuration.c, needed by --signal player
+      option
+    * lib/speaker.c: speaker/server communication support
+    * progs/speaker.c: the speaker process itself.
+
+    new files:
+     lib/signame.c lib/signame.h lib/speaker.c lib/speaker.h
+     plugins/execraw.c progs/speaker.c
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 driver/disorder.c
+     lib/Makefile.am lib/configuration.c lib/configuration.h
+     lib/disorder.h lib/plugin.c lib/plugin.h lib/queue.c
+     lib/queue.h lib/syscalls.c lib/syscalls.h plugins/Makefile.am
+     plugins/exec.c plugins/shell.c progs/Makefile.am
+     progs/deadlock.c progs/disorder.c progs/disorderd.c
+     progs/play.c progs/play.h progs/state.c
+
+
+2005-10-01 17:31:19 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-173
+
+    Summary:
+      Prefork/cleanup support
+    Revision:
+      disorder--mainline--0.1--patch-173
+
+    * lib/plugin.c: simplify plugin opening interface.  The main reason for
+      the plugin struct is to keep track of plugin names and to avoid repeat
+      opening, but it also allows the hiding of the dlopen() interface.
+      Also add support for the prefork/cleanup interface.
+    
+    * lib/queue.h: track plugin and its data for each track.  Currently only
+      for the playing track but perhaps also for pre-decoded tracks in the
+      future.
+    
+    * progs/play.c: Support the prefork/cleanup player plugin interface.
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 lib/plugin.c lib/plugin.h
+     lib/queue.c lib/queue.h progs/play.c
+
+
+2005-10-01 16:35:07 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-172
+
+    Summary:
+      new plugin interface
+    Revision:
+      disorder--mainline--0.1--patch-172
+
+    New plugin interface declarations.  No implementation behind them yet
+    however.
+    
+    * lib/disorder.h: new player plugin declarations
+    * plugins/shell.c: new plugin interface
+    * plugins/exec.c: new plugin interface
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 lib/disorder.h
+     plugins/exec.c plugins/shell.c
+
+
+2005-10-01 16:16:50 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-171
+
+    Summary:
+      libao driver
+    Revision:
+      disorder--mainline--0.1--patch-171
+
+    * driver/disorder.c: libao driver that outputs in raw format with a
+      descriptive header.
+    * README: note dependency on libao
+
+    new files:
+     driver/.arch-ids/=id driver/Makefile.am driver/disorder.c
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 Makefile.am README
+     README.darwin configure.ac
+
+    new directories:
+     driver driver/.arch-ids
+
+
+2005-09-27 18:30:42 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-170
+
+    Summary:
+      random play enabled on first startup
+    Revision:
+      disorder--mainline--0.1--patch-170
+
+    If random play is enabled before we've got any tracks then
+    trackdb_random() tried to get record 1 of 0, and fails, and terminates
+    the process.  Fixed.
+
+    modified files:
+     CHANGES ChangeLog.d/disorder--mainline--0.1 progs/trackdb.c
+
+
+2005-08-07 11:11:05 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-169
+
+    Summary:
+      build against fink libraries without extra configure args
+    Revision:
+      disorder--mainline--0.1--patch-169
+
+    * configure.ac: if fink is installed, add some CPPFLAGS/LDFLAGS based on
+      its path.
+    * README.darwin: no longer need to specify paths to fink libraries.
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 README.darwin configure.ac
+
+
+2005-07-04 21:55:09 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-168
+
+    Summary:
+      more build-time testing
+    Revision:
+      disorder--mainline--0.1--patch-168
+
+    * lib/Makefile.am: don't automatically run checks
+    * progs/Makefile.am: check that --help options work
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 lib/Makefile.am
+     progs/Makefile.am scripts/dist scripts/inst
+
+
+2005-07-04 21:40:14 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-167
+
+    Summary:
+      don't crash in --help-commands
+    Revision:
+      disorder--mainline--0.1--patch-167
+
+    * progs/disorder.c: don't crash in --help-commands
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 progs/disorder.c
+
+
+2005-06-18 17:31:44 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-166
+
+    Summary:
+      correct version numbers
+    Revision:
+      disorder--mainline--0.1--patch-166
+
+    * README.upgrades: correct version numbers
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 README.upgrades
+
+
+2005-06-17 17:24:01 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-165
+
+    Summary:
+      post 1.3
+    Revision:
+      disorder--mainline--0.1--patch-165
+
+    * CHANGES: remove entries up to 1.0.  200 lines is plenty of history in a
+      file people are expected to actually read.
+    * configure.ac: version changed to 1.3+dev
+
+    modified files:
+     CHANGES ChangeLog.d/disorder--mainline--0.1 configure.ac
+
+
+2005-06-16 20:42:17 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-164
+
+    Summary:
+      release 1.2
+    Revision:
+      disorder--mainline--0.1--patch-164
+
+    * progs/server.c: save queue after move operation
+    * configure.ac: release 1.3
+    * debian/changelog: release 1.3
+    * CHANGES: release 1.3
+
+    modified files:
+     CHANGES ChangeLog.d/disorder--mainline--0.1 configure.ac
+     debian/changelog progs/server.c
+
+
+2005-06-16 20:31:17 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-163
+
+    Summary:
+      missing documentation
+    Revision:
+      disorder--mainline--0.1--patch-163
+
+    * doc/disorder_config.5.in: document 'alias' directive
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 doc/disorder_config.5.in
+
+
+2005-06-16 20:16:40 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-162
+
+    Summary:
+      distribution administrivia
+    Revision:
+      disorder--mainline--0.1--patch-162
+
+    * debian/rules.m4: install all READMEs
+    * progs/Makefile.am: remember trackdb-int.h
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 debian/changelog
+     debian/rules.m4 progs/Makefile.am
+
+
+2005-06-08 09:48:40 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-161
+
+    Summary:
+      quieten tree-lint
+    Revision:
+      disorder--mainline--0.1--patch-161
+
+    * {arch}/=tagging-method: stop tree-lint from complaining about emacs
+      droppings
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 {arch}/=tagging-method
+
+
+2005-06-01 22:45:28 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-160
+
+    Summary:
+      darwin port update
+    Revision:
+      disorder--mainline--0.1--patch-160
+
+    Build on Mac OS X again.
+    
+    * progs/trackdb.c: missing header
+    * progs/trackdb-int.h: correct types
+    * README.darwin: note requirement for db4.3
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 README.darwin
+     progs/trackdb-int.h progs/trackdb.c
+
+
+2005-05-31 22:13:11 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-159
+
+    Summary:
+      update CHANGES
+    Revision:
+      disorder--mainline--0.1--patch-159
+
+    * CHANGES: mention missing files included for 1.2.1.  The fclose checked
+      in 1.2.1 isn't present any more anyway.
+
+    modified files:
+     CHANGES ChangeLog.d/disorder--mainline--0.1
+
+
+2005-05-31 19:55:21 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-158
+
+    Summary:
+      web ui reports errors more gracefully
+    Revision:
+      disorder--mainline--0.1--patch-158
+
+    * progs/cgimain.c: report errors by calling disorder_cgi_error()
+    * progs/dcgi.c: disorder_cgi_error expands the 'error' template with the
+      'error' label set to an error indicator string.
+    * progs/cgi.c: cgi_set_option allows web options to be set other than
+      through the config files
+    
+    * templates/error.html: new template for error pages
+    * templates/options.labels: default error strings
+
+    new files:
+     templates/error.html
+
+    modified files:
+     CHANGES ChangeLog.d/disorder--mainline--0.1
+     doc/disorder_config.5.in progs/cgi.c progs/cgi.h
+     progs/cgimain.c progs/dcgi.c progs/dcgi.h
+     templates/Makefile.am templates/options.labels
+
+
+2005-05-31 19:26:23 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-157
+
+    Summary:
+      management screen fixes
+    Revision:
+      disorder--mainline--0.1--patch-157
+
+    * templates/playing.html: put a <form> around volume input boxes, so the
+      client knows where to send the change.
+    * templates/disorder.css: management stuff is all displayed inline
+    * doc/ui-checklist.txt: new checklist for manual UI testing
+
+    new files:
+     doc/ui-checklist.txt
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 templates/disorder.css
+     templates/playing.html
+
+
+2005-05-31 18:23:15 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-156
+
+    Summary:
+      minor build fixes
+    Revision:
+      disorder--mainline--0.1--patch-156
+
+    * progs/dcgi.c: quieten compiler
+    * lib/Makefile.am: delete the right file
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 lib/Makefile.am
+     progs/dcgi.c
+
+
+2005-05-30 11:02:45 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-155
+
+    Summary:
+      color enable/disable buttons to reflect current state
+    Revision:
+      disorder--mainline--0.1--patch-155
+
+    * templates/disorder.css: enable/disable button colors
+    * templates/playing.html: enable/disable buttons get red/green
+      backgrounds
+
+    modified files:
+     CHANGES ChangeLog.d/disorder--mainline--0.1
+     templates/disorder.css templates/options.labels
+     templates/playing.html
+
+
+2005-05-30 10:27:41 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-154
+
+    Summary:
+      update copyright dates
+    Revision:
+      disorder--mainline--0.1--patch-154
+
+    Administrivia.
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 acinclude.m4
+     examples/disorder.init.in progs/api-server.c
+
+
+2005-05-29 23:17:23 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-153
+
+    Summary:
+      update CHANGES
+    Revision:
+      disorder--mainline--0.1--patch-153
+
+    * CHANGES: note that subprocess output is logged
+
+    modified files:
+     CHANGES ChangeLog.d/disorder--mainline--0.1
+
+
+2005-05-29 22:51:59 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-152
+
+    Summary:
+      log output of subprocesses
+    Revision:
+      disorder--mainline--0.1--patch-152
+
+    * lib/logfd.c: logfd() returns an FD which (via the event loop) ends up
+      in log output.  Useful to pick up stdout/stderr of subprocesses.
+    * progs/trackdb.c: log output of deadlock and rescan subprocesses
+    * progs/play.c: log output of player subprocesses
+    
+    * progs/rescan.c: check for newline in raw path, not track
+    * progs/dcgi.c: quieten compiler
+    * progs/dump.c: quieten compiler
+
+    new files:
+     lib/logfd.c lib/logfd.h
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 lib/Makefile.am
+     progs/dcgi.c progs/dump.c progs/play.c progs/rescan.c
+     progs/trackdb.c
+
+
+2005-05-29 18:30:28 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-151
+
+    Summary:
+      unweird search output
+    Revision:
+      disorder--mainline--0.1--patch-151
+
+    Searching was producing weird results: the artist 'Various' was being
+    displayed as the first aliased artist (but sorted, correctly, as
+    'Various').  This change fixes this, though artists are still sorted by
+    their display name (so the 'The ...' bug remains in this context).  
+    
+    * progs/dcgi.c: @search@ takes an additional CONTEXT argument, and marks
+      the last element in a group correctly.
+    * doc/disorder_config.5.in: document changes to @search@
+    * templates/search.html: @search@ context used to avoid weirdness.
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 doc/disorder_config.5.in
+     progs/dcgi.c templates/search.html
+
+
+2005-05-29 18:01:01 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-150
+
+    Summary:
+      rewritten track database code
+    Revision:
+      disorder--mainline--0.1--patch-150
+
+    * lib/disorder.h: _count and _getn are gone, replaced by _random
+    * plugins/pick.c: use _random instead of _count and _getn
+    
+    * lib/client.c: rescan no longer takes an arg; dump is gone; new resolve
+      command.
+    * lib/filepart.c: strip_extension() and extension()
+    * lib/trackname.c: implement 'ext' and 'path' parts here
+    * progs/api-server.c: adapt to new trackdb_ interface
+    * progs/dcgi.c: resolve paths when figuring out track status; implement
+      @resolve@
+    * progs/disorder.c: new resolve, scratch-id; modified rescan
+    * progs/disorderd.c: adapt to new trackdb_ code; open database after
+      taking lockfile, not before; move user change code to user.c
+    * progs/play.c: adapt to new trackdb_ interface
+    * progs/server.c: adapt to new trackdb_ interface.  resolve aliases when
+      playing.  dump is gone.  new resolve command.
+    * progs/state.c: dapt to new trackdb_ interface
+    * progs/trackdb.c: new trackdb.  Largely rewritten though a little old
+      tracks.c material remains.
+    
+    * progs/dump.c: rewritten for new trackdb_ code.  Dump and undump both
+      access the database directly and work while the server is running
+      (although particularly undumping while it is running is likely to be
+      painful).  --recompute-aliases and --remove-pathless can be used to
+      tidy up broken databases, mostly useful when developing.  --recover and
+      --recover-fatal provide access to libdb facilities (though these are
+      also available through db_recover).
+    * progs/deadlock.c: disorder-deadlock implementation.  Just runs the
+      deadlock detector once a second.
+    * progs/rescan.c: disorder-rescan implementation.
+    * progs/user.c: user-switching code taken from disorderd.c
+    
+    * templates/choose.html: resolve track when linking to prefs
+    
+    * scripts/completion.bash: disorder-dump support
+    * examples/disorder.init.in: put sbindir on the path
+    
+    * debian/control: need libdb4.3-dev
+    
+    * doc/disorder-dump.8.in: document rewritten dump program
+    * doc/disorder.1.in: document resolve, scratch-id and modified rescan
+    * doc/disorder.3: _count and _getn are gone, replaced by _random; recheck
+      happens in a subprocess.
+    * doc/disorder_config.5.in: document @resolve@
+    * doc/disorder_protocol.5.in: document resolve and changed rescan; dump
+      is gone.
+    * doc/disorderd.8.in: helper programs must be on the path; discuss
+      backups using disorder-dump.  Mention DB_CONFIG.
+
+    new files:
+     doc/disorder-deadlock.8.in doc/disorder-rescan.8.in
+     progs/deadlock.c progs/rescan.c progs/trackdb-int.h
+     progs/trackdb.c progs/trackdb.h progs/user.c progs/user.h
+
+    removed files:
+     progs/rescan.c progs/tracks.c progs/tracks.h
+
+    modified files:
+     CHANGES ChangeLog.d/disorder--mainline--0.1 README
+     README.upgrades debian/control doc/Makefile.am
+     doc/disorder-dump.8.in doc/disorder.1.in doc/disorder.3
+     doc/disorder_config.5.in doc/disorder_protocol.5.in
+     doc/disorderd.8.in examples/disorder.init.in lib/client.c
+     lib/client.h lib/disorder.h lib/event.c lib/filepart.c
+     lib/filepart.h lib/log-impl.h lib/trackname.c plugins/pick.c
+     progs/Makefile.am progs/api-server.c progs/dcgi.c
+     progs/disorder.c progs/disorderd.c progs/dump.c progs/play.c
+     progs/server.c progs/state.c scripts/completion.bash
+     scripts/inst templates/choose.html
+
+
+2005-05-27 14:24:51 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-149
+
+    Summary:
+      new 'lock' directive
+    Revision:
+      disorder--mainline--0.1--patch-149
+
+    * progs/disorderd.c: take lock here, under control of 'lock' directive
+    * progs/tracks.c: don't lock here any more
+    * lib/configuration.c: 'lock' directive 
+
+    modified files:
+     CHANGES ChangeLog.d/disorder--mainline--0.1
+     doc/disorder_config.5.in lib/configuration.c
+     lib/configuration.h progs/disorderd.c progs/tracks.c
+
+
+2005-05-27 14:19:25 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-148
+
+    Summary:
+      wrap up program name setting
+    Revision:
+      disorder--mainline--0.1--patch-148
+
+    * lib/log.c: set_progname() sets progname from argv[0]
+    * progs/disorderd.c: use set_progname()
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 lib/log.c lib/log.h
+     progs/disorderd.c
+
+
+2005-05-27 14:17:04 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-147
+
+    Summary:
+      optionally abort on fatal error
+    Revision:
+      disorder--mainline--0.1--patch-147
+
+    * lib/log-impl.h: DISORDER_FATAL_ABORT=yes forces fatal() to abort, for
+      debugging purposes.
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 lib/log-impl.h
+
+
+2005-05-27 14:04:58 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-146
+
+    Summary:
+      more liberal url-encoding
+    Revision:
+      disorder--mainline--0.1--patch-146
+
+    * lib/kvp.c: allow RFC2396 unreserved characters plus '/' to pass
+      URL-encoding unchanged.
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 lib/kvp.c
+
+
+2005-05-27 13:55:49 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-145
+
+    Summary:
+      more conservative signal handling
+    Revision:
+      disorder--mainline--0.1--patch-145
+
+    * lib/event.c: if we fail to write to the signal pipe then abort.  This
+      saves worry about write() modifiying errno.
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 lib/event.c
+
+
+2005-05-27 13:50:27 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-144
+
+    Summary:
+      libtool 1.4 no good
+    Revision:
+      disorder--mainline--0.1--patch-144
+
+    * README: libtool note
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 README
+
+
+2005-05-26 12:02:49 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-143
+
+    Summary:
+      update copyright dates
+    Revision:
+      disorder--mainline--0.1--patch-143
+
+    Update copyright dates.
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 lib/regsub.c lib/regsub.h
+     lib/vector.h
+
+
+2005-05-26 11:54:52 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-142
+
+    Summary:
+      detect missing symbols in plugins early
+    Revision:
+      disorder--mainline--0.1--patch-142
+
+    * lib/plugin.c: use RTLD_NOW instead of RTLD_LAZY.
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 lib/plugin.c
+
+
+2005-05-22 13:15:38 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-141
+
+    Summary:
+      minor doc fixes
+    Revision:
+      disorder--mainline--0.1--patch-141
+
+    * debian/README.Debian: leftover names converted to /etc/disorder.
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 debian/README.Debian
+
+
+2005-05-21 17:16:03 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-140
+
+    Summary:
+      check for UTF-8 support in pcre.
+    Revision:
+      disorder--mainline--0.1--patch-140
+
+    * acinclude.m4: new RJK_REQUIRE_PCRE_UTF8 macro checks that PCRE was
+      built with UTF-8 support.
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 acinclude.m4 configure.ac
+
+
+2005-05-21 12:17:49 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-139
+
+    Summary:
+      config overview
+    Revision:
+      disorder--mainline--0.1--patch-139
+
+    * doc/disorder_config.5.in: add an overview section
+    
+    
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 doc/disorder_config.5.in
+
+
+2005-05-15 20:02:36 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-138
+
+    Summary:
+      unchecked fclose
+    Revision:
+      disorder--mainline--0.1--patch-138
+
+    * progs/tracks.c: unchecked fclose()
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 progs/tracks.c
+
+
+2005-05-15 19:59:12 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-137
+
+    Summary:
+      correct for multiple =build directories
+    Revision:
+      disorder--mainline--0.1--patch-137
+
+    * {arch}/=tagging-method: correct =build* exclusion
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 {arch}/=tagging-method
+
+
+2005-05-15 19:57:44 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-136
+
+    Summary:
+      typos
+    Revision:
+      disorder--mainline--0.1--patch-136
+
+    * doc/disorder_config.5.in: typo fix
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 doc/disorder_config.5.in
+
+
+2005-05-11 18:56:43 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-135
+
+    Summary:
+      add missing files
+    Revision:
+      disorder--mainline--0.1--patch-135
+
+    * lib/filepart.c, lib/filepart.c: missing files from previous commit.
+      Thought that wasn't supposed to be possible...
+
+    new files:
+     lib/filepart.c lib/filepart.h
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1
+
+
+2005-05-08 19:05:56 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-134
+
+    Summary:
+      results of trackname_ prefs appear in virtual filesystem
+    Revision:
+      disorder--mainline--0.1--patch-134
+
+    * lib/configuration.c: 'alias' directive; syntax-check collection root
+    * lib/regsub.c: REGSUB_REPLACE flag to just expand the substitution
+      string rather than substituting it into the subject string
+    * lib/trackname.c: compute track name parts from track name without
+      collection root.
+    * progs/rescan.c: recompute aliases as part of rescan.
+    * progs/tracks.c: support aliases, i.e. names that appear in the virtual
+      filesystem corresponding to the results of trackname_display_ prefs.
+      When they are in the same directory as their real file, only the alias
+      is visible.
+    
+    * README.upgrades: note 'ext' namepart and namepart changes
+    * debian/disorder.config: add 'ext' directive and update namepart
+      directives for new semantics
+    * doc/disorder_config.5.in: note that collection root is removed.
+    * examples/config.sample.in: add 'ext' directive and update namepart
+      directives for new semantics
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 README.upgrades
+     debian/disorder.config doc/disorder_config.5.in
+     examples/config.sample.in lib/Makefile.am lib/configuration.c
+     lib/configuration.h lib/regsub.c lib/regsub.h lib/trackname.c
+     lib/trackname.h lib/vector.h progs/play.c progs/rescan.c
+     progs/tracks.c progs/tracks.h
+
+
+2005-05-07 16:08:16 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-133
+
+    Summary:
+      'disorder authorize' command to simplify adding users
+    Revision:
+      disorder--mainline--0.1--patch-133
+
+    * lib/configuration.c: export paths to subsiduary configuration files as
+      required.
+    * progs/disorder.c: 'authorize' command
+    * progs/authorize.c: implementation of 'authorize' command
+    * scripts/completion.bash: add 'authorize' command to list
+    * README: mention disorder authorize; alternative advice about
+      config.USER ownership.
+    * doc/disorder.1.in: document 'authorize' command
+    * doc/disorder_config.5.in: config.private is root:jukebox, not jukebox:*
+      according to README and debian/postinst; make disorder_config(5)
+      consistent.
+
+    new files:
+     progs/authorize.c progs/authorize.h
+
+    modified files:
+     CHANGES ChangeLog.d/disorder--mainline--0.1 README
+     doc/disorder.1.in doc/disorder_config.5.in lib/configuration.c
+     lib/configuration.h progs/Makefile.am progs/disorder.c
+     scripts/completion.bash
+
+
+2005-05-07 13:50:13 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-132
+
+    Summary:
+      more encoding safeguard text
+    Revision:
+      disorder--mainline--0.1--patch-132
+
+    * debian/templates (disorder/encoding): note in template text that you
+      can't guess the encoding.
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 debian/templates
+
+
+2005-05-07 13:30:54 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-131
+
+    Summary:
+      notes about wrong fs encoding troubles
+    Revision:
+      disorder--mainline--0.1--patch-131
+
+    * README: emphasize need to get filesystem encoding right
+    * BUGS: note about difficulty of recovering from wrong filesystem
+      encoding.
+
+    modified files:
+     BUGS ChangeLog.d/disorder--mainline--0.1 README
+
+
+2005-03-12 17:53:26 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-130
+
+    Summary:
+      missing file
+    Revision:
+      disorder--mainline--0.1--patch-130
+
+    * progs/Makefile.am: remember to distribute getopt.h
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 progs/Makefile.am
+
+
+2005-03-12 17:51:42 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-129
+
+    Summary:
+      post 1.2
+    Revision:
+      disorder--mainline--0.1--patch-129
+
+    * configure.ac: 1.2+dev
+    
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 configure.ac
+
+
+2005-03-11 20:07:38 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-128
+
+    Summary:
+      release 1.2
+    Revision:
+      disorder--mainline--0.1--patch-128
+
+    * configure.ac, debian/changelog, CHANGES: version number
+    * scripts/inst: run ldconfig
+
+    modified files:
+     CHANGES ChangeLog.d/disorder--mainline--0.1 configure.ac
+     debian/changelog scripts/inst
+
+
+2005-03-05 20:57:35 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-127
+
+    Summary:
+      build fix
+    Revision:
+      disorder--mainline--0.1--patch-127
+
+    * plugins/mad.c: quieten gcc 4 prerelease
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 plugins/mad.c
+
+
+2005-03-04 23:31:19 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-126
+
+    Summary:
+      fix broken @navigate@
+    Revision:
+      disorder--mainline--0.1--patch-126
+
+    * progs/dcgi.c: fix path name parsing in @navigate@.  Was always broken
+      but never showed up until memory allocation changes in patch-125.
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 progs/dcgi.c
+
+
+2005-03-04 19:41:29 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-125
+
+    Summary:
+      disable gc for some utilities
+    Revision:
+      disorder--mainline--0.1--patch-125
+
+    * lib/mem.c: callers can disable gc too
+    * progs/cgimain.c, progs/trackname.c: no gc for web interface or
+      trackname utility.  These are very short running programs.
+    * progs/disorderd.c: enable gc.  Long running program.
+    * progs/disorder.c, progs/dump.c: enable gc.  disorder(1) might run a
+      long time if log is used; dump.c allocates memory for every track which
+      soon goes unreachable.  If there are very many tracks then not freeing
+      this memory along the way might consume excessive amounts.
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 lib/mem.c lib/mem.h
+     progs/cgimain.c progs/disorder.c progs/disorderd.c
+     progs/dump.c progs/trackname.c
+
+
+2005-03-04 19:22:18 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-124
+
+    Summary:
+      optional disabling of garbage collection for debug purposes
+    Revision:
+      disorder--mainline--0.1--patch-124
+
+    * lib/mem.c: allow garbage collection to be turned off, e.g. for use with
+      memory allocation checkers that don't play nicely with libgc.  To turn
+      garbage collection off set the environment variable DISORDER_GC=no.
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 lib/mem.c
+
+
+2005-03-01 00:08:09 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-123
+
+    Summary:
+      tidying up
+    Revision:
+      disorder--mainline--0.1--patch-123
+
+    * lib/log.h: move log_output structure to log.c, since it is not needed
+      by callers any more.
+    * templates/disorder.css, templates/volume.html,
+      templates/stylesheet.html, scripts/htmlman: copyright date
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 lib/log.c lib/log.h
+     progs/dcgi.c progs/dcgi.h scripts/htmlman
+     templates/choosealpha.html templates/disorder.css
+     templates/sidebar.html templates/stylesheet.html
+     templates/volume.html
+
+
+2005-02-27 19:43:31 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-122
+
+    Summary:
+      more spelling
+    Revision:
+      disorder--mainline--0.1--patch-122
+
+    * python/disorder.py.in: typo fixes
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 python/disorder.py.in
+
+
+2005-02-27 19:41:10 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-121
+
+    Summary:
+      better python docs
+    Revision:
+      disorder--mainline--0.1--patch-121
+
+    * python/disorder.py.in: more verbose docs
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 python/disorder.py.in
+     templates/help.html
+
+
+2005-02-27 19:21:51 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-120
+
+    Summary:
+      more 'tooltips'
+    Revision:
+      disorder--mainline--0.1--patch-120
+
+    * templates/playing.html: TITLE attributes for links and buttons
+    * templates/options.labels: values for the above attributes
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 templates/options.labels
+     templates/playing.html
+
+
+2005-02-27 19:05:19 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-119
+
+    Summary:
+      typo fixes
+    Revision:
+      disorder--mainline--0.1--patch-119
+
+    * README.upgrades: typo fixes
+    * CHANGES: typo fixes
+    * doc/disorder_config.5.in: typo fixes
+
+    modified files:
+     CHANGES ChangeLog.d/disorder--mainline--0.1 README.upgrades
+     doc/disorder_config.5.in
+
+
+2005-02-27 18:24:53 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-118
+
+    Summary:
+      remove annoying hang in tkdisorder
+    Revision:
+      disorder--mainline--0.1--patch-118
+
+    * python/tkdisorder: perform initial fill of recent window (or whatever)
+      in a background thread, to avoid blocking the rest of the UI.  We set
+      the cursor to 'watch' for the duration.
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 python/tkdisorder
+
+
+2005-02-26 20:36:56 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-117
+
+    Summary:
+      debian fixes for new web arrangements
+    Revision:
+      disorder--mainline--0.1--patch-117
+
+    * debian/options.debian: this becomes a debian-specific version of
+      /etc/disorder/options, with alternative URLs for static content.  It's
+      marked as a conffile but the user would be better off putting their
+      changes into options.user.
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 debian/conffiles
+     debian/options.debian debian/rules.m4
+
+
+2005-02-26 18:46:03 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-116
+
+    Summary:
+      simpler static content configuration
+    Revision:
+      disorder--mainline--0.1--patch-116
+
+    * templates/options.labels: images.* and links.* are the full URL
+      (possibly relative to the disorder cgi base URL).
+    * templates/playing.html, templates/volume.html, templates/recent.html,
+      templates/help.html, templates/choose.html: fix image links
+    * templates/stylesheet.html: fix stylesheet URL
+    * doc/disorder_config.5.in: document URL changes
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 doc/disorder_config.5.in
+     templates/choose.html templates/help.html
+     templates/options.labels templates/playing.html
+     templates/recent.html templates/stylesheet.html
+     templates/volume.html
+
+
+2005-02-24 22:58:17 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-115
+
+    Summary:
+      static (non-embedded) stylesheet
+    Revision:
+      disorder--mainline--0.1--patch-115
+
+    * templates/disorder.css: copied from contents of stylesheet.html
+    * templates/stylesheet.html: just link to disorder.css
+    * templates/options.labels: links.css label identifies stylesheet
+
+    new files:
+     templates/disorder.css
+
+    modified files:
+     CHANGES ChangeLog.d/disorder--mainline--0.1
+     templates/Makefile.am templates/options.labels
+     templates/stylesheet.html
+
+
+2005-02-20 19:29:08 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-114
+
+    Summary:
+      link/image title attributes
+    Revision:
+      disorder--mainline--0.1--patch-114
+
+    * templates/options.labels: new *.*verbose labels used for informative
+      TITLE attributes on various links and images
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 templates/choose.html
+     templates/credits.html templates/options.labels
+     templates/playing.html templates/recent.html
+     templates/topbar.html templates/volume.html
+
+
+2005-02-20 18:34:43 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-113
+
+    Summary:
+      more flexible choice of graphics
+    Revision:
+      disorder--mainline--0.1--patch-113
+
+    * templates/options.labels: individual labels for each graphic.
+      Currently everything has to be relative to url.static which might not
+      be ideal.
+    * templates/playing.html, templates/choose.html, templates/help.html,
+      templates/recent.html, templates/volume.html: use new labels for
+      graphics.  We discard the width and height attributes which is a shame
+      but most of the time browsers will have a copy already so it shouldn't
+      be too problematic.
+    * doc/disorder_config.5.in: document new labels
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 doc/disorder_config.5.in
+     templates/choose.html templates/help.html
+     templates/options.labels templates/playing.html
+     templates/recent.html templates/volume.html
+
+
+2005-02-20 12:39:10 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-112
+
+    Summary:
+      missing bit of patch-107
+    Revision:
+      disorder--mainline--0.1--patch-112
+
+    * templates/help.html: forgot to includ ethe menu end file in patch-107
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 templates/help.html
+
+
+2005-02-20 12:35:42 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-111
+
+    Summary:
+      definitions moved from macros to library
+    Revision:
+      disorder--mainline--0.1--patch-111
+
+    * lib/defs.c: make macros defined by configure (VERSION, PKGCONFDIR, etc)
+      available as library symbols, rather than repeating them everywhere
+      they are use.
+
+    new files:
+     lib/defs.c lib/defs.h
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 lib/Makefile.am
+     lib/configuration.c lib/configuration.h lib/plugin.c
+     progs/cgi.c progs/dcgi.c progs/disorder.c progs/disorderd.c
+     progs/dump.c progs/server.c progs/trackname.c
+
+
+2005-02-19 23:48:05 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-110
+
+    Summary:
+      fix search facility
+    Revision:
+      disorder--mainline--0.1--patch-110
+
+    * progs/dcgi.c: unbreak the search facility, which didn't return all the
+      results for an artist (or album) which contains more than one hit.
+
+    modified files:
+     CHANGES ChangeLog.d/disorder--mainline--0.1 progs/dcgi.c
+
+
+2005-02-19 23:27:28 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-109
+
+    Summary:
+      missing bits from previous changes
+    Revision:
+      disorder--mainline--0.1--patch-109
+
+    * scripts/htmlman: make generated web pages use the new menu
+      infrastructure.
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 scripts/htmlman
+
+
+2005-02-19 23:18:21 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-108
+
+    Summary:
+      revert clumsiness
+    Revision:
+      disorder--mainline--0.1--patch-108
+
+    * templates/choose.html: accidentally reverted class change in patch-107.
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 templates/choose.html
+
+
+2005-02-19 23:10:17 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-107
+
+    Summary:
+      flexible menu infrastructure, new default menu layout
+    Revision:
+      disorder--mainline--0.1--patch-107
+
+    * progs/dcgi.c: @action@ expansion to make determining the current action
+      easier.
+    
+    * templates/options.labels: default 'menu' label to 'topbar'
+    
+    * doc/disorder_config.5.in: document 'menu' label and @action@ expansion
+    * templates/help.html: updated for the above changes
+    
+    * templates/topbar.html: new default menu template
+    * templates/topbarend.html: menu tempates now have a closing half too,
+      where the credits are output from.
+    * templates/stylesheet.html: formatting rules for topbar; make title
+      bigger to stand out against (rather big and friendly) menu items.
+    
+    * templates/sidebar.html: open the content div from the sidebar template
+    * templates/sidebarend.html: final half of sidebar template closes the
+      content div as well as outputting the credits.
+
+    new files:
+     templates/sidebarend.html templates/topbar.html
+     templates/topbarend.html
+
+    modified files:
+     CHANGES ChangeLog.d/disorder--mainline--0.1
+     doc/disorder_config.5.in progs/dcgi.c templates/Makefile.am
+     templates/about.html templates/choose.html
+     templates/choosealpha.html templates/help.html
+     templates/options.labels templates/playing.html
+     templates/prefs.html templates/recent.html
+     templates/search.html templates/sidebar.html
+     templates/stylesheet.html templates/volume.html
+
+
+2005-02-19 22:02:08 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-106
+
+    Summary:
+      more powerful management page
+    Revision:
+      disorder--mainline--0.1--patch-106
+
+    * templates/playing.html: put volume control into management page
+    * templates/options.labels: new playing.volume label;
+      playing.{random,playing} labels now contain the colon formerly in the
+      template (for greater flexibility).
+    * doc/disorder_config.5.in: document playing.volume (and playing.playing
+      which was formerly missing)
+
+    modified files:
+     CHANGES ChangeLog.d/disorder--mainline--0.1
+     doc/disorder_config.5.in templates/options.labels
+     templates/playing.html
+
+
+2005-02-19 21:28:20 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-105
+
+    Summary:
+      volume control bug fixes + visual improvements
+    Revision:
+      disorder--mainline--0.1--patch-105
+
+    * progs/dcgi.c: make act_volume() redirect back to itself when a change
+      occurs, so that it's safe to reload volume pages
+    * templates/volume.html: use new graphics for up/down
+    * templates/stylesheet.html: center volume control
+    * templates/options.labels: volume.{left,right} set to null on the
+      assumption that user can deduce that the left and rights input boxes
+      control the left and right speakers respectively
+
+    modified files:
+     CHANGES ChangeLog.d/disorder--mainline--0.1 progs/dcgi.c
+     templates/options.labels templates/stylesheet.html
+     templates/volume.html
+
+
+2005-02-19 21:03:03 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-104
+
+    Summary:
+      more graphical improvements
+    Revision:
+      disorder--mainline--0.1--patch-104
+
+    * images/scratch.png, images/noscratch.png: cleaner scratch button
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 images/noscratch.png
+     images/scratch.png
+
+
+2005-02-19 20:37:56 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-103
+
+    Summary:
+      tidy up graphics a little
+    Revision:
+      disorder--mainline--0.1--patch-103
+
+    * images/edit.png: truncate the pencil perpendicular to its long axis,
+      rather than according to the corner of the bounding square, to
+      eliminate the visually confusing corner.
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 images/edit.png
+
+
+2005-02-19 20:32:56 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-102
+
+    Summary:
+      grey out inactive buttons
+    Revision:
+      disorder--mainline--0.1--patch-102
+
+    * progs/dcgi.c: @isfirst@ and @islast@ expansions report whether this is
+      the first or last (or other) iteration of a recursive template
+      expansion.
+    * templates/playing.html: 'grey out' up/down buttons for first/last track
+      in queue (since they don't do anything useful).
+    * doc/disorder_config.5.in: document @isfirst@/@islast@
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 doc/disorder_config.5.in
+     progs/dcgi.c progs/dcgi.h templates/playing.html
+
+
+2005-02-19 20:17:40 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-101
+
+    Summary:
+      ignore whitespace between expansion arguments
+    Revision:
+      disorder--mainline--0.1--patch-101
+
+    * progs/cgi.c: ignore whitespace after '}' and at the start and end of
+      unquoted template expansion args.
+    * doc/disorder_config.5.in: document new whitespace rules
+    * templates/playing.html: missing class attribute on an img
+
+    modified files:
+     CHANGES ChangeLog.d/disorder--mainline--0.1
+     doc/disorder_config.5.in progs/cgi.c templates/playing.html
+
+
+2005-02-19 19:05:29 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-100
+
+    Summary:
+      graphical buttons in web interface
+    Revision:
+      disorder--mainline--0.1--patch-100
+
+    * README, README.upgrades: mention appearance of /static
+    * doc/disorder_config.5.in: document url.static
+    
+    * templates/choose.html: graphical button for edit
+    * templates/help.html: catch up with graphical buttons; tidy up a bit.
+    * templates/playing.html: graphic buttons for scratch/remove/up/down
+    * templates/recent.html: graphical button for edit
+    * templates/stylesheet.html: img.button class for new graphical buttons
+    
+    * images/*.png: new graphics
+    
+    * debian/options.debian: debian-specific location for static content
+    * debian/conffiles: options.debian is a conffile
+    * debian/rules.m4: install static content under /var/www
+                       install options.debian
+    
+    * progs/play.h: update copyright date
+    * examples/Makefile.am: update copyright date
+    * progs/daemonize.c: update copyright date
+
+    new files:
+     debian/options.debian images/.arch-ids/=id
+     images/.arch-ids/down.png.id images/.arch-ids/edit.png.id
+     images/.arch-ids/nodown.png.id
+     images/.arch-ids/noscratch.png.id images/.arch-ids/noup.png.id
+     images/.arch-ids/scratch.png.id images/.arch-ids/up.png.id
+     images/Makefile.am images/down.png images/edit.png
+     images/nodown.png images/noscratch.png images/noup.png
+     images/scratch.png images/up.png
+
+    modified files:
+     CHANGES ChangeLog.d/disorder--mainline--0.1 Makefile.am README
+     README.upgrades configure.ac debian/Makefile.am
+     debian/autorules.m4 debian/conffiles debian/rules.m4
+     doc/disorder_config.5.in examples/Makefile.am
+     progs/daemonize.c progs/play.h templates/choose.html
+     templates/help.html templates/playing.html
+     templates/recent.html templates/stylesheet.html
+
+    new directories:
+     images images/.arch-ids
+
+
+2005-02-19 14:16:39 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-99
+
+    Summary:
+      restore debian/changelog to proper name
+    Revision:
+      disorder--mainline--0.1--patch-99
+
+    * debian/changelog: rename back to the standard name.  I can't quite see
+      from the change history why it was changelog.Debian in the first place.
+      Hopefuly nothing will break.
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 debian/Makefile.am
+     debian/autorules.m4
+
+    renamed files:
+     debian/changelog.Debian
+       ==> debian/changelog
+
+
+2005-02-18 20:49:17 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-98
+
+    Summary:
+      docs catch up with changes below
+    Revision:
+      disorder--mainline--0.1--patch-98
+
+    * doc/disorder_protocol.5.in: document new 'quitting' state
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 doc/disorder_protocol.5.in
+
+
+2005-02-18 20:27:06 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-97
+
+    Summary:
+      mention previous bug fix
+    Revision:
+      disorder--mainline--0.1--patch-97
+
+    * CHANGES: mention previous bug fix
+
+    modified files:
+     CHANGES ChangeLog.d/disorder--mainline--0.1
+
+
+2005-02-18 20:15:05 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-96
+
+    Summary:
+      add current track to recently played list on server shutdown
+    Revision:
+      disorder--mainline--0.1--patch-96
+
+    When the recently played list was not preserved across restarts this was
+    unnecessary.  It was left out when it started being preserved.
+    
+    * progs/play.c: when quitting, explicitly call player_finished() to get
+      the track added to the recently played list (and do notifications etc)
+    * progs/state.c: tell playing module we're quitting rather than just
+      disabling playing and expecting it to guess
+    * lib/queue.h: new track state for a track terminated by server shutdown
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 lib/queue.c lib/queue.h
+     progs/dcgi.c progs/play.c progs/play.h progs/state.c
+
+
+2005-02-18 16:51:04 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-95
+
+    Summary:
+      disorder.monitor python class
+    Revision:
+      disorder--mainline--0.1--patch-95
+
+    * python/disorder.py.in: disorder.monitor class provides cooked access to
+      event log
+    * examples/disorder-log: sketch example of using disorder.monitor
+    
+    * CHANGES: mention event log changes
+
+    new files:
+     examples/disorder-log
+
+    modified files:
+     CHANGES ChangeLog.d/disorder--mainline--0.1
+     examples/Makefile.am python/disorder.py.in
+
+
+2005-02-18 15:56:49 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-94
+
+    Summary:
+      event log interface
+    Revision:
+      disorder--mainline--0.1--patch-94
+
+    * lib/eventlog.c: new event log interface for sending messages to clients
+      that issue the 'log' command
+    * lib/queue.c: event log queue, moved, removed, recent-* messages
+    * progs/play.c: event log completed, scratched, failed, playing messages
+    * progs/disorder.c: mention event log in command help
+    * progs/server.c: use event log interface for 'log' command
+    
+    * lib/log.c: don't send log messages to clients; logging interface is
+      simplified slightly.
+    * progs/daemonize.c: following simplified logging interface
+    
+    * doc/disorder_protocol.5.in: document event log
+    
+    * lib/configuration.c: remove left-over debugging printf, oops!
+    * progs/server.c: set SO_REUSEADDR so we don't have to cool off a bit
+      before binding to a TCP socket again.
+
+    new files:
+     lib/eventlog.c lib/eventlog.h
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 doc/disorder.1.in
+     doc/disorder_protocol.5.in lib/Makefile.am lib/configuration.c
+     lib/log.c lib/log.h lib/queue.c progs/daemonize.c
+     progs/disorder.c progs/play.c progs/server.c
+     python/disorder.py.in
+
+
+2005-02-17 00:02:42 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-93
+
+    Summary:
+      put README on the web
+    Revision:
+      disorder--mainline--0.1--patch-93
+
+    * scripts/dist: put README on the web
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 scripts/dist
+
+
+2005-02-16 23:49:44 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-92
+
+    Summary:
+      update copyright dates for files changed in 2005
+    Revision:
+      disorder--mainline--0.1--patch-92
+
+    * scripts/check: case independent check
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 debian/copyright
+     lib/client.c lib/client.h lib/kvp.c lib/kvp.h lib/log.c
+     lib/log.h lib/table.h plugins/tracklength.c progs/Makefile.am
+     progs/cgi.h progs/cgimain.c progs/tracks.h scripts/check
+     templates/Makefile.am templates/choose.html
+     templates/playing.html templates/recent.html
+     templates/search.html
+
+
+2005-02-16 23:40:00 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-91
+
+    Summary:
+      unicode search strings
+    Revision:
+      disorder--mainline--0.1--patch-91
+
+    * templates/search.html: use POST with multipart/form-data and an
+      explicit charset for the search form, rather than GET, so that we can
+      portably have non-ASCII characters in search terms.
+      back= URLs still use GET, but we can interpret query strings that
+      encode non-ASCII characters however we choose, and we choose UTF-8.
+
+    modified files:
+     CHANGES ChangeLog.d/disorder--mainline--0.1
+     templates/search.html
+
+
+2005-02-16 23:13:16 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-90
+
+    Summary:
+      configurable scratch signal
+    Revision:
+      disorder--mainline--0.1--patch-90
+
+    * lib/configuration.c: new 'signal' configuration item controls the
+      signal that will be used to interrupt players.  Default SIGINT.
+    * progs/play.c: interrupt tracks using configured signal
+    
+    * lib/table.h: document TABLE_FIND() macro
+    
+    * doc/disorder_config.5.in: document 'signal'
+    * doc/disorder.3: document scratching interface.
+    
+    I've only listed signals from glibc's <bits/signal.h>; more could easily
+    be added.
+
+    modified files:
+     CHANGES ChangeLog.d/disorder--mainline--0.1 doc/disorder.3
+     doc/disorder_config.5.in lib/configuration.c
+     lib/configuration.h lib/table.h progs/play.c
+
+
+2005-02-16 22:17:38 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-89
+
+    Summary:
+      make artist/album in playing/recent be links
+    Revision:
+      disorder--mainline--0.1--patch-89
+
+    * progs/dcgi.c: generalize @dirname@ and @basename@
+    * templates/playing.html: make artist/album be links
+    * templates/recent.html: make artist/album be links
+    * doc/disorder_config.5.in: document extended @dirname@/@basename@
+
+    modified files:
+     CHANGES ChangeLog.d/disorder--mainline--0.1
+     doc/disorder_config.5.in progs/dcgi.c templates/playing.html
+     templates/recent.html
+
+
+2005-02-16 21:32:50 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-88
+
+    Summary:
+      improved track selection extended to searching, debugged
+    Revision:
+      disorder--mainline--0.1--patch-88
+
+    The previous approach, of recording the directory to go back to, didn't
+    work for searching and didn't work properly where a regexp argument
+    reduced the set of tracks listed.  The new approach is to specify the
+    exact URL to return to.
+    
+    * progs/dcgi.c: new 'back' CGI argument provides URL to redirect back to
+      after any operation except 'playing'.  We use this to simply act_play().
+      New @thisurl@ expansion gives the current page's URL, with a freshened
+      nonce.
+    
+    * templates/choose.html: use new 'back' behaviour; canonicalize name of
+      nonce arguments.
+    * templates/help.html: canonicalize name of nonce arguments.
+    * templates/search.html: use new 'back' behaviour as per choose.html
+    
+    * doc/disorder_config.5.in: document the above
+
+    modified files:
+     CHANGES ChangeLog.d/disorder--mainline--0.1
+     doc/disorder_config.5.in progs/dcgi.c templates/choose.html
+     templates/help.html templates/search.html
+
+
+2005-02-06 23:45:49 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-87
+
+    Summary:
+      typo
+    Revision:
+      disorder--mainline--0.1--patch-87
+
+    * doc/disorder_config.5.in: typo fix
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 doc/disorder_config.5.in
+
+
+2005-02-06 23:44:50 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-86
+
+    Summary:
+      improved track picking interface
+    Revision:
+      disorder--mainline--0.1--patch-86
+
+    This change follows watching a user pick several tracks fromg a single
+    album without the benefit of an 'open in new tab' client command (the
+    client they were using had the feature but they didn't know to use it).
+    
+    The new behaviour is that when you pick a track to be played you stay on
+    the same screen, with an indicator appearing beside the track to show
+    that it is on the queue.
+    
+    The old behaviour is still available, by editing templates/choose.html.
+    
+    * lib/kvp.c: urlencodestring() provides a more convenient interface for
+      getting url-encoded strings
+    * progs/dcgi.c: action=play now takes a back=directory argument to
+      redirect back into action=choose with a chosen directory.  Used to stay
+      on the same page when choosing multiple tracks.
+      New @trackstate@ action reports current track state as 'playing',
+      'queued' or '' if neither.
+    * templates/choose.html: use the above to stay on the same page when
+      choosing tracks while also giving visual feedback
+    * doc/disorder_config.5.in: document the above changes
+    * CHANGES: mention recent changes
+
+    modified files:
+     CHANGES ChangeLog.d/disorder--mainline--0.1
+     doc/disorder_config.5.in lib/kvp.c lib/kvp.h progs/dcgi.c
+     templates/choose.html
+
+
+2005-02-06 20:39:47 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-85
+
+    Summary:
+      faster searching
+    Revision:
+      disorder--mainline--0.1--patch-85
+
+    * progs/tracks.c: track_search() retrieves word list for each track from
+      isearch database, which is rather fewer queries than reconstructing the
+      word list on the fly.
+      isearch_words() factors out common code for getting word lists from
+      isearch.db.
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 progs/tracks.c
+
+
+2005-02-06 18:37:32 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-84
+
+    Summary:
+      inverse search index
+    Revision:
+      disorder--mainline--0.1--patch-84
+
+    * progs/tracks.c: isearch.db is 'inverse' of search db, so we can keep
+      search db properly up to date.
+      DBCALL writes to debug output.
+      get/put write to debug output, report db name
+      opendb() centralizes database opening
+      track_getpart() wraps trackname_part(), doing database lookup too
+    * progs/server.c: use track_getpart() instead of manually checking
+      database and calling trackname_part().
+    * lib/log.c: report file/line in debug output
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 lib/configuration.c
+     lib/configuration.h lib/log.c lib/log.h progs/cgi.h
+     progs/server.c progs/tracks.c progs/tracks.h
+
+
+2005-02-06 16:00:55 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-83
+
+    Summary:
+      internal documentation
+    Revision:
+      disorder--mainline--0.1--patch-83
+
+    * progs/tracks.c: describe current database tables
+
+    modified files:
+     CHANGES ChangeLog.d/disorder--mainline--0.1 progs/tracks.c
+
+
+2005-02-05 19:50:44 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-82
+
+    Summary:
+      tkdisorder improvements
+    Revision:
+      disorder--mainline--0.1--patch-82
+
+    * python/tkdisorder: use a canvas to display queue/recent listings,
+      showing artist, album and title.  A bit slow.  Could use timings,
+      submitters, etc too.
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 python/tkdisorder
+
+
+2005-02-05 18:18:16 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-81
+
+    Summary:
+      avoid accumulating overlarge recently played list
+    Revision:
+      disorder--mainline--0.1--patch-81
+
+    * lib/queue.c: recompute size of 'recent' list on loading it.  Previously
+      it was not recounted but started again from 0 even if it wasn't empty;
+      so restarting the server effectively bumped the history variable
+      upwards by whatever the current size of the list was.
+    * {arch}/=tagging-method: ignore =obj directory
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 lib/queue.c
+     {arch}/=tagging-method
+
+
+2005-02-05 17:20:43 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-80
+
+    Summary:
+      make tkdisorder use 'part' command
+    Revision:
+      disorder--mainline--0.1--patch-80
+
+    * python/tkdisorder: replace local track parsing with calls to
+      disorder.client.part()
+    * python/disorder.py.in: DISORDER_PYTHON_DEBUG can be used to turn on
+      disorder.py debugging
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 python/disorder.py.in
+     python/tkdisorder
+
+
+2005-02-05 15:33:36 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-79
+
+    Summary:
+      build fixes
+    Revision:
+      disorder--mainline--0.1--patch-79
+
+    * lib/types.h: work around broken apple header file by undefining PRI?MAX
+      values that GNU C rejects in pedantic mode.
+    * plugins/tracklength.c: cast strncmp() args to reliably match declaration
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 lib/types.h
+     plugins/tracklength.c
+
+
+2005-02-05 15:12:52 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-78
+
+    Summary:
+      fix trackname parsing for scratches
+    Revision:
+      disorder--mainline--0.1--patch-78
+
+    * progs/server.c: don't insist that the track exists, as this can break
+      scratches which aren't required to 'exist' (in this sense)
+    * progs/trackname.c: new internal program exposes trackname_part() for
+      testing purposes.
+
+    new files:
+     progs/trackname.c
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 progs/Makefile.am
+     progs/server.c
+
+
+2005-02-05 11:54:53 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-77
+
+    Summary:
+      move trackname parsing into server
+    Revision:
+      disorder--mainline--0.1--patch-77
+
+    Moving the trackname parsing into the server allows every client to get
+    the same logic without having to locally reimplement it.
+    
+    * debian/disorder.config: add namepart directives
+    * examples/config.sample.in: add namepart directives
+    * doc/disorder_config.5.in: document namepart directive; remove
+      trackname-part references.
+    
+    * lib/trackname.c: trackname_part() function does regexp substitution
+      based on namepart directives.
+    * lib/configuration.c: namepart directive
+    * lib/regsub.c: moved to lib
+    
+    * progs/server.c: implement 'part' command
+    * lib/client.c: add disorder_part() function; report transmitted commands
+      in debug output.
+    * doc/disorder_protocol.5.in: document 'part' command
+    
+    * progs/disorder.c: expose 'part' command to command line
+    * doc/disorder.1.in: document 'part' command
+    
+    * python/disorder.py.in: expose 'part' command to python
+    
+    * progs/cgi.c: abolish trackname-part
+    * progs/cgimain.c: environment variable DISORDER_DEBUG enables debugging.
+    * progs/dcgi.c: use disorder_part() to get track name parts
+    * templates/options: options.trackname is gone
+    * templates/options.trackname: gone
+    
+    * README.upgrades: new upgrading instructions mention this change.
+    * README: mention README.upgrades
+
+    new files:
+     README.upgrades lib/trackname.c lib/trackname.h
+
+    removed files:
+     templates/options.trackname
+
+    modified files:
+     CHANGES ChangeLog.d/disorder--mainline--0.1 Makefile.am README
+     debian/disorder.config doc/disorder.1.in
+     doc/disorder_config.5.in doc/disorder_protocol.5.in
+     examples/config.sample.in lib/Makefile.am lib/client.c
+     lib/client.h lib/configuration.c lib/configuration.h
+     progs/Makefile.am progs/cgi.c progs/cgimain.c progs/dcgi.c
+     progs/disorder.c progs/server.c python/disorder.py.in
+     templates/Makefile.am templates/options
+
+    renamed files:
+     progs/regsub.c
+       ==> lib/regsub.c
+     progs/regsub.h
+       ==> lib/regsub.h
+
+
+2005-02-04 13:29:13 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-76
+
+    Summary:
+      preparations for the future
+    Revision:
+      disorder--mainline--0.1--patch-76
+
+    Prepare for move of DisOrder website to www.greenend.org/rjk/disorder.
+    Version number to 1.1+dev.
+
+    modified files:
+     CHANGES ChangeLog.d/disorder--mainline--0.1 configure.ac
+     debian/copyright scripts/check scripts/dist
+     templates/about.html templates/credits.html
+
+
+2005-02-03 22:26:13 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-75
+
+    Summary:
+      better ChangeLog.d handling
+    Revision:
+      disorder--mainline--0.1--patch-75
+
+    Distribute ChangeLog.d/* by mentioning it in EXTRA_DIST rather than
+    giving it its own Makefile.
+
+    removed files:
+     ChangeLog.d/Makefile.am
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 Makefile.am configure.ac
+
+
+2005-02-03 17:07:25 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-74
+
+    Summary:
+      automake bodge
+    Revision:
+      disorder--mainline--0.1--patch-74
+
+    * prepare: make sure Automake adds INSTALL, but doesn't fall over because
+      of missing ChangeLog.
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 prepare
+
+
+2005-02-03 00:02:59 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-73
+
+    Summary:
+      fix up dist script
+    Revision:
+      disorder--mainline--0.1--patch-73
+
+    * scripts/dist: install change history files
+    
+    
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 scripts/dist
+
+
+2005-02-02 23:50:09 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-72
+
+    Summary:
+      release 1.1
+    Revision:
+      disorder--mainline--0.1--patch-72
+
+    * configure.ac, CHANGES, debian/changelog.Debian: version number to 1.1
+    * debian/control: Build-Depends on libdb4.3 then libdb4.2
+    * scripts/makedeb: bzip2
+    * scripts/check: script to scan for missing copyright dates
+    * lib/Makefile.am: tie libdisorder shared library version to disorder
+      version to avoid appearing to promise anything about ABI stability.
+    
+    Everything else: missing copyright dates.
+
+    new files:
+     scripts/check
+
+    modified files:
+     CHANGES ChangeLog.d/disorder--mainline--0.1 configure.ac
+     debian/changelog.Debian debian/config debian/control
+     doc/Makefile.am doc/disorder.3 doc/disorderd.8.in
+     lib/Makefile.am lib/charset.c lib/charset.h
+     lib/configuration.c lib/configuration.h lib/disorder.h
+     lib/hex.c lib/hex.h lib/plugin.c lib/plugin.h lib/queue.h
+     lib/types.h lib/utf8.h plugins/notify.c plugins/pick.c
+     progs/cgi.c progs/dcgi.c progs/play.c progs/server.c
+     progs/state.c progs/tracks.c python/Makefile.am
+     scripts/Makefile.am scripts/inst scripts/makedeb
+     scripts/sedfiles.make templates/credits.html
+     templates/help.html templates/prefs.html
+
+
+2005-02-01 20:09:19 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-71
+
+    Summary:
+      more portability fixes
+    Revision:
+      disorder--mainline--0.1--patch-71
+
+    The aim is to build with CC=gcc -std=c89 -pedantic, though sadly it's not
+    practical to add -Werror in there as well.
+    
+    * configure.ac: turn on -Werror (if that's being used) when checking for
+      long long, since that's how it'll be used later on.  In fact this only
+      rejects long long for compilers that warn but accept it, but it's
+      useful to be able to build without long long being available.
+      However, we disable -Werror if we can't convert function pointers to
+      object pointers without warning: DisOrder without dlsym() is
+      essentially hopeless.
+    * lib/basen.c: rename div to divide (libc conflict)
+    * lib/configuration.c: variable initializers are not allowed in C89
+    * lib/types.h: include <stdlib.h> before redefing atoll() etc
+      Define PRIxMAX
+    * progs/server.c: use uintmax_t rather than explicit unsigned long long
+      to report times in client log messages.
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 configure.ac lib/basen.c
+     lib/configuration.c lib/types.h progs/server.c
+
+
+2005-01-30 13:08:35 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-70
+
+    Summary:
+      cope with broken darwin headers
+    Revision:
+      disorder--mainline--0.1--patch-70
+
+    'gcc-3.3 -std=c99' on Darwin turns declaration of strtoll and atoll off,
+    even though they are in the C99 library clause.
+    
+    * plugins/pick.c: cope with undeclared atoll
+    * lib/types.h: cope with undeclared strtoll/atoll
+    * configure.ac: check whether strtoll/atoll are declared; include
+      <sys/types.h> for ssize_t
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 configure.ac lib/types.h
+     plugins/pick.c
+
+
+2005-01-29 19:18:11 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-69
+
+    Summary:
+      libdb version checking makes more sense
+    Revision:
+      disorder--mainline--0.1--patch-69
+
+    * progs/tracks.c: reverse sense of libdb 4.2/4.3 tests; now DB42 means
+      just libdb 4.2, rather than DB43 meaning anything from 4.3 onwards.
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 progs/tracks.c
+
+
+2005-01-27 23:49:50 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-68
+
+    Summary:
+      fix botched libdb upgrade
+    Revision:
+      disorder--mainline--0.1--patch-68
+
+    * progs/tracks.c: 4.2 code was bust, restore
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 progs/tracks.c
+
+
+2005-01-27 23:47:29 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-67
+
+    Summary:
+      improved distribution script
+    Revision:
+      disorder--mainline--0.1--patch-67
+
+    * scripts/webman: dead
+    * scripts/dist: new distribution script installs tarball and web man
+      pages in right place
+
+    new files:
+     scripts/dist
+
+    removed files:
+     scripts/webman
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1
+
+
+2005-01-27 23:37:34 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-66
+
+    Summary:
+      abolish backward compatibility code
+    Revision:
+      disorder--mainline--0.1--patch-66
+
+    * progs/tracks.c: remove upgrade code for ancient database location and
+      content
+    * README: db 4.3 and gcc 3.4 work
+
+    modified files:
+     CHANGES ChangeLog.d/disorder--mainline--0.1 README
+     progs/tracks.c
+
+
+2005-01-27 23:20:21 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-65
+
+    Summary:
+      db version 4.3 support
+    Revision:
+      disorder--mainline--0.1--patch-65
+
+    We support 4.2 and 4.3 for now.  4.2 support can be expected to go away
+    at some point.
+    
+    * progs/tracks.c: db4.3 support
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 progs/tracks.c
+
+
+2005-01-27 22:55:36 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-64
+
+    Summary:
+      spelling corrections
+    Revision:
+      disorder--mainline--0.1--patch-64
+
+    * python/disorder.py.in: minor typo fixes
+    * doc/disorder_config.5.in: typo fix
+    * progs/disorder.c: typo fix
+
+    modified files:
+     CHANGES ChangeLog.d/disorder--mainline--0.1
+     doc/disorder_config.5.in progs/disorder.c
+     python/disorder.py.in
+
+
+2005-01-25 23:52:36 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-63
+
+    Summary:
+      C dialect strictness
+    Revision:
+      disorder--mainline--0.1--patch-63
+
+    * configure.ac: move _GNU_SOURCE define above library checks, since
+      <db.h> gets on badly with -std=c89 otherwise.
+    * lib/configuration.h: 'restrict' is a C99 keyword, don't use it as a
+      structure member name!
+    * lib/configuration.c: 'restrict' option field is now 'restrictions'
+    * progs/server.c: 'restrict' option field is now 'restrictions'
+    * progs/dcgi.c: 'restrict' option field is now 'restrictions'
+    * progs/cgi.c: remove extraneous semicolon
+    * lib/plugin.c: cast to keep gcc --std=c99 -pedantic happy
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 configure.ac
+     lib/configuration.c lib/configuration.h lib/plugin.c
+     progs/cgi.c progs/dcgi.c progs/server.c
+
+
+2005-01-25 18:35:36 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-62
+
+    Summary:
+      completion.bash
+    Revision:
+      disorder--mainline--0.1--patch-62
+
+    * scripts/completion.bash: renamed from disorder-bash-completion.
+      'disorder' will already be in the path since it is installed to
+      pkgdatadir.
+
+    modified files:
+     CHANGES ChangeLog.d/disorder--mainline--0.1 README
+     scripts/Makefile.am
+
+    renamed files:
+     scripts/disorder-bash-completion
+       ==> scripts/completion.bash
+
+
+2005-01-24 19:49:23 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-61
+
+    Summary:
+      bash completion
+    Revision:
+      disorder--mainline--0.1--patch-61
+
+    * scripts/disorder-bash-completion: bash completion for disorder and
+      disorderd
+
+    new files:
+     scripts/disorder-bash-completion
+
+    modified files:
+     CHANGES ChangeLog.d/disorder--mainline--0.1
+     scripts/Makefile.am
+
+
+2005-01-24 01:47:36 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-60
+
+    Summary:
+      more UTF-8 testing stuff
+    Revision:
+      disorder--mainline--0.1--patch-60
+
+    * lib/charset.c: ucs4cmp, used in testing
+    * lib/test.c: fix broken UTF-8 testing
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 lib/charset.c
+     lib/charset.h lib/test.c
+
+
+2005-01-24 01:42:37 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-59
+
+    Summary:
+      more tests
+    Revision:
+      disorder--mainline--0.1--patch-59
+
+    * lib/charset.c: new ucs42utf8 function, currently only used by tests
+    * lib/test.c: test hex codec; ucs42utf8; casefold; check the basic
+      character set looks like ASCII.
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 lib/charset.c
+     lib/charset.h lib/test.c
+
+
+2005-01-23 19:17:20 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-58
+
+    Summary:
+      eliminate bogus diagnostics
+    Revision:
+      disorder--mainline--0.1--patch-58
+
+    * lib/hex.c: prevoius change to unhexdigit() produced an error on every
+      call.  Oops.
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 lib/hex.c
+
+
+2005-01-23 19:08:58 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-57
+
+    Summary:
+      base64 corrections
+    Revision:
+      disorder--mainline--0.1--patch-57
+
+    * lib/test.c: MIME base64 tests
+    * lib/mime.c: corrected base64 parsing
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 lib/mime.c lib/test.c
+
+
+2005-01-23 18:18:25 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-56
+
+    Summary:
+      quoted-printable tests and fixes
+    Revision:
+      disorder--mainline--0.1--patch-56
+
+    * lib/test.c: a few MIME decoding tests
+    * lib/hex.c: quiet hex digit conversion
+    * lib/mime.c: corrected decoding of quoted-printable;
+      eliminate bogus diagnostics
+
+    modified files:
+     CHANGES ChangeLog.d/disorder--mainline--0.1 lib/hex.c
+     lib/hex.h lib/mime.c lib/test.c
+
+
+2005-01-23 17:49:14 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-55
+
+    Summary:
+      tests, further UTF-8 improvements
+    Revision:
+      disorder--mainline--0.1--patch-55
+
+    * lib/test.c: tests for UTF-8 decoding and validation
+    * lib/utf8.h: corrected again, sigh
+    * lib/Makefile.am: run library tests at build time (not that there are
+      many of them)
+
+    new files:
+     lib/test.c
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 lib/Makefile.am lib/utf8.h
+
+
+2005-01-19 23:09:55 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-54
+
+    Summary:
+      finally correct UTF-8 checking
+    Revision:
+      disorder--mainline--0.1--patch-54
+
+    * lib/utf8.h: check for invalid UTF-8 sequences more strictly
+                  parse [U+10000,U+10FFFF] correctly(!)
+    * lib/utf8.c: validutf8() function checks a string
+    * progs/cgi.c: use validutf8() instead of wrongly(!) checking manually.
+
+    new files:
+     lib/utf8.c
+
+    modified files:
+     CHANGES ChangeLog.d/disorder--mainline--0.1 lib/Makefile.am
+     lib/utf8.h progs/cgi.c
+
+
+2005-01-18 20:49:23 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-53
+
+    Summary:
+      stricter CGI arg checking
+    Revision:
+      disorder--mainline--0.1--patch-53
+
+    * progs/cgi.c: UTF-8 checking of CGI arguments
+
+    modified files:
+     CHANGES ChangeLog.d/disorder--mainline--0.1 progs/cgi.c
+
+
+2005-01-17 23:39:46 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-52
+
+    Summary:
+      make prefs.html self-consistent
+    Revision:
+      disorder--mainline--0.1--patch-52
+
+    * templates/prefs.html: even/odd styles count from 0, not 1 l-)
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 templates/prefs.html
+
+
+2005-01-17 23:26:15 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-51
+
+    Summary:
+      base64/qp support in MIME parsing
+    Revision:
+      disorder--mainline--0.1--patch-51
+
+    * lib/mime.c: base64 and qp support for MIME body parts.  mime_header()
+      becomes mime_parse() and promises do deal with
+      content-transfer-encoding for you.
+    * progs/cgi.c: track mime.c changes
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 lib/mime.c lib/mime.h
+     progs/cgi.c
+
+
+2005-01-17 22:31:40 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-50
+
+    Summary:
+      use multipart/form-data for preference submissions
+    Revision:
+      disorder--mainline--0.1--patch-50
+
+    * progs/cgi.c: accept multipart/form-data POST data.  Note that the
+      character set is assumed to be UTF-8.
+    * lib/mime.c,: enough MIME support for multipart/form-data support.  We
+      don't do QP or BASE64 yet(!)
+    * templates/prefs.html: use multi-part/form-data submission for
+      preference updates.
+
+    new files:
+     lib/mime.c lib/mime.h
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 lib/Makefile.am
+     progs/cgi.c templates/prefs.html
+
+
+2005-01-16 19:57:33 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-49
+
+    Summary:
+      python administrivia
+    Revision:
+      disorder--mainline--0.1--patch-49
+
+    * doc/Makefile.am: ship tkdisorder.1
+    * doc/tkdisorder.1: refer to 'pydoc disorder'
+    * doc/disorder.1.in: refer to 'pydoc disorder'
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 doc/Makefile.am
+     doc/disorder.1.in doc/tkdisorder.1
+
+
+2005-01-16 16:25:33 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-48
+
+    Summary:
+      tkdisorder administrivia
+    Revision:
+      disorder--mainline--0.1--patch-48
+
+    * python/disorder.py.in: copyright message, version number
+    * python/tkdisorder: copyright message, display version
+    * scripts/sedfiles.make: version number substitution
+    * doc/tkdisorder.1: document tkdisorder
+
+    new files:
+     doc/tkdisorder.1
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 doc/Makefile.am
+     python/Makefile.am python/disorder.py.in python/tkdisorder
+     scripts/sedfiles.make
+
+
+2005-01-16 15:20:43 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-47
+
+    Summary:
+      more user-friendly "cooked" preferences interface
+    Revision:
+      disorder--mainline--0.1--patch-47
+
+    * templates/prefs.html: cooked preferences; wider input boxes
+    * templates/options.labels: new labels for cooked prefs
+    * templates/help.html: describe cooked preferences interface
+    * progs/dcgi.c: prefs is now a proper action, @prefs@ just iterates over
+      the set preferences.  @pref@ added.  @part@ can now take a track name.
+    * doc/disorder_config.5.in: document new/modified expansions and action
+    * CHANGES: mention cooked prefs
+
+    modified files:
+     CHANGES ChangeLog.d/disorder--mainline--0.1
+     doc/disorder_config.5.in progs/dcgi.c templates/help.html
+     templates/options.labels templates/prefs.html
+
+
+2005-01-12 23:24:12 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-46
+
+    Summary:
+      preserve recently played list across server restarts
+    Revision:
+      disorder--mainline--0.1--patch-46
+
+    * lib/queue.c: save/restore recently-played list
+    * progs/state.c: restore recently-played list at startup
+    * progs/play.c: save recently-played list after modifying it
+    * doc/disorderd.8.in: mention new file
+    * doc/disorder_config.5.in: recent list no longer nuked at startup
+    * CHANGES: mention the change
+    
+    A better approach might be for the mutating queue_*() functions to set a
+    flag, which is then queried each time round the event loop to determine
+    when a save is required.
+
+    modified files:
+     CHANGES ChangeLog.d/disorder--mainline--0.1
+     doc/disorder_config.5.in doc/disorderd.8.in lib/queue.c
+     lib/queue.h progs/disorder.c progs/play.c progs/state.c
+
+
+2005-01-04 19:56:52 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-45
+
+    Summary:
+      further tkdisorder improvements
+    Revision:
+      disorder--mainline--0.1--patch-45
+
+    * python/tkdisorder: break up QueueWidget into TrackListWidget and
+      {Queue,Recent}Widget, replacing callback with subclassing.
+      Add title to main window.
+      Be more careful about using clients from the right thread.
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 python/tkdisorder
+
+
+2005-01-03 16:30:02 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-44
+
+    Summary:
+      'recent' button
+    Revision:
+      disorder--mainline--0.1--patch-44
+
+    * python/tkdisorder: 'recent' button pops up a window with the last N
+      tracks.  Generalized QueueWidget a bit.  MonitorStateThread can have
+      widgets added to and removed from its notification list.
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 python/tkdisorder
+
+
+2005-01-03 14:39:10 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-43
+
+    Summary:
+      scratch button for tkdisorder
+    Revision:
+      disorder--mainline--0.1--patch-43
+
+    * python/tkdisorder: Quit and Scratch buttons
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 python/tkdisorder
+
+
+2005-01-03 14:21:33 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-42
+
+    Summary:
+      more efficient tkdisorder
+    Revision:
+      disorder--mainline--0.1--patch-42
+
+    We could make it more efficient yet by ignoring irrelevant log messages.
+    
+    * python/disorder.py.in: warning about disorder.log() return value
+    * python/tkdisorder: Use disorder.log() to watch for server state changes
+      rather than plling.  Also separate clients for separate threads rather
+      than locking a single client.
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 python/disorder.py.in
+     python/tkdisorder
+
+
+2005-01-03 13:51:01 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-41
+
+    Summary:
+      notifications and logs for queue and playing state changes
+    Revision:
+      disorder--mainline--0.1--patch-41
+
+    * lib/disorder.h: new notify plugin calls report when a track is moved or
+      removed in the queue
+    * doc/disorder.3: document new notify calls
+    * lib/plugin.c: stubs for new notify calls
+    * lib/plugin.c: stubs for new notify calls
+    * plugins/notify.c: empty implementations of new calls
+    
+    * lib/queue.c: call new notify plugin calls
+                   log queue changes
+    * progs/play.c: log playing, scratchin and completion of tracks
+                    unconditionally log playing status
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 doc/disorder.3
+     lib/disorder.h lib/plugin.c lib/plugin.h lib/queue.c
+     lib/queue.h plugins/notify.c progs/play.c progs/server.c
+
+
+2005-01-03 00:26:18 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-40
+
+    Summary:
+      update copyright dates
+    Revision:
+      disorder--mainline--0.1--patch-40
+
+    More copyright dates.
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 templates/about.html
+
+
+2005-01-03 00:25:36 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-39
+
+    Summary:
+      update copyright dates
+    Revision:
+      disorder--mainline--0.1--patch-39
+
+    It's 2005 now.
+
+    modified files:
+     ChangeLog.d/Makefile.am ChangeLog.d/disorder--mainline--0.1
+     Makefile.am README configure.ac debian/rules.m4
+     doc/disorder.1.in doc/disorder_config.5.in
+     doc/disorder_protocol.5.in lib/basen.c lib/basen.h lib/queue.c
+     prepare progs/disorder.c
+
+
+2005-01-03 00:21:16 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-38
+
+    Summary:
+      Typo fixes
+    Revision:
+      disorder--mainline--0.1--patch-38
+
+    Trivial corrections to various bits of documentation.
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 README doc/disorder.1.in
+     doc/disorder_config.5.in doc/disorder_protocol.5.in
+
+
+2005-01-02 23:56:24 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-37
+
+    Summary:
+      automake --foreign
+    Revision:
+      disorder--mainline--0.1--patch-37
+
+    Reduce Automake strictness and delete quietening files.
+
+    removed files:
+     .arch-ids/ChangeLog.id AUTHORS ChangeLog NEWS
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 prepare
+
+
+2005-01-02 21:31:11 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-36
+
+    Summary:
+      documentation trivia
+    Revision:
+      disorder--mainline--0.1--patch-36
+
+    * CHANGES: describe recent changes
+    * doc/disorder.1.in: unify remove/move language and caveat
+
+    modified files:
+     CHANGES ChangeLog.d/disorder--mainline--0.1 doc/disorder.1.in
+
+
+2005-01-02 21:16:36 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-35
+
+    Summary:
+      track ID improvements
+    Revision:
+      disorder--mainline--0.1--patch-35
+
+    * progs/disorder.c: report track id in output
+    * lib/basen.c: arbitrary base printer
+    * lib/queue.c: queue IDs are now base-62 not hex, making them much
+      shorter.  The serial number is made the most significant word to
+      increase diversity of adjacently generated IDs.
+
+    new files:
+     ChangeLog lib/basen.c lib/basen.h
+
+    modified files:
+     ChangeLog.d/disorder--mainline--0.1 lib/Makefile.am
+     lib/queue.c progs/disorder.c
+
+
+2005-01-02 20:42:37 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-34
+
+    Summary:
+      ChangeLog.d directory
+    Revision:
+      disorder--mainline--0.1--patch-34
+
+    Move changelogs into ChangeLog.d directory.
+    
+    * CHANGES: note movement of ChangeLogs
+
+    new files:
+     .arch-ids/ChangeLog.id ChangeLog ChangeLog.d/.arch-ids/=id
+     ChangeLog.d/Makefile.am
+
+    modified files:
+     CHANGES ChangeLog Makefile.am configure.ac debian/rules.m4
+
+    renamed files:
+     ChangeLog
+       ==> ChangeLog.d/disorder--mainline--0.1
+     ChangeLog.cvs
+       ==> ChangeLog.d/cvs--ChangeLog
+
+    new directories:
+     ChangeLog.d ChangeLog.d/.arch-ids
+
+
+2005-01-02 20:27:21 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-33
+
+    Summary:
+      expose track movement to the command line interface
+    Revision:
+      disorder--mainline--0.1--patch-33
+
+    * progs/disorder.c: implement 'move' command
+    * doc/disorder.1.in: document 'move' command
+
+    modified files:
+     ChangeLog doc/disorder.1.in progs/disorder.c
+
+
+2004-12-30 16:21:07 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-32
+
+    Summary:
+      sort 'The Beatles' under B not T
+    Revision:
+      disorder--mainline--0.1--patch-32
+
+    * progs/dcgi.c: filter according to regexp in the web interface rather
+      than in the server.  This is slower but can actually be made correct.
+      This might be a problem for sites with very large numbers of (in
+      particular) top-level directories.
+      part() is renamed tracknamepart() as a no-longer-required build fix,
+      but it's also a bit clearer what it does, so I left it in.
+    
+    * BUGS: remove fixed bugs.
+
+    modified files:
+     BUGS ChangeLog progs/dcgi.c
+
+
+2004-12-30 14:42:26 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-31
+
+    Summary:
+      strip out libdb backwards compatibility cruft
+    Revision:
+      disorder--mainline--0.1--patch-31
+
+    Anything before libdb 4.2 is now regarded obsolete, and thus the grotty
+    configure and preprocessor logic to support older versions is removed.
+    
+    * progs/dbfixup.h: removed
+    * progs/tracks.c: strip out db version fixup hackery.  Now we only
+      support libdb 4.2 (and possibly later).
+    * README: note that libdb 4.1 and earlier won't work
+    * progs/Makefile.am: dbfixup.h is gone
+    * configure.ac: remove obsolete libdb feature tests
+    
+
+    removed files:
+     progs/dbfixup.h
+
+    modified files:
+     ChangeLog README configure.ac progs/Makefile.am progs/tracks.c
+
+
+2004-12-30 14:18:19 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-30
+
+    Summary:
+      documentation fixups
+    Revision:
+      disorder--mainline--0.1--patch-30
+
+    * scripts/webman: html man pages are in doc directory now
+    * scripts/htmlman: fix title of unmunged man pages
+    * configure.ac: version number to 1.0+dev
+    
+
+    modified files:
+     ChangeLog configure.ac scripts/htmlman scripts/webman
+
+
+2004-12-30 12:55:48 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-29
+
+    Summary:
+      release 1.0
+    Revision:
+      disorder--mainline--0.1--patch-29
+
+    * README: list development-time dependencies
+    * scripts/Makefile.am: ship sedfiles.make
+    * debian/rules.m4: disorder.init and disorder.cgi moved
+    * debian/autorules.m4: debian.changelog moved
+    
+
+    modified files:
+     CHANGES ChangeLog README configure.ac debian/autorules.m4
+     debian/changelog.Debian debian/rules.m4 scripts/Makefile.am
+     scripts/makedeb
+
+
+2004-12-05 11:21:09 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-28
+
+    Summary:
+      more post-split tidy-up
+    Revision:
+      disorder--mainline--0.1--patch-28
+
+    * scripts/inst: disorder.cgi is in progs/ now
+
+    modified files:
+     ChangeLog scripts/inst
+
+
+2004-12-04 17:36:25 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-27
+
+    Summary:
+      more most-split tidy-ups
+    Revision:
+      disorder--mainline--0.1--patch-27
+
+    * debian/changelog.Debian: a saner name
+
+    modified files:
+     ChangeLog debian/Makefile.am debian/autorules.m4
+
+    renamed files:
+     debian/ChangeLog
+       ==> debian/changelog.Debian
+
+
+2004-12-04 16:18:26 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-26
+
+    Summary:
+      make python optional
+    Revision:
+      disorder--mainline--0.1--patch-26
+
+    Python support should be optional.  Implement this by suppressing
+    recursion into python/ if no Python interpreter is found.  Not tested on
+    a system without Python, please report success/failure in such cases.
+
+    modified files:
+     ChangeLog Makefile.am README configure.ac
+
+
+2004-12-04 16:06:33 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-25
+
+    Summary:
+      fix up build instructions
+    Revision:
+      disorder--mainline--0.1--patch-25
+
+    * BUGS: note that darwin can't do volume control
+    * Makefile.am: ship README.darwin
+    * README: link to mailing lists
+              catch up with directory split
+    * README.darwin: caveats
+
+    modified files:
+     BUGS CHANGES ChangeLog Makefile.am README README.darwin
+
+    renamed files:
+     inst
+       ==> scripts/inst
+     webman
+       ==> scripts/webman
+
+
+2004-12-04 15:26:48 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-24
+
+    Summary:
+      post-directory-split tidy-ups
+    Revision:
+      disorder--mainline--0.1--patch-24
+
+    * scripts/sedfiles.make: de-dupe seddery into a single file
+    * debian/autorules.m4: catch up with filename case change
+                           (workaround for automake wackiness)
+
+    new files:
+     scripts/sedfiles.make
+
+    modified files:
+     ChangeLog debian/autorules.m4 doc/Makefile.am
+     examples/Makefile.am python/Makefile.am
+
+
+2004-12-04 13:50:38 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-23
+
+    Summary:
+      split into subdirectories
+    Revision:
+      disorder--mainline--0.1--patch-23
+
+    Almost everything moves out of the root.  The new directory structure is:
+      templates/       web interface template files
+      scripts/         scripts used in the build process
+      lib/             libdisorder
+      progs/           the server and the front-end programs
+      doc/             man pages
+      plugins/         the standard plugins
+      debian/          debian build files
+      sounds/          standard scratch sounds
+      python/          python support code
+      examples/        config/init examples, etc
+      config.aux/      autotools auxilary files
+
+    new files:
+     config.aux/.arch-ids/=id doc/.arch-ids/=id doc/Makefile.am
+     examples/.arch-ids/=id examples/Makefile.am lib/.arch-ids/=id
+     lib/Makefile.am progs/.arch-ids/=id progs/Makefile.am
+     python/.arch-ids/=id python/Makefile.am scripts/.arch-ids/=id
+     scripts/Makefile.am
+
+    modified files:
+     ChangeLog Makefile.am configure.ac debian/Makefile.am
+     plugins/Makefile.am prepare
+
+    renamed files:
+     addr.c
+       ==> lib/addr.c
+     addr.h
+       ==> lib/addr.h
+     api-client.c
+       ==> progs/api-client.c
+     api-client.h
+       ==> progs/api-client.h
+     api-server.c
+       ==> progs/api-server.c
+     api.c
+       ==> progs/api.c
+     asprintf.c
+       ==> lib/asprintf.c
+     authhash.c
+       ==> lib/authhash.c
+     authhash.h
+       ==> lib/authhash.h
+     casefold.h
+       ==> lib/casefold.h
+     cgi.c
+       ==> progs/cgi.c
+     cgi.h
+       ==> progs/cgi.h
+     cgimain.c
+       ==> progs/cgimain.c
+     charset.c
+       ==> lib/charset.c
+     charset.h
+       ==> lib/charset.h
+     client.c
+       ==> lib/client.c
+     client.h
+       ==> lib/client.h
+     config.sample.in
+       ==> examples/config.sample.in
+     configuration.c
+       ==> lib/configuration.c
+     configuration.h
+       ==> lib/configuration.h
+     daemonize.c
+       ==> progs/daemonize.c
+     daemonize.h
+       ==> progs/daemonize.h
+     dbfixup.h
+       ==> progs/dbfixup.h
+     dcgi.c
+       ==> progs/dcgi.c
+     dcgi.h
+       ==> progs/dcgi.h
+     debian/changelog
+       ==> debian/ChangeLog
+     disorder-dump.8.in
+       ==> doc/disorder-dump.8.in
+     disorder.1.in
+       ==> doc/disorder.1.in
+     disorder.3
+       ==> doc/disorder.3
+     disorder.c
+       ==> progs/disorder.c
+     disorder.h
+       ==> lib/disorder.h
+     disorder.init.in
+       ==> examples/disorder.init.in
+     disorder.py.in
+       ==> python/disorder.py.in
+     disorder_config.5.in
+       ==> doc/disorder_config.5.in
+     disorder_protocol.5.in
+       ==> doc/disorder_protocol.5.in
+     disorderd.8.in
+       ==> doc/disorderd.8.in
+     disorderd.c
+       ==> progs/disorderd.c
+     dump.c
+       ==> progs/dump.c
+     event.c
+       ==> lib/event.c
+     event.h
+       ==> lib/event.h
+     fprintf.c
+       ==> lib/fprintf.c
+     hex.c
+       ==> lib/hex.c
+     hex.h
+       ==> lib/hex.h
+     htmlman
+       ==> scripts/htmlman
+     inputline.c
+       ==> lib/inputline.c
+     inputline.h
+       ==> lib/inputline.h
+     kvp.c
+       ==> lib/kvp.c
+     kvp.h
+       ==> lib/kvp.h
+     log-impl.h
+       ==> lib/log-impl.h
+     log.c
+       ==> lib/log.c
+     log.h
+       ==> lib/log.h
+     makedeb
+       ==> scripts/makedeb
+     mem-impl.h
+       ==> lib/mem-impl.h
+     mem.c
+       ==> lib/mem.c
+     mem.h
+       ==> lib/mem.h
+     mixer.c
+       ==> lib/mixer.c
+     mixer.h
+       ==> lib/mixer.h
+     play.c
+       ==> progs/play.c
+     play.h
+       ==> progs/play.h
+     plugin.c
+       ==> lib/plugin.c
+     plugin.h
+       ==> lib/plugin.h
+     printf.c
+       ==> lib/printf.c
+     printf.h
+       ==> lib/printf.h
+     queue.c
+       ==> lib/queue.c
+     queue.h
+       ==> lib/queue.h
+     regsub.c
+       ==> progs/regsub.c
+     regsub.h
+       ==> progs/regsub.h
+     rescan.c
+       ==> progs/rescan.c
+     server.c
+       ==> progs/server.c
+     server.h
+       ==> progs/server.h
+     sink.c
+       ==> lib/sink.c
+     sink.h
+       ==> lib/sink.h
+     snprintf.c
+       ==> lib/snprintf.c
+     split.c
+       ==> lib/split.c
+     split.h
+       ==> lib/split.h
+     state.c
+       ==> progs/state.c
+     state.h
+       ==> progs/state.h
+     syscalls.c
+       ==> lib/syscalls.c
+     syscalls.h
+       ==> lib/syscalls.h
+     table.c
+       ==> lib/table.c
+     table.h
+       ==> lib/table.h
+     tkdisorder
+       ==> python/tkdisorder
+     tracks.c
+       ==> progs/tracks.c
+     tracks.h
+       ==> progs/tracks.h
+     types.h
+       ==> lib/types.h
+     unicodegc.h
+       ==> lib/unicodegc.h
+     utf8.h
+       ==> lib/utf8.h
+     vacopy.h
+       ==> lib/vacopy.h
+     vector.c
+       ==> lib/vector.c
+     vector.h
+       ==> lib/vector.h
+     words.c
+       ==> lib/words.c
+     words.h
+       ==> lib/words.h
+     wstat.c
+       ==> lib/wstat.c
+     wstat.h
+       ==> lib/wstat.h
+
+    new directories:
+     config.aux config.aux/.arch-ids doc doc/.arch-ids examples
+     examples/.arch-ids lib lib/.arch-ids progs progs/.arch-ids
+     python python/.arch-ids scripts scripts/.arch-ids
+
+
+2004-12-03 16:18:53 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-22
+
+    Summary:
+      missing from previous change
+    Revision:
+      disorder--mainline--0.1--patch-22
+
+    * dump.c: missing includes
+    * disorder.c: missing includes
+
+    modified files:
+     ChangeLog disorder.c dump.c
+
+
+2004-12-03 16:09:46 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-21
+
+    Summary:
+      fix garbage collection problems under Darwin
+    Revision:
+      disorder--mainline--0.1--patch-21
+
+    Call GC_init() at the start of each program.  This is necesary on Darwin and
+    leaving it out led to crashes.
+    
+    * play.c: more idiomatic xmalloc
+    * README.darwin: where to get ogg123/mpg321.
+
+    modified files:
+     ChangeLog README.darwin cgimain.c disorder.c disorderd.c
+     dump.c mem.c mem.h play.c
+
+
+2004-12-03 13:15:15 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-20
+
+    Summary:
+      first pass at Darwin (Mac OS X) port
+    Revision:
+      disorder--mainline--0.1--patch-20
+
+    The code now builds, runs, and plays music (albeit rather tinnily on my
+    laptop's speakers), but has a tendency to crash e.g. if you scratch three
+    or four tracks in a row.
+    
+    Code changes:
+    
+    * asprintf.c: error-checking wrapper for byte_asprintf
+    * event.c: EPROTO might not exist
+    * mixer.c: don't know how to set the volume if we don't have
+               <sys/soundcard.h>
+    * printf.c: support 'q' length modifier as a synonym for 'll'
+    * server.c: Darwin's getpeername() doesn't reliably fill in sa_family,
+                so remember the protocol family ourselves.
+    * tracks.c: DBT.size is not size_t
+                pass length back from track_states() correctly
+    
+    Build system changes:
+    
+    * prepare: look in /sw for the benefit of finkified Darwin.
+    * Makefile.am: Abandoned the attempt to restrict exported symbols; it is
+                   impractical to do portably.
+    * configure.ac: Use RJK_CHECK_LIB for iconv as AC_CHECK_LIB is not up to
+                    the job.
+    * confgure.ac: If fdatasync() is not available use fsync() instead.
+    * Makefile.am: Only use getopt* sources if necessary, and disable -Werror
+                   in that case (since the code doesn't compile cleanly
+                   enough)
+
+    new files:
+     README.darwin
+
+    removed files:
+     disorder.vs
+
+    modified files:
+     ChangeLog Makefile.am README addr.c asprintf.c cgi.c cgimain.c
+     client.c configuration.c configure.ac dcgi.c event.c mixer.c
+     plugin.c prepare printf.c printf.h queue.c server.c
+     sounds/slap.ogg state.c tracks.c wstat.c
+
+
+2004-12-01 23:51:21 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-19
+
+    Summary:
+      DisOrder 0.13
+    Revision:
+      disorder--mainline--0.1--patch-19
+
+    New release.
+
+    modified files:
+     CHANGES ChangeLog configure.ac debian/changelog
+
+
+2004-12-01 23:41:59 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-18
+
+    Summary:
+      fix crash on queue_find() of non-existent tracks
+    Revision:
+      disorder--mainline--0.1--patch-18
+
+    * queue.c: queue_find() was returning &qhead on error, which seriously
+               confuses its callers; for instance it could lead to the 'fake'
+               root node in the queue being removed, with hilarious
+               consequences when the queue was written back out.
+               Changed queue_find() to correctly return 0 on error.
+
+    modified files:
+     ChangeLog queue.c
+
+
+2004-10-31 13:56:12 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-17
+
+    Summary:
+      change version to 0.12+dev
+    Revision:
+      disorder--mainline--0.1--patch-17
+
+    0.12 branch is disorder--release-0-12--0.1.
+
+    modified files:
+     ChangeLog configure.ac
+
+
+2004-10-31 13:50:51 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-16
+
+    Summary:
+      delete non-working configs/ directory
+    Revision:
+      disorder--mainline--0.1--patch-16
+
+
+    removed files:
+     configs/.arch-ids/=id configs/disorder-0.12.arch
+     configs/disorder.arch
+
+    modified files:
+     ChangeLog
+
+    removed directories:
+     configs configs/.arch-ids
+
+
+2004-10-31 13:34:31 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-15
+
+    Summary:
+      config for release 0.12
+    Revision:
+      disorder--mainline--0.1--patch-15
+
+    Add configs for
+      disorder        main development line
+      disorder-0.12   release 0.12
+
+    new files:
+     configs/.arch-ids/=id configs/disorder-0.12.arch
+     configs/disorder.arch
+
+    modified files:
+     ChangeLog
+
+    new directories:
+     configs configs/.arch-ids
+
+
+2004-10-30 18:52:50 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-14
+
+    Summary:
+      release 0.12
+    Revision:
+      disorder--mainline--0.1--patch-14
+
+    ChangeLog is now an arch changelog; old changes can be found in
+    ChangeLog.cvs.
+    
+    Release 0.12.
+
+    new files:
+     ChangeLog
+
+    modified files:
+     CHANGES Makefile.am configure.ac debian/changelog
+     debian/rules.m4
+
+    renamed files:
+     ChangeLog
+       ==> ChangeLog.cvs
+
+
+2004-10-30 18:37:34 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-13
+
+    Summary:
+      tidy up disorder.py
+    Revision:
+      disorder--mainline--0.1--patch-13
+
+    Remove a bogus debugging print
+    
+    Add an example to the disorder.log() documentation
+
+    modified files:
+     disorder.py.in
+
+
+2004-10-30 18:33:08 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-12
+
+    Summary:
+      log command could crash server
+    Revision:
+      disorder--mainline--0.1--patch-12
+
+    Log output to a conn was never stopped even when the client no longer
+    wanted it.  So not only would bogus log messages be sent if the conn was
+    kept open, once it was closed there would be a crash.
+    
+    Fixed by storing the log output in the conn and closing it at the right
+    point.
+
+    modified files:
+     CHANGES server.c
+
+
+2004-10-30 18:26:39 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-11
+
+    Summary:
+      support 'log' in python client
+    Revision:
+      disorder--mainline--0.1--patch-11
+
+    New disorder.log method supports log command.
+
+    modified files:
+     disorder.py.in
+
+
+2004-10-29 19:50:39 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-10
+
+    Summary:
+      more detailed dependencies table
+    Revision:
+      disorder--mainline--0.1--patch-10
+
+    List version numbers for build dependencies.
+
+    modified files:
+     README
+
+
+2004-10-29 19:39:33 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-9
+
+    Summary:
+      deprecate libdb before 4.2
+    Revision:
+      disorder--mainline--0.1--patch-9
+
+    No code changes, but no promises regarding older libdb versions.
+
+    modified files:
+     README
+
+
+2004-10-29 19:38:04 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-8
+
+    Summary:
+      fix debian build rules
+    Revision:
+      disorder--mainline--0.1--patch-8
+
+    Cope with debian/rules being made outside ${srcdir}.
+
+    modified files:
+     debian/Makefile.am debian/autorules.m4
+
+
+2004-10-29 15:15:17 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-7
+
+    Summary:
+      enable/disable from web templates
+    Revision:
+      disorder--mainline--0.1--patch-7
+
+    Add enable, disable, disable-now actions and @enabled@ expansion, and
+    documented them.  The playing.html has an example usage in a comment, not
+    enabled because we find {enable,disable}-random much more useful in
+    practice.
+
+    modified files:
+     dcgi.c disorder_config.5.in templates/options.labels
+     templates/playing.html
+
+
+2004-10-28 23:05:52 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-6
+
+    Summary:
+      typo fix in error message
+    Revision:
+      disorder--mainline--0.1--patch-6
+
+
+    modified files:
+     dcgi.c
+
+
+2004-10-28 23:04:31 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-5
+
+    Summary:
+      add missing documentation
+    Revision:
+      disorder--mainline--0.1--patch-5
+
+    Describe various missing labels and the action= values.
+
+    modified files:
+     disorder_config.5.in
+
+
+2004-10-28 22:52:15 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-4
+
+    Summary:
+      add random play enable/disable buttons
+    Revision:
+      disorder--mainline--0.1--patch-4
+
+    @random-enabled@ expansion reports current state as a boolean
+    
+    random-enable and random-disable actions do the obvious thing
+    
+    New labels provide the text.  playing.html template includes the buttons
+    in management mode.
+    
+
+    modified files:
+     CHANGES dcgi.c disorder_config.5.in templates/help.html
+     templates/options.labels templates/playing.html
+
+
+2004-10-28 21:04:30 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-3
+
+    Summary:
+      Fix file permissions mangled in import
+    Revision:
+      disorder--mainline--0.1--patch-3
+
+    Added executable bit trampled by my add-arch-tag script.
+
+    modified files:
+     debian/config debian/postinst debian/postrm debian/prerm
+     htmlman inst makedeb prepare tkdisorder webman
+
+
+2004-10-28 20:45:11 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-2
+
+    Summary:
+      Further error corrections for import
+    Revision:
+      disorder--mainline--0.1--patch-2
+
+    Sort out confusion over aclocal.m4/acinclude.m4
+    
+
+    new files:
+     acinclude.m4
+
+    removed files:
+     aclocal.m4
+
+    modified files:
+     {arch}/=tagging-method
+
+
+2004-10-28 20:02:17 GMT        Richard Kettlewell <rjk@greenend.org.uk>        patch-1
+
+    Summary:
+      Fix missing files in import
+    Revision:
+      disorder--mainline--0.1--patch-1
+
+    Fix =tagging-method to not make debian/*.m4 and configure.ac(!) precious
+    Add arch-tags to add new files.
+
+    new files:
+     configure.ac debian/autorules.m4 debian/rules.m4
+
+    modified files:
+     {arch}/=tagging-method
+
+
+2004-10-28 19:19:21 GMT        Richard Kettlewell <rjk@greenend.org.uk>        base-0
+
+    Summary:
+      import from cvs tag disorder--mainline--0_1--base-0
+    Revision:
+      disorder--mainline--0.1--base-0
+
+    Add arch-tag lines to almost all files
+    'arch add' binary files and files without known comment syntax:
+      sounds/scratch.ogg
+      sounds/slap.ogg
+      debian/conffiles
+      debian/templates
+    Omitted .cvsignore files.
+    
+    Make various generated files (whether made by automake, prepare, etc)
+    precious.
+
+    new files:
+     AUTHORS BUGS CHANGES ChangeLog DESIGN2 Makefile.am NEWS README
+     README.streams TODO aclocal.m4 addr.c addr.h api-client.c
+     api-client.h api-server.c api.c asprintf.c authhash.c
+     authhash.h casefold.h cgi.c cgi.h cgimain.c charset.c
+     charset.h client.c client.h config.sample.in configuration.c
+     configuration.h daemonize.c daemonize.h dbfixup.h dcgi.c
+     dcgi.h debian/Makefile.am debian/README.Debian
+     debian/changelog debian/conffiles debian/config debian/control
+     debian/copyright debian/disorder.config debian/htaccess
+     debian/postinst debian/postrm debian/prerm debian/templates
+     disorder-dump.8.in disorder.1.in disorder.3 disorder.c
+     disorder.h disorder.init.in disorder.py.in disorder.vs
+     disorder_config.5.in disorder_protocol.5.in disorderd.8.in
+     disorderd.c dump.c event.c event.h fprintf.c hex.c hex.h
+     htmlman inputline.c inputline.h inst kvp.c kvp.h log-impl.h
+     log.c log.h makedeb mem-impl.h mem.c mem.h mixer.c mixer.h
+     play.c play.h plugin.c plugin.h plugins/Makefile.am
+     plugins/exec.c plugins/fs.c plugins/mad.c plugins/madshim.h
+     plugins/notify.c plugins/pick.c plugins/shell.c
+     plugins/tracklength.c prepare printf.c printf.h queue.c
+     queue.h regsub.c regsub.h rescan.c server.c server.h sink.c
+     sink.h snprintf.c sounds/Makefile.am sounds/scratch.ogg
+     sounds/slap.ogg split.c split.h state.c state.h syscalls.c
+     syscalls.h table.c table.h templates/Makefile.am
+     templates/about.html templates/choose.html
+     templates/choosealpha.html templates/credits.html
+     templates/help.html templates/options
+     templates/options.columns templates/options.labels
+     templates/options.trackname templates/options.transform
+     templates/playing.html templates/prefs.html
+     templates/recent.html templates/search.html
+     templates/sidebar.html templates/stdhead.html
+     templates/stylesheet.html templates/volume.html tkdisorder
+     tracks.c tracks.h types.h unicodegc.h utf8.h vacopy.h vector.c
+     vector.h webman words.c words.h wstat.c wstat.h
+
+
diff --git a/Makefile.am b/Makefile.am
new file mode 100644 (file)
index 0000000..401a14c
--- /dev/null
@@ -0,0 +1,27 @@
+#
+# This file is part of DisOrder.
+# Copyright (C) 2004, 2005, 2006 Richard Kettlewell
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+# USA
+#
+
+EXTRA_DIST=TODO CHANGES README.streams BUGS ChangeLog.d        \
+README.upgrades README.client
+SUBDIRS=@subdirs@
+
+echo-distdir:
+       @echo $(distdir)
+# arch-tag:7e0566bae866a64c2f998d4253581ce0
diff --git a/README b/README
new file mode 100644 (file)
index 0000000..64d4940
--- /dev/null
+++ b/README
@@ -0,0 +1,334 @@
+DisOrder
+========
+
+This program is used to play random and chosen tracks from a collection of
+digital audio files (for instance MP3 and OGG files).  If you just set it going
+it plays random tracks from your collection, but you can also ask for specific
+tracks to be played, either via a command line program or a web interface, and
+you can 'scratch' the current track.
+
+See CHANGES for details of recent changes to DisOrder.
+
+Currently it only runs on Linux.  It could probably be ported to other UNIX
+variants in some cases without too much effort.  Things you will need:
+
+Build dependencies:
+  Name             Tested              Notes
+  libdb            4.3.21              4.2 and earlier won't work
+  libgc            6.3
+  libvorbisfile    1.0.1
+  libpcre          4.5                 need UTF-8 support
+  libmad           0.15.1b
+  libgcrypt        1.2.0
+  libao            0.8.6
+  libasound        1.0.8
+  Python           2.3                 (optional)
+  GNU C            3.3, 3.4
+
+"Tested" means I've built against that version; earlier or later versions will
+often work too.
+
+Runtime dependencies:
+ * Players:
+   + ogg123 and mpg321 work for me, but you could potentially use others.
+ * Web server:
+   + Apache 1.3.x works for me, but anything that supports CGI and
+     authentication should be suitable.
+
+Development dependencies (only developers will need these):
+  Automake         1.9.4               AM_PATH_PYTHON not good enough in 1.7
+  Autoconf         2.59
+  Libtool          1.5.6               1.4 not good enough
+  Arch             1.3-1
+
+Mailing lists:
+  http://www.chiark.greenend.org.uk/mailman/listinfo/sgo-software-discuss
+   - discussion of DisOrder (and other software), bug reports, etc
+  http://www.chiark.greenend.org.uk/mailman/listinfo/sgo-software-announce
+   - announcements of new versions of DisOrder
+
+
+Installation
+============
+
+   "This place'd be a paradise tomorrow, if every department had a supervisor
+   with a machine-gun"
+
+NOTE: If you are upgrading from an earlier version, see README.upgrades.
+
+1. Build the software.  Do something like this:
+
+     ./configure --sysconfdir=/etc --localstatedir=/var
+     make
+
+   See INSTALL for more details about driving configure.  The precise set of
+   options you pass to configure is up to you, if you like configuration being
+   in /usr/local/etc or wherever then that should work.
+
+   If you only want to build a subset of DisOrder, specify one or more of the
+   following options:
+     --without-server       Don't build server or web interface
+     --without-gtk          Don't build GTK+ client (Disobedience)
+     --without-python       Don't build Python support
+
+   See README.client for setting up a standalone client.
+
+2. Install it.  Most of the installation is done via the install target:
+
+     make installdirs install
+
+   The CGI interface has to be installed separately, and you must use Libtool
+   to install it.  For instance:
+
+     ./libtool --mode=install install -m 755 progs/disorder.cgi /usr/local/lib/cgi-bin/disorder
+
+   Depending on how your system is configured you may need to link the disorder
+   libao driver into the right directory:
+
+     ln -s /usr/local/lib/ao/plugins-2/libdisorder.so /usr/lib/ao/plugins-2/.
+
+3. Create a 'jukebox' user and group, with the jukebox group being the default
+   group of the jukebox user.  The server will run as this user and group.
+   Check that this user can read your music files and write to the audio
+   device, e.g. by playing a track.  The exact name doesn't matter, it could be
+   'jukebox' or 'disorder' or 'fred' or whatever.
+
+   Do not use a general-purpose user or group, you must create ones
+   specifically for DisOrder.
+
+4. Create /etc/disorder/config.  Start from examples/config.sample and adapt it
+   to your own requirements.  In particular, you should:
+    * edit the 'player' commands to reflect the software you have installed.
+    * edit the 'collection' command to identify the location(s) of your own
+      digital audio files.  These commands also specify the encoding of
+      filenames, which you should be sure to get right as recovery from an
+      error here can be painful (see BUGS).
+    * edit the 'scratch' commands to supply scratch sounds (or delete them if
+      you don't want any).
+    * edit the 'trust' command to reflect the user the web interface will
+      eventually run as.
+    * edit the 'url' command to give the URL of the web interface.
+    * add or remove 'stopword' entries as necessary (these words won't take
+      part in track name searches from the web interface).
+
+   See disorder_config(5) for more details.
+
+5. Create /etc/disorder/config.private.  This should be readable only by the
+   jukebox group:
+
+     touch /etc/disorder/config.private
+     chown root:jukebox /etc/disorder/config.private
+     chmod 640 /etc/disorder/config.private
+
+   Set up a username and password for root, for example with line like this:
+
+     allow root somepassword
+
+   Use (for instance) pwgen(1) to create the password.  DO NOT use your root
+   password - this is a password to give root access to the server, not to give
+   access to the root login.
+
+   See disorderd(8) and disorder_config(5) for more details.
+
+6. Make sure the server is started at boot time.  On many Linux systems,
+   examples/disorder.init should be more or less suitable; install it in
+   /etc/init.d, adapting it as necessary, and make appropriate links from
+   /etc/rc[0-6].d.  If you have a BSD style init then you are on your own.
+
+7. Make sure the state directory (/var/disorder or /usr/local/var/disorder or
+   as determined by configure) exists and is writable by the jukebox user.
+
+     mkdir -m 755 /var/disorder
+     chown disorder:root /var/disorder
+
+8. Start the server, for instance:
+
+     /etc/init.d/disorder start
+
+   By default disorderd logs to daemon.*; check your syslog.conf to see where
+   this ends up and look for log messages from disorderd there.  If it didn't
+   start up correctly there should be an error message.  Correct the problem
+   and try again.
+
+9. After a minute it should start to play something.  Try scratching it, as any
+   of the users you set up in step 5:
+
+     disorder scratch
+
+   The track should stop playing, and (if you set any up) a scratch sound play.
+
+10. Add any other users you want to config.private.  Each user's password
+    should be stored in a file in their home directory, ~/.disorder/passwd,
+    which should be readable only by them, and should take the form of a single
+    line:
+
+      password MYPASSWORD
+
+    (root doesn't need this as the client can read it out of config.private
+    when running as root.)
+
+    Note that the server must be reloaded (e.g. by 'disorder reconfigure')
+    when new users are added.
+
+    Alternatively the administrator can create /etc/disorder/config.USERNAME
+    containing the same thing as above.  It can either be owned by the user and
+    mode 400, or owned by root and the user's group (if you have per-user
+    groups) and mode 440.
+
+    You can use 'disorder authorize' to automatically pick passwords and
+    create these files.
+
+11. Optionally source completion.bash from /etc/profile or similar, for
+    example:
+
+      . /usr/local/share/disorder/completion.bash
+
+    This provides completion over disorder command and option names.
+
+
+Web Interface
+=============
+
+   "Thought I was a gonner baby, but I'm bullet proof"
+
+These instructions assumes you are using Apache 1.3.x.
+
+You need to configure a number of things to make this work:
+
+1. If you want to have a 'jukebox' virtual host, modify the DNS (or hosts file
+   if you are somehow reading this in the 1980s) accordingly and use a fragment
+   such as this one:
+
+     <VirtualHost HOSTNAME>
+     DocumentRoot /home/jukebox/public_html
+     ServerName jukebox.DOMAIN
+     ServerAlias jukebox
+     ServerAdmin webmaster@DOMAIN
+     ErrorLog /var/log/apache/jukebox/error.log
+     TransferLog /var/log/apache/jukebox/access.log
+     Alias /static/ /usr/local/share/disorder/static/
+     </VirtualHost>
+
+   /static/ should point to the 'static' directory installed by DisOrder.  If
+   you don't want to use the name 'static' then you can change the url.static
+   label in the web interface configuration to your preferred URL; see
+   disorder_config(5) for details.
+
+   Don't forget to reload Apache after modifying its configuration.
+
+   Separate logging is not required but I find it convenient.  Up to you.
+
+2. disorder.cgi assumes it is subject to access control (and in particular uses
+   the username to report who did what).  Here's how I configured Apache, given
+   the above VirtualHost settings:
+
+     <Directory /home/jukebox>
+     Require valid-user
+     AuthType basic
+     AuthName jukebox
+     AuthUserFile /home/jukebox/http.users
+     </Directory>
+
+   Adjust this according to wherever you're going to install disorder.cgi and
+   its expected URL.
+
+   Don't forget to reload apache after modifying its configuration.  If you got
+   it wrong, fix it and restart Apache.
+
+3. Create the password file configured above.  Something like this:
+
+     # htpasswd -b -c /home/jukebox/http.users myusername mypassword
+     Adding password for user myusername
+     # htpasswd -b /home/jukebox/http.users othername otherpass
+     Adding password for user othername
+
+4. The jukebox must be configured to trust the web user.  I added the following
+   line to my /etc/disorder/config:
+
+     trust www-data
+
+   This might not be the same on your system!  You have to specify the user
+   that the CGI script runs as, whatever that is.
+
+5. Install disorder.cgi in an appropriate location.  Remember to make it
+   executable.  With the above configuration I installed it as
+   ~jukebox/public_html/index.cgi.
+
+6. Give www-data (or whatever user it is) a password and edit
+   /etc/disorder/config.private accordingly.  This file should be mode 640 and
+   owned by root:jukebox.  The line should look something like this:
+
+     allow www-data MYPASSWORD
+
+   After editing the config file, you must make the daemon re-read it:
+
+     disorder reconfigure
+
+7. Teach www-data its password, by putting it in /etc/disorder/config.www-data.
+   This file should be mode 640 and owned by root:www-data.
+
+     password MYPASSWORD
+
+   (You could also use ~www-data/.disorder/passwd for this but on some systems
+   the web server user's home directory is inside the document root, which
+   would have rather unfortunate consequences.)
+
+8. Try it out.  You should be asked for a username and password that you
+   configured earlier, and be shown details of what is playing and what other
+   tracks have been configured for future play.
+
+9. Some features take time to start working, for instance those involving
+   reporting the length of tracks.  This is because the server starts up as
+   quickly as possible even if the full track data has not yet been gathered;
+   the track data is then calculated in the background.
+
+10. If you run into problems, always look at the appropriate error log; the
+    message you see in your web browser will usually not be sufficient to
+    diagnose the problem all by itself.
+
+11. If you have a huge number of top level directories, then you might find
+    that the 'Choose' page is unreasonably large.  If so add the following line
+    to /etc/disorder/options.user:
+      label sidebar.choosewhich choosealpha
+
+    This will make 'Choose' be a link for each letter of the 26-letter Roman
+    alphabet; follow the link and you just get the directories which start with
+    that letter.  The "*" link at the end gives you directories which don't
+    start with a letter.
+
+    You can copy choosealpha.html to /etc/disorder and edit it to change the
+    set of initial choices to anything that can be expressed with regexps.  The
+    regexps must be URL-encoded UTF-8 PCRE regexps.
+
+
+Copyright
+=========
+
+  "Nothing but another drug, a licence that you buy and sell"
+
+DisOrder - select and play digital audio files
+Copyright (C) 2003, 2004, 2005, 2006 Richard Kettlewell
+Portions extracted from MPG321, http://mpg321.sourceforge.net/
+  Copyright (C) 2001 Joe Drew
+  Copyright (C) 2000-2001 Robert Leslie
+Binaries may derive extra copyright owners through linkage (binary distributors
+are expected to do their own legwork)
+
+This program is free software; you can redistribute it and/or modify it under
+the terms of the GNU General Public License as published by the Free Software
+Foundation; either version 2 of the License, or (at your option) any later
+version.
+
+This program is distributed in the hope that it will be useful, but WITHOUT ANY
+WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+PARTICULAR PURPOSE.  See the GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License along with
+this program; if not, write to the Free Software Foundation, Inc., 59 Temple
+Place, Suite 330, Boston, MA 02111-1307 USA
+
+Local Variables:
+mode:text
+fill-column:79
+End:
+arch-tag:e7058f9442f954f3dd51523a1e805c32
diff --git a/README.client b/README.client
new file mode 100644 (file)
index 0000000..9a2ff74
--- /dev/null
@@ -0,0 +1,47 @@
+Setting up a standalone DisOrder client
+=======================================
+
+Although DisOrder can still only play from a single computer, it is possible to
+control it over the network if the server has a 'listen PORT' directive in its
+configuration file.
+
+There is currently no standard DisOrder port number.
+
+
+1. Configure the software with --without-server (and, optionally,
+--without-python) and build and install it.  Set up a stub config in
+/etc/disorder/config (or /usr/local/etc/disorder/config if you didn't
+set a nondefault --prefix) with the following contents:
+
+   connect jukebox PORT
+
+where PORT is the same as 'listen PORT' on the server.
+
+
+2. Copy the password file for each user to /etc/disorder/config.USER,
+the contents being:
+
+  password PASSWORD
+
+Alternatvely, each user can use ~/.disorder/passwd, with the same contents.  If
+the DisOrder username differs from the local username then use a 'username'
+directive.
+
+
+3. Test by issuing 'disorder playing'.
+
+
+4. Run 'disobedience' for the GUI client.
+
+
+The web interface could in principle be made to work on a separate
+machine from the main server, though it is unlikely to be efficient
+and at the moment it is built whenever the server is, so you will have
+to unpick them a bit yourself if you wish to do this.
+
+
+Local Variables:
+mode:text
+fill-column:79
+End:
+# arch-tag:jEmzIKHdvK6GSjnax7Kp5Q
diff --git a/README.raw b/README.raw
new file mode 100644 (file)
index 0000000..cf2ca0c
--- /dev/null
@@ -0,0 +1,55 @@
+* DisOrder Raw Format Players
+
+** Purpose
+
+The purpose of raw format players is:
+
+   * Support pausing of playing tracks, with the audio device closed when not
+     in active use.
+
+   * Eliminate the inter-track gap.
+
+   * Perhaps in the future support network play.
+
+** Usage
+
+To use raw format, use the execraw module and make the command choose the
+"disorder" libao driver.
+
+You should pass the "fragile" option to ogg123.  This is because ogg123 ignores
+write errors!
+
+mpg321 does not appear to have this bug.
+
+For _non_ raw players it is advisable to use the new --wait-for-device option.
+This repeatedly tries to open the audio device before starting the player
+proper.  It times out after a couple of seconds.
+
+See disorder_config(5) and the example configuration file for further
+information and examples.
+
+** Low-Level Details
+
+Raw format players are started slightly differently to normal ones.  Before
+they are executed a pipe is created and one end passed to a special speaker
+process, which is spawned by the main server at startup.  The file descriptor
+of the player's end is identified by $DISORDER_RAW_FD.
+
+The expected data format is a ao_sample_format structure followed by the raw
+sample data.  However, this may be changed without notice in future versions of
+DisOrder.  If you need a stable interface here for some reason then get in
+touch.
+
+Raw format players may be started before the track is to be played, and (if the
+track is then removed from the queue before it reaches the head) terminated
+before the track ever reaches a physical speaker.  The point of this is to
+allow audio data to be ready to play the moment the previous track end, without
+having to wait for the player to start up.  There is no way for a player to
+tell that this is going on.
+
+Local Variables:
+mode:outline
+fill-column:79
+End:
+
+# arch-tag:FDgaJ8rznoa6TnmXxU1iPw
diff --git a/README.streams b/README.streams
new file mode 100644 (file)
index 0000000..4e6e425
--- /dev/null
@@ -0,0 +1,32 @@
+DisOrder and Internet Streams
+=============================
+
+DisOrder doesn't have any built-in support for playing streams but you can make
+it do so.  I use the following in my configuration file:
+
+ player /export/radio/*.oggradio shell 'xargs ogg123 -q < "$TRACK"'
+ collection fs iso-8859-1 /export/radio
+
+After setting this up you'll need to re-read the config file and provoke a
+rescan:
+
+  disorder reconfigure rescan /export/radio
+
+/export/radio contains a file for each stream, containing the URL to use:
+
+ lyonesse$ cat /export/radio/CUR1350.oggradio
+ http://cur.chu.cam.ac.uk:8000/cur.ogg
+
+You'll probably want to prevent random play of streams:
+
+ disorder set /export/radio/CUR1350.oggradio pick_at_random 0
+
+You can then queue a stream like any other track.  It won't automatically
+interrupt the playing track, you have to scratch it manually.  Go back to
+normal play by scratching the stream.
+
+Local Variables:
+mode:text
+fill-column:79
+End:
+arch-tag:ae95108d51c55288c4f6da4102343cd5
diff --git a/README.upgrades b/README.upgrades
new file mode 100644 (file)
index 0000000..6e279e7
--- /dev/null
@@ -0,0 +1,112 @@
+* Upgrading DisOrder
+
+The general procedure is:
+
+ * stop the old daemon, e.g. with
+     /etc/init.d/disorder stop
+ * build and install the new version as described in the README
+ * update the configuration files (see below)
+ * start the new daemon, e.g. with
+     /etc/init.d/disorder start
+
+The rest of this file describes things you must pay attention to when
+upgrading between particular versions.  Minor versions are not
+explicitly mentioned; a version number like 1.1 implicitly includes
+all 1.1.x versions.
+
+* 1.5 -> 1.6
+
+** 'transform' and 'namepart' directives
+
+'transform' has moved from the web options to the main configuration file, so
+that they can be used by other interfaces.  The syntax and semantics are
+unchanged.
+
+More importantly however both 'transform' and 'namepart' are now optional, with
+sensible defaults being built in.  So if you were already using the default
+values you can just delete all instances of both.
+
+** enabled' and 'random_enabled' directives
+
+These have been removed.  Instead the state persists from one run of the server
+to the next.
+
+* 1.3 -> 1.4
+
+** Raw Format Decoders
+
+You will probably want reconfigure your install to use the new facilities
+(although the old way works fine).  See the example configuration file and
+README.raw for more details.
+
+Depending on how your system is configured you may need to link the disorder
+libao driver into the right directory:
+
+   ln -s /usr/local/lib/ao/plugins-2/libdisorder.so /usr/lib/ao/plugins-2/.
+
+* 1.2 -> 1.3
+
+** Server Environment
+
+It is important that $sbindir is on the server's path.  The example init script
+guarantees this.  You may need to modify the installed one.  You will get
+"deadlock manager unexpectedly terminated" if you get this wrong.
+
+** namepart directives
+
+These have changed in three ways.
+
+Firstly they have changed to substitute in a more convenient way.  Instead of
+matches for the regexp being substituted back into the original track name, the
+replacement string now completely replaces it.  Given the usual uses of
+namepart, this is much more convenient.  If you've stuck with the defaults no
+changes should be needed for this.
+
+Secondly they are matched against the track name with the collection root
+stripped off.
+
+Finally you will need to add an extra line to your config file as follows for
+the new track aliasing mechanisms to work properly:
+
+namepart        ext     "(\\.[a-zA-Z0-9]+)$"                   "$1"    *
+
+* 1.1 -> 1.2
+
+** Web Interface Changes
+
+The web interface now includes static content as well as templates.
+The static content must be given a name visible to HTTP clients which
+maps to its location in the real filesystem.
+
+The README suggests using a rule in httpd.conf to make /static in the
+HTTP namespace point to /usr/local/share/disorder/static, which is
+where DisOrder installs its static content (by default).
+Alternatively you can set the url.static label to the base URL of the
+static content.
+
+** Configuration File Changes
+
+The trackname-part web interface directive has now gone, and the
+options.trackname file with it.
+
+It is replaced by a new namepart directive in the main configuration
+file.  This has exactly the same syntax as trackname-part, only the
+name and location have changed.
+
+The reason for the change is to allow track name parsing to be
+centrally configured, rather than every interface to DisOrder having
+to implement it locally.
+
+If you do not install new namepart directives into the main
+configuration file then track titles will show up blank.
+
+If you do not remove the trackname-part directives from the web
+interface configuration then you will get error messages in the web
+server's error log.
+
+Local Variables:
+mode:outline
+fill-column:79
+End:
+
+# arch-tag:j+OBlcYYyUdGBVbVXVgXew
diff --git a/TODO b/TODO
new file mode 100644 (file)
index 0000000..704fa3e
--- /dev/null
+++ b/TODO
@@ -0,0 +1,26 @@
+-*-outline-*-
+
+* plugins
+
+** configuration
+
+Allow plugins to be configured via the main config file somehow.
+
+* web interface
+
+** language choice
+
+Parse HTTP_ACCEPT_LANGUAGE and use it to choose template subdirectory.
+I might leave this until I hear that someone actually wants a
+multilingual jukebox.
+
+** rearrange queue
+
+Needs thought on how to design the interface.
+
+** improve volume control
+
+** templates
+
+Build defaults into program to save file IO.
+arch-tag:d8e9783460cc93d13e90d8b8e3f1d481
diff --git a/acinclude.m4 b/acinclude.m4
new file mode 100644 (file)
index 0000000..03fd6ca
--- /dev/null
@@ -0,0 +1,105 @@
+# This file is part of DisOrder.
+# Copyright (C) 2004, 2005 Richard Kettlewell
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+# USA
+#
+
+AC_DEFUN([RJK_FIND_GC_H],[
+  AC_CACHE_CHECK([looking for <gc.h>],[rjk_cv_gc_h],[
+    AC_PREPROC_IFELSE([
+                      #include <gc.h>
+                     ],
+                     [rjk_cv_gc_h="on default include path"],[
+      oldCPPFLAGS="${CPPFLAGS}"
+      for dir in /usr/include/gc /usr/local/include/gc; do
+       if test "x$GCC" = xyes; then
+         CPPFLAGS="${oldCPPFLAGS} -isystem $dir"
+       else
+         CPPFLAGS="${oldCPPFLAGS} -I$dir"
+       fi
+       AC_PREPROC_IFELSE([
+                          #include <gc.h>
+                         ],
+                         [rjk_cv_gc_h=$dir;break],[rjk_cv_gc_h="not found"])
+      done
+      CPPFLAGS="${oldCPPFLAGS}"
+   ])
+  ])
+  case "$rjk_cv_gc_h" in
+  "not found" )
+    missing_headers="$missing_headers gc.h"
+    ;;
+  /* )
+    if test "x$GCC" = xyes; then
+      CPPFLAGS="${CPPFLAGS} -isystem $rjk_cv_gc_h"
+    else
+      CPPFLAGS="${CPPFLAGS} -I$rjk_cv_gc_h"
+    fi
+    ;;
+  esac
+])
+
+AC_DEFUN([RJK_CHECK_LIB],[
+  AC_CACHE_CHECK([for $2 in -l$1],[rjk_cv_lib_$1_$2],[
+    save_LIBS="$LIBS"
+    LIBS="${LIBS} -l$1"
+    AC_LINK_IFELSE([AC_LANG_PROGRAM([$3],[$2;])],
+                   [rjk_cv_lib_$1_$2=yes],
+                   [rjk_cv_lib_$1_$2=no])
+    LIBS="$save_LIBS"
+  ])
+  if test $rjk_cv_lib_$1_$2 = yes; then
+    $4
+  else
+    $5
+  fi
+])
+
+AC_DEFUN([RJK_REQUIRE_PCRE_UTF8],[
+  AC_CACHE_CHECK([whether libpcre was built with UTF-8 support],
+                 [rjk_cv_pcre_utf8],[
+    save_LIBS="$LIBS"
+    LIBS="$LIBS $1"
+    AC_RUN_IFELSE([AC_LANG_PROGRAM([
+                    #include <pcre.h>
+                    #include <stdio.h>
+                  ],
+                  [
+                    pcre *r;
+                    const char *errptr;
+                    int erroffset;
+
+                    r = pcre_compile("\x80\x80", PCRE_UTF8,
+                                     &errptr, &erroffset, 0);
+                    if(!r) {
+                      fprintf(stderr, "pcre_compile: %s at %d",
+                              errptr, erroffset);
+                      exit(0);
+                    } else {
+                      fprintf(stderr, "accepted bogus UTF-8 string\n");
+                      exit(1);
+                    }
+                  ])],
+                  [rjk_cv_pcre_utf8=yes],
+                  [rjk_cv_pcre_utf8=no],
+                  [AC_MSG_ERROR([cross-compiling, cannot check libpcre behaviour])])
+    LIBS="$save_LIBS"
+  ])
+  if test $rjk_cv_pcre_utf8 = no; then
+    AC_MSG_ERROR([please rebuild your pcre library with --enable-utf8])
+  fi
+])
+# arch-tag:d09b2112a218009313949a279401a5b4
diff --git a/clients/Makefile.am b/clients/Makefile.am
new file mode 100644 (file)
index 0000000..5cdb0cb
--- /dev/null
@@ -0,0 +1,70 @@
+#
+# This file is part of DisOrder.
+# Copyright (C) 2006 Richard Kettlewell
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+# USA
+#
+
+bin_PROGRAMS=disorder disorderfm
+noinst_PROGRAMS=test-eclient filename-bytes
+
+AM_CPPFLAGS=-I${top_srcdir}/lib -I../lib
+
+disorder_SOURCES=disorder.c authorize.c authorize.h
+disorder_LDADD=$(LIBOBJS) ../lib/libdisorder.la
+disorder_DEPENDENCIES=$(LIBOBJS) ../lib/libdisorder.la
+
+disorderfm_SOURCES=disorderfm.c
+disorderfm_LDADD=$(LIBOBJS) ../lib/libdisorder.la
+disorderfm_DEPENDENCIES=$(LIBOBJS) ../lib/libdisorder.la
+
+filename_bytes_SOURCES=filename-bytes.c
+
+test_eclient_SOURCES=test-eclient.c
+test_eclient_LDADD=../lib/libdisorder.la
+test_eclient_DEPENDENCIES=../lib/libdisorder.la
+
+install-exec-hook:
+       $(LIBTOOL) --mode=finish $(DESTDIR)$(libdir)
+
+check: check-help check-completions
+
+# check everything has working --help
+check-help: all
+       ./disorder --version > /dev/null
+       ./disorder --help > /dev/null
+       ./disorder --help-commands > /dev/null
+
+# check that the command completions are up to date
+check-completions:
+       ./disorder --help-commands \
+               | awk '/^  [a-z]/ { print $$1 }' \
+               | sort > ,commands
+       ( set -e;completions() { \
+           for x; do \
+             case $$x in\
+               quack ) ;;\
+               [a-z]* ) echo $$x; ;;\
+             esac;\
+           done;\
+          }; \
+          complete() { if [ "$$7" = disorder ]; then completions $$6; fi }; \
+          . ${top_srcdir}/scripts/completion.bash )\
+               | sort > ,completions
+       diff -u ,commands ,completions
+
+CLEANFILES=,commands ,completions
+# arch-tag:3wdM7iS0B+n8makCG+YcAg
diff --git a/clients/authorize.c b/clients/authorize.c
new file mode 100644 (file)
index 0000000..e38aed4
--- /dev/null
@@ -0,0 +1,104 @@
+/*
+ * This file is part of DisOrder
+ * Copyright (C) 2005 Richard Kettlewell
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ * USA
+ */
+
+#include <config.h>
+#include "types.h"
+
+#include <pwd.h>
+#include <gcrypt.h>
+#include <errno.h>
+#include <unistd.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <stdio.h>
+
+#include "authorize.h"
+#include "log.h"
+#include "configuration.h"
+#include "printf.h"
+#include "hex.h"
+
+int authorize(const char *user) {
+  uint8_t pwbin[10];
+  const struct passwd *pw, *jbpw;
+  gid_t jbgid;
+  char *c, *t, *pwhex;
+  int fd;
+  FILE *fp;
+
+  if(!(jbpw = getpwnam(config->user)))
+    fatal(0, "cannot find user %s", config->user);
+  jbgid = jbpw->pw_gid;
+  if(!(pw = getpwnam(user)))
+    fatal(0, "no such user as %s", user);
+  if((c = config_userconf(0, pw)) && access(c, F_OK) == 0) {
+    error(0, "%s already exists", c);
+    return -1;
+  }
+  if((c = config_usersysconf(pw)) && access(c, F_OK) == 0) {
+    error(0, "%s already exists", c);
+    return -1;
+  }
+  byte_xasprintf(&t, "%s.new", c);
+  gcry_randomize(pwbin, sizeof pwbin, GCRY_STRONG_RANDOM);
+  pwhex = hex(pwbin, sizeof pwbin);
+
+  /* create config.USER, to end up with mode 440 user:jukebox */
+  if((fd = open(t, O_WRONLY|O_CREAT|O_EXCL, 0600)) < 0)
+    fatal(errno, "error creating %s", t);
+  if(fchown(fd, pw->pw_uid, -1) < 0)
+    fatal(errno, "error chowning %s", t);
+  if(fchmod(fd, 0400) < 0)
+    fatal(errno, "error chmoding %s", t);
+  if(!(fp = fdopen(fd, "w")))
+    fatal(errno, "error calling fdopen");
+  if(fprintf(fp, "password %s\n", pwhex) < 0
+     || fclose(fp) < 0)
+    fatal(errno, "error writing to %s", t);
+  if(rename(t, c) < 0)
+    fatal(errno, "error renaming %s to %s", t, c);
+
+  /* append to config.private.  We might create it along the way (though this
+   * is unlikely) in which case it had better be 640 root:jukebox */
+  if(!(c = config_private()))
+    fatal(0, "cannot determine private config file");
+  if((fd = open(c, O_WRONLY|O_APPEND|O_CREAT, 0600)) < 0)
+    fatal(errno, "error opening %s", c);
+  if(fchown(fd, 0, jbgid) < 0)
+    fatal(errno, "error chowning %s", c);
+  if(fchmod(fd, 0640) < 0)
+    fatal(errno, "error chmoding %s", t);
+  if(!(fp = fdopen(fd, "a")))
+    fatal(errno, "error calling fdopen");
+  if(fprintf(fp, "allow %s %s\n", user, pwhex) < 0
+     || fclose(fp) < 0)
+    fatal(errno, "error appending to %s", c);
+  return 0;
+}
+
+/*
+Local Variables:
+c-basic-offset:2
+comment-column:40
+fill-column:79
+indent-tabs-mode:nil
+End:
+*/
+/* arch-tag:BHATzWNN/1ccK/g2pbA63Q */
diff --git a/clients/authorize.h b/clients/authorize.h
new file mode 100644 (file)
index 0000000..0098b09
--- /dev/null
@@ -0,0 +1,35 @@
+/*
+ * This file is part of DisOrder
+ * Copyright (C) 2005 Richard Kettlewell
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ * USA
+ */
+#ifndef AUTHORIZE_H
+#define AUTHORIZE_H
+
+int authorize(const char *user);
+
+#endif /* AUTHORIZE_H */
+
+/*
+Local Variables:
+c-basic-offset:2
+comment-column:40
+fill-column:79
+indent-tabs-mode:nil
+End:
+*/
+/* arch-tag:2mW0Quc+PMX1C3BWywYFsQ */
diff --git a/clients/disorder.c b/clients/disorder.c
new file mode 100644 (file)
index 0000000..46e2c2d
--- /dev/null
@@ -0,0 +1,554 @@
+/*
+ * This file is part of DisOrder.
+ * Copyright (C) 2004, 2005, 2006 Richard Kettlewell
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ * USA
+ */
+
+#include <config.h>
+#include "types.h"
+
+#include <getopt.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <sys/un.h>
+#include <stdio.h>
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+#include <locale.h>
+#include <time.h>
+#include <stddef.h>
+#include <unistd.h>
+#include <assert.h>
+
+#include "configuration.h"
+#include "syscalls.h"
+#include "log.h"
+#include "queue.h"
+#include "client.h"
+#include "wstat.h"
+#include "table.h"
+#include "charset.h"
+#include "kvp.h"
+#include "split.h"
+#include "sink.h"
+#include "plugin.h"
+#include "mem.h"
+#include "defs.h"
+#include "authorize.h"
+#include "vector.h"
+
+static int auto_reconfigure;
+
+static const struct option options[] = {
+  { "help", no_argument, 0, 'h' },
+  { "version", no_argument, 0, 'V' },
+  { "config", required_argument, 0, 'c' },
+  { "debug", no_argument, 0, 'd' },
+  { "help-commands", no_argument, 0, 'H' },
+  { 0, 0, 0, 0 }
+};
+
+/* display usage message and terminate */
+static void help(void) {
+  xprintf("Usage:\n"
+         "  disorder [OPTIONS] COMMAND ...\n"
+         "Options:\n"
+         "  --help, -h              Display usage message\n"
+         "  --help-commands, -H     List commands\n"
+         "  --version, -V           Display version number\n"
+         "  --config PATH, -c PATH  Set configuration file\n"
+         "  --debug, -d             Turn on debugging\n");
+  xfclose(stdout);
+  exit(0);
+}
+
+/* display version number and terminate */
+static void version(void) {
+  xprintf("disorder version %s\n", disorder_version_string);
+  xfclose(stdout);
+  exit(0);
+}
+
+static void cf_version(disorder_client *c,
+                      char attribute((unused)) **argv) {
+  char *v;
+
+  if(disorder_version(c, &v)) exit(EXIT_FAILURE);
+  xprintf("%s\n", nullcheck(utf82mb(v)));
+}
+
+static void print_queue_entry(const struct queue_entry *q) {
+  if(q->track) xprintf("track %s\n", nullcheck(utf82mb(q->track)));
+  if(q->id) xprintf("  id %s\n", nullcheck(utf82mb(q->id)));
+  if(q->submitter) xprintf("  submitted by %s at %s",
+                          nullcheck(utf82mb(q->submitter)), ctime(&q->when));
+  if(q->played) xprintf("  played at %s", ctime(&q->played));
+  if(q->state == playing_started
+     || q->state == playing_paused) xprintf("  %lds so far",  q->sofar);
+  else if(q->expected) xprintf("  might start at %s", ctime(&q->expected));
+  if(q->scratched) xprintf("  scratched by %s\n",
+                          nullcheck(utf82mb(q->scratched)));
+  else xprintf("  %s\n", playing_states[q->state]);
+  if(q->wstat) xprintf("  %s\n", wstat(q->wstat));
+}
+
+static void cf_playing(disorder_client *c,
+                      char attribute((unused)) **argv) {
+  struct queue_entry *q;
+
+  if(disorder_playing(c, &q)) exit(EXIT_FAILURE);
+  if(q)
+    print_queue_entry(q);
+  else
+    xprintf("nothing\n");
+}
+
+static void cf_play(disorder_client *c, char **argv) {
+  while(*argv)
+    if(disorder_play(c, *argv++)) exit(EXIT_FAILURE);
+}
+
+static void cf_remove(disorder_client *c, char **argv) {
+  if(disorder_remove(c, argv[0])) exit(EXIT_FAILURE);
+}
+
+static void cf_disable(disorder_client *c,
+                      char attribute((unused)) **argv) {
+  if(disorder_disable(c)) exit(EXIT_FAILURE);
+}
+
+static void cf_enable(disorder_client *c, char attribute((unused)) **argv) {
+  if(disorder_enable(c)) exit(EXIT_FAILURE);
+}
+
+static void cf_scratch(disorder_client *c,
+                      char **argv) {
+  if(disorder_scratch(c, argv[0])) exit(EXIT_FAILURE);
+}
+
+static void cf_shutdown(disorder_client *c,
+                       char attribute((unused)) **argv) {
+  if(disorder_shutdown(c)) exit(EXIT_FAILURE);
+}
+
+static void cf_reconfigure(disorder_client *c,
+                          char attribute((unused)) **argv) {
+  if(disorder_reconfigure(c)) exit(EXIT_FAILURE);
+}
+
+static void cf_rescan(disorder_client *c, char attribute((unused)) **argv) {
+  if(disorder_rescan(c)) exit(EXIT_FAILURE);
+}
+
+static void cf_somequeue(disorder_client *c,
+                        int (*fn)(disorder_client *c,
+                                  struct queue_entry **qp)) {
+  struct queue_entry *q;
+
+  if(fn(c, &q)) exit(EXIT_FAILURE);
+  while(q) {
+    print_queue_entry(q);
+    q = q->next;
+  }
+}
+
+static void cf_recent(disorder_client *c, char attribute((unused)) **argv) {
+  cf_somequeue(c, disorder_recent);
+}
+
+static void cf_queue(disorder_client *c, char attribute((unused)) **argv) {
+  cf_somequeue(c, disorder_queue);
+}
+
+static void cf_quack(disorder_client attribute((unused)) *c,
+                    char attribute((unused)) **argv) {
+  xprintf("\n"
+         " .------------------.\n"
+         " | Naath is a babe! |\n"
+         " `---------+--------'\n"
+         "            \\\n"
+         "              >0\n"
+         "               (<)'\n"
+         "~~~~~~~~~~~~~~~~~~~~~~\n"
+         "\n");
+}
+
+static void cf_somelist(disorder_client *c, char **argv,
+                       int (*fn)(disorder_client *c,
+                                 const char *arg, const char *re,
+                                 char ***vecp, int *nvecp)) {
+  char **vec;
+  const char *re;
+
+  if(argv[1])
+    re = xstrdup(argv[1] + 1);
+  else
+    re = 0;
+  if(fn(c, argv[0], re, &vec, 0)) exit(EXIT_FAILURE);
+  while(*vec)
+    xprintf("%s\n", nullcheck(utf82mb(*vec++)));
+}
+
+static int isarg_regexp(const char *s) {
+  return s[0] == '~';
+}
+
+static void cf_dirs(disorder_client *c,
+                   char **argv) {
+  cf_somelist(c, argv, disorder_directories);
+}
+
+static void cf_files(disorder_client *c, char **argv) {
+  cf_somelist(c, argv, disorder_files);
+}
+
+static void cf_allfiles(disorder_client *c, char **argv) {
+  cf_somelist(c, argv, disorder_allfiles);
+}
+
+static void cf_get(disorder_client *c, char **argv) {
+  char *value;
+
+  if(disorder_get(c, argv[0], argv[1], &value)) exit(EXIT_FAILURE);
+  xprintf("%s\n", nullcheck(utf82mb(value)));
+}
+
+static void cf_length(disorder_client *c, char **argv) {
+  long length;
+
+  if(disorder_length(c, argv[0], &length)) exit(EXIT_FAILURE);
+  xprintf("%ld\n", length);
+}
+
+static void cf_set(disorder_client *c, char **argv) {
+  if(disorder_set(c, argv[0], argv[1], argv[2])) exit(EXIT_FAILURE);
+}
+
+static void cf_unset(disorder_client *c, char **argv) {
+  if(disorder_unset(c, argv[0], argv[1])) exit(EXIT_FAILURE);
+}
+
+static void cf_prefs(disorder_client *c, char **argv) {
+  struct kvp *k;
+
+  if(disorder_prefs(c, argv[0], &k)) exit(EXIT_FAILURE);
+  for(; k; k = k->next)
+    xprintf("%s = %s\n",
+           nullcheck(utf82mb(k->name)), nullcheck(utf82mb(k->value)));
+}
+
+static void cf_search(disorder_client *c, char **argv) {
+  char **results;
+  int nresults, n;
+
+  if(disorder_search(c, *argv, &results, &nresults)) exit(EXIT_FAILURE);
+  for(n = 0; n < nresults; ++n)
+    xprintf("%s\n", nullcheck(utf82mb(results[n])));
+}
+
+static void cf_random_disable(disorder_client *c,
+                             char attribute((unused)) **argv) {
+  if(disorder_random_disable(c)) exit(EXIT_FAILURE);
+}
+
+static void cf_random_enable(disorder_client *c,
+                            char attribute((unused)) **argv) {
+  if(disorder_random_enable(c)) exit(EXIT_FAILURE);
+}
+
+static void cf_stats(disorder_client *c,
+                    char attribute((unused)) **argv) {
+  char **vec;
+
+  if(disorder_stats(c, &vec, 0)) exit(EXIT_FAILURE);
+  while(*vec)
+      xprintf("%s\n", nullcheck(utf82mb(*vec++)));
+}
+
+static void cf_get_volume(disorder_client *c,
+                         char attribute((unused)) **argv) {
+  int l, r;
+
+  if(disorder_get_volume(c, &l, &r)) exit(EXIT_FAILURE);
+  xprintf("%d %d\n", l, r);
+}
+
+static void cf_set_volume(disorder_client *c,
+                         char **argv) {
+  if(disorder_set_volume(c, atoi(argv[0]), atoi(argv[1]))) exit(EXIT_FAILURE);
+}
+
+static void cf_become(disorder_client *c,
+                     char **argv) {
+  if(disorder_become(c, argv[0])) exit(EXIT_FAILURE);
+}
+
+static void cf_log(disorder_client *c,
+                  char attribute((unused)) **argv) {
+  if(disorder_log(c, sink_stdio("stdout", stdout))) exit(EXIT_FAILURE);
+}
+
+static void cf_move(disorder_client *c,
+                  char **argv) {
+  long n;
+  int e;
+  
+  if((e = xstrtol(&n, argv[1], 0, 10)))
+    fatal(e, "cannot convert '%s'", argv[1]);
+  if(n > INT_MAX || n < INT_MIN)
+    fatal(e, "%ld out of range", n);
+  if(disorder_move(c, argv[0], (int)n)) exit(EXIT_FAILURE);
+}
+
+static void cf_part(disorder_client *c,
+                   char **argv) {
+  char *s;
+
+  if(disorder_part(c, &s, argv[0], argv[1], argv[2])) exit(EXIT_FAILURE);
+  xprintf("%s\n", nullcheck(utf82mb(s)));
+}
+
+static int isarg_filename(const char *s) {
+  return s[0] == '/';
+}
+
+static void cf_authorize(disorder_client attribute((unused)) *c,
+                        char **argv) {
+  if(!authorize(argv[0]))
+    auto_reconfigure = 1;
+}
+
+static void cf_resolve(disorder_client *c,
+                      char **argv) {
+  char *track;
+
+  if(disorder_resolve(c, &track, argv[0])) exit(EXIT_FAILURE);
+  xprintf("%s\n", nullcheck(utf82mb(track)));
+}
+
+static void cf_pause(disorder_client *c,
+                       char attribute((unused)) **argv) {
+  if(disorder_pause(c)) exit(EXIT_FAILURE);
+}
+
+static void cf_resume(disorder_client *c,
+                       char attribute((unused)) **argv) {
+  if(disorder_resume(c)) exit(EXIT_FAILURE);
+}
+
+static void cf_tags(disorder_client *c,
+                    char attribute((unused)) **argv) {
+  char **vec;
+
+  if(disorder_tags(c, &vec, 0)) exit(EXIT_FAILURE);
+  while(*vec)
+      xprintf("%s\n", nullcheck(utf82mb(*vec++)));
+}
+
+static void cf_get_global(disorder_client *c, char **argv) {
+  char *value;
+
+  if(disorder_get_global(c, argv[0], &value)) exit(EXIT_FAILURE);
+  xprintf("%s\n", nullcheck(utf82mb(value)));
+}
+
+static void cf_set_global(disorder_client *c, char **argv) {
+  if(disorder_set_global(c, argv[0], argv[1])) exit(EXIT_FAILURE);
+}
+
+static void cf_unset_global(disorder_client *c, char **argv) {
+  if(disorder_unset_global(c, argv[0])) exit(EXIT_FAILURE);
+}
+
+static const struct command {
+  const char *name;
+  int min, max;
+  void (*fn)(disorder_client *c, char **);
+  int (*isarg)(const char *);
+  const char *argstr, *desc;
+} commands[] = {
+  { "allfiles",       1, 2, cf_allfiles, isarg_regexp, "DIR [~REGEXP]",
+                      "List all files and directories in DIR" },
+  { "authorize",      1, 1, cf_authorize, 0, "USER",
+                      "Authorize USER to connect to the server" },
+  { "become",         1, 1, cf_become, 0, "USER",
+                      "Become user USER" },
+  { "dirs",           1, 2, cf_dirs, isarg_regexp, "DIR [~REGEXP]",
+                      "List directories in DIR" },
+  { "disable",        0, 0, cf_disable, 0, "",
+                      "Disable play" },
+  { "disable-random", 0, 0, cf_random_disable, 0, "",
+                      "Disable random play" },
+  { "enable",         0, 0, cf_enable, 0, "",
+                      "Enable play" },
+  { "enable-random",  0, 0, cf_random_enable, 0, "",
+                      "Enable random play" },
+  { "files",          1, 2, cf_files, isarg_regexp, "DIR [~REGEXP]",
+                      "List files in DIR" },
+  { "get",            2, 2, cf_get, 0, "TRACK NAME",
+                      "Get a preference value" },
+  { "get-global",     1, 1, cf_get_global, 0, "NAME",
+                      "Get a global preference value" },
+  { "get-volume",     0, 0, cf_get_volume, 0, "",
+                      "Get the current volume" },
+  { "length",         1, 1, cf_length, 0, "TRACK",
+                      "Get the length of TRACK in seconds" },
+  { "log",            0, 0, cf_log, 0, "",
+                      "Copy event log to stdout" },
+  { "move",           2, 2, cf_move, 0, "TRACK DELTA",
+                      "Move a track in the queue" },
+  { "part",           3, 3, cf_part, 0, "TRACK CONTEXT PART",
+                      "Find a track name part" },
+  { "pause",          0, 0, cf_pause, 0, "",
+                      "Pause the currently playing track" },
+  { "play",           1, INT_MAX, cf_play, isarg_filename, "TRACKS...",
+                      "Add TRACKS to the end of the queue" },
+  { "playing",        0, 0, cf_playing, 0, "",
+                      "Report the playing track" },
+  { "prefs",          1, 1, cf_prefs, 0, "TRACK",
+                      "Display all the preferences for TRACK" },
+  { "quack",          0, 0, cf_quack, 0, 0, 0 },
+  { "queue",          0, 0, cf_queue, 0, "",
+                      "Display the current queue" },
+  { "random-disable", 0, 0, cf_random_disable, 0, "",
+                      "Disable random play" },
+  { "random-enable",  0, 0, cf_random_enable, 0, "",
+                      "Enable random play" },
+  { "recent",         0, 0, cf_recent, 0, "",
+                      "Display recently played track" },
+  { "reconfigure",    0, 0, cf_reconfigure, 0, "",
+                      "Reconfigure the daemon" },
+  { "remove",         1, 1, cf_remove, 0, "TRACK",
+                      "Remove a track from the queue" },
+  { "rescan",         0, 0, cf_rescan, 0, "",
+                      "Rescan for new tracks" },
+  { "resolve",        1, 1, cf_resolve, 0, "TRACK",
+                      "Resolve alias for TRACK" },
+  { "resume",         0, 0, cf_resume, 0, "",
+                      "Resume after a pause" },
+  { "scratch",        0, 0, cf_scratch, 0, "",
+                      "Scratch the currently playing track" },
+  { "scratch-id",     1, 1, cf_scratch, 0, "ID",
+                      "Scratch the currently playing track" },
+  { "search",         1, 1, cf_search, 0, "WORDS",
+                      "Display tracks matching all the words" },
+  { "set",            3, 3, cf_set, 0, "TRACK NAME VALUE",
+                      "Set a preference value" },
+  { "set-global",     2, 2, cf_set_global, 0, "NAME VALUE",
+                      "Set a global preference value" },
+  { "set-volume",     2, 2, cf_set_volume, 0, "LEFT RIGHT",
+                      "Set the volume" },
+  { "shutdown",       0, 0, cf_shutdown, 0, "",
+                      "Shut down the daemon" },
+  { "stats",          0, 0, cf_stats, 0, "",
+                      "Display server statistics" },
+  { "tags",           0, 0, cf_tags, 0, "",
+                      "List known tags" },
+  { "unset",          2, 2, cf_unset, 0, "TRACK NAME",
+                      "Unset a preference" },
+  { "unset-global",   1, 1, cf_unset_global, 0, "NAME",
+                      "Unset a global preference" },
+  { "version",        0, 0, cf_version, 0, "",
+                      "Display the server version" },
+};
+
+static void help_commands(void) {
+  unsigned n, max = 0, l;
+
+  xprintf("Command summary:\n");
+  for(n = 0; n < sizeof commands / sizeof *commands; ++n) {
+    if(!commands[n].desc) continue;
+    l = strlen(commands[n].name);
+    if(*commands[n].argstr)
+      l += strlen(commands[n].argstr) + 1;
+    if(l > max)
+      max = l;
+  }
+  for(n = 0; n < sizeof commands / sizeof *commands; ++n) {
+    if(!commands[n].desc) continue;
+    l = strlen(commands[n].name);
+    if(*commands[n].argstr)
+      l += strlen(commands[n].argstr) + 1;
+    xprintf("  %s%s%s%*s  %s\n", commands[n].name,
+           *commands[n].argstr ? " " : "",
+           commands[n].argstr,
+           max - l, "",
+           commands[n].desc);
+  }
+  xfclose(stdout);
+  exit(0);
+}
+
+int main(int argc, char **argv) {
+  int n, i, j;
+  disorder_client *c = 0;
+  const char *s;
+  int status = 0;
+  struct vector args;
+
+  mem_init(1);
+  if(!setlocale(LC_CTYPE, "")) fatal(errno, "error calling setlocale");
+  while((n = getopt_long(argc, argv, "hVc:dHL", options, 0)) >= 0) {
+    switch(n) {
+    case 'h': help();
+    case 'H': help_commands();
+    case 'V': version();
+    case 'c': configfile = optarg; break;
+    case 'd': debugging = 1; break;
+    default: fatal(0, "invalid option");
+    }
+  }
+  if(config_read()) fatal(0, "cannot read configuration");
+  if(!(c = disorder_new(1))) exit(EXIT_FAILURE);
+  s = config_get_file("socket");
+  if(disorder_connect(c)) exit(EXIT_FAILURE);
+  n = optind;
+  /* accumulate command args */
+  while(n < argc) {
+    if((i = TABLE_FIND(commands, struct command, name, argv[n])) < 0)
+      fatal(0, "unknown command '%s'", argv[n]);
+    if(n + commands[i].min >= argc)
+      fatal(0, "missing arguments to '%s'", argv[n]);
+    n++;
+    vector_init(&args);
+    for(j = 0; j < commands[i].min; ++j)
+      vector_append(&args, nullcheck(mb2utf8(argv[n + j])));
+    for(; j < commands[i].max
+         && n + j < argc
+         && commands[i].isarg(argv[n + j]); ++j)
+      vector_append(&args, nullcheck(mb2utf8(argv[n + j])));
+    vector_terminate(&args);
+    commands[i].fn(c, args.vec);
+    n += j;
+  }
+  if(auto_reconfigure) {
+    assert(c != 0);
+    if(disorder_reconfigure(c)) exit(EXIT_FAILURE);
+  }
+  if(c && disorder_close(c)) exit(EXIT_FAILURE);
+  if(fclose(stdout) < 0) fatal(errno, "error closing stdout");
+  return status;
+}
+
+/*
+Local Variables:
+c-basic-offset:2
+comment-column:40
+End:
+*/
+/* arch-tag:0ff200f4c42e9b04dd781fa89c6129f6 */
diff --git a/clients/disorderfm.c b/clients/disorderfm.c
new file mode 100644 (file)
index 0000000..0fd4fa0
--- /dev/null
@@ -0,0 +1,414 @@
+/*
+ * This file is part of DisOrder.
+ * Copyright (C) 2006 Richard Kettlewell
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ * USA
+ */
+
+#include <config.h>
+#include "types.h"
+
+#include <getopt.h>
+#include <unistd.h>
+#include <locale.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <dirent.h>
+#include <sys/stat.h>
+#include <langinfo.h>
+#include <string.h>
+#include <fnmatch.h>
+
+#include "syscalls.h"
+#include "log.h"
+#include "printf.h"
+#include "charset.h"
+#include "defs.h"
+#include "mem.h"
+
+/* Arguments etc ----------------------------------------------------------- */
+
+typedef int copyfn(const char *from, const char *to);
+typedef int mkdirfn(const char *dir, mode_t mode);
+
+/* Input and output directories */
+static const char *source, *destination;
+
+/* Function used to copy or link a file */
+static copyfn *copier = link;
+
+/* Function used to make a directory */
+static mkdirfn *dirmaker = mkdir;
+
+/* Various encodings */
+static const char *fromencoding, *toencoding, *tagencoding;
+
+/* Directory for untagged files */
+static const char *untagged;
+
+/* Extract tag information? */
+static int extracttags;
+
+/* Windows-friendly filenames? */
+static int windowsfriendly;
+
+/* Native character encoding (i.e. from LC_CTYPE) */
+static const char *nativeencoding;
+
+/* Count of errors */
+static long errors;
+
+/* Included/excluded filename patterns */
+static struct pattern {
+  struct pattern *next;
+  const char *pattern;
+  int type;
+} *patterns, **patterns_end = &patterns;
+
+static int default_inclusion = 1;
+
+static const struct option options[] = {
+  { "help", no_argument, 0, 'h' },
+  { "version", no_argument, 0, 'V' },
+  { "debug", no_argument, 0, 'd' },
+  { "from", required_argument, 0, 'f' },
+  { "to", required_argument, 0, 't' },
+  { "include", required_argument, 0, 'i' },
+  { "exclude", required_argument, 0, 'e' },
+  { "extract-tags", no_argument, 0, 'E' },
+  { "tag-encoding", required_argument, 0, 'T' },
+  { "untagged", required_argument, 0, 'u' },
+  { "windows-friendly", no_argument, 0, 'w' },
+  { "link", no_argument, 0, 'l' },
+  { "symlink", no_argument, 0, 's' },
+  { "copy", no_argument, 0, 'c' },
+  { "no-action", no_argument, 0, 'n' },
+  { 0, 0, 0, 0 }
+};
+
+/* display usage message and terminate */
+static void help(void) {
+  xprintf("Usage:\n"
+"  disorderfm [OPTIONS] SOURCE DESTINATION\n"
+"Options:\n"
+"  --from, -f ENCODING     Source encoding\n"
+"  --to, -t ENCODING       Destination encoding\n"
+"If neither --from nor --to are specified then no encoding translation is\n"
+"performed.  If only one is specified then the other defaults to the current\n"
+"locale's encoding.\n"
+"  --windows-friendly, -w  Replace illegal characters with '_'\n"
+"  --include, -i PATTERN   Include files matching a glob pattern\n"
+"  --exclude, -e PATTERN   Include files matching a glob pattern\n"
+"--include and --exclude may be used multiple times.  They are checked in\n"
+"order and the first match wins.  If --include is ever used then nonmatching\n"
+"files are excluded, otherwise they are included.\n"
+"  --link, -l              Link files from source to destination (default)\n"
+"  --symlink, -s           Symlink files from source to destination\n"
+"  --copy, -c              Copy files from source to destination\n"
+"  --no-action, -n         Just report what would be done\n"
+"  --debug, -d             Debug mode\n"
+"  --help, -h              Display usage message\n"
+"  --version, -V           Display version number\n");
+  /* TODO: tag extraction stuff when implemented */
+  xfclose(stdout);
+  exit(0);
+}
+
+/* display version number and terminate */
+static void version(void) {
+  xprintf("disorderfm version %s\n", disorder_version_string);
+  xfclose(stdout);
+  exit(0);
+}
+
+/* Utilities --------------------------------------------------------------- */
+
+/* Copy FROM to TO.  Has the same signature as link/symlink. */
+static int copy(const char *from, const char *to) {
+  int fdin, fdout;
+  char buffer[4096];
+  int n;
+
+  if((fdin = open(from, O_RDONLY)) < 0)
+    fatal(errno, "error opening %s", from);
+  if((fdout = open(to, O_WRONLY|O_CREAT|O_TRUNC, 0666)) < 0)
+    fatal(errno, "error opening %s", to);
+  while((n = read(fdin, buffer, sizeof buffer)) > 0) {
+    if(write(fdout, buffer, n) < 0)
+      fatal(errno, "error writing to %s", to);
+  }
+  if(n < 0) fatal(errno, "error reading %s", from);
+  if(close(fdout) < 0) fatal(errno, "error closing %s", to);
+  xclose(fdin);
+  return 0;
+}
+
+static int nocopy(const char *from, const char *to) {
+  xprintf("%s -> %s\n",
+          any2mb(fromencoding, from),
+          any2mb(toencoding, to));
+  return 0;
+}
+
+static int nomkdir(const char *dir, mode_t attribute((unused)) mode) {
+  xprintf("mkdir %s\n", any2mb(toencoding, dir));
+  return 0;
+}
+
+/* Name translation -------------------------------------------------------- */
+
+static int bad_windows_char(int c) {
+  switch(c) {
+  default:
+    return 0;
+    /* Documented as bad by MS */
+  case '<':
+  case '>':
+  case ':':
+  case '"':
+  case '\\':
+  case '|':
+    /* Not documented as bad by MS but Samba mangles anyway? */
+  case '*':
+    return 1;
+  }
+}
+
+/* Return the translated form of PATH */
+static char *nametrans(const char *path) {
+  char *t = any2any(fromencoding, toencoding, path);
+
+  if(windowsfriendly) {
+    /* See:
+     * http://msdn.microsoft.com/library/default.asp?url=/library/en-us/fileio/fs/naming_a_file.asp?frame=true&hidetoc=true */
+    /* List of forbidden names */
+    static const char *const devicenames[] = {
+      "CON", "PRN", "AUX", "NUL", "COM1", "COM2", "COM3", "COM4", "COM5",
+      "COM6", "COM7", "COM8", "COM9", "LPT1", "LPT2", "LPT3", "LPT4", "LPT5",
+      "LPT6", "LPT7", "LPT8", "LPT9", "CLOCK$"
+    };
+#define NDEVICENAMES (sizeof devicenames / sizeof *devicenames)
+    char *s;
+    size_t n, l;
+
+    /* Certain characters are just not allowed.  We replace them with
+     * underscores. */
+    for(s = t; *s; ++s)
+      if(bad_windows_char((unsigned char)*s))
+        *s = '_';
+    /* Trailing spaces and dots are not allowed.  We just strip them. */
+    while(s > t && (s[-1] == ' ' || s[-1] == '.'))
+      --s;
+    *s = 0;
+    /* Reject device names */
+    if((s = strchr(t, '.'))) l = s - t;
+    else l = 0;
+    for(n = 0; n < NDEVICENAMES; ++n)
+      if(l == strlen(devicenames[n]) && !strncasecmp(devicenames[n], t, l))
+        break;
+    if(n < NDEVICENAMES)
+      byte_xasprintf(&t, "_%s", t);
+  }
+  return t;
+}
+
+/* The file walker --------------------------------------------------------- */
+
+/* Visit file or directory PATH relative to SOURCE.  SOURCE is a null pointer
+ * at the top level.
+ *
+ * PATH is something we extracted from the filesystem so by assumption is in
+ * the FROM encoding, which might _not_ be the same as the current locale's
+ * encoding.
+ *
+ * For most errors we carry on as best we can.
+ */
+static void visit(const char *path, const char *destpath) {
+  const struct pattern *p;
+  struct stat sb;
+  /* fullsourcepath is the full source pathname for PATH */
+  char *fullsourcepath;
+  /* fulldestpath will be the full destination pathname */
+  char *fulldestpath;
+  /* String to use in error messags.  We convert to the current locale; this
+   * may be somewhat misleading but is necessary to avoid getting EILSEQ in
+   * error messages. */
+  char *errsourcepath, *errdestpath;
+
+  D(("visit %s", path ? path : "NULL"));
+  
+  /* Set up all the various path names */
+  if(path) {
+    byte_xasprintf(&fullsourcepath, "%s/%s",
+                   source, path);
+    byte_xasprintf(&fulldestpath, "%s/%s",
+                   destination, destpath);
+    byte_xasprintf(&errsourcepath, "%s/%s",
+                   source, any2mb(fromencoding, path));
+    byte_xasprintf(&errdestpath, "%s/%s",
+                   destination, any2mb(toencoding, destpath));
+    for(p = patterns; p; p = p->next)
+      if(fnmatch(p->pattern, path, FNM_PATHNAME) == 0)
+        break;
+    if(p) {
+      /* We found a matching pattern */
+      if(p->type == 'e') {
+        D(("%s matches %s therefore excluding",
+           path, p->pattern));
+        return;
+      }
+    } else {
+      /* We did not find a matching pattern */
+      if(!default_inclusion) {
+        D(("%s matches nothing and not including by default", path));
+        return;
+      }
+    }
+  } else {
+    fullsourcepath = errsourcepath = (char *)source;
+    fulldestpath = errdestpath = (char *)destination;
+  }
+
+  /* The destination directory might be a subdirectory of the source
+   * directory. In that case we'd better not descend into it when we encounter
+   * it in the source. */
+  if(!strcmp(fullsourcepath, destination)) {
+    info("%s matches destination directory, not recursing", errsourcepath);
+    return;
+  }
+  
+  /* Find out what kind of file we're dealing with */
+  if(stat(fullsourcepath, &sb) < 0) {
+    error(errno, "cannot stat %s", errsourcepath );
+    ++errors;
+    return;
+  }
+  if(S_ISREG(sb.st_mode)) {
+    if(copier != nocopy)
+      if(unlink(fulldestpath) < 0 && errno != ENOENT) {
+        error(errno, "cannot remove %s", errdestpath);
+        ++errors;
+        return;
+      }
+    if(copier(fullsourcepath, fulldestpath) < 0) {
+      error(errno, "cannot link %s to %s", errsourcepath, errdestpath);
+      ++errors;
+      return;
+    }
+  } else if(S_ISDIR(sb.st_mode)) {
+    DIR *dp;
+    struct dirent *de;
+    char *childpath, *childdestpath;
+  
+    /* We create the directory on the destination side.  If it already exists,
+     * that's fine. */
+    if(dirmaker(fulldestpath, 0777) < 0 && errno != EEXIST) {
+      error(errno, "cannot mkdir %s", errdestpath);
+      ++errors;
+      return;
+    }
+    /* We read the directory and visit all the files in it in any old order. */
+    if(!(dp = opendir(fullsourcepath))) {
+      error(errno, "cannot open directory %s", errsourcepath);
+      ++errors;
+      return;
+    }
+    while(((errno = 0), (de = readdir(dp)))) {
+      if(!strcmp(de->d_name, ".")
+         || !strcmp(de->d_name, "..")) continue;
+      if(path) {
+        byte_xasprintf(&childpath, "%s/%s", path, de->d_name);
+        byte_xasprintf(&childdestpath, "%s/%s",
+                       destpath, nametrans(de->d_name));
+      } else {
+        childpath = de->d_name;
+        childdestpath = nametrans(de->d_name);
+      }
+      visit(childpath, childdestpath);
+    }
+    if(errno) fatal(errno, "error reading directory %s", errsourcepath);
+    closedir(dp);
+  } else {
+    /* We don't handle special files, but we'd better warn the user. */
+    info("ignoring %s", errsourcepath);
+  }
+}
+
+int main(int argc, char **argv) {
+  int n;
+  struct pattern *p;
+
+  mem_init(1);
+  if(!setlocale(LC_CTYPE, "")) fatal(errno, "error calling setlocale");
+  while((n = getopt_long(argc, argv, "hVdf:t:i:e:ET:u:wlscn", options, 0)) >= 0) {
+    switch(n) {
+    case 'h': help();
+    case 'V': version();
+    case 'd': debugging = 1; break;
+    case 'f': fromencoding = optarg; break;
+    case 't': toencoding = optarg; break;
+    case 'i': 
+    case 'e':
+      p = xmalloc(sizeof *p);
+      p->type = n;
+      p->pattern = optarg;
+      p->next = 0;
+      *patterns_end = p;
+      patterns_end = &p->next;
+      if(n == 'i') default_inclusion = 0;
+      break;
+    case 'E': extracttags = 1; break;
+    case 'T': tagencoding = optarg; break;
+    case 'u': untagged = optarg; break;
+    case 'w': windowsfriendly = 1; break;
+    case 'l': copier = link; break;
+    case 's': copier = symlink; break;
+    case 'c': copier = copy; break;
+    case 'n': copier = nocopy; dirmaker = nomkdir; break;
+    default: fatal(0, "invalid option");
+    }
+  }
+  if(optind == argc) fatal(0, "missing SOURCE and DESTINATION arguments");
+  else if(optind + 1 == argc) fatal(0, "missing DESTINATION argument");
+  else if(optind + 2 != argc) fatal(0, "redundant extra arguments");
+  if(extracttags) fatal(0, "--extract-tags is not implemented yet"); /* TODO */