@c This is part of the paxutils manual.
@c Copyright (C) 2006--2021 Free Software Foundation, Inc.
@c Written by Sergey Poznyakoff
@c This file is distributed under GFDL 1.1 or any later version
@c published by the Free Software Foundation.

  Incremental archives keep information about contents of each
dumped directory in special data blocks called @dfn{dumpdirs}.

  Dumpdir is a sequence of entries of the following form:

@smallexample
@var{C} @var{filename} \0
@end smallexample

@noindent
where @var{C} is one of the @dfn{control codes} described below,
@var{filename} is the name of the file @var{C} operates upon, and
@samp{\0} represents a nul character (ASCII 0).  The white space
characters were added for readability, real dumpdirs do not contain
them.

  Each dumpdir ends with a single nul character.

  The following table describes control codes and their meanings:

@table @samp
@item Y
@var{filename} is contained in the archive.

@item N
@var{filename} was present in the directory at the time the archive
was made, yet it was not dumped to the archive, because it had not
changed since the last backup.

@item D
@var{filename} is a directory.

@item R
This code requests renaming of the @var{filename} to the name
specified with the @samp{T} command, that immediately follows it.

@item T
Specify target file name for @samp{R} command (see below).

@item X
Specify @dfn{temporary directory} name for a rename operation (see below).
@end table

  Codes @samp{Y}, @samp{N} and @samp{D} require @var{filename} argument
to be a relative file name to the directory this dumpdir describes,
whereas codes @samp{R}, @samp{T} and @samp{X} require their argument
to be an absolute file name.

 The three codes @samp{R}, @samp{T} and @samp{X} specify a
@dfn{renaming operation}.  In the simplest case it is:

@smallexample
R@file{source}\0T@file{dest}\0
@end smallexample

@noindent
which means ``rename file @file{source} to file @file{dest}''.

  However, there are cases that require using a @dfn{temporary
directory}.  For example, consider the following scenario:

@enumerate 1
@item
Previous run dumped a directory @file{foo} which contained the
following three directories:

@smallexample
a
b
c
@end smallexample

@item
They were renamed @emph{cyclically}, so that:

@example
@file{a} became @file{b}
@file{b} became @file{c}
@file{c} became @file{a}
@end example

@item
New incremental dump was made.
@end enumerate

  This case cannot be handled by three successive renames, since
renaming @file{a} to @file{b} will destroy the existing directory.
To correctly process it, @GNUTAR{} needs a temporary directory, so
it creates the following dumpdir (newlines have been added for
readability):

@smallexample
@group
Xfoo\0
Rfoo/a\0T\0
Rfoo/b\0Tfoo/c\0
Rfoo/c\0Tfoo/a\0
R\0Tfoo/a\0
@end group
@end smallexample

  The first command, @samp{Xfoo\0}, instructs the extractor to create a
temporary directory in the directory @file{foo}.  Second command,
@samp{Rfoo/aT\0}, says ``rename file @file{foo/a} to the temporary
directory that has just been created'' (empty file name after a
command means use temporary directory).  Third and fourth commands
work as usual, and, finally, the last command, @samp{R\0Tfoo/a\0}
tells tar to rename the temporary directory to @file{foo/a}.

  The exact placement of a dumpdir in the archive depends on the
archive format (@pxref{Formats}):

@itemize
@item PAX archives

In PAX archives, dumpdir is stored in the extended header of the
corresponding directory, in variable @code{GNU.dumpdir}.

@item GNU and old GNU archives

These formats implement special header type @samp{D}, which is similar
to ustar header @samp{5} (directory), except that it precedes a data
block containing the dumpdir.
@end itemize

@c End of dumpdir.texi
