108 lines
		
	
	
	
		
			4.4 KiB
		
	
	
	
		
			XML
		
	
	
	
	
	
			
		
		
	
	
			108 lines
		
	
	
	
		
			4.4 KiB
		
	
	
	
		
			XML
		
	
	
	
	
	
| <appendix><title>Bugs / To-Do</title>
 | |
| 
 | |
| <itemizedlist>
 | |
| 
 | |
|     <listitem>
 | |
|       <para>
 | |
|         The man-pages generated from the DocBook documentation are ugly.
 | |
|       </para>
 | |
|     </listitem>
 | |
| 
 | |
|     <listitem>
 | |
|       <para>
 | |
|         Generations properly form a tree.  E.g., if after switching to
 | |
|         generation 39, we perform an installation action, a generation
 | |
|         43 is created which is a descendant of 39, not 42.  So a
 | |
|         rollback from 43 ought to go back to 39.  This is not
 | |
|         currently implemented; generations form a linear sequence.
 | |
|       </para>
 | |
|     </listitem>
 | |
| 
 | |
|     <listitem>
 | |
|       <para>
 | |
|         Unify the concepts of successors and substitutes into a
 | |
|         general notion of <emphasis>equivalent expressions</emphasis>.
 | |
|         Expressions are equivalent if they have the same target paths
 | |
|         with the same identifiers.  However, even though they are
 | |
|         functionally equivalent, they may differ stronly with respect
 | |
|         to their <emphasis>performance characteristics</emphasis>.
 | |
|         For example, realising a closure expression is more efficient
 | |
|         that realising the derivation expression from which it was
 | |
|         produced.  On the other hand, distributing sources may be more
 | |
|         efficient (storage- or bandwidth-wise) than distributing
 | |
|         binaries.  So we need to be able to attach weigths or
 | |
|         priorities or performance annotations to expressions; Nix can
 | |
|         then choose the most efficient expression dependent on the
 | |
|         context.
 | |
|       </para>
 | |
|     </listitem>
 | |
| 
 | |
|     <listitem>
 | |
|       <para>
 | |
|         <emphasis>Build management.</emphasis>  In principle it is already
 | |
|         possible to do build management using Nix (by writing builders that
 | |
|         perform appropriate build steps), but the Nix expression language is
 | |
|         not yet powerful enough to make this pleasant (?).  The language should
 | |
|         be extended with features from the <ulink
 | |
|           url='http://www.cs.uu.nl/~eelco/maak/'>Maak build manager</ulink>.
 | |
|         Another interesting idea is to write a <command>make</command>
 | |
|         implementation that uses Nix as a back-end to support <ulink
 | |
|           url='http://www.research.att.com/~bs/bs_faq.html#legacy'>legacy</ulink> 
 | |
|         build files.
 | |
|       </para>
 | |
|     </listitem>
 | |
| 
 | |
|     <listitem>
 | |
|       <para>
 | |
|         There are race conditions between the garbage collector and
 | |
|         other Nix tools.  For instance, when we run
 | |
|         <command>nix-env</command> to build and install a derivation
 | |
|         and run the garbage collector at the same time, the garbage
 | |
|         collector may kick in exactly between the build and
 | |
|         installation steps, i.e., before the newly built derivation
 | |
|         has become reachable from a root of the garbage collector.
 | |
|       </para>
 | |
| 
 | |
|       <para>
 | |
|         One solution would be for these programs to properly register
 | |
|         temporary roots for the collector.  Another would be to use
 | |
|         stop-the-world garbage collection: if any tool is running, the
 | |
|         garbage collector blocks, and vice versa.  These solutions do
 | |
|         not solve the situation where multiple tools are involved,
 | |
|         e.g.,
 | |
| 
 | |
|         <screen>
 | |
| $ nix-store -r $(nix-instantiate foo.nix)</screen>
 | |
| 
 | |
|         since even if <command>nix-instantiate</command> where to
 | |
|         register a temporary root, it would be released by the time
 | |
|         <command>nix-store</command> is started.  A solution would be
 | |
|         to write the intermediate value to a file that is used as a
 | |
|         root to the collector, e.g.,
 | |
|         
 | |
|         <screen>
 | |
| $ nix-instantiate foo.nix > /nix/var/nix/roots/bla
 | |
| $ nix-store -r $(cat /nix/var/nix/roots/bla)</screen>
 | |
| 
 | |
|       </para>
 | |
|     </listitem>
 | |
| 
 | |
| <listitem><para>For security, <command>nix-push</command> manifests
 | |
| should be digitally signed, and <command>nix-pull</command> should
 | |
| verify the signatures.  The actual NAR archives in the cache do not
 | |
| need to be signed, since the manifest contains cryptographic hashes of
 | |
| these files (and <filename>fetchurl.nix</filename> checks
 | |
| them).</para></listitem>
 | |
| 
 | |
| <listitem><para>We should switch away from MD5, since it has been
 | |
| more-or-less cracked.  We don't currently depend very much on the
 | |
| collision-resistance of MD5, but we will once we start sharing build
 | |
| results between users.</para></listitem>
 | |
| 
 | |
| <listitem><para>It would be useful to have an option in
 | |
| <command>nix-env --delete-generations</command> to remove non-current
 | |
| generations older than a certain age.</para></listitem>
 | |
| 
 | |
| </itemizedlist>
 | |
| 
 | |
| </appendix>
 |