
= TODO

== Convinient symlink method

Implement a Rant::Sys.symlink (or similar name) method that converts
destination filenames to absolute pathes before actual linking.

== More tests for --dry-run

== Behaviour of `gen Rule' without block

Currently dies with undefined method `arity' for
nil:NilClass.

Done (0.4.9), printing an appropriate error message.

== Command: Hash interpolation

Decide about behaviour of hash interpolation in Command tasks.

== Don't use +invoke+ result of dependency to check if update is
   necessary

It doesn't make sense since:
1. The node (prerequisite) could have already been invoked by another
   node as prerequisite. For the first node, the prerequisite would
   return true, all following false.
2. The node (prerequisite) *can* *not* know if the invoking node is
   up to date compared to itself.

== Check +enhance+ for SourceNodes

Rant fails (infinite recursion) for enhance on SourceNodes.
Update: Infinite recursion occurs only when a require "rant"
        was done. Else an appropriate message is printed. Can be
        considered OK.

== Implement Rant::FileList#==

== Update documentation with regards to resolve hooks.

The argument list for resolve hooks has changed in version 0.4.5.
A hook has to accept two arguments now, the first is the target name
and the second is the project directory the resolve action is relative
to. Previously, a resolve hook got only the target name as argument.

== Eventually replace # with another symbol.

The # symbol as reference to the project's root directory should
eventuelly get replaced with a better fitting symbol. Many shells
interpret it as comment start and thus escaping/quoting is needed if
#some_target arguments are used on the commandline. This
could get a common source of annoyance/bugs.

Favorite candidate is currently @.

Done (0.4.5), using @.

== Improve SourceNode types

Currently a SourceNode can only have other SourceNodes or files as
prerequisites. But if e.g., a header file should be autogenerated,
this isn't sufficient anymore.
Done (0.4.5).

---
Update

Done (0.4.3) for SignedSourceNodes.

== Deprecate plugin API

... and provide alternatives for the Configure and CSharp plugins.

== FileList

FileList objects need a method which adds a file which won't be
removed by any pattern (also not affected by var[:ignore]).

---
Done (0.4.3).

Use FileList#<< to append a single entry which won't be removed by
exclude/ignore patterns.

== Semantics of directories as prerequisites of file creating nodes.

Currently there are two so called "file creating" nodes: FileTask and
SignedFile. The following treatments of a directory as prerequisite
are possible:

1. Current behaviour:
   FileTask::   If a directory node exists, invoke it and compare if
                the modification time of the directory is newer than
                the target file.
   SignedFile:: If a directory node exists, invoke it. If the
                invocation return true, rebuild target file. If no
                directory node exists, create a signature of the
                directory by reading its entries and check this
                signature against the signature of the last time the
                target file was built.

2. Just check if a directory node exists and invoke it. Trigger target
   rebuild if +invoke+ returns true. If no node exists do nothing
   special, the directory doesn't trigger a target file rebuild.

I'm currently in favour of #2.

---
*Update*

Current behaviour:
FileTask::      If a directory node exists, invoke it and compare if
                the modification time of the directory is newer than
                the target file. If no node exists, just compare the
                modification time.
SignedFile::    If a directory node exists, invoke it and trigger a
                rebuild if +invoke+ returns true. Anyway create a
                signature of the path, which results in a rebuild if
                the directory path changes once. This could be
                considered an inconsistency since path/name changes of
                other prerequisites don't trigger a rebuild.

== Don't use testrb as testrunner for RubyTest.

== Solve archiving dependency problem
Because of timed depdencies, the archiving tasks don't recognize if
the only change is that a file was removed. The only exception is a
primitive +Archive+ task whith manifest synchronization. The problem
can be solved by writing a list of files parallel to archive creation
or to write a signature of the filelist.

== Dependency alternation
Allow at least two tasks as one dependency where the first available
will actually used to satisfy the dependency, pseudo code:
    task :a => :b | :c
Rant should first try :b and if the task :b exists and succeds
:c won't be considered, if task :b doesn't exist, rant should try
to make :c.

== GET RID OF CLASS Rant::Path
Done (0.3.7).

== Packaging
Try minitar if tar is not available.
Done (0.3.9).

== C# plugin
Define the method +assembly+ for building a file with the C# compiler?
Done.

== Predefined tasks

Add a 'distclean' task that removes all files and directories
generatet by any file task.
Done (AutoClean generator).

== Java plugin

At least for the 1.0.0 release.

#--
# vim:tw=70
