# $Id: TODO 184 2008-03-03 01:54:09Z alan $

reorganize TODO file :)

#################
Version 0.16:
    Break a bunch of stuff:
    * change behavior of symlinks in SOURCE -- nobody likes the current
      behavior, and rsyncd won't let it work as intended anyway.  Just copy
      them down as symlinks, instead of trying to dereference them within the
      repository.
    * don't test for -x on scripts, just -e (making non-executable scripts a
      fatal error, rather than skipping silently by what is usually a mistake)
    * get rid of implicit '-e ssh' with a double-colon in SOURCE.  Make people
      use --rsh explicitly (maybe add a warning first?)
    * replace --cvs-exclude in slack-sync with a better exclude list
      [so people can, against my advice :), install .so files and such]

#################
logging!

add --explicit-roles option that enables specifying roles on the command line
    but defaults to on.  but you can disable this in slack.conf if you want to
    avoid admin errors.

make slack-getroles use slack-sync, so only slack-sync needs to know about
    how to get stuff from source, and we can more easily add support
    for other roles sources

in rolediff, feed the files to slack-diff via stdin or something to speed
    things up.

make slack.conf noreplace in slack.spec?

in --preview=prompt, add a "skip" option to skip a particular role

fully support alternate diff programs (temp files or fds for modes with
    filename and attribute in the text; honor DIFF env var or something)

Slack.pm: in find_files_to_install(), probably better to hand the callback a
    relative path (sub out ^$source/).

make run_backend() do the printing to stderr and dereferencing backend flags

make slack-getroles work for non-superusers (by caching the role list in /tmp
    or something)

write unit tests for slack-stage changes (--subdir support)
more unit tests for slack-diff
    we can use fakeroot if avail and skip some tests if non-root

manpage update:
    describe order of operations

add functionality to check manually-supplied role list against list in
    slack-getroles, with option to override
just skip syncing if source equals cache.
use an "install" script, if present, instead of built-in
    file install routines
export dry-run, backup, backup-dir if they exist
support preview
    add a flag to run script in preview with a dry-run flag or env
function library for shell scripts
in RPM, deb, create subdirs of CACHE


a push script to read roles.conf and push a role to all servers running it

defaults for slack.conf in Slack.pm or somewhere?  (so people don't have to
keep patching as new variables are introduced...)

#################

PRE-1.0:
* Figure out some better way to handle backup options:
    - by default, we want admins to just specify the base backup dir in config,
      and we can add the time-based subdir to it
    - we generally want only installfiles to do backups (given the existence
        of fixfiles, it's pretty useless for slack-sync)
    - if we're doing backups in slack-sync, we need to append
        files(.subrole)?|scripts
    - rsync really hates whatever fixfiles does with symlinks in the
        accounts role.  it's probably a bug.  track it down.
    - before running scripts, install them in some other directory, so we
        can keep track of the last script we ran for backup and warning
        purposes.  (just doing it in slack-sync wouldn't work for nagging
        or warning purposes).  Probably we'll have to install them all
        at once, since we don't know what other files in the scripts/
        directory they may use.

* Nagging
    - we want to be able to nag admins about files they have not yet installed
        or scripts they have not yet run

* separate slack-runscript, slack-runfixfiles
* allow ./configure to set paths
* manpages for slack, slack-backends
* record what roles have been installed
--------
LATER:

* build in support for heterogenous underlying distros, like subsets have
  (maybe just using subroles)

* Nagging email about pending changes
* Use backup functionality to store original versions of files,
  so we can uninstall
* Use backups to store intermediate versions of files for rollbacks
* Make a helper that uses tripwire or AIDE to find files that
  have been modified and upload them to repository, so people
  can be *really* lazy.
* Locking to prevent concurrent writes

* something like rpm -ql, -qf to show/query files in a role (just from files
    dir)
* use a tarball as a source (possibly fetched with wget)
* support http urls (with wget), both as raw dir trees and as tar.gz files
* use rsync+ssh to mean rsync -e ssh (like svn)
* maybe split the getting stuff in sync/getroles from the syncing stuff in stage, so we can have a common backend for various URLs
