Skip to content
  • Samuel Lijin's avatar
    clean: teach clean -d to preserve ignored paths · 6b1db431
    Samuel Lijin authored and Junio C Hamano's avatar Junio C Hamano committed
    
    
    There is an implicit assumption that a directory containing only
    untracked and ignored paths should itself be considered untracked. This
    makes sense in use cases where we're asking if a directory should be
    added to the git database, but not when we're asking if a directory can
    be safely removed from the working tree; as a result, clean -d would
    assume that an "untracked" directory containing ignored paths could be
    deleted, even though doing so would also remove the ignored paths.
    
    To get around this, we teach clean -d to collect ignored paths and skip
    an untracked directory if it contained an ignored path, instead just
    removing the untracked contents thereof. To achieve this, cmd_clean()
    has to collect all untracked contents of untracked directories, in
    addition to all ignored paths, to determine which untracked dirs must be
    skipped (because they contain ignored paths) and which ones should *not*
    be skipped.
    
    For this purpose, correct_untracked_entries() is introduced to prune a
    given dir_struct of untracked entries containing ignored paths and those
    untracked entries encompassed by the untracked entries which are not
    pruned away.
    
    A memory leak is also fixed in cmd_clean().
    
    This also fixes the known breakage in t7300, since clean -d now skips
    untracked directories containing ignored paths.
    
    Signed-off-by: default avatarSamuel Lijin <sxlijin@gmail.com>
    Signed-off-by: default avatarJunio C Hamano <gitster@pobox.com>
    6b1db431