unburden-home-dir-0.3.2.2/0000755000000000000000000000000012206373216012070 5ustar unburden-home-dir-0.3.2.2/Xsession.d/0000755000000000000000000000000012057737542014137 5ustar unburden-home-dir-0.3.2.2/Xsession.d/95unburden-home-dir0000644000000000000000000000116212057737542017564 0ustar # -*- shell-script -*- # /etc/X11/Xsession.d/95unburden_home_dir # This file is sourced by Xsession(5), not executed. UNBURDEN_BASENAME=${UNBURDEN_BASENAME:-unburden-home-dir} if [ -e /etc/default/"${UNBURDEN_BASENAME}" ]; then . /etc/default/"${UNBURDEN_BASENAME}" fi if [ -e "${HOME}/.${UNBURDEN_BASENAME}" ]; then . "${HOME}/.${UNBURDEN_BASENAME}" fi if [ -e "${XDG_CONFIG_HOME:-$HOME/.config}/${UNBURDEN_BASENAME}/config" ]; then . "${XDG_CONFIG_HOME:-$HOME/.config}/${UNBURDEN_BASENAME}/config" fi if [ "${UNBURDEN_HOME}" = "true" ] || \ [ "${UNBURDEN_HOME}" = "yes" ]; then unburden-home-dir fi unburden-home-dir-0.3.2.2/bin/0000755000000000000000000000000012206370045012635 5ustar unburden-home-dir-0.3.2.2/bin/unburden-home-dir0000755000000000000000000004562112206370045016117 0ustar #!/usr/bin/perl # # This file causes a list of directories to be removed or moved off # the users home directory into a given other directory. Usually this # is used to relief NFS home directories of the burden of caches and # other performance needing directories. # # Copyright (C) 2010-2013 by Axel Beckert , # Department of Physics, ETH Zurich. # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see http://www.gnu.org/licenses/. # use Modern::Perl; # Globally define version our $VERSION = '0.3.2.2'; # Configuration variables to be used in configuration files my $CONFIG = { TARGETDIR => '/tmp', FILELAYOUT => '.unburden-%u/%s', }; # Just show what would be done my $DRYRUN = undef; # Undo feature my $REVERT = 0; # Defaul base name my $BASENAME = 'unburden-home-dir'; my $LISTSUFFIX = 'list'; # Load Modules use Config::File; use Getopt::Std; $Getopt::Std::STANDARD_HELP_VERSION = 1; use File::Path qw(mkpath rmtree); use File::Basename; use File::BaseDir qw(config_home); use File::Touch; use File::Rsync; use File::Which; use IO::Handle; use Data::Dumper; # Declare and initialise some variables my %OPTIONS = (); my $FILTER = undef; my $UID = getpwuid($<); my $USE_LSOF = 1; my $LSOF_CMD = undef; # Some messages for Getopt::Std sub VERSION_MESSAGE { my ($fh, $getoptpkg, $getoptversion, $cmdlineargs) = @_; say $fh "Unburden Home Directory $VERSION\n"; return; } sub HELP_MESSAGE { my ($fh, $getoptpkg, $getoptversion, $cmdlineargs) = @_; say $fh "Usage: $0 [ -F | -n | -u | -b basename | (-c|-C) conffile | -f filter | (-l|-L) listfile ] $0 ( -h | --help | --version ) Options with parameters: -b use the given string as basename instead of \"$BASENAME\". -c read an additional configuration file -C read only the given configuration file -f just unburden those directory matched by the given filter (a perl regular expression) -- it matches the already unburdened directories if used together with -u. -l read an additional list file -L read only the given list file Options without parameters: -F Do not check if to-be-(re)moved files and directories are still in use (aka *F*orce (re)moving). -n dry run (show what would be done) -u undo (reverse the functionality and put stuff back into the home directory) -h, --help show this help --version show the program's version "; return; } # Parse command line options getopts('hnufFb:c:C:l:L:', \%OPTIONS); foreach my $key (keys %OPTIONS) { if ($key eq 'h') { my $fh = IO::Handle->new_from_fd(fileno(STDERR),'w'); VERSION_MESSAGE($fh); HELP_MESSAGE($fh); exit 0; } elsif ($key eq 'b') { $BASENAME = $OPTIONS{b}; } } # By default check for a system wide and a user configuration and list file my @CONFFILES = ("/etc/$BASENAME", "$ENV{HOME}/.$BASENAME", config_home($BASENAME).'/config'); my @LISTFILES = ("/etc/$BASENAME.$LISTSUFFIX", "$ENV{HOME}/.$BASENAME.$LISTSUFFIX", config_home($BASENAME)."/$LISTSUFFIX"); foreach my $key (keys %OPTIONS) { if ($key eq 'C') { @CONFFILES = ($OPTIONS{C}); } elsif ($key eq 'c') { push(@CONFFILES, $OPTIONS{c}); } elsif ($key eq 'L') { @LISTFILES = ($OPTIONS{L}); } elsif ($key eq 'l') { push(@LISTFILES, $OPTIONS{l}); } elsif ($key eq 'n') { $DRYRUN = 1; } elsif ($key eq 'u') { $REVERT = 1; } elsif ($key eq 'F') { $USE_LSOF = 0; } elsif ($key eq 'f') { eval { $FILTER = qr/$OPTIONS{f}/; }; if ($@) { report_serious_problem("parameter to -f", "\n$@"); exit 2; } } } # Check for configuration files and read them foreach my $configfile (@CONFFILES) { if ( -e $configfile ) { $CONFIG = { %$CONFIG, %{Config::File::read_config_file($configfile)} }; } } # Fix some values $UID =~ s/\s+//gs; # Remove quotes and line-feeds from values foreach my $key (keys %$CONFIG) { chomp($CONFIG->{$key}); $CONFIG->{$key} =~ s/^([\'\"])(.*)\1$/$2/; } # Set proper umask when creating files or directories. Save current # umask before. my $OLDUMASK = umask(); umask(077); # Initialize rsync object my $rsync = File::Rsync->new({ archive => 1, verbose => 1, outfun => sub { my $output = shift; chomp($output); say $output unless $output =~ m(^sent |^total size|^\s*$); }, errfun => sub { chomp; warn "$_[0]\n"; }, }); # Check for lsof in search path my $which_lsof = which('lsof'); if (!$which_lsof) { warn "WARNING: lsof not found, not checking for files in use.\n"; $USE_LSOF = 0; } # Standard Error reporting function; Warning sub report_problem { warn "WARNING: Can't handle $_[0]: $_[1]"; return; } # Standard Error reporting function; Error sub report_serious_problem { warn "ERROR: Can't handle $_[0]: $_[1]"; return; } # Actually move a directory or file sub move ($$) { my ($from, $to) = @_; say "Moving $from -> $to"; unless ($DRYRUN) { if (-d $from) { $from .= '/' unless $from =~ m(/$); $to .= '/' unless $to =~ m(/$); my $rc = $rsync->exec({ src => $from, dst => $to, }); rmtree($from); } else { my $rc = system(qw(mv -v), $from, $to); return !($? >> 8); } } return 1; } # Create a symlink. Create its parent directories if they don't yet # exist. sub create_symlink_and_parents { my ($old, $new) = @_; create_parent_directories($new); say "Symlinking $new -> $old"; unless ($DRYRUN) { symlink($old, $new) or die "Couldn't symlink $new -> $old: $!"; } return; } # Create those parent directories for a given file or directory name # which don't yet exist. sub create_parent_directories { my $file = shift; my $parent_dir = dirname($file); unless (-d $parent_dir) { say "Create parent directories for $file"; mkpath($parent_dir, { verbose => 1 }) unless $DRYRUN; } return; } # In case of uppercase type letters, create symlinks as replacement # for directories files which may not even exist yet. Common cases are # trash directories which are created when something gets put into the # trashcan, etc. sub possibly_create_non_existing_stuff { my ($type, $item, $target) = @_; # Shall we create not yet existing directories or files as symlink? # Case 1: directory if ( $type eq 'D' ) { # TODO: Refactor create_symlink_and_parents so that its # create_parent_directories call isn't redundant in this case. say "Create directory $target and parents"; mkpath($target, { verbose => 1 }) unless $DRYRUN; create_symlink_and_parents($target, $item); } # Case 2: file elsif ( $type eq 'F' ) { create_parent_directories($target); say "Touching $target"; touch($target) unless $DRYRUN; create_symlink_and_parents($target, $item) } return 0; } # Dangling links may happen if the destination directory has been # weeped, e.g. due to being on an tmpfs mount or by tmpreaper, etc. sub fix_dangling_links { my ($type, $itemexpanded, $target) = @_; my $link = readlink($itemexpanded); my $is_dir = type_is_directory($type); my $is_file = type_is_file($type); # Accept existing symlinks or unburden-home-dir.list entries for # directories with or without trailing slash if ($is_dir) { $link =~ s{/$}{}; $itemexpanded =~ s{/$}{}; $target =~ s{/$}{}; } # Check if link target is wanted target if ( $link ne $target ) { report_problem($itemexpanded, "$link not equal $target"); return 1; } # Check if target exists and is same type if ( -e $target ) { my $unexpected_type = check_for_unexpected_type($type, $target); return $unexpected_type if $unexpected_type; } # Symlink is there, but file or directory not else { create_object_of_type($type, $target); } return 0; } # Find pid and command in lsof output sub parse_lsof_output { my ($output) = @_; chomp($output); my @lines = split(/\n/, $output); my $result = ''; my $pid; my $cmd; foreach my $line (@lines) { if ($line =~ /^p(.*)$/) { $pid = $1; $cmd = undef; } elsif ($line =~ /^c(.*)$/) { $cmd = $1; unless ($pid) { report_problem("lsof output", "No pid before command: $line"); next; } $result .= sprintf(" %5i (%s)\n", $pid, $cmd); $pid = undef; } else { report_problem("line in lsof output", $line); } } return $result; } # Check if files in to be moved directories are currently in use. sub files_in_use { my ($item) = @_; my $lsof_output = undef; if (-d $item) { $lsof_output = `find '$item' -print0 | buffer | xargs -0 lsof -F c`; } elsif (-f _) { $lsof_output = `lsof -F c '$item'`; } else { report_problem("Not checking for open files in $item: neither file nor directory"); return; } my $lsof_parsed = parse_lsof_output($lsof_output); if ($lsof_parsed) { report_problem($item, "in use, not (re)moving. Process list:\n$lsof_parsed"); return 1; } else { return 0; } } # Move a directory or file (higher level function) sub action_move { my ($itemexpanded, $target) = @_; create_parent_directories($target); move($itemexpanded, $target) or die "Couldn't move $itemexpanded -> $target: $!"; return; } # Handle directory or file which should be emptied (higher level function) sub action_delete_and_recreate { my ($type, $itemexpanded, $target) = @_; my $is_file = type_is_file($type); my $is_dir = type_is_directory($type); say "Delete $itemexpanded"; unless ($DRYRUN) { $is_dir and rmtree($itemexpanded, { verbose => 1 }) ; $is_file and (unlink($itemexpanded) || die "Couldn't delete $itemexpanded: $!"); } create_object_of_type($type, $target); return; } # Generic create function for both, directories and files sub create_object_of_type { my ($type, $target) = @_; say "Create $target"; unless ($DRYRUN) { if (type_is_directory($type)) { mkpath($target, { verbose => 1 }); } elsif (type_is_file($type)) { create_parent_directories($target); say "Touching $target"; touch($target) || die "Couldn't touch $target: $!"; } } return; } # Bail out on common assertion sub unknown_element { my ($what, $unknown) = @_; warn "Unknown $what '$unknown'. This should never happen."; return 255; } # Create a symlink sub create_symlink { my ($itemexpanded, $target) = @_; say "Symlinking $target -> $itemexpanded"; unless ($DRYRUN) { symlink($target, $itemexpanded) or die "Couldn't symlink $target -> $itemexpanded: $!"; } return; } # Check if the expected type of an object is "directory" sub type_is_directory { return (lc(shift) eq 'd'); } # Check if the expected type of an object is "file" sub type_is_file { return (lc(shift) eq 'f'); } # Check if an object has an unexpected type (higher level function) sub check_for_unexpected_type { my ($type, $itemexpanded) = @_; my $is_file = type_is_file($type); my $is_dir = type_is_directory($type); unless ($is_file or $is_dir) { return unknown_element('type', $type); } if ($is_file and !-f $itemexpanded) { report_serious_problem($itemexpanded, 'Unexpected type (not a file)'); return 1; } if ($is_dir and !-d $itemexpanded) { report_serious_problem($itemexpanded, 'Unexpected type (not a directory)'); return 1; } return; } # Top-level function run once per to-be-changed-item sub do_it { my ($type, $itemexpanded, $target, $action) = @_; if ( $USE_LSOF and files_in_use($itemexpanded) ) { return 0; } my $unexpected_type = check_for_unexpected_type($type, $itemexpanded); return $unexpected_type if $unexpected_type; if ( $action eq 'r' or $action eq 'd' ) { action_delete_and_recreate($type, $itemexpanded, $target); } elsif ( $action eq 'm' ) { action_move($itemexpanded, $target); } else { return unknown_element('action', $action); } create_symlink($itemexpanded, $target); return 0; } # Parse and fill placeholders in target definition sub calculate_target { my $replacement = shift; my $target = $CONFIG->{FILELAYOUT}; $target =~ s|%u|$UID|g; $target =~ s|%s|$replacement|g; return $CONFIG->{TARGETDIR}."/$target"; } # Parse and fill wildcards sub fill_in_wildcard_matches { my ($itemglob, $itemexpanded, $target) = @_; # Replace % (e.g. %1) with the n-th wildcard match. Uses perl # here as it would be too complicated and way less readable if # written as (bourne) shell script. # Change from globbing to regexp $itemglob =~ s/\?/(.)/g; $itemglob =~ s/\*/(.*)/g; my @result = $itemexpanded =~ m($itemglob)g; $target =~ s/\%(\d+)/$result[$1-1]/eg; return $target; } # Check if the path to something to unburden already contains a symlink sub symlink_in_path { my $path = shift; # Remove home directory, i.e. check just from below the home directory if ($path =~ s($ENV{HOME}/?)()) { # Split up into components, but remove the last one (which we # are requested to handle, so we shouldn't check that now) my @path_elements = split(m(/), $path); pop(@path_elements); foreach my $i (0..$#path_elements) { my $path_to_check = $ENV{HOME}.'/'.join('/', @path_elements[0..$i]); #say "Check if $path_to_check is a symlink"; return $path_to_check if -l $path_to_check; } return 0; } else { report_serious_problem("Can't find home directory ($ENV{HOME}) in $path!"); } return; } # Handle replacement requests and check if they're sane sub replace { # replace $type $i $item $replacement my ($type, $itemexpanded, $itemglob, $replacement, $action) = @_; # Skip entries where wildcard where passed if ($itemexpanded =~ /[][*?]/) { warn "Skipping '$itemexpanded' due to unmatched wildcard.\n"; return 0; } if (my $symlink = symlink_in_path($itemexpanded)) { warn "Skipping '$itemexpanded' due to symlink in path: $symlink\n"; return 0; } my $target = fill_in_wildcard_matches($itemglob, $itemexpanded, calculate_target($replacement)); # Check if the source exists if ( ! -e $itemexpanded and ! -l $itemexpanded ) { possibly_create_non_existing_stuff($type, $itemexpanded, $target); } # Check if source is already a symlink elsif ( -l $itemexpanded ) { fix_dangling_links($type, $itemexpanded, $target); } # TODO: Check available disk space # Should use report_serious_problem # No symlink yet, then actually move or remove! else { do_it($type, $itemexpanded, $target, $action); } return; } # Core functionality of the undo feature sub revert { my ($itemexpanded, $item_in_home, $target_glob) = @_; # Skip entries where wildcard where passed if ($itemexpanded =~ /[][*?]/) { warn "Skipping '$target_glob' due to unmatched wildcard.\n"; return 0; } $item_in_home = "$ENV{HOME}/" . fill_in_wildcard_matches($target_glob, $itemexpanded, $item_in_home); say "Trying to revert $itemexpanded to $item_in_home"; if (-l $item_in_home) { my $link_target = readlink($item_in_home); $itemexpanded =~ s{/$}{}; $link_target =~ s{/$}{}; if ($itemexpanded eq $link_target) { say "Removing symlink $item_in_home"; unlink($item_in_home) unless $DRYRUN; move($itemexpanded, $item_in_home); } else { warn "Ignoring symlink $item_in_home as it points to $link_target ". "and not to $itemexpanded as expected.\n"; } } return; } # Parse wildcards backwards sub exchange_wildcards_and_replacements { my ($wildcard, $replacement) = @_; my $i = 1; while ($replacement =~ /\%(\d+)/) { my $number = $1; my $prev = $number-1; $wildcard =~ s/^(([^*]*[*?]){$prev}[^*]*)([?*])/"$1\%".$i++/e; my $wildcardtype = $3; $replacement =~ s/\%(\d+)/$wildcardtype/; } return ($wildcard, $replacement); } # Main loop over all items in list files for my $list (@LISTFILES) { next unless -r $list; # Clean up this and that open(LIST, '<', $list) or die "Can't open $list: $!"; while () { next if /^#|^ *$/; chomp; my ($action, $type, $item, $replacement) = split; next unless defined $action; if (!defined($item) or !defined($replacement)) { warn "Can't parse '$_', skipping..."; next; } unless ( type_is_directory($type) or type_is_file($type) ) { warn "Can't parse type '$type', must be 'd', 'D', 'f' or 'F', skipping..."; next; } if ( $action ne 'd' and $action ne 'r' and $action ne 'm' ) { warn "Can't parse action '$action', must be 'd', 'r' or 'm', skipping..."; next; } if ( $item =~ m(^(\.\.)?/) ) { warn "$item would be outside of the home directory, skipping...\n"; next; } if ($REVERT) { ($item, $replacement) = exchange_wildcards_and_replacements($item, $replacement); my $replacement_path = calculate_target($replacement); for my $i (glob($replacement_path)) { if (defined($FILTER)) { next unless ($i =~ $FILTER); } revert($i, $item, $replacement); } } else { for my $i (glob("$ENV{HOME}/$item")) { if (defined($FILTER)) { next unless ($i =~ $FILTER); } replace($type, $i, $item, $replacement, $action); } } } close(LIST); } # Restore original umask umask($OLDUMASK); unburden-home-dir-0.3.2.2/debian/0000755000000000000000000000000012206373216013312 5ustar unburden-home-dir-0.3.2.2/debian/postinst0000777000000000000000000000000011750531743016530 2preinstustar unburden-home-dir-0.3.2.2/debian/postrm0000777000000000000000000000000011750531743016171 2preinstustar unburden-home-dir-0.3.2.2/debian/source/0000755000000000000000000000000011463340707014615 5ustar unburden-home-dir-0.3.2.2/debian/source/format0000644000000000000000000000001511463340701016016 0ustar 3.0 (native) unburden-home-dir-0.3.2.2/debian/NEWS.Debian0000644000000000000000000000146111751061107015171 0ustar unburden-home-dir (0.1) unstable; urgency=low All configuration files (and not just some) now use consistently the basename "unburden-home-dir" instead of "unburden_home_dir": Changed: /etc/unburden_home_dir → /etc/unburden-home-dir /etc/unburden_home_dir_list → /etc/unburden-home-dir.list /etc/X11/Xsession.d/95unburden_home_dir → /etc/X11/Xsession.d/95unburden-home-dir Unchanged: /etc/default/unburden-home-dir dpkg should handle the renaming of the global conffiles gracefully, but some user configuration files may need to be renamed manually: ~/.unburden_home_dir → ~/.unburden-home-dir ~/.unburden_home_dir_list → ~/.unburden-home-dir.list -- Axel Beckert Sat, 05 May 2012 00:36:30 +0200 unburden-home-dir-0.3.2.2/debian/README.Debian0000644000000000000000000000037111756746135015371 0ustar unburden-home-dir for Debian ---------------------------- By default, nothing is done on Debian. Uncomment or add files in /etc/unburden-home-dir.list to enable unburden-home-dir. -- Axel Beckert , Tue, 22 May 2012 19:08:58 +0200 unburden-home-dir-0.3.2.2/debian/clean0000644000000000000000000000000711771617250014321 0ustar README unburden-home-dir-0.3.2.2/debian/preinst0000644000000000000000000000073611750531743014733 0ustar #!/bin/sh set -e # Move around configuration files from earlier experimental versions dpkg-maintscript-helper mv_conffile \ /etc/X11/Xsession.d/95unburden_home_dir /etc/X11/Xsession.d/95unburden-home-dir \ 0.0.20110401 -- "$@" dpkg-maintscript-helper mv_conffile \ /etc/unburden_home_dir_list /etc/unburden-home-dir.list \ 0.0.20110401 -- "$@" dpkg-maintscript-helper mv_conffile \ /etc/unburden_home_dir /etc/unburden-home-dir \ 0.0.20110401 -- "$@" #DEBHELPER# unburden-home-dir-0.3.2.2/debian/unburden-home-dir.default0000644000000000000000000000045111750531743020210 0ustar # Defaults for unburden-home-dir Xsession hook # sourced by /etc/X11/Xsession.d/95unburden-home-dir # installed at /etc/default/unburden-home-dir by the maintainer scripts # # This is a POSIX shell fragment # # Uncomment to activate automatic unburdening of home directories #UNBURDEN_HOME=true unburden-home-dir-0.3.2.2/debian/unburden-home-dir.examples0000644000000000000000000000006111750531743020377 0ustar etc/unburden-home-dir etc/unburden-home-dir.list unburden-home-dir-0.3.2.2/debian/docs0000644000000000000000000000001012123066570014154 0ustar README unburden-home-dir-0.3.2.2/debian/copyright0000644000000000000000000000275412154161715015256 0ustar This work was packaged for Debian by: Axel Beckert on Sun, 31 Oct 2010 20:17:57 +0100 It was downloaded from: http://github.com/xtaran/unburden-home-dir ... but can also be found at http://git.phys.ethz.ch/?p=unburden-home-dir.git and http://gitorious.org/unburden-home-dir/ Upstream Author: Axel Beckert Copyright: Copyright (C) 2010-2013 Axel Beckert License: This package is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This package is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see On Debian systems, the complete text of the GNU General Public License version 2 can be found in "/usr/share/common-licenses/GPL-2". The Debian packaging is: Copyright (C) 2010-2013 Axel Beckert you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. unburden-home-dir-0.3.2.2/debian/gbp.conf0000644000000000000000000000023512154161715014732 0ustar [DEFAULT] # As long as this is a native package, we don't need any prefixes debian-tag = %(version)s [git-buildpackage] sign-tags = True keyid = 0x95930ede unburden-home-dir-0.3.2.2/debian/rules0000755000000000000000000000037412154161715014377 0ustar #!/usr/bin/make -f # -*- makefile -*- # Uncomment this to turn on verbose mode. #export DH_VERBOSE=1 %: dh $@ # Rename README.md to README for the Debian binary package (cf. #678630) override_dh_installdocs: cp -p README.md README dh_installdocs unburden-home-dir-0.3.2.2/debian/compat0000644000000000000000000000000212206371045014506 0ustar 9 unburden-home-dir-0.3.2.2/debian/control0000644000000000000000000000633312206371045014720 0ustar Source: unburden-home-dir Section: x11 Priority: extra Maintainer: Axel Beckert Build-Depends: buffer, debhelper (>= 9~), devscripts, libconfig-file-perl, libfile-basedir-perl, libfile-rsync-perl, libfile-slurp-perl, libfile-touch-perl, libfile-which-perl, libmodern-perl-perl, # Test suite dependencies libmouse-perl, libtest-differences-perl, libtest-file-perl Standards-Version: 3.9.4 Homepage: https://github.com/xtaran/unburden-home-dir Vcs-Git: git://github.com/xtaran/unburden-home-dir.git Vcs-Browser: https://github.com/xtaran/unburden-home-dir Package: unburden-home-dir Architecture: all Depends: buffer, libconfig-file-perl, libfile-basedir-perl, libfile-rsync-perl, libfile-touch-perl, libfile-which-perl, libmodern-perl-perl, x11-common, ${misc:Depends}, ${perl:Depends} Pre-Depends: dpkg (>= 1.15.7.2) Recommends: lsof Enhances: x11-common Suggests: agedu, autotrash, bleachbit, eatmydata, fslint, ncdu | baobab | filelight | xdiskusage | xdu, tmpreaper Description: Remove or move cache files automatically from user's home unburden-home-dir allows users to move cache files from browsers, etc. off their home directory, i.e. on a local harddisk or tmpfs and replace them with a symbolic link to the new location (e.g. on /tmp/ or /scratch/) upon login. Optionally the contents of the directories and files can be removed instead of moved. . This is helpful at least in the following cases: . The idea-giving case are big workstation setups where $HOME is on NFS and all those caches put an unnecessary burden (hence the name) on the file server since caching over NFS doesn't have the best performance and may clog the NFS server, too. . A similar case, but with different purpose is reducing I/O on mobile devices like laptops or netbooks to extend the battery life: Moving browser caches etc. off the real disk into a tmpfs filesystem reduces the amount of disk I/O which reduces the power consumption of the disk. . Another possible solution for saving non-crucial I/O is using the package eatmydata to ignore a software's fsync calls. . The other type of use cases for unburden-home-dir is to reduce disk space usage, e.g. on devices with small disk space but a lot of RAM as seen often on boxes with flash disks or early netbooks, especially the EeePC, where configurations with 4GB disk space and 2GB RAM are not seldom. In this case you want to move off as many cache files, etc. as possible to some tmpfs filesystem, e.g. /tmp/. . It may also help to reduce the amount of needed backup disk space by keeping those files in places where they don't get backed up. In that case it's an alternative to keeping the blacklist in your backup software up-to-date. . The package also contains an Xsession hook which calls this script on X login for every user. But by default no files or directories are configured to be moved elsewhere, so nothing will happen automatically without configuration. unburden-home-dir-0.3.2.2/debian/changelog0000644000000000000000000002153112206373155015170 0ustar unburden-home-dir (0.3.2.2) unstable; urgency=low * No more use "when" nor "my $_". Both features are marked experimental in Perl 5.18 and hence cause warnings which again cause test-suite failures. (Closes: #720762) * Bump debhelper compatibility to 9 + Update versioned debhelper build-dependency accordingly -- Axel Beckert Sun, 25 Aug 2013 14:19:57 +0200 unburden-home-dir (0.3.2.1) unstable; urgency=low * man-page: Clarify why du and friends are helpful when configuring unburden-home-dir (Closes: #711820) * README/man page: Update information about corekeeper * Add ~/.devscripts_cache and qupzilla cache (Thanks Daniel Koch!) to unburden-home-dir.list -- Axel Beckert Wed, 10 Jul 2013 20:42:08 +0200 unburden-home-dir (0.3.2) unstable; urgency=low * Use "buffer" to prevent "find" still running when "lsof" is started by "xargs". Add dependency and build-dependency (for test-suite) on "buffer". * Fix trailing slashes on revert (GitHub issue #5, thanks Johan van den Dorpe!) * debian/control: Apply wrap-and-sort * Add support for using XDG config directory for configuration files. (Closes: #692807) + Add dependency and build-dependency on libfile-basedir-perl. * Refactor test suite + Uses more external modules, Added Test::Differences, Test::Files and Mouse as build dependencies. * Fix test suite failures with newer coreutils versions in t/moving-to-existing-subdir.t. * README: + Create new section "see also" about similar solutions and move hint about eatmydata there. + Add lots of information + Merge THANKS into README * Sync man page with --help output and recognized options. * Add sxiv, Google Earth and CCache to example unburden-home-dir.list * New (optional) make target "cover" to make easy use of Devel::Cover. * debian/rules: Remove notice that the initial example file has no copyright restrictions, i.e. that the notice is allowed to be removed. * Bump Standards-Version to 3.9.4 (no changes) * Bump copyright years in various places * Switch Homepage and Vcs-* headers to Github. Mention all Git repos in debian/copyright. * Add debian/gbp.conf with "sign-tags = True" (Closes: #695980) -- Axel Beckert Thu, 06 Jun 2013 20:59:07 +0200 unburden-home-dir (0.3.1.2) unstable; urgency=low * Option -F doesn't have a parameter, so don't let it consume one (which could be another option which then will be ignored, e.g. the dry-run option -n; Closes: #691619) * Fix comment about usage in etc/unburden-home-dir — it's no more a POSIX shell fragment, but parsed by Config::File. (Closes: #690266) * Minor bugfix for example config files (Closes: #690268) * Update $VERSION in bin/unburden-home-dir which had been forgotten since 0.3. Add test so that this doesn't happen again. (Closes: #690265) * Add missing options to --help message and reorder it slightly. * More documentation updates and fixes. -- Axel Beckert Sat, 27 Oct 2012 17:25:44 +0200 unburden-home-dir (0.3.1.1) unstable; urgency=low * Better and more documentation -- Axel Beckert Wed, 10 Oct 2012 16:14:29 +0200 unburden-home-dir (0.3.1) unstable; urgency=low * Make test suite check if lsof is available or not and expect different output in both cases. (Closes: #678780) * Use which('lsof') from File::Which instead of `which lsof` + Add dependency and build-dependency on libfile-which-perl * Use a copy of README.md named just README to be installed in the Debian binary package to avoid any associations with Linux' software RAID. (Closes: #678630) * Minor refactoring of t/undo.t for not confusing syntax highlighting -- Axel Beckert Mon, 25 Jun 2012 15:34:34 +0200 unburden-home-dir (0.3) unstable; urgency=low * If lsof is available, check if files to (re)move are still in use before (re)moving them. - Recommend lsof * Some Refactoring: - use Modern::Perl; add libmodern-perl-perl as dependencies. - use say instead of print + "perl -l". Fixes issues with double newlines printed by modules.. - use for and when instead of tons of if blocks - replace last use of @_[...] - add missing trailing semicolons and explicit returns - remove all subroutine calls with "&" sigil - remove code duplication - use lc($var) eq 'c' instead of two string comparisons * Remove no more necessary eval in regexp replacement * Add missing close(); * More documentation in README: - Add some paragraphs about reversing unburden-home-dir's effect (Closes: #673909) - Add sections How To and Common Issues + Troubleshooting - Reorder sections and add subsections to get a nice outline * Renamed README to README.md so it will be parsed as Markdown on GitHub * Added THANKS file * Add ~/.aptitude/cache to unburden-home-dir.list. (cf. #671780) * Fix typo in README.Debian (Closes: #673912; Thanks Touko Korpela!) * Suggest fslint. -- Axel Beckert Tue, 12 Jun 2012 16:38:06 +0200 unburden-home-dir (0.2) unstable; urgency=low [ Klaus Umbach ] * Fix FTBFS: Add missing build-dependency on libfile-rsync-perl * Fix FTBFS: Ignore locales in moving-to-existing-subdir.t [ Axel Beckert ] * Unconditionally move files (no more uses "mv -i", likely a debugging leftover) * Handle symlinks to and unburden-home-dir.list entries for directories identical independent of trailing slashes. (Thanks Johan van den Dorpe! cf. GitHub Pull Request #2) * Also ignore blank lines in unburden-home-dir.list. * Add the caches of the following applications to the example unburden-home-dir.list: Galeon, Epiphany, xxxterm, Battle for Wesnoth, Gaia, Adobe Acrobat, Java, Forg, Buzzbird, Shotwell * Update list of caches in the example unburden-home-dir.list for the following applications: Opera, Mozilla based browsers * Comment the example unburden-home-dir.list, group entries by category * Add a test that verifies that lists with comments and blank lines can be parsed * Suggest a find command in the README to find most caches in a home directory -- Axel Beckert Fri, 18 May 2012 23:23:42 +0200 unburden-home-dir (0.1) unstable; urgency=low * First release thought for production use. Upload to unstable. * Uses consistently the basename "unburden-home-dir" instead of "unburden_home_dir". + Add Pre-Depends on dpkg >= 1.15.7.2 for usage of dpkg-maintscript-helper to rename conffiles. * Let Xsession.d snippet also source ~/.unburden-home-dir to allow per User execution + Call unburden-home-dir without hardcoded path * Refactoring: + Use speaking variable names in fix_dangling_links() and do_it() + Reindent and reformat some overlong lines in bin/unburden-home-dir + Add semicolons on all return statements before block ends + Define list file suffix just once * Add further tests to the test suite * Improve README and man page * Add tmpreaper, eatmydata, agedu, bleachbit and some more comfortable "du"-like tools to "Suggests". * Remove corekeeper from Suggests but keep it in the man page's SEE ALSO section. * Update man page + Split EXAMPLES and SEE ALSO + Update SEE ALSO + Typeset em dash properly * Add a further use case to the long description and README. (Thanks Pietro Abate!) Rewrite parts of the use cases section in both files. * Bump Standards-Version to 3.9.3 (no changes) * Make Xsession.d snippet POSIX-compatible (Thanks Carsten Hey!) * Fix lintian warning helper-templates-in-copyright * Update copyright years in debian/copyright * Fix indentation in Xsession.d snippet and debian/copyright -- Axel Beckert Sat, 05 May 2012 00:29:11 +0200 unburden-home-dir (0.0.20110203) experimental; urgency=low * Fix bug when moving stuff and the target directory already exists. Use File::Rsync for that and add proper dependency to libfile-rsync-perl for that. * Fix bug where only the parent of an empty target directory has been created. * Reduce probability of false positives when looking for issues in the logs. * Add two more common cases to the example configuration: .conkeror[...]/Cache.Trash and .mozilla/default/[...]/Cache -- Axel Beckert Thu, 03 Feb 2011 20:12:56 +0100 unburden-home-dir (0.0.20110201) experimental; urgency=low * Rewritten in Perl. * Includes a test suite * Suggest corekeeper which can help for similar issues with core dumps. * Suggest autotrash which can help for similar issues with the desktop trash can. * First upload to Debian (Closes: #602045) -- Axel Beckert Wed, 10 Nov 2010 00:14:51 +0100 unburden-home-dir (0.0.20101103) unstable; urgency=low * Initial release -- Axel Beckert Sun, 31 Oct 2010 19:48:11 +0100 unburden-home-dir-0.3.2.2/etc/0000755000000000000000000000000012165030777012651 5ustar unburden-home-dir-0.3.2.2/etc/unburden-home-dir0000644000000000000000000000016612057657547016135 0ustar # Configuration for unburden-home-dir # # Parsed by Config::File TARGETDIR=/tmp FILELAYOUT='.unburden-%u/%s' #DEBUG= unburden-home-dir-0.3.2.2/etc/unburden-home-dir.list0000644000000000000000000000402512165030777017073 0ustar # Generic cache locations m D .cache cache m D .thumbnails thumbnails m D .ccache ccache # Common browser caches m f .config/google-chrome/*/Thumbnails google-chrome-thumbnails-%1 m f .config/google-chrome/*/Thumbnails-journal google-chrome-thumbnails-journal-%1 m f .config/chromium/*/Thumbnails google-chrome-thumbnails-%1 m f .config/chromium/*/Thumbnails-journal google-chrome-thumbnails-journal-%1 m d .mozilla/default/*/Cache mozilla-default-cache-%1 m d .mozilla/default/*/startupCache mozilla-default-startup-cache-%1 m d .mozilla/firefox/*/Cache firefox-cache-%1 m d .mozilla/firefox/*/startupCache firefox-startup-cache-%1 m d .mozilla/firefox/*/Cache.Trash firefox-cache-trash-%1 m d .conkeror.mozdev.org/conkeror/*/Cache conkeror-cache-%1 m d .conkeror.mozdev.org/conkeror/*/startupCache conkeror-startup-cache-%1 m d .conkeror.mozdev.org/conkeror/*/Cache.Trash conkeror-cache-trash-%1 m d .kazehakase/mozilla/kazehakase/Cache kazehakase-cache m d .galeon/mozilla/galeon/Cache galeon-cache m d .gnome2/epiphany/mozilla/epiphany/Cache epiphany-cache m d .xxxterm/cache xxxterm-cache m d .forg/cache forg-cache m d .opera/cache opera-cache m d .opera/cache4 opera-cache4 m d .opera/opcache opera-opcache m d .opera/cacheOp opera-cacheOp m d .config/qupzilla/profiles/*/networkcache qupzilla-cache-%1 # Mail- and microblogging clients, may affect offline caches m d .thunderbird/*/Cache thunderbird-cache-%1 m d .mozilla-thunderbird/*/Cache debian-thunderbird-cache-%1 m d .icedove/*/Cache icedove-cache-%1 m d .buzzbird/*/Cache buzzbird-cache # Other applications' caches m f .aptitude/cache aptitude-cache m d .wesnoth*/cache wesnoth%1-cache m d .gaia/cache gaia-cache m d .googleearth/Cache google-earth-cache m d .java/deployment/cache java-deployment-cache m d .adobe/Acrobat/*/Cache adobe-acrobat-%1-cache m d .shotwell/thumbs shotwell-thumbs # sxiv caches thumbnails if a .sxiv directory exists, so create it if nonexistent m D .sxiv sxiv-thumbs m D .devscripts_cache devscripts_cache # Trash locations r D .Trash trash r D .local/Trash local-trash unburden-home-dir-0.3.2.2/man/0000755000000000000000000000000012155447414012650 5ustar unburden-home-dir-0.3.2.2/man/unburden-home-dir.10000644000000000000000000000574712155447414016273 0ustar .TH UNBURDEN-HOME-DIR "1" "Dec 2012" "Unburden Home Directory" "User Commands" .SH NAME unburden\-home\-dir \- unburdens home directories from caches and trashes .SH SYNOPSIS .B unburden\-home\-dir [ \fB-n\fR | \fB-u\fR | \fB-f\fR \fIfilter\fR ] .br .B unburden\-home\-dir ( \fB\-h\fR | \fB\-\-help\fR | \fB\-\-version\fR ) .SH DESCRIPTION unburden\-home\-dir unburdens the home directory from files and directory which cause high I/O or disk usage but are neither important if they are lost, e.g. caches or trash directory. .PP When being run it moves the files and directories given in the configuration file to a location outside the home directory, e.g. \fI/tmp\fR or \fI/scratch\fR, and puts appropriate symbolic links in the home directory instead. .SH OPTIONS .TP \fB\-b\fR use the given string as basename instead of "unburden-home-dir". .TP \fB\-c\fR read an additional configuration file. .TP \fB\-C\fR read only the given configuration file .TP \fB\-f\fR just unburden those directory matched by the given filter (a perl regular expression) \(em it matches the already unburdened directories if used together with \fB\-u\fR. .TP \fB\-F\fR Do not check for files in use with lsof before (re)moving files. .TP \fB\-l\fR read an additional list file .TP \fB\-L\fR read only the given list file .TP \fB\-n\fR dry run (show what would be done) .TP \fB\-u\fR undo (reverse the functionality and put stuff back into the home directory) .TP \fB\-h\fR, \fB\-\-help\fR show this help .TP \fB\-\-version\fR show the program's version .SH EXAMPLES Example configuration files can be found at \fI/usr/share/doc/unburden-home-dir/examples\fR on Debian-based systems and in the \fIetc/\fR directory of the source tar ball. .SH FILES \fI/etc/unburden-home-dir\fR, \fI/etc/unburden-home-dir.list\fR, \fI~/.unburden-home-dir\fR, \fI~/.unburden-home-dir.list\fR, \fI~/.config/unburden-home-dir/config\fR, \fI~/.config/unburden-home-dir/list\fR, \fI/etc/default/unburden-home-dir\fR, \fI/etc/X11/Xsession.d/95unburden-home-dir\fR .PP Read \fI/usr/share/doc/unburden-home-dir/README\fR on debianoid installations or \fIREADME\fR in the source tar ball for an explanation of these files. .SH "SEE ALSO" \fBcorekeeper\fR (\fIhttp://packages.debian.org/sid/corekeeper\fR), \fBautotrash\fR(1), \fBagedu\fR(1), \fBbleachbit\fR(1). \fBmundus\fR (\fIhttp://www.mundusproject.org/\fR). \fBcomputer-janitor\fR(1). .PP Of, course, \fBdu\fR(1) can help you to find potential files or directories to handle by unburden-home-dir, but there are quite some \fBdu\fR(1)-like tools out there which are way more comfortable, e.g. \fBncdu\fR(1) (text-mode), \fBbaobab\fR(1) (GNOME), \fBfilelight\fR(1) (KDE), \fBxdiskusage\fR(1) (X tool calling \fBdu\fR(1) itself), or \fBxdu\fR(1) (X tool reading \fBdu\fR(1) output from STDIN). .SH AUTHOR Unburden Home Dir is written and maintained by Axel Beckert <\fIbeckert@phys.ethz.ch\fR> .SH LICENSE Unburden Home Dir is available under the terms of the GNU General Public License (GPL) version 2 or any later version at your option. unburden-home-dir-0.3.2.2/t/0000755000000000000000000000000012206371336012334 5ustar unburden-home-dir-0.3.2.2/t/version.t0000644000000000000000000000075312035573202014207 0ustar #!/usr/bin/perl -wl use Test::More tests => 1; use File::Slurp; use File::Basename; use 5.010; my $basedir = dirname($0).'/..'; my $debian_changelog_version = `head -1 $basedir/debian/changelog | awk -F'[ ()]+' '{print \$2}'`; chomp($debian_changelog_version); my $script_version = `egrep '^our .VERSION' $basedir/bin/unburden-home-dir`; eval($script_version); is( $debian_changelog_version, $VERSION, 'Version numbers in debian/changelog and bin/unburden-home-dir are the same' ); unburden-home-dir-0.3.2.2/t/check-symlinks-in-path.t0000644000000000000000000000321612131653573017010 0ustar #!/usr/bin/perl -wl use lib qw(t/lib lib); use Test::UBH; my $t = Test::UBH->new('check-symlinks-in-path'); $t->setup_test_environment('.foobar/fnord/bla'); ok( symlink(".foobar/fnord", $t->HOME."/.fnord"), "Create test environment (Symlink 1)" ); file_is_symlink_ok( $t->HOME."/.fnord" ); # http://bugs.debian.org/705242 + https://rt.cpan.org/Public/Bug/Display.html?id=84582 #symlink_target_exists_ok( $t->HOME."/.fnord" ); ok( symlink("fnord", $t->HOME."/.foobar/blafasel"), "Create test environment (Symlink 2)" ); file_is_symlink_ok( $t->HOME."/.foobar/blafasel" ); # http://bugs.debian.org/705242 + https://rt.cpan.org/Public/Bug/Display.html?id=84582 #symlink_target_exists_ok( $t->HOME."/.foobar/blafasel" ); $t->write_configs("m d .foobar/fnord/bla foobar-fnord-bla\n" . "m d .fnord/bla fnord-bla\n" . "m d .foobar/blafasel/bla foobar-blafasel-bla\n"); $t->call_unburden_home_dir_default; my $wanted = $t->prepend_lsof_warning( "Skipping '".$t->HOME."/.fnord/bla' due to symlink in path: ".$t->HOME."/.fnord\n" . "Skipping '".$t->HOME."/.foobar/blafasel/bla' due to symlink in path: ".$t->HOME."/.foobar/blafasel\n"); $t->eq_or_diff_stderr($wanted); $wanted = "Moving ".$t->HOME."/.foobar/fnord/bla -> ".$t->TP."-foobar-fnord-bla sending incremental file list created directory ".$t->TP."-foobar-fnord-bla ./ Symlinking ".$t->TP."-foobar-fnord-bla -> ".$t->HOME."/.foobar/fnord/bla "; $t->eq_or_diff_stdout($wanted); dir_exists_ok( $t->TP."-foobar-fnord-bla" ); file_not_exists_ok( $t->TP."-fnord-bla", "Symlink 1 not moved" ); file_not_exists_ok( $t->TP."-foobar-blafasel-bla", "Symlink 2 not moved" ); $t->done; unburden-home-dir-0.3.2.2/t/check-symlinks-without-trailing-slash.t0000644000000000000000000000135512131653573022074 0ustar #!/usr/bin/perl -wl use lib qw(t/lib lib); use Test::UBH; my $t = Test::UBH->new('check-symlinks-without-trailing-slash'); $t->setup_test_environment_without_target(".foobar"); file_not_exists_ok( $t->TARGET."/fnord" ); ok( symlink($t->TP."-foobar-fnord", $t->HOME."/.foobar/fnord"), "Create test environment (Symlink)" ); file_is_symlink_ok( $t->HOME."/.foobar/fnord" ); $t->write_configs("m d .foobar/fnord foobar-fnord/\n"); $t->call_unburden_home_dir_default; my $wanted = $t->prepend_lsof_warning; $t->eq_or_diff_stderr($wanted); $wanted = "Create ".$t->TP."-foobar-fnord\n" . "mkdir ".$t->TARGET."\n" . "mkdir ".$t->TP."-foobar-fnord\n"; $t->eq_or_diff_stdout($wanted); dir_exists_ok( $t->TP."-foobar-fnord" ); $t->done; unburden-home-dir-0.3.2.2/t/create-empty-directories.t0000644000000000000000000000135312131653573017437 0ustar #!/usr/bin/perl -wl use lib qw(t/lib lib); use Test::UBH; my $t = Test::UBH->new('create-empty-directories'); $t->setup_test_environment(''); file_not_exists_ok( $t->TP."-foobar-fnord" ); $t->write_configs("r D .foobar/fnord foobar-fnord"); $t->call_unburden_home_dir_default; $t->eq_lsof_warning_or_diff_stderr; $wanted = "Create directory ".$t->TP."-foobar-fnord and parents mkdir ".$t->TP."-foobar-fnord Create parent directories for ".$t->HOME."/.foobar/fnord mkdir ".$t->HOME."/.foobar Symlinking ".$t->HOME."/.foobar/fnord -> ".$t->TP."-foobar-fnord "; $t->eq_or_diff_stdout($wanted); dir_exists_ok( $t->TP."-foobar-fnord" ); dir_exists_ok( $t->HOME."/.foobar" ); symlink_target_exists_ok( $t->HOME."/.foobar/fnord" ); $t->done(); unburden-home-dir-0.3.2.2/t/find-per-user-stuff.t0000644000000000000000000000377712131653573016347 0ustar #!/usr/bin/perl -wl use lib qw(t/lib lib); use Test::UBH; my $t = Test::UBH->new('find-per-user-stuff'); my $demodir1 = '.foobar/fnord'; my $demofile1 = "$demodir1/bla"; my $demotarget1 = 'foobar-fnord-bla'; my $demodir2 = '.foobar/blafasel'; my $demofile2 = "$demodir2/bla"; my $demotarget2 = 'foobar-blafasel-bla'; foreach my $configtype (qw(write_user_configs write_xdg_configs)) { $t->setup_test_environment($demofile1); ok( symlink($demodir1, $t->HOME."/.fnord"), "Create test environment (Symlink 1)" ); file_is_symlink_ok( $t->HOME."/.fnord" ); # http://bugs.debian.org/705242 + https://rt.cpan.org/Public/Bug/Display.html?id=84582 #symlink_target_exists_ok( $t->HOME."/.fnord" ); ok( symlink("fnord", $t->HOME."/$demodir2"), "Create test environment (Symlink 2)" ); file_is_symlink_ok( $t->HOME."/$demodir2" ); # http://bugs.debian.org/705242 + https://rt.cpan.org/Public/Bug/Display.html?id=84582 #symlink_target_exists_ok( $t->HOME."/$demodir2" ); $t->$configtype("m d $demofile1 $demotarget1\n". "m d .fnord/bla fnord-bla\n". "m d $demofile2 $demotarget2\n"); $t->call_unburden_home_dir_user; my $wanted = $t->prepend_lsof_warning( "Skipping '".$t->HOME."/.fnord/bla' due to symlink in path: ".$t->HOME."/.fnord\n" . "Skipping '".$t->HOME."/$demofile2' due to symlink in path: ".$t->HOME."/$demodir2\n"); $t->eq_or_diff_stderr($wanted); $wanted = "Moving ".$t->HOME."/$demofile1 -> ".$t->TP."-$demotarget1\n" . "sending incremental file list\n" . "created directory ".$t->TP."-$demotarget1\n" . "./\n" . "Symlinking ".$t->TP."-$demotarget1 -> ".$t->HOME."/$demofile1\n"; $t->eq_or_diff_stdout($wanted); dir_exists_ok( $t->TP."-$demotarget1", "First directory moved" ); file_not_exists_ok( $t->TP."-fnord-bla", "Symlink 1 not moved" ); file_not_exists_ok( $t->TP."-$demotarget2", "Symlink 2 not moved" ); $t->cleanup(); } done_testing(); unburden-home-dir-0.3.2.2/t/lib/0000755000000000000000000000000012131653573013105 5ustar unburden-home-dir-0.3.2.2/t/lib/Test/0000755000000000000000000000000012131653573014024 5ustar unburden-home-dir-0.3.2.2/t/lib/Test/UBH.pm0000644000000000000000000001255712131653573015012 0ustar # Module to reduce boilerplate code in unburden-home-dir's test suite # Boilerplate which exports into main:: use Test::More; use Test::Differences; use Test::File; use File::Path qw(mkpath); use File::Slurp; use Data::Dumper; package Test::UBH; use Mouse; # Boilerplate which exports into Test::UBH:: use Test::More; use Test::Differences; use Test::File; use File::Path qw(mkpath rmtree); use File::Slurp; use File::Which; use Data::Dumper; foreach my $varname (qw(TESTNAME BASE HOME TARGET BASENAME PREFIX TP)) { has $varname => ( is => 'rw', isa => 'Str' ); } sub new { my $class = shift; my $t = {}; bless($t, $class); $t->TESTNAME(shift || 'generic-test'); $t->BASE('t/'.$t->TESTNAME); $t->HOME($t->BASE . '/1'); $t->TARGET($t->BASE .'/2'); $t->BASENAME("unburden-home-dir_TEST_$$"); $t->PREFIX('u'); $t->TP($t->TARGET.'/'.$t->PREFIX); # Set a debug environment $ENV{HOME} = $t->HOME; $ENV{LANG} = 'C'; # Clean up possible remainders of aborted tests rmtree($t->BASE); return $t; } sub cleanup { my $t = shift; ok( rmtree($t->BASE), "Clean up" ); } sub done { my $t = shift; $t->cleanup; done_testing(); } sub setup_test_environment { my $t = shift; $t->setup_test_environment_without_target(@_); $t->create_and_check_directory($t->TARGET, "test environment (target directory)" ); } sub setup_test_environment_without_target { my $t = shift; foreach my $dir (@_) { $t->create_and_check_directory($t->HOME."/".($dir || ''), "test environment (home directory)" ); } } sub create_and_check_directory { my $t = shift; my ($dir, $desc) = @_; ok( mkpath($dir, {}), "Create $desc" ); ok( -d $dir, "$desc has been created" ); } sub default_config { my $t = shift; return "TARGETDIR=".$t->TARGET."\nFILELAYOUT=".$t->PREFIX."-\%s"; } sub prepend_lsof_warning { my $t = shift; my $wanted = shift || ''; unless (which('lsof')) { $wanted = "WARNING: lsof not found, not checking for files in use.\n".$wanted; } return $wanted; } sub call_unburden_home_dir { my $t = shift; die 'Assertion: call_unburden_home_dir needs at least one non-empty parameter' unless @_; my $cmd = 'bin/unburden-home-dir '.join(' ', @_); $t->call_cmd($cmd); } sub call_cmd { my $t = shift; my $cmd = shift; ok( system($cmd . $t->shell_capture) == 0, "Call '$cmd'" ); } sub call_unburden_home_dir_user { my $t = shift; $t->call_unburden_home_dir(@_, '-b '.$t->BASENAME) } sub call_unburden_home_dir_default { my $t = shift; $t->call_unburden_home_dir(@_, "-C ".$t->BASE."/config -L ".$t->BASE."/list"); } sub write_configs { my $t = shift; my ($list, $config) = @_; $t->write_config_file($t->BASE.'/list', $list || '', "Write classic list" ); $t->write_config_file($t->BASE.'/config', $config || $t->default_config, "Write classic config" ); } sub write_user_configs { my $t = shift; my ($list, $config) = @_; $t->write_config_file_to_home('.'.$t->BASENAME.'.list', $list || '', "Write classic list" ); $t->write_config_file_to_home('.'.$t->BASENAME, $config || $t->default_config, "Write classic config" ); } sub write_xdg_configs { my $t = shift; my ($list, $config) = @_; ok( mkpath($t->HOME.'/.config/'.$t->BASENAME, {}), "Create test environment (XDG directory)" ); $t->write_config_file_to_home('.config/'.$t->BASENAME.'/list', $list || '', "Write XDG list" ); $t->write_config_file_to_home('.config/'.$t->BASENAME.'/config', $config || $t->default_config, "Write XDG config" ); } sub write_config_file_to_home { my $t = shift; my $file = shift; $t->write_config_file($t->HOME.'/'.$file, @_); } sub write_config_file { my $t = shift; my ($file, $contents, $desc) = @_; BAIL_OUT('write_config_file: $file empty') unless $file; BAIL_OUT('write_config_file: $contents undefined') unless defined $contents; ok( write_file($file, $contents), $desc || "Write config file $file" ); } sub shell_capture { my $t = shift; return ' >'.$t->BASE.'/output 2>'.$t->BASE.'/stderr'; } sub eq_or_diff_stderr { my $t = shift; my ($wanted, $desc) = @_; $t->eq_or_diff_file('stderr', $desc || 'STDERR', $wanted); } sub eq_lsof_warning_or_diff_stderr { my $t = shift; $t->eq_or_diff_stderr($t->prepend_lsof_warning); } sub eq_or_diff_stdout { my $t = shift; my ($wanted, $desc) = @_; $t->eq_or_diff_file('output', $desc || 'STDOUT' , $wanted); } sub eq_or_diff_file { my $t = shift; my ($file, $desc, $wanted) = @_; $file = $t->BASE."/$file"; my $output = read_file($file); # Somewhere between coreutils 8.13 (until Wheezy/Quantal), and # 8.20 (from Jessie/Raring on) the quoting characters in verbose # output of mv. changed. $wanted contains the newer style. In case # this test runs with older version of coreutils, we change the # output to look like the one from the newer versions. $output =~ s/\`/\'/g; unified_diff; eq_or_diff_text( $output, $wanted || '', "Check $desc" ); ok( unlink($file), "Clean cache file ($desc)" ); } 1; unburden-home-dir-0.3.2.2/t/moving-to-existing-subdir.t0000644000000000000000000000312512131653573017562 0ustar #!/usr/bin/perl -wl use lib qw(t/lib lib); use Test::UBH; my $t = Test::UBH->new('moving-to-existing-subdir'); $t->setup_test_environment(".foobar/fnord", ".foobar/gnarz"); ok( mkpath($t->TP."-foobar-gnarz", {}), 'Create test environment (target)' ); ok( write_file($t->HOME."/.foobar/fnord/bla", "123\n"), "Create file 1" ); ok( write_file($t->HOME."/.foobar/gnarz/goo", "456\n"), "Create file 2" ); ok( write_file($t->HOME."/.foobar/foo", "abc\n"), "Create file 3" ); $t->write_configs("m d .foobar/fnord foobar-fnord\n" . "m d .foobar/gnarz foobar-gnarz\n" . "m f .foobar/foo foobar-foo\n"); $t->call_unburden_home_dir_default; $t->eq_lsof_warning_or_diff_stderr; $wanted = "Moving ".$t->HOME."/.foobar/fnord -> ".$t->TP."-foobar-fnord sending incremental file list created directory ".$t->TP."-foobar-fnord ./ bla Symlinking ".$t->TP."-foobar-fnord -> ".$t->HOME."/.foobar/fnord Moving ".$t->HOME."/.foobar/gnarz -> ".$t->TP."-foobar-gnarz sending incremental file list goo Symlinking ".$t->TP."-foobar-gnarz -> ".$t->HOME."/.foobar/gnarz Moving ".$t->HOME."/.foobar/foo -> ".$t->TP."-foobar-foo '".$t->HOME."/.foobar/foo' -> '".$t->TP."-foobar-foo' Symlinking ".$t->TP."-foobar-foo -> ".$t->HOME."/.foobar/foo "; $t->eq_or_diff_stdout($wanted); dir_exists_ok( $t->TP."-foobar-fnord", "First directory moved" ); dir_exists_ok( $t->TP."-foobar-gnarz", "Second directory moved" ); file_exists_ok( $t->TP."-foobar-fnord/bla", "File 1 moved" ); file_exists_ok( $t->TP."-foobar-gnarz/goo", "File 2 moved" ); file_exists_ok( $t->TP."-foobar-foo", "File 3 moved" ); $t->done; unburden-home-dir-0.3.2.2/t/parse-comments-and-blank-lines.t0000644000000000000000000000340612131653573020421 0ustar #!/usr/bin/perl -wl use lib qw(t/lib lib); use Test::UBH; my $t = Test::UBH->new('parse-comments-and-blank-lines'); $t->setup_test_environment('.foobar/fnord/bla'); ok( symlink(".foobar/fnord", $t->HOME."/.fnord"), "Create test environment (Symlink 1)" ); file_is_symlink_ok( $t->HOME."/.fnord" ); # http://bugs.debian.org/705242 + https://rt.cpan.org/Public/Bug/Display.html?id=84582 #symlink_target_exists_ok( $t->HOME."/.fnord" ); ok( symlink("fnord", $t->HOME."/.foobar/blafasel"), "Create test environment (Symlink 2)" ); file_is_symlink_ok( $t->HOME."/.foobar/blafasel" ); # http://bugs.debian.org/705242 + https://rt.cpan.org/Public/Bug/Display.html?id=84582 #symlink_target_exists_ok( $t->HOME."/.foobar/blafasel" ); $t->write_configs("m d .foobar/fnord/bla foobar-fnord-bla\n" . "# Comment\n" . "\n" . " \n" . " \n" . "m d .fnord/bla fnord-bla\n" . "m d .foobar/blafasel/bla foobar-blafasel-bla\n"); $t->call_unburden_home_dir_default; my $wanted = $t->prepend_lsof_warning( "Skipping '".$t->HOME."/.fnord/bla' due to symlink in path: ".$t->HOME."/.fnord\n" . "Skipping '".$t->HOME."/.foobar/blafasel/bla' due to symlink in path: ".$t->HOME."/.foobar/blafasel\n"); $t->eq_or_diff_stderr($wanted); $wanted = "Moving ".$t->HOME."/.foobar/fnord/bla -> ".$t->TP."-foobar-fnord-bla sending incremental file list created directory ".$t->TP."-foobar-fnord-bla ./ Symlinking ".$t->TP."-foobar-fnord-bla -> ".$t->HOME."/.foobar/fnord/bla "; $t->eq_or_diff_stdout($wanted); dir_exists_ok( $t->TP."-foobar-fnord-bla" ); file_not_exists_ok( $t->TP."-fnord-bla", "Symlink 1 not moved" ); file_not_exists_ok( $t->TP."-foobar-blafasel-bla", "Symlink 2 not moved" ); $t->done; unburden-home-dir-0.3.2.2/t/replacement-order-dryrun.t0000644000000000000000000000141312131653573017454 0ustar #!/usr/bin/perl -wl use lib qw(t/lib lib); use Test::UBH; my $t = Test::UBH->new('replacement-order-dryrun'); $t->setup_test_environment_without_target(".foobar/blatest/barba"); $t->write_configs('m d .foo*/bla*/bar* bar%3-bla%2-foo%1'); $t->call_unburden_home_dir_default('-n'); my $wanted = "Create parent directories for ".$t->TP."-barba-blatest-foobar Moving ".$t->HOME."/.foobar/blatest/barba -> ".$t->TP."-barba-blatest-foobar Symlinking ".$t->TP."-barba-blatest-foobar -> ".$t->HOME."/.foobar/blatest/barba "; $t->eq_or_diff_stdout($wanted); file_not_exists_ok( $t->TP."-barba-blatest-foobar" ); ok( ! -l $t->HOME."/.foobar/blatest/barba", "File ".$t->HOME."/.foobar/blatest/barba is no symlink" ); dir_exists_ok( $t->HOME."/.foobar/blatest/barba" ); $t->done; unburden-home-dir-0.3.2.2/t/replacement-order.t0000644000000000000000000000075612131653573016144 0ustar #!/usr/bin/perl -wl use lib qw(t/lib lib); use Test::UBH; my $t = Test::UBH->new('replacement-order'); $t->setup_test_environment_without_target(".foobar/blatest/barba"); $t->write_configs('m d .foo*/bla*/bar* bar%3-bla%2-foo%1'); $t->call_unburden_home_dir_default; dir_exists_ok( $t->TP."-barba-blatest-foobar" ); file_is_symlink_ok( $t->HOME."/.foobar/blatest/barba" ); symlink_target_is( $t->HOME."/.foobar/blatest/barba", $t->TP."-barba-blatest-foobar" ); $t->done; unburden-home-dir-0.3.2.2/t/skip-non-home.t0000644000000000000000000000137112131653573015212 0ustar #!/usr/bin/perl -wl use lib qw(t/lib lib); use Test::UBH; my $t = Test::UBH->new('skip-non-home'); foreach my $example (qw(/foobar ../foobar)) { $t->setup_test_environment_without_target("foobar"); file_not_exists_ok( $t->BASE."/foobar" ); file_not_exists_ok( "/foobar" ); $t->write_configs("m d $example foobar"); $t->call_unburden_home_dir_default; my $wanted = $t->prepend_lsof_warning( "$example would be outside of the home directory, skipping...\n"); $t->eq_or_diff_stderr($wanted); $t->eq_or_diff_stdout(''); file_not_exists_ok( $t->TP."-foobar" ); file_not_exists_ok( $t->TP ); file_not_exists_ok( $t->BASE."/foobar" ); file_not_exists_ok( "/foobar" ); $t->cleanup; } done_testing(); unburden-home-dir-0.3.2.2/t/undo-dryrun.t0000644000000000000000000000223412131653573015013 0ustar #!/usr/bin/perl -wl use lib qw(t/lib lib); use Test::UBH; my $t = Test::UBH->new('undo-dryrun'); $t->setup_test_environment(".foobar/blatest"); ok( mkpath($t->TP."-barba-blatest-foobar", {}), "Create test environment (directory)" ); ok( symlink($t->TP."-barba-blatest-foobar", $t->HOME."/.foobar/blatest/barba"), "Create test environment (symlink)" ); file_is_symlink_ok( $t->HOME."/.foobar/blatest/barba" ); $t->write_configs('m d .foo*/bla*/bar* bar%3-bla%2-foo%1'); $t->call_unburden_home_dir_default('-n -u'); my $wanted = "Trying to revert ".$t->TP."-barba-blatest-foobar to ".$t->HOME."/.foobar/blatest/barba\n" . "Removing symlink ".$t->HOME."/.foobar/blatest/barba\n" . "Moving ".$t->TP."-barba-blatest-foobar -> ".$t->HOME."/.foobar/blatest/barba\n"; $t->eq_or_diff_stdout($wanted); $t->eq_lsof_warning_or_diff_stderr; dir_exists_ok( $t->TARGET, "Base directory still exists" ); dir_exists_ok( $t->TP."-barba-blatest-foobar", "Directory still exists" ); file_is_symlink_ok( $t->HOME."/.foobar/blatest/barba", "Symlink still exists" ); symlink_target_is( $t->HOME."/.foobar/blatest/barba", $t->TP."-barba-blatest-foobar" ); $t->done; unburden-home-dir-0.3.2.2/t/undo.t0000644000000000000000000000224512131653573013474 0ustar #!/usr/bin/perl -wl use lib qw(t/lib lib); use Test::UBH; my $t = Test::UBH->new('undo'); $t->setup_test_environment(".foobar/blatest"); ok( mkpath($t->TP."-barba-blatest-foobar", {}), "Create test environment (directory)" ); ok( symlink($t->TP."-barba-blatest-foobar", $t->HOME."/.foobar/blatest/barba"), "Create test environment (symlink)" ); file_is_symlink_ok( $t->HOME."/.foobar/blatest/barba" ); $t->write_configs('m d .foo*/bla*/bar* bar%3-bla%2-foo%1'); $t->call_unburden_home_dir_default('-u'); my $wanted = "Trying to revert ".$t->TP."-barba-blatest-foobar to ".$t->HOME."/.foobar/blatest/barba\n" . "Removing symlink ".$t->HOME."/.foobar/blatest/barba\n" . "Moving ".$t->TP."-barba-blatest-foobar -> ".$t->HOME."/.foobar/blatest/barba\n" . "sending incremental file list\n" . "created directory ".$t->HOME."/.foobar/blatest/barba\n" . "./\n"; $t->eq_or_diff_stdout($wanted); $t->eq_lsof_warning_or_diff_stderr; dir_exists_ok( $t->TARGET, "Base directory still exists" ); file_not_exists_ok( $t->TP."-barba-blatest-foobar", "Directory no more exists" ); dir_exists_ok( $t->HOME."/.foobar/blatest/barba", "Symlink is a directory again" ); $t->done; unburden-home-dir-0.3.2.2/t/xsession-d.t0000644000000000000000000000307512131653573014625 0ustar #!/usr/bin/perl -wl use File::Copy; use lib qw(t/lib lib); use Test::UBH; my $t = Test::UBH->new('xsession-d'); my $BINDIR = $t->BASE."/bin"; my $XSESSIOND = $t->BASE."/Xsession.d"; my $RPSCRIPT = "95unburden-home-dir"; my ($cmd, $wanted, $output, $stderr); # Set a debug environment $ENV{PATH} = $BINDIR; $ENV{UNBURDEN_BASENAME} = $t->BASENAME; $t->setup_test_environment_without_target(''); ok( mkpath($XSESSIOND, $BINDIR, {}), "Create test environment (directories)" ); dir_exists_ok( "$BINDIR", "Script directory has been created" ); dir_exists_ok( "$XSESSIOND", "Xsession.d directory has been created" ); ok( copy( "Xsession.d/$RPSCRIPT", "$XSESSIOND/" ), "Install Xsession.d script" ); ok( write_file("$BINDIR/unburden-home-dir", "#!/bin/sh\necho \$0 called\n"), "Create test script" ); ok( chmod( 0755, "$BINDIR/unburden-home-dir" ), "Set executable bit on testscript" ); ok( write_file($t->HOME.'/.'.$t->BASENAME, "UNBURDEN_HOME=yes\n"), "Configure Xsession.d script to run unburden-home-dir" ); $t->call_cmd("/bin/run-parts --list $XSESSIOND"); $t->eq_or_diff_stderr('', "run-parts STDERR"); $t->eq_or_diff_stdout("$XSESSIOND/$RPSCRIPT\n", "run-parts STDOUT"); $t->call_cmd("/bin/sh $XSESSIOND/$RPSCRIPT"); $t->eq_or_diff_stderr('', "Xsession.d STDERR"); $t->eq_or_diff_stdout("$BINDIR/unburden-home-dir called\n", "Xsession.d STDOUT"); ok( write_file($t->HOME.'/.'.$t->BASENAME, "UNBURDEN_HOME=no\n"), "Configure Xsession.d script to NOT run unburden-home-dir" ); $t->call_cmd("/bin/sh $XSESSIOND/$RPSCRIPT"); $t->eq_or_diff_stderr(''); $t->eq_or_diff_stdout(''); $t->done; unburden-home-dir-0.3.2.2/COPYING0000644000000000000000000004325411462540434013134 0ustar GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Lesser General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. unburden-home-dir-0.3.2.2/Makefile0000644000000000000000000000126312123071205013521 0ustar build: test: checkbashisms Xsession.d/95unburden-home-dir perl -c bin/unburden-home-dir prove t/*.t cover: cover -delete prove --exec 'env PERL5OPT=-MDevel::Cover perl' t/*.t cover install: install -d $(DESTDIR)/etc/X11/Xsession.d/ install -d $(DESTDIR)/usr/bin/ install -d $(DESTDIR)/usr/share/man/man1/ install -m 755 bin/unburden-home-dir $(DESTDIR)/usr/bin/ install -m 644 Xsession.d/95unburden-home-dir $(DESTDIR)/etc/X11/Xsession.d/ install -m 644 etc/unburden-home-dir etc/unburden-home-dir.list $(DESTDIR)/etc/ sed -e 's/^\([^#]\)/#\1/' -i $(DESTDIR)/etc/unburden-home-dir.list gzip -9c man/unburden-home-dir.1 > $(DESTDIR)/usr/share/man/man1/unburden-home-dir.1.gz unburden-home-dir-0.3.2.2/cover_db/0000755000000000000000000000000012123071317013646 5ustar unburden-home-dir-0.3.2.2/cover_db/runs/0000755000000000000000000000000012123071316014634 5ustar unburden-home-dir-0.3.2.2/cover_db/structure/0000755000000000000000000000000012123071316015705 5ustar unburden-home-dir-0.3.2.2/cover_db/structure/9c4bf4fb201e11b18ccd100dfb8127310000644000000000000000000002431412123071316022241 0ustar {"subroutine":[[25,"BEGIN"],[47,"BEGIN"],[48,"BEGIN"],[49,"BEGIN"],[50,"BEGIN"],[51,"BEGIN"],[52,"BEGIN"],[53,"BEGIN"],[54,"BEGIN"],[55,"BEGIN"],[56,"BEGIN"],[67,"VERSION_MESSAGE"],[75,"HELP_MESSAGE"],[179,"__ANON__"],[183,"__ANON__"],[195,"report_problem"],[201,"report_serious_problem"],[207,"move"],[230,"create_symlink_and_parents"],[243,"create_parent_directories"],[257,"possibly_create_non_existing_stuff"],[282,"fix_dangling_links"],[315,"parse_lsof_output"],[346,"files_in_use"],[370,"action_move"],[380,"action_delete_and_recreate"],[398,"create_object_of_type"],[417,"unknown_element"],[425,"create_symlink"],[437,"type_is_directory"],[442,"type_is_file"],[447,"check_for_unexpected_type"],[473,"do_it"],[499,"calculate_target"],[510,"fill_in_wildcard_matches"],[529,"symlink_in_path"],[553,"replace"],[591,"revert"],[623,"exchange_wildcards_and_replacements"]],"statement":[28,31,37,40,43,44,48,59,60,61,62,63,115,117,118,119,120,121,122,124,124,128,131,135,136,136,137,137,138,138,139,139,140,140,141,141,142,142,143,144,144,145,146,147,153,154,156,155,161,164,165,166,171,172,184,179,180,181,183,183,187,188,189,190,636,637,640,641,642,644,645,647,649,650,651,653,654,655,657,658,659,662,663,664,667,668,670,671,672,673,675,678,679,680,682,686,690,25,25,25,47,47,47,48,48,48,49,49,49,50,50,50,51,51,51,52,52,52,53,53,53,54,54,54,55,55,55,56,56,56,67,69,71,75,77,111,195,196,201,202,207,208,209,210,211,212,214,218,220,221,224,230,231,232,233,234,237,243,244,245,246,247,249,257,261,264,265,266,271,272,273,274,276,282,283,284,285,289,290,291,292,296,297,298,302,303,304,308,310,315,316,317,319,320,321,323,324,325,326,328,329,330,331,333,334,336,340,346,347,349,350,352,354,355,358,360,361,362,364,370,372,373,375,380,382,383,385,386,387,388,391,393,398,400,401,402,403,406,407,408,412,417,419,420,425,427,428,429,432,437,442,447,449,450,452,453,456,457,459,462,463,465,468,473,475,476,479,480,482,483,486,489,492,494,499,500,502,503,505,510,517,518,520,522,522,524,529,531,534,535,537,538,540,542,544,547,553,556,557,558,561,562,563,566,570,571,575,583,586,591,594,595,596,599,601,603,604,605,606,608,609,610,611,613,618,623,624,625,626,627,628,628,629,630,632],"file":"bin/unburden-home-dir","digest":"9c4bf4fb201e11b18ccd100dfb812731","branch":[[145,{"text":"if ($@)"}],[154,{"text":"if (-e $configfile)"}],[181,{"text":"unless /^sent |^total size|^\\s*$/"}],[188,{"text":"unless ($which_lsof)"}],[637,{"text":"unless -r $list"}],[640,{"text":"unless open LIST, '<', $list"}],[642,{"text":"if /^#|^ *$/"}],[647,{"text":"unless defined $action"}],[649,{"text":"unless (defined $item and defined $replacement)"}],[653,{"text":"unless (type_is_directory($type) or type_is_file($type))"}],[657,{"text":"if ($action ne 'd' and $action ne 'r' and $action ne 'm')"}],[662,{"text":"if ($item =~ m[^(\\.\\.)?/])"}],[673,{"text":"unless $i =~ /$FILTER/"}],[672,{"text":"if (defined $FILTER)"}],[680,{"text":"unless $i =~ /$FILTER/"}],[679,{"text":"if (defined $FILTER)"}],[667,{"text":"if ($REVERT) { }"}],[211,{"text":"unless $from =~ m[/$]"}],[212,{"text":"unless $to =~ m[/$]"}],[210,{"text":"if (-d $from) { }"}],[209,{"text":"unless ($DRYRUN)"}],[234,{"text":"unless symlink $old, $new"}],[233,{"text":"unless ($DRYRUN)"}],[247,{"text":"unless $DRYRUN"}],[245,{"text":"unless (-d $parent_dir)"}],[265,{"text":"unless $DRYRUN"}],[273,{"text":"unless $DRYRUN"}],[261,{"text":"if ($type eq 'D') { }"}],[261,{"text":"elsif ($type eq 'F') { }"}],[289,{"text":"if ($is_dir)"}],[296,{"text":"if ($link ne $target)"}],[304,{"text":"if $unexpected_type"}],[302,{"text":"if (-e $target) { }"}],[329,{"text":"unless ($pid)"}],[324,{"text":"if ($line =~ /^p(.*)$/) { }"}],[324,{"text":"elsif ($line =~ /^c(.*)$/) { }"}],[349,{"text":"if (-d $item) { }"}],[349,{"text":"elsif (-f _) { }"}],[360,{"text":"if ($lsof_parsed) { }"}],[373,{"text":"unless move $itemexpanded, $target"}],[387,{"text":"if $is_dir"}],[388,{"text":"if $is_file"}],[386,{"text":"unless ($DRYRUN)"}],[408,{"text":"unless touch($target)"}],[402,{"text":"if (type_is_directory($type)) { }"}],[402,{"text":"elsif (type_is_file($type)) { }"}],[401,{"text":"unless ($DRYRUN)"}],[429,{"text":"unless symlink $target, $itemexpanded"}],[428,{"text":"unless ($DRYRUN)"}],[452,{"text":"unless ($is_file or $is_dir)"}],[456,{"text":"if ($is_file and not -f $itemexpanded)"}],[462,{"text":"if ($is_dir and not -d $itemexpanded)"}],[475,{"text":"if ($USE_LSOF and files_in_use($itemexpanded))"}],[480,{"text":"if $unexpected_type"}],[482,{"text":"if ($action eq 'r' or $action eq 'd') { }"}],[482,{"text":"elsif ($action eq 'm') { }"}],[540,{"text":"if -l $path_to_check"}],[531,{"text":"if ($path =~ s[$ENV{'HOME'}/?][]) { }"}],[556,{"text":"if ($itemexpanded =~ /[][*?]/)"}],[561,{"text":"if (my $symlink = symlink_in_path($itemexpanded))"}],[570,{"text":"if (not -e $itemexpanded || -l $itemexpanded) { }"}],[570,{"text":"elsif (-l $itemexpanded) { }"}],[594,{"text":"if ($itemexpanded =~ /[][*?]/)"}],[610,{"text":"unless $DRYRUN"}],[608,{"text":"if ($itemexpanded eq $link_target) { }"}],[603,{"text":"if (-l $item_in_home)"}]],"condition":[[649,{"left":"defined $item","right":"defined $replacement","type":"and_3","op":"and"}],[653,{"left":"type_is_directory($type)","right":"type_is_file($type)","type":"or_3","op":"or"}],[657,{"left":"$action ne 'd'","right":"$action ne 'r'","type":"and_3","op":"and"}],[657,{"left":"$action ne 'd' and $action ne 'r'","right":"$action ne 'm'","type":"and_3","op":"and"}],[388,{"left":"unlink $itemexpanded","right":"die \"Couldn't delete ${itemexpanded}: $!\"","type":"or_2","op":"or"}],[452,{"left":"$is_file","right":"$is_dir","type":"or_3","op":"or"}],[456,{"left":"$is_file","right":"not -f $itemexpanded","type":"and_3","op":"and"}],[462,{"left":"$is_dir","right":"not -d $itemexpanded","type":"and_3","op":"and"}],[475,{"left":"$USE_LSOF","right":"files_in_use($itemexpanded)","type":"and_3","op":"and"}],[482,{"left":"$action eq 'r'","right":"$action eq 'd'","type":"or_3","op":"or"}],[570,{"left":"-e $itemexpanded","right":"-l $itemexpanded","type":"or_3","op":"||"}]],"start":{"398":{"create_object_of_type":[{"pod":null,"statement":232,"subroutine":26,"time":null,"branch":43,"condition":5}]},"67":{"VERSION_MESSAGE":[{"pod":null,"statement":130,"subroutine":11,"time":null,"branch":17,"condition":4}]},"370":{"action_move":[{"pod":null,"statement":219,"subroutine":24,"time":null,"branch":39,"condition":4}]},"346":{"files_in_use":[{"pod":null,"statement":207,"subroutine":23,"time":null,"branch":36,"condition":4}]},"315":{"parse_lsof_output":[{"pod":null,"statement":189,"subroutine":22,"time":null,"branch":33,"condition":4}]},"179":{"__ANON__":[{"pod":null,"statement":136,"subroutine":13,"time":null,"branch":17,"condition":4}]},"380":{"action_delete_and_recreate":[{"pod":null,"statement":223,"subroutine":25,"time":null,"branch":40,"condition":4}]},"55":{"BEGIN":[{"pod":null,"statement":124,"subroutine":9,"time":null,"branch":17,"condition":4}]},"25":{"BEGIN":[{"pod":null,"statement":97,"subroutine":null,"time":null,"branch":17,"condition":4}]},"437":{"type_is_directory":[{"pod":null,"statement":249,"subroutine":29,"time":null,"branch":49,"condition":5}]},"75":{"HELP_MESSAGE":[{"pod":null,"statement":133,"subroutine":12,"time":null,"branch":17,"condition":4}]},"230":{"create_symlink_and_parents":[{"pod":null,"statement":151,"subroutine":18,"time":null,"branch":21,"condition":4}]},"447":{"check_for_unexpected_type":[{"pod":null,"statement":251,"subroutine":31,"time":null,"branch":49,"condition":5}]},"243":{"create_parent_directories":[{"pod":null,"statement":157,"subroutine":19,"time":null,"branch":23,"condition":4}]},"201":{"report_serious_problem":[{"pod":null,"statement":138,"subroutine":16,"time":null,"branch":17,"condition":4}]},"623":{"exchange_wildcards_and_replacements":[{"pod":null,"statement":325,"subroutine":38,"time":null,"branch":66,"condition":11}]},"49":{"BEGIN":[{"pod":null,"statement":106,"subroutine":3,"time":null,"branch":17,"condition":4}]},"529":{"symlink_in_path":[{"pod":null,"statement":286,"subroutine":35,"time":null,"branch":56,"condition":10}]},"53":{"BEGIN":[{"pod":null,"statement":118,"subroutine":7,"time":null,"branch":17,"condition":4}]},"207":{"move":[{"pod":null,"statement":140,"subroutine":17,"time":null,"branch":17,"condition":4}]},"282":{"fix_dangling_links":[{"pod":null,"statement":173,"subroutine":21,"time":null,"branch":29,"condition":4}]},"48":{"BEGIN":[{"pod":null,"statement":103,"subroutine":2,"time":null,"branch":17,"condition":4}]},"257":{"possibly_create_non_existing_stuff":[{"pod":null,"statement":163,"subroutine":20,"time":null,"branch":25,"condition":4}]},"473":{"do_it":[{"pod":null,"statement":263,"subroutine":32,"time":null,"branch":52,"condition":8}]},"553":{"replace":[{"pod":null,"statement":296,"subroutine":36,"time":null,"branch":58,"condition":10}]},"50":{"BEGIN":[{"pod":null,"statement":109,"subroutine":4,"time":null,"branch":17,"condition":4}]},"183":{"__ANON__":[{"pod":null,"statement":136,"subroutine":14,"time":null,"branch":17,"condition":4}]},"51":{"BEGIN":[{"pod":null,"statement":112,"subroutine":5,"time":null,"branch":17,"condition":4}]},"442":{"type_is_file":[{"pod":null,"statement":250,"subroutine":30,"time":null,"branch":49,"condition":5}]},"417":{"unknown_element":[{"pod":null,"statement":241,"subroutine":27,"time":null,"branch":47,"condition":5}]},"425":{"create_symlink":[{"pod":null,"statement":244,"subroutine":28,"time":null,"branch":47,"condition":5}]},"47":{"BEGIN":[{"pod":null,"statement":100,"subroutine":1,"time":null,"branch":17,"condition":4}]},"52":{"BEGIN":[{"pod":null,"statement":115,"subroutine":6,"time":null,"branch":17,"condition":4}]},"591":{"revert":[{"pod":null,"statement":309,"subroutine":37,"time":null,"branch":62,"condition":11}]},"510":{"fill_in_wildcard_matches":[{"pod":null,"statement":279,"subroutine":34,"time":null,"branch":56,"condition":10}]},"499":{"calculate_target":[{"pod":null,"statement":274,"subroutine":33,"time":null,"branch":56,"condition":10}]},"56":{"BEGIN":[{"pod":null,"statement":127,"subroutine":10,"time":null,"branch":17,"condition":4}]},"54":{"BEGIN":[{"pod":null,"statement":121,"subroutine":8,"time":null,"branch":17,"condition":4}]},"-1":{"__COVER__":[{"pod":null,"statement":335,"subroutine":39,"time":null,"branch":66,"condition":11}]},"195":{"report_problem":[{"pod":null,"statement":136,"subroutine":15,"time":null,"branch":17,"condition":4}]}}} unburden-home-dir-0.3.2.2/cover_db/structure/329796d345e715579efe5a374ed6d6c80000644000000000000000000000205612123071316022115 0ustar {"statement":[10,11,12,13,16,19,21,22,23,25,26,27,28,30,31,33,34,36,39,40,43,44,46,53,54,56,57,58,60,62,3,3,3,4,4,4,5,5,5,6,6,6,7,7,7,8,8,8],"subroutine":[[3,"BEGIN"],[4,"BEGIN"],[5,"BEGIN"],[6,"BEGIN"],[7,"BEGIN"],[8,"BEGIN"]],"file":"t/check-symlinks-in-path.t","digest":"329796d345e715579efe5a374ed6d6c8","branch":[[39,{"text":"unless (which('lsof'))"}]],"start":{"6":{"BEGIN":[{"pod":null,"subroutine":3,"statement":39,"time":null,"branch":1,"condition":null}]},"8":{"BEGIN":[{"pod":null,"subroutine":5,"statement":45,"time":null,"branch":1,"condition":null}]},"4":{"BEGIN":[{"pod":null,"subroutine":1,"statement":33,"time":null,"branch":1,"condition":null}]},"3":{"BEGIN":[{"pod":null,"subroutine":null,"statement":30,"time":null,"branch":1,"condition":null}]},"7":{"BEGIN":[{"pod":null,"subroutine":4,"statement":42,"time":null,"branch":1,"condition":null}]},"-1":{"__COVER__":[{"pod":null,"subroutine":6,"statement":48,"time":null,"branch":1,"condition":null}]},"5":{"BEGIN":[{"pod":null,"subroutine":2,"statement":36,"time":null,"branch":1,"condition":null}]}}} unburden-home-dir-0.3.2.2/cover_db/structure/9a0c6243830e3dadf321a2b597d55be90000644000000000000000000000205612123071316022206 0ustar {"statement":[10,11,12,13,16,19,21,22,24,25,27,28,30,31,33,34,35,38,39,41,46,47,49,51,53,3,3,3,4,4,4,5,5,5,6,6,6,7,7,7,8,8,8],"subroutine":[[3,"BEGIN"],[4,"BEGIN"],[5,"BEGIN"],[6,"BEGIN"],[7,"BEGIN"],[8,"BEGIN"]],"file":"t/check-symlinks-without-trailing-slash.t","digest":"9a0c6243830e3dadf321a2b597d55be9","branch":[[34,{"text":"unless (which('lsof'))"}]],"start":{"6":{"BEGIN":[{"pod":null,"subroutine":3,"statement":34,"time":null,"branch":1,"condition":null}]},"8":{"BEGIN":[{"pod":null,"subroutine":5,"statement":40,"time":null,"branch":1,"condition":null}]},"4":{"BEGIN":[{"pod":null,"subroutine":1,"statement":28,"time":null,"branch":1,"condition":null}]},"3":{"BEGIN":[{"pod":null,"subroutine":null,"statement":25,"time":null,"branch":1,"condition":null}]},"7":{"BEGIN":[{"pod":null,"subroutine":4,"statement":37,"time":null,"branch":1,"condition":null}]},"-1":{"__COVER__":[{"pod":null,"subroutine":6,"statement":43,"time":null,"branch":1,"condition":null}]},"5":{"BEGIN":[{"pod":null,"subroutine":2,"statement":31,"time":null,"branch":1,"condition":null}]}}} unburden-home-dir-0.3.2.2/cover_db/structure/e74b03dd8d81421a98c64013773710180000644000000000000000000000204712123071316021630 0ustar {"statement":[10,11,12,13,16,19,21,22,23,24,26,27,29,30,32,33,34,37,38,40,47,48,50,51,52,54,56,3,3,3,4,4,4,5,5,5,6,6,6,7,7,7,8,8,8],"subroutine":[[3,"BEGIN"],[4,"BEGIN"],[5,"BEGIN"],[6,"BEGIN"],[7,"BEGIN"],[8,"BEGIN"]],"file":"t/create-empty-directories.t","digest":"e74b03dd8d81421a98c6401377371018","branch":[[33,{"text":"unless (which('lsof'))"}]],"start":{"6":{"BEGIN":[{"pod":null,"subroutine":3,"statement":36,"time":null,"branch":1,"condition":null}]},"8":{"BEGIN":[{"pod":null,"subroutine":5,"statement":42,"time":null,"branch":1,"condition":null}]},"4":{"BEGIN":[{"pod":null,"subroutine":1,"statement":30,"time":null,"branch":1,"condition":null}]},"3":{"BEGIN":[{"pod":null,"subroutine":null,"statement":27,"time":null,"branch":1,"condition":null}]},"7":{"BEGIN":[{"pod":null,"subroutine":4,"statement":39,"time":null,"branch":1,"condition":null}]},"-1":{"__COVER__":[{"pod":null,"subroutine":6,"statement":45,"time":null,"branch":1,"condition":null}]},"5":{"BEGIN":[{"pod":null,"subroutine":2,"statement":33,"time":null,"branch":1,"condition":null}]}}} unburden-home-dir-0.3.2.2/cover_db/structure/22a9c2dddaf09fcb617208937adc7faf0000644000000000000000000000206212123071316022510 0ustar {"statement":[10,11,12,13,14,17,20,22,23,24,26,27,28,29,31,32,34,35,37,40,41,44,45,47,54,55,57,58,59,61,63,3,3,3,4,4,4,5,5,5,6,6,6,7,7,7,8,8,8],"subroutine":[[3,"BEGIN"],[4,"BEGIN"],[5,"BEGIN"],[6,"BEGIN"],[7,"BEGIN"],[8,"BEGIN"]],"file":"t/find-per-user-stuff-xdg.t","digest":"22a9c2dddaf09fcb617208937adc7faf","branch":[[40,{"text":"unless (which('lsof'))"}]],"start":{"6":{"BEGIN":[{"pod":null,"subroutine":3,"statement":40,"time":null,"branch":1,"condition":null}]},"8":{"BEGIN":[{"pod":null,"subroutine":5,"statement":46,"time":null,"branch":1,"condition":null}]},"4":{"BEGIN":[{"pod":null,"subroutine":1,"statement":34,"time":null,"branch":1,"condition":null}]},"3":{"BEGIN":[{"pod":null,"subroutine":null,"statement":31,"time":null,"branch":1,"condition":null}]},"7":{"BEGIN":[{"pod":null,"subroutine":4,"statement":43,"time":null,"branch":1,"condition":null}]},"-1":{"__COVER__":[{"pod":null,"subroutine":6,"statement":49,"time":null,"branch":1,"condition":null}]},"5":{"BEGIN":[{"pod":null,"subroutine":2,"statement":37,"time":null,"branch":1,"condition":null}]}}} unburden-home-dir-0.3.2.2/cover_db/structure/87056748e9488a83bea7341a19859da20000644000000000000000000000205612123071316021744 0ustar {"statement":[10,11,12,13,14,17,20,22,23,24,26,27,28,29,31,32,34,35,37,40,41,44,45,47,54,55,57,58,59,61,63,3,3,3,4,4,4,5,5,5,6,6,6,7,7,7,8,8,8],"subroutine":[[3,"BEGIN"],[4,"BEGIN"],[5,"BEGIN"],[6,"BEGIN"],[7,"BEGIN"],[8,"BEGIN"]],"file":"t/find-per-user-stuff.t","digest":"87056748e9488a83bea7341a19859da2","branch":[[40,{"text":"unless (which('lsof'))"}]],"start":{"6":{"BEGIN":[{"pod":null,"subroutine":3,"statement":40,"time":null,"branch":1,"condition":null}]},"8":{"BEGIN":[{"pod":null,"subroutine":5,"statement":46,"time":null,"branch":1,"condition":null}]},"4":{"BEGIN":[{"pod":null,"subroutine":1,"statement":34,"time":null,"branch":1,"condition":null}]},"3":{"BEGIN":[{"pod":null,"subroutine":null,"statement":31,"time":null,"branch":1,"condition":null}]},"7":{"BEGIN":[{"pod":null,"subroutine":4,"statement":43,"time":null,"branch":1,"condition":null}]},"-1":{"__COVER__":[{"pod":null,"subroutine":6,"statement":49,"time":null,"branch":1,"condition":null}]},"5":{"BEGIN":[{"pod":null,"subroutine":2,"statement":37,"time":null,"branch":1,"condition":null}]}}} unburden-home-dir-0.3.2.2/cover_db/structure/9958efadd0988aa38eb9cc2f6dd3d3980000644000000000000000000000207512123071316022473 0ustar {"statement":[10,11,12,13,16,17,20,22,24,25,27,28,29,31,32,34,35,37,38,39,42,43,44,46,61,68,70,72,73,74,75,76,78,80,3,3,3,4,4,4,5,5,5,6,6,6,7,7,7,8,8,8],"subroutine":[[3,"BEGIN"],[4,"BEGIN"],[5,"BEGIN"],[6,"BEGIN"],[7,"BEGIN"],[8,"BEGIN"]],"file":"t/moving-to-existing-subdir.t","digest":"9958efadd0988aa38eb9cc2f6dd3d398","branch":[[38,{"text":"unless (which('lsof'))"}]],"start":{"6":{"BEGIN":[{"pod":null,"subroutine":3,"statement":43,"time":null,"branch":1,"condition":null}]},"8":{"BEGIN":[{"pod":null,"subroutine":5,"statement":49,"time":null,"branch":1,"condition":null}]},"4":{"BEGIN":[{"pod":null,"subroutine":1,"statement":37,"time":null,"branch":1,"condition":null}]},"3":{"BEGIN":[{"pod":null,"subroutine":null,"statement":34,"time":null,"branch":1,"condition":null}]},"7":{"BEGIN":[{"pod":null,"subroutine":4,"statement":46,"time":null,"branch":1,"condition":null}]},"-1":{"__COVER__":[{"pod":null,"subroutine":6,"statement":52,"time":null,"branch":1,"condition":null}]},"5":{"BEGIN":[{"pod":null,"subroutine":2,"statement":40,"time":null,"branch":1,"condition":null}]}}} unburden-home-dir-0.3.2.2/cover_db/structure/5e9326a652f87d3d5a05bde10d45691d0000644000000000000000000000206612123071316022137 0ustar {"statement":[10,11,12,13,16,19,21,22,23,25,26,27,28,30,31,33,34,36,39,40,43,44,46,53,54,56,57,58,60,62,3,3,3,4,4,4,5,5,5,6,6,6,7,7,7,8,8,8],"subroutine":[[3,"BEGIN"],[4,"BEGIN"],[5,"BEGIN"],[6,"BEGIN"],[7,"BEGIN"],[8,"BEGIN"]],"file":"t/parse-comments-and-blank-lines.t","digest":"5e9326a652f87d3d5a05bde10d45691d","branch":[[39,{"text":"unless (which('lsof'))"}]],"start":{"6":{"BEGIN":[{"pod":null,"subroutine":3,"statement":39,"time":null,"branch":1,"condition":null}]},"8":{"BEGIN":[{"pod":null,"subroutine":5,"statement":45,"time":null,"branch":1,"condition":null}]},"4":{"BEGIN":[{"pod":null,"subroutine":1,"statement":33,"time":null,"branch":1,"condition":null}]},"3":{"BEGIN":[{"pod":null,"subroutine":null,"statement":30,"time":null,"branch":1,"condition":null}]},"7":{"BEGIN":[{"pod":null,"subroutine":4,"statement":42,"time":null,"branch":1,"condition":null}]},"-1":{"__COVER__":[{"pod":null,"subroutine":6,"statement":48,"time":null,"branch":1,"condition":null}]},"5":{"BEGIN":[{"pod":null,"subroutine":2,"statement":36,"time":null,"branch":1,"condition":null}]}}} unburden-home-dir-0.3.2.2/cover_db/structure/eb62134d113bae297c80dc4800f6b5fc0000644000000000000000000000156312123071316022260 0ustar {"statement":[9,10,11,12,15,17,19,20,22,24,30,31,33,34,35,37,39,3,3,3,4,4,4,5,5,5,6,6,6,7,7,7],"subroutine":[[3,"BEGIN"],[4,"BEGIN"],[5,"BEGIN"],[6,"BEGIN"],[7,"BEGIN"]],"file":"t/replacement-order-dryrun.t","digest":"eb62134d113bae297c80dc4800f6b5fc","start":{"6":{"BEGIN":[{"pod":null,"subroutine":3,"statement":26,"time":null,"branch":null,"condition":null}]},"4":{"BEGIN":[{"pod":null,"subroutine":1,"statement":20,"time":null,"branch":null,"condition":null}]},"3":{"BEGIN":[{"pod":null,"subroutine":null,"statement":17,"time":null,"branch":null,"condition":null}]},"7":{"BEGIN":[{"pod":null,"subroutine":4,"statement":29,"time":null,"branch":null,"condition":null}]},"-1":{"__COVER__":[{"pod":null,"subroutine":5,"statement":32,"time":null,"branch":null,"condition":null}]},"5":{"BEGIN":[{"pod":null,"subroutine":2,"statement":23,"time":null,"branch":null,"condition":null}]}}} unburden-home-dir-0.3.2.2/cover_db/structure/53bee11db9df5d09ff737f434199d8400000644000000000000000000000154312123071316022234 0ustar {"statement":[9,10,11,12,15,17,19,20,22,24,25,26,30,32,3,3,3,4,4,4,5,5,5,6,6,6,7,7,7],"subroutine":[[3,"BEGIN"],[4,"BEGIN"],[5,"BEGIN"],[6,"BEGIN"],[7,"BEGIN"]],"file":"t/replacement-order.t","digest":"53bee11db9df5d09ff737f434199d840","start":{"6":{"BEGIN":[{"pod":null,"subroutine":3,"statement":23,"time":null,"branch":null,"condition":null}]},"4":{"BEGIN":[{"pod":null,"subroutine":1,"statement":17,"time":null,"branch":null,"condition":null}]},"3":{"BEGIN":[{"pod":null,"subroutine":null,"statement":14,"time":null,"branch":null,"condition":null}]},"7":{"BEGIN":[{"pod":null,"subroutine":4,"statement":26,"time":null,"branch":null,"condition":null}]},"-1":{"__COVER__":[{"pod":null,"subroutine":5,"statement":29,"time":null,"branch":null,"condition":null}]},"5":{"BEGIN":[{"pod":null,"subroutine":2,"statement":20,"time":null,"branch":null,"condition":null}]}}} unburden-home-dir-0.3.2.2/cover_db/structure/44a47bd9769d5fad2ce4826dedc8c95f0000644000000000000000000000203712123071316022463 0ustar {"subroutine":[[3,"BEGIN"],[4,"BEGIN"],[5,"BEGIN"],[6,"BEGIN"],[7,"BEGIN"],[8,"BEGIN"]],"statement":[10,11,12,13,16,19,21,23,24,26,27,29,30,32,33,35,36,37,40,41,43,44,46,47,49,50,52,55,3,3,3,4,4,4,5,5,5,6,6,6,7,7,7,8,8,8],"file":"t/skip-non-home.t","digest":"44a47bd9769d5fad2ce4826dedc8c95f","branch":[[36,{"text":"unless (which('lsof'))"}]],"start":{"8":{"BEGIN":[{"pod":null,"statement":43,"subroutine":5,"time":null,"branch":1,"condition":null}]},"6":{"BEGIN":[{"pod":null,"statement":37,"subroutine":3,"time":null,"branch":1,"condition":null}]},"4":{"BEGIN":[{"pod":null,"statement":31,"subroutine":1,"time":null,"branch":1,"condition":null}]},"3":{"BEGIN":[{"pod":null,"statement":28,"subroutine":null,"time":null,"branch":1,"condition":null}]},"7":{"BEGIN":[{"pod":null,"statement":40,"subroutine":4,"time":null,"branch":1,"condition":null}]},"5":{"BEGIN":[{"pod":null,"statement":34,"subroutine":2,"time":null,"branch":1,"condition":null}]},"-1":{"__COVER__":[{"pod":null,"statement":46,"subroutine":6,"time":null,"branch":1,"condition":null}]}}} unburden-home-dir-0.3.2.2/cover_db/structure/851bb052269c1fe29b4cfcde64eb781f0000644000000000000000000000156212123071316022361 0ustar {"subroutine":[[3,"BEGIN"],[4,"BEGIN"],[5,"BEGIN"],[6,"BEGIN"],[7,"BEGIN"]],"statement":[9,10,11,12,15,17,18,19,21,22,24,25,27,32,33,35,36,37,38,42,44,3,3,3,4,4,4,5,5,5,6,6,6,7,7,7],"file":"t/undo-dryrun.t","digest":"851bb052269c1fe29b4cfcde64eb781f","start":{"6":{"BEGIN":[{"pod":null,"statement":30,"subroutine":3,"time":null,"branch":null,"condition":null}]},"4":{"BEGIN":[{"pod":null,"statement":24,"subroutine":1,"time":null,"branch":null,"condition":null}]},"3":{"BEGIN":[{"pod":null,"statement":21,"subroutine":null,"time":null,"branch":null,"condition":null}]},"7":{"BEGIN":[{"pod":null,"statement":33,"subroutine":4,"time":null,"branch":null,"condition":null}]},"5":{"BEGIN":[{"pod":null,"statement":27,"subroutine":2,"time":null,"branch":null,"condition":null}]},"-1":{"__COVER__":[{"pod":null,"statement":36,"subroutine":5,"time":null,"branch":null,"condition":null}]}}} unburden-home-dir-0.3.2.2/cover_db/structure/13f12dadd47bb7557259afc245fb3e370000644000000000000000000000202612123071316022267 0ustar {"subroutine":[[3,"BEGIN"],[4,"BEGIN"],[5,"BEGIN"],[6,"BEGIN"],[7,"BEGIN"],[8,"BEGIN"]],"statement":[10,11,12,13,16,19,21,22,23,24,26,27,29,30,32,40,41,43,44,45,48,49,50,52,53,54,56,58,3,3,3,4,4,4,5,5,5,6,6,6,7,7,7,8,8,8],"file":"t/undo.t","digest":"13f12dadd47bb7557259afc245fb3e37","branch":[[44,{"text":"unless (which('lsof'))"}]],"start":{"8":{"BEGIN":[{"pod":null,"statement":43,"subroutine":5,"time":null,"branch":1,"condition":null}]},"6":{"BEGIN":[{"pod":null,"statement":37,"subroutine":3,"time":null,"branch":1,"condition":null}]},"4":{"BEGIN":[{"pod":null,"statement":31,"subroutine":1,"time":null,"branch":1,"condition":null}]},"3":{"BEGIN":[{"pod":null,"statement":28,"subroutine":null,"time":null,"branch":1,"condition":null}]},"7":{"BEGIN":[{"pod":null,"statement":40,"subroutine":4,"time":null,"branch":1,"condition":null}]},"5":{"BEGIN":[{"pod":null,"statement":34,"subroutine":2,"time":null,"branch":1,"condition":null}]},"-1":{"__COVER__":[{"pod":null,"statement":46,"subroutine":6,"time":null,"branch":1,"condition":null}]}}} unburden-home-dir-0.3.2.2/cover_db/structure/79d9ed86aa75dcf0e70125e1ac3878570000644000000000000000000000145712123071316022241 0ustar {"statement":[8,10,11,12,13,15,3,3,3,4,4,4,5,5,5,6,6,6,6,6,6],"subroutine":[[3,"BEGIN"],[4,"BEGIN"],[5,"BEGIN"],[6,"BEGIN"],[6,"BEGIN"]],"file":"t/version.t","digest":"79d9ed86aa75dcf0e70125e1ac387857","start":{"6":{"BEGIN":[{"pod":null,"subroutine":3,"statement":15,"time":null,"branch":null,"condition":null},{"pod":null,"subroutine":4,"statement":18,"time":null,"branch":null,"condition":null}]},"4":{"BEGIN":[{"pod":null,"subroutine":1,"statement":9,"time":null,"branch":null,"condition":null}]},"3":{"BEGIN":[{"pod":null,"subroutine":null,"statement":6,"time":null,"branch":null,"condition":null}]},"-1":{"__COVER__":[{"pod":null,"subroutine":5,"statement":21,"time":null,"branch":null,"condition":null}]},"5":{"BEGIN":[{"pod":null,"subroutine":2,"statement":12,"time":null,"branch":null,"condition":null}]}}} unburden-home-dir-0.3.2.2/cover_db/structure/53b54c214335e3d81a5f61b3a4ff1f020000644000000000000000000000230212123071316022103 0ustar {"subroutine":[[3,"BEGIN"],[4,"BEGIN"],[5,"BEGIN"],[6,"BEGIN"],[7,"BEGIN"],[8,"BEGIN"],[9,"BEGIN"]],"statement":[11,12,13,14,15,16,17,19,22,23,24,27,29,30,31,32,34,35,36,37,39,40,42,44,45,46,48,50,51,52,54,55,57,59,60,61,63,65,66,67,69,71,72,74,76,77,78,80,82,83,84,86,88,3,3,3,4,4,4,5,5,5,6,6,6,7,7,7,8,8,8,9,9,9],"file":"t/xsession-d.t","digest":"53b54c214335e3d81a5f61b3a4ff1f02","start":{"6":{"BEGIN":[{"pod":null,"statement":62,"subroutine":3,"time":null,"branch":null,"condition":null}]},"3":{"BEGIN":[{"pod":null,"statement":53,"subroutine":null,"time":null,"branch":null,"condition":null}]},"7":{"BEGIN":[{"pod":null,"statement":65,"subroutine":4,"time":null,"branch":null,"condition":null}]},"9":{"BEGIN":[{"pod":null,"statement":71,"subroutine":6,"time":null,"branch":null,"condition":null}]},"8":{"BEGIN":[{"pod":null,"statement":68,"subroutine":5,"time":null,"branch":null,"condition":null}]},"4":{"BEGIN":[{"pod":null,"statement":56,"subroutine":1,"time":null,"branch":null,"condition":null}]},"-1":{"__COVER__":[{"pod":null,"statement":74,"subroutine":7,"time":null,"branch":null,"condition":null}]},"5":{"BEGIN":[{"pod":null,"statement":59,"subroutine":2,"time":null,"branch":null,"condition":null}]}}} unburden-home-dir-0.3.2.2/cover_db/digests0000644000000000000000000001425112123071316015235 0ustar {"11495fe9195f878767b0f0f90fd77ab0":"/usr/share/perl/5.14.2/B/Deparse.pm","eb62134d113bae297c80dc4800f6b5fc":"t/replacement-order-dryrun.t","3741fe9186eb501745a73aacf8dc4900":"/usr/share/perl5/Pod/Coverage/CountParents.pm","2d96e83d8cd3f31bbfcdf3f6eaa10e94":"/usr/share/perl5/Text/Diff.pm","4f16e868f9c14f14525091354b62922b":"/usr/lib/perl5/Devel/Cover/Condition_or_3.pm","9177fa4c4fd0438356c986aaa6db9136":"/usr/lib/perl/5.14.2/Data/Dumper.pm","6801455ffe35cf1eaef66bbd6c7169ab":"/usr/share/perl/5.14.2/Test/More.pm","22b387f2854415c91d4c7786baa66f33":"/usr/lib/perl5/Devel/Cover/Condition_and_2.pm","de86391fb43f4f262155557bfdd0dd7a":"/usr/share/perl/5.14.2/constant.pm","dd1db95fc86be3280eb3668c0dad66d8":"/usr/lib/perl5/JSON/XS.pm","bd17e52f82dfe8d824bfdf2c249eebdf":"/usr/lib/perl5/Devel/Cover.pm","4a982eade107ffa113cf899a80efb553":"/usr/share/perl5/Devel/Symdump.pm","17a56b7de0e9e191f38b1b32617df750":"/usr/lib/perl5/Devel/Cover/Condition_and_3.pm","766fa97c9e98adc967df3f9df5a6cdfe":"/usr/share/perl5/File/Which.pm","851bb052269c1fe29b4cfcde64eb781f":"t/undo-dryrun.t","44a47bd9769d5fad2ce4826dedc8c95f":"t/skip-non-home.t","f7c875184ac74b7c303174338f070e65":"/usr/lib/perl5/Devel/Cover/Subroutine.pm","e969b63e90e3adf0697548819caf3a71":"/usr/lib/perl5/Devel/Cover/Criterion.pm","b797910f140981ee60c3a02f3e7b0787":"/usr/lib/perl/5.14.2/auto/POSIX/autosplit.ix","c46e2ebb720ee7d9c600ce5acbf34291":"/usr/share/perl/5.14.2/Digest/base.pm","da724a9bfa5f7d1ecc856dae006c85be":"/usr/lib/perl/5.14.2/POSIX.pm","92b2dbec7f34c9ae405ad7315096d453":"/usr/share/perl5/Test/Differences.pm","1736fcc53036f2db21f5a999c6a26583":"/usr/share/perl/5.14.2/warnings.pm","53b54c214335e3d81a5f61b3a4ff1f02":"t/xsession-d.t","e4141265c1ae7cdef3adf35b655b30e6":"/usr/share/perl/5.14.2/File/Copy.pm","1c182578a9d9a35def5848f6768e0e7e":"/usr/lib/perl/5.14.2/B.pm","a09dd50088b6e5eb1124dc8307382673":"/usr/lib/perl5/Cwd.pm","13f12dadd47bb7557259afc245fb3e37":"t/undo.t","5c0c424e4525e0d58da07b337def32ac":"/usr/share/perl/5.14.2/XSLoader.pm","364da9785dc7e67d1115f40303a25075":"/usr/lib/perl5/File/Spec/Unix.pm","e7adcd89cdbd274a761b174dbd13f2f8":"/usr/lib/perl/5.14.2/Fcntl.pm","bc37dde18e03fed871c39e030cd68908":"/usr/lib/perl5/Devel/Cover/Dumper.pm","24301f241cbf274b43fecec98dcc46aa":"/usr/share/perl/5.14.2/overload.pm","e74b03dd8d81421a98c6401377371018":"t/create-empty-directories.t","bff99e0ba11fb03edd0476529416aefa":"/usr/lib/perl/5.14.2/DynaLoader.pm","adceef1030aabf8e05f42047438004c1":"/usr/share/perl/5.14.2/vars.pm","d35b561dac6aec8105cd2a4c195dde52":"/usr/share/perl/5.14.2/bytes.pm","c59010149f1675b8132698dd5126db20":"/usr/share/perl/5.14.2/Test/Builder.pm","2f2fe3c611148b5d298935fe9e1afc3c":"/usr/share/perl/5.14.2/Pod/InputObjects.pm","f22bc1fee9b0fb213477233a6cfa6846":"/usr/lib/perl5/Devel/Cover/DB/File.pm","b4f108c9926aa8eb3c7371123a989f1b":"/usr/lib/perl5/Devel/Cover/Condition.pm","b91032c877e4701cb5b3c336bd4e451a":"/usr/lib/perl5/Devel/Cover/DB/Structure.pm","9b65a36bcfb26da1d9d1846e16ca76d3":"/usr/lib/perl/5.14.2/attributes.pm","2f242fe18268eb30a89d712a57a82c37":"/usr/share/perl5/Algorithm/Diff.pm","dc2a279672beb7321599f3ea295130df":"/usr/lib/perl5/Devel/Cover/Branch.pm","ca2fbb5ce40c9968e39e8a93f518a14d":"/usr/share/perl/5.14.2/strict.pm","9958efadd0988aa38eb9cc2f6dd3d398":"t/moving-to-existing-subdir.t","4daaf4639c4d7c0a0311d95ec382e3de":"/usr/lib/perl/5.14.2/Errno.pm","79d9ed86aa75dcf0e70125e1ac387857":"t/version.t","329796d345e715579efe5a374ed6d6c8":"t/check-symlinks-in-path.t","9593ff56045aab4e7e846982715ca32c":"/usr/lib/perl5/Devel/Cover/DB.pm","e88176796c4ad5a4ddb3473281c46eed":"/usr/share/perl/5.14.2/Pod/Parser.pm","217ac40ea8f9e4becda8a13f8ef81933":"/usr/share/perl/5.14.2/Test/Builder/Module.pm","5ea128b037232517e338a3981e099957":"/usr/share/perl/5.14.2/Carp.pm","53bee11db9df5d09ff737f434199d840":"t/replacement-order.t","46c629ef6558d8808c23f8e5a50959ec":"/usr/share/perl5/common/sense.pm","810b139375e26bb443c5feed193f1049":"/usr/share/perl/5.14.2/File/Path.pm","9fde3243857aa2d105ebb0d2ee7d99b1":"/usr/share/perl/5.14.2/File/Find.pm","f87d7f94c6f8197d33a55e0b01c55e55":"/usr/lib/perl5/Devel/Cover/Time.pm","bbfa5cf40e82638ab323b3caa07e68f2":"/usr/share/perl/5.14.2/B/Debug.pm","725d943e5c6955385bd53b0456674e6f":"/usr/lib/perl5/Devel/Cover/Condition_xor_4.pm","35afc5c270a7e33819a05b0d0e45da1e":"/usr/share/perl/5.14.2/AutoLoader.pm","a19075810d148cd806eab7ff7acef21a":"/usr/share/perl5/Pod/Coverage.pm","18ad86aaaf06f108bee0d1bbfc33d730":"/usr/lib/perl5/Devel/Cover/DB/IO.pm","2f1a06b5e27fa7f8f28cf4750b87018e":"/usr/lib/perl5/Scalar/Util.pm","b1fc53bbe75d5d68dc07553cd94acb54":"/usr/share/perl/5.14.2/base.pm","c8bf4cd6da149a7577f4be5fe8ee51f3":"/usr/share/perl/5.14.2/Tie/Hash.pm","c30b6c3fe54516077a7ed223ded9c16d":"/usr/share/perl/5.14.2/File/Basename.pm","d1b004f9e116a27eac6a12a4223a58b7":"/usr/share/perl/5.14.2/Exporter.pm","b28c6d78c4e6ba99cac5751fd518d50e":"/usr/lib/perl/5.14.2/re.pm","44b437fa3a9858229bed1ff1dbb18a50":"/usr/share/perl/5.14.2/feature.pm","bfd71d2980c8b4fa5f0423ba0a35d8da":"/usr/lib/perl5/Devel/Cover/DB/IO/JSON.pm","66430dfb32b2253b80c5741a9ce02b7e":"/usr/lib/perl/5.14.2/File/Glob.pm","27b96841e9cecacb39ad23a7d5f45678":"/usr/lib/perl5/Devel/Cover/Statement.pm","87056748e9488a83bea7341a19859da2":"t/find-per-user-stuff.t","7e9e800f67e8dc11025eb0368044881b":"/usr/lib/perl5/Devel/Cover/DB/Digests.pm","d1f7e1d16fda6bfe86f20edb5806d277":"/usr/lib/perl/5.14.2/Config.pm","9a0c6243830e3dadf321a2b597d55be9":"t/check-symlinks-without-trailing-slash.t","33f6a227db992efd9e5758359253a0df":"/usr/share/perl5/JSON.pm","16a96d3160d0ce24d6c70a8a08503be8":"/usr/lib/perl5/Devel/Cover/Condition_or_2.pm","b098603acdde868556abe1f91051806f":"/usr/share/perl/5.14.2/Pod/Find.pm","5548036ef0be0a4c33698b2ece03c8a7":"/usr/share/perl5/File/Slurp.pm","1911f23e052355bfd13247baff7760ac":"/usr/lib/perl5/Devel/Cover/Pod.pm","c8233d79ea5e81d9839951c54e8e49e2":"/usr/share/perl/5.14.2/warnings/register.pm","5e9326a652f87d3d5a05bde10d45691d":"t/parse-comments-and-blank-lines.t","22a9c2dddaf09fcb617208937adc7faf":"t/find-per-user-stuff-xdg.t","015e67606915a59a2cabec1fb8c31e45":"/usr/share/perl/5.14.2/Exporter/Heavy.pm","e34c87285c0ccc506e282b6c05d76b95":"/usr/share/perl/5.14.2/integer.pm","3b6158d7a490f429a795d171d38b4c90":"/usr/share/perl/5.14.2/PerlIO.pm"} unburden-home-dir-0.3.2.2/cover_db/cover.130000644000000000000000000015140012123071316015131 0ustar {"runs":{"1363964617.5915.62857":{"count":{"bin/unburden-home-dir":{"statement":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,0,0,0,0,3,0,1,1,1,3,1,2,0,2,1,1,0,1,0,1,1,0,0,0,0,0,0,0,0,1,1,1,1,1,1,2,2,1,1,1,6,6,6,0,0,1,1,0,0,1,1,1,1,1,1,1,1,1,0,0,1,0,0,1,0,0,1,0,0,1,1,1,1,1,0,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,3,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,3,3,3,3,3,3,1],"subroutine":[1,1,1,1,1,1,1,1,1,1,1,0,0,6,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,1,0,0,1,1],"time":[480948,12,6,5,7,6,6,6,7,1236,9,7,80,251,29,null,null,null,null,46,null,54,198,104,16,11,10,null,9,11,6,null,5,null,6,6,null,null,null,null,null,null,null,null,8,32,9,42,1723,12,13,21,20,5,77,60421,70,646,null,null,597,794,null,null,9,21,56,72,35,8,13,10,39,null,null,9,null,null,33,null,null,11,null,null,9,9,10,257,12,null,9,null,null,null,null,55,null,4708,26294,48,1188,2429,138,5828,154,226,14,4,174,14,4,201,882,3970,369,1115,23566,161,998,53805,137,831,2844,161,15,4,90,1138,20548,169681,null,null,null,null,null,null,null,null,null,null,10,12,11,21,14,9,74,6556,null,null,64,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,14,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,6,9,7,13,12,8,46,29,66,15,55,14,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,10,13,null,null,13,33,36,143,8,5,12,11,202,12,null,116,8,5,19,26,18,172,43,22,48,14],"branch":[[0,0],[1,0],[3,3],[0,1],[0,1],[0,1],[0,1],[0,1],[0,1],[0,1],[0,1],[0,1],[0,0],[0,1],[0,0],[0,0],[1,0],[1,0],[1,0],[1,0],[1,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,1],[1,0],[1,0],[1,0]],"condition":[[0,0,1],[1,0,0],[0,0,1],[0,1,0],[0,0],[0,0,0],[0,0,0],[0,0,0],[0,0,0],[0,0,0],[0,0,0]]}},"finish":1363964616.38043,"digests":{"bin/unburden-home-dir":"9c4bf4fb201e11b18ccd100dfb812731"},"collected":["branch","condition","pod","statement","subroutine","time"],"vec":{"bin/unburden-home-dir":{"subroutine":{"vec":"ÿ'\u0002 f","size":39},"statement":{"vec":"ÿèw\rðÿ3ÿIò…ÿÿÿÿ\u0003ðO\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0002\u0000\u0000ü?\u0000\u0000`þ÷","size":335},"branch":{"vec":"´ªª\bU\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000`\u0005","size":132},"condition":{"vec":"\f\u0005\u0000\u0000","size":32}}},"perl":"5.14.2","run":"bin/unburden-home-dir","OS":"linux","start":1363964616.30471},"1363964565.5678.43262":{"count":{"bin/unburden-home-dir":{"statement":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,0,0,0,0,2,0,1,1,1,2,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,2,2,1,1,1,0,0,0,0,0,1,1,0,0,1,1,1,1,1,1,1,1,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,0,0,0,0,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,0,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,1,0,0,0,0,0,0,0,0,3,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,0,0,1,1,0,0,1,0,0,1,1,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"subroutine":[1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,3,1,0,0,1,1,1,1,0,0],"time":[401061,19,9,8,9,10,10,14,10,2004,14,13,108,344,46,null,null,null,null,63,null,89,323,187,24,19,8,null,9,20,null,null,null,null,null,null,null,null,null,null,null,null,null,null,12,50,15,76,2491,19,22,36,27,10,129,null,null,null,null,null,957,1254,null,null,13,37,73,119,50,11,22,15,57,null,null,17,null,null,54,null,null,19,null,null,14,null,null,null,null,null,null,209,25,null,15,39,null,6746,37674,63,1382,2300,131,5327,156,226,13,5,174,13,4,195,756,3862,198,930,24364,165,1210,55728,142,1028,4437,244,24,8,153,1671,27358,217350,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,97,36,13,13,15,13,8,23,13,null,null,28,null,null,12,10,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,13,47,15,11,897,null,null,null,19,null,null,null,null,null,null,null,null,65,13,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,30,15,11,27,36,13,8,18,65,11,null,15,10,94,18,9,17,28,50,22,null,null,15,18,null,null,13,null,null,16,344,null,16,null,57],"branch":[[0,0],[1,0],[0,0],[0,1],[0,1],[0,1],[0,1],[0,1],[0,1],[0,1],[0,1],[0,1],[0,0],[0,0],[0,0],[0,1],[0,1],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[1,0],[0,1],[0,0],[0,1],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[1,0],[0,0],[1,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,1],[1,0],[0,1],[0,1],[0,1],[1,0],[0,0],[0,0],[0,0],[0,0]],"condition":[[0,0,1],[1,0,0],[0,0,1],[0,1,0],[0,0],[0,0,0],[0,0,0],[0,0,0],[0,0,0],[0,0,0],[0,1,0]]}},"finish":1363964563.7256,"digests":{"bin/unburden-home-dir":"9c4bf4fb201e11b18ccd100dfb812731"},"collected":["branch","condition","pod","statement","subroutine","time"],"vec":{"bin/unburden-home-dir":{"subroutine":{"vec":"ÿ\u0007 d\u001e","size":39},"statement":{"vec":"ÿè7\u0000ð0ÿI\u0012Øÿÿÿÿ\u0003\u0000\u0000\u0000\u0000à?\u0019\u0000\u0000\u0000\u0000\u0000\u001f\u0001\u0006\u0000\u0000üï?“\u0015\u0000\u0000\u0000","size":335},"branch":{"vec":"„ªª€\u0002\u0000\u0000$\u0002\u0000\u0000\u0011\u0000\u0000¦\u0006\u0000","size":132},"condition":{"vec":"\f\u0005\u0000@","size":32}}},"perl":"5.14.2","run":"bin/unburden-home-dir","OS":"linux","start":1363964563.71372},"1363964585.5765.35675":{"count":{"bin/unburden-home-dir":{"statement":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,0,0,0,0,2,0,1,1,1,2,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,2,2,1,1,1,12,12,12,0,0,1,1,0,0,1,1,1,1,3,3,3,3,3,0,0,3,0,0,3,0,0,3,0,0,3,0,0,0,0,0,0,3,3,0,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,3,3,3,3,2,2,2,2,1,1,2,0,0,0,0,0,0,3,3,3,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,3,3,3,3,3,3,0,0,0,0,0,0,0,0,0,0,3,3,3,3,2,1,0,0,3,3,0,0,3,3,3,3,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,3,3,3,3,6,4,3,3,3,3,0,3,0,0,3,0,0,3,3,3,0,3,3,3,0,3,0,3,3,3,3,3,3,3,3,3,3,3,3,0,3,3,3,3,3,3,3,3,3,0,0,3,3,0,0,3,0,0,3,3,0,0,3,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"subroutine":[1,1,1,1,1,1,1,1,1,1,1,0,0,12,0,0,0,3,0,3,0,0,3,3,3,0,0,0,3,6,4,3,3,3,3,3,3,0,0],"time":[472861,13,6,6,6,6,6,7,5,1249,10,7,80,220,24,null,null,null,null,42,null,52,203,106,12,11,6,null,6,12,null,null,null,null,null,null,null,null,null,null,null,null,null,null,8,33,9,43,1624,13,13,23,20,5,77,119332,109,915,null,null,601,791,null,null,9,22,55,71,128,20,51,28,104,null,null,25,null,null,97,null,null,62,null,null,29,null,null,null,null,null,null,523,38,null,29,40,null,4598,26073,48,1192,2324,200,7122,150,226,13,4,172,13,4,290,763,3777,202,913,34222,338,1519,62771,157,1183,4771,263,21,6,180,1826,29141,169538,null,null,null,null,null,null,null,null,null,null,24,97,50,61,37,22,303,5856,5457,77,71,null,null,null,null,null,null,21,619,78,null,null,18,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,38,19,43,20,13,13,50,null,null,null,null,null,null,null,null,null,null,40,39,18,76,504857,255645,null,null,118,39,null,null,99,25,73,40,42,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,43,56,38,564,21,119,70,26,33,23,76,null,80,null,null,146,null,null,21,69,77,null,44,22,81,null,55,null,65,24,20,31,23,73,57,30,25,20,179,27,null,47,37,131,52,22,52,54,100,49,null,null,36,38,null,null,30,null,null,30,143,null,null,29,255],"branch":[[0,0],[1,0],[6,6],[0,1],[0,1],[0,1],[0,3],[0,3],[0,3],[0,3],[0,3],[0,3],[0,0],[0,0],[0,0],[0,3],[0,3],[2,0],[2,0],[2,1],[3,0],[0,0],[0,0],[0,0],[0,3],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[2,1],[1,0],[0,3],[0,3],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,3],[3,0],[0,3],[0,3],[0,3],[0,3],[0,3],[0,3],[3,0],[0,3],[3,0],[0,3],[0,3],[0,3],[0,3],[0,0],[0,0],[0,0],[0,0]],"condition":[[0,0,3],[2,1,0],[0,0,3],[0,3,0],[0,0],[1,2,0],[2,1,0],[1,2,0],[0,3,0],[0,0,3],[3,0,0]]}},"finish":1363964584.06094,"digests":{"bin/unburden-home-dir":"9c4bf4fb201e11b18ccd100dfb812731"},"collected":["branch","condition","pod","statement","subroutine","time"],"vec":{"bin/unburden-home-dir":{"subroutine":{"vec":"ÿ'Êñ\u001f","size":39},"statement":{"vec":"ÿè7\u0000ðÿ3ÿI\u0012Øÿÿÿÿ\u0003ðà\u0004\u0000\u0000à\u000fÀÏ|\u0000\u0000ðÉ]ÿï?“\u0019\u0000\u0000\u0000","size":335},"branch":{"vec":"„ªª€‚\u0001\u0002\u0000\u0000¦\u0000€©j¦\n\u0000","size":132},"condition":{"vec":"\u0014E\u00141","size":32}}},"perl":"5.14.2","run":"bin/unburden-home-dir","OS":"linux","start":1363964583.15617},"1363964565.5674.31021":{"count":{"t/check-symlinks-without-trailing-slash.t":{"statement":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],"subroutine":[1,1,1,1,1,1],"time":[9,10,8,6,14,323,901,1277,1810,1771,1603,2516,2410,2676031,1303,72,null,1590,581,1597,61,343,1457,5414,1412,4994,46366,62,2250,30834,263,17,5,182,947,40478,207,736,3013,182,1132,18205,497832],"branch":[[0,1]]}},"finish":1363964565.11866,"digests":{"t/check-symlinks-without-trailing-slash.t":"9a0c6243830e3dadf321a2b597d55be9"},"collected":["branch","condition","pod","statement","subroutine","time"],"perl":"5.14.2","vec":{"t/check-symlinks-without-trailing-slash.t":{"subroutine":{"vec":"?","size":6},"statement":{"vec":"ÿÿþÿÿ\u0007","size":43},"branch":{"vec":"\u0002","size":2}}},"run":"t/check-symlinks-without-trailing-slash.t","OS":"linux","start":1363964562.41521},"1363964560.5649.33523":{"count":{"bin/unburden-home-dir":{"statement":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,0,0,0,0,2,0,1,1,1,2,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,2,2,1,1,1,6,6,6,0,0,1,1,0,0,1,1,1,1,3,3,3,3,3,0,0,3,0,0,3,0,0,3,0,0,3,0,0,0,0,0,0,3,3,0,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,0,0,1,0,0,0,0,0,0,1,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,1,1,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,4,1,1,1,1,1,0,1,0,0,1,0,0,1,1,1,0,1,1,1,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,0,1,3,3,3,3,3,5,5,1,0,0,3,3,0,0,3,2,2,1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"subroutine":[1,1,1,1,1,1,1,1,1,1,1,0,0,6,0,0,0,1,0,1,0,0,1,1,1,0,0,0,1,4,1,1,1,1,1,3,3,0,0],"time":[400175,13,6,6,6,6,6,7,7,1248,10,7,82,220,25,null,null,null,null,41,null,55,205,107,13,11,6,null,6,11,null,null,null,null,null,null,null,null,null,null,null,null,null,null,8,33,9,43,1718,12,14,21,19,6,76,64809,59,574,null,null,597,802,null,null,8,21,55,69,226,35,85,45,149,null,null,54,null,null,166,null,null,61,null,null,40,null,null,null,null,null,null,1086,54,null,47,81,null,4225,26088,50,1277,3603,312,8432,231,345,24,8,314,23,7,384,1237,6277,340,1361,28033,161,1139,71252,155,1228,4775,267,27,6,168,1772,20692,256398,null,null,null,null,null,null,null,null,null,null,8,39,16,19,24,21,122,4587,null,null,63,null,null,null,null,null,null,5,182,23,null,null,6,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,10,6,13,10,6,4,17,null,null,null,null,null,null,null,null,null,null,10,7,5,20,250104,null,null,null,38,17,null,null,30,8,8,8,32,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,25,36,26,339,19,95,15,10,11,11,33,null,11,null,null,52,null,null,7,68,21,null,14,7,31,null,30,null,37,17,6,9,7,14,16,9,6,5,32,7,null,9,28,168,79,31,69,127,252,14,null,null,52,54,null,null,51,386,157,8,44,null,null,15,165],"branch":[[0,0],[1,0],[3,3],[0,1],[0,1],[0,1],[0,3],[0,3],[0,3],[0,3],[0,3],[0,3],[0,0],[0,0],[0,0],[0,3],[0,3],[1,0],[1,0],[1,0],[1,0],[0,0],[0,0],[0,0],[0,1],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[1,0],[0,0],[0,1],[0,1],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,1],[1,0],[0,1],[0,1],[0,1],[0,1],[0,1],[0,1],[1,0],[2,3],[3,0],[0,3],[2,1],[0,1],[0,1],[0,0],[0,0],[0,0],[0,0]],"condition":[[0,0,3],[3,0,0],[0,0,3],[0,3,0],[0,0],[0,1,0],[1,0,0],[0,1,0],[0,1,0],[0,0,1],[1,0,0]]}},"finish":1363964558.96504,"digests":{"bin/unburden-home-dir":"9c4bf4fb201e11b18ccd100dfb812731"},"collected":["branch","condition","pod","statement","subroutine","time"],"vec":{"bin/unburden-home-dir":{"subroutine":{"vec":"ÿ'Êñ\u001f","size":39},"statement":{"vec":"ÿè7\u0000ðÿ3ÿI\u0012Øÿÿÿÿ\u0003ðOà\u0004\u0000\u0000à\u000fÀÇ|\u0000\u0000ðÉ]ÿï?ó\u0019\u0000\u0000\u0000","size":335},"branch":{"vec":"´ªª€V\u0001\u0002\u0000\u0000¡\u0000€©j¦\n\u0000","size":132},"condition":{"vec":"\f…\"1","size":32}}},"perl":"5.14.2","run":"bin/unburden-home-dir","OS":"linux","start":1363964558.63312},"1363964613.5884.48779":{"count":{"t/undo-dryrun.t":{"statement":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],"subroutine":[1,1,1,1,1],"time":[8,23,8,6,14,1389,1289,1743,1155,1861,1681,2868484,2056,89,383,2313,3182,2415,1487,11117,1520,13796,46042,62,2182,38668,393,27,7,317,1519,56665,318,1560,27475,587000]}},"finish":1363964612.84915,"digests":{"t/undo-dryrun.t":"851bb052269c1fe29b4cfcde64eb781f"},"collected":["branch","condition","pod","statement","subroutine","time"],"perl":"5.14.2","vec":{"t/undo-dryrun.t":{"subroutine":{"vec":"\u001f","size":5},"statement":{"vec":"ÿÿÿÿ\u000f","size":36}}},"run":"t/undo-dryrun.t","OS":"linux","start":1363964609.94505},"1363964620.5923.63584":{"count":{"t/version.t":{"statement":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],"subroutine":[1,1,1,1,1],"time":[180,10512,26,8522,647,111,4802,46207,70,2747,39903,201,15,5,197,68,9,88,11,5,517334]}},"finish":1363964619.49091,"digests":{"t/version.t":"79d9ed86aa75dcf0e70125e1ac387857"},"collected":["branch","condition","pod","statement","subroutine","time"],"perl":"5.14.2","vec":{"t/version.t":{"subroutine":{"vec":"\u001f","size":5},"statement":{"vec":"ÿÿ\u001f","size":21}}},"run":"t/version.t","OS":"linux","start":1363964619.46806},"1363964580.5722.18141":{"count":{"t/find-per-user-stuff.t":{"statement":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],"subroutine":[1,1,1,1,1,1],"time":[9,8,8,10,6,16,347,1398,1211,1859,1438,1275,1509,1159,1253,1771,1651,2883094,2073,75,null,1506,367,3504,75,315,2997,1554,3216,10696,1614,5077,45703,62,2852,33244,409,25,8,323,1598,50791,216,1168,2925,248,1126,18270,605010],"branch":[[0,1]]}},"finish":1363964579.60331,"digests":{"t/find-per-user-stuff.t":"87056748e9488a83bea7341a19859da2"},"collected":["branch","condition","pod","statement","subroutine","time"],"perl":"5.14.2","vec":{"t/find-per-user-stuff.t":{"subroutine":{"vec":"?","size":6},"statement":{"vec":"ÿÿïÿÿÿ\u0001","size":49},"branch":{"vec":"\u0002","size":2}}},"run":"t/find-per-user-stuff.t","OS":"linux","start":1363964576.67629},"1363964608.5859.12738":{"count":{"t/skip-non-home.t":{"statement":[1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,0,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],"subroutine":[1,1,1,1,1,1],"time":[12,13,11,8,18,398,13,77266,2621,2729,5903,2877,5443,4403,5237301,2599,138,null,3199,634,3707,1459,2770,2582,2655,2199,9551,1232,4995,46798,62,2295,30681,349,26,8,272,1576,62929,334,1134,4657,255,1768,19511,524750],"branch":[[0,2]]}},"finish":1363964607.96899,"digests":{"t/skip-non-home.t":"44a47bd9769d5fad2ce4826dedc8c95f"},"collected":["branch","condition","pod","statement","subroutine","time"],"perl":"5.14.2","vec":{"t/skip-non-home.t":{"subroutine":{"vec":"?","size":6},"statement":{"vec":"ÿÿýÿÿ?","size":46},"branch":{"vec":"\u0000","size":2}}},"run":"t/skip-non-home.t","OS":"linux","start":1363964602.59624},"1363964586.5745.53573":{"count":{"t/moving-to-existing-subdir.t":{"statement":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],"subroutine":[1,1,1,1,1,1],"time":[13,15,15,11,20,16,531,2381,3257,1697,2547,3336,2265,3682,3116,3061,3742054,1439,69,null,1624,555,100,1671,71,326,65,1617,1316,1183,1173,1284,6724,1036,7392,80475,175,4331,48957,436,18,5,186,969,48528,340,1135,4741,263,1669,19976,661509],"branch":[[0,1]]}},"finish":1363964585.54472,"digests":{"t/moving-to-existing-subdir.t":"9958efadd0988aa38eb9cc2f6dd3d398"},"collected":["branch","condition","pod","statement","subroutine","time"],"perl":"5.14.2","vec":{"t/moving-to-existing-subdir.t":{"subroutine":{"vec":"?","size":6},"statement":{"vec":"ÿÿ÷ÿÿÿ\u000f","size":52},"branch":{"vec":"\u0002","size":2}}},"run":"t/moving-to-existing-subdir.t","OS":"linux","start":1363964581.75538},"1363964569.5688.08606":{"count":{"bin/unburden-home-dir":{"statement":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,0,0,0,0,2,0,1,1,1,2,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,2,2,1,1,1,0,0,0,0,0,1,1,0,0,1,1,1,1,1,1,1,1,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,0,0,0,0,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,0,0,1,1,0,0,1,0,0,1,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"subroutine":[1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,1,0,0,0,1,1,1,1,0,0],"time":[439270,13,6,5,6,7,6,7,6,1247,11,7,79,219,24,null,null,null,null,43,null,54,206,107,13,12,5,null,6,12,null,null,null,null,null,null,null,null,null,null,null,null,null,null,8,32,10,43,1631,17,13,24,20,6,121,null,null,null,null,null,613,807,null,null,8,22,57,88,32,6,12,10,40,null,null,8,null,null,24,null,null,11,null,null,10,null,null,null,null,null,null,192,22,null,14,37,null,4743,26718,48,1363,2306,132,5172,154,228,13,4,174,14,4,197,746,3834,200,922,23649,156,994,54788,95,748,2931,162,14,4,92,1144,17695,171658,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,10,7,11,10,134,6,6,106,24,11,233,9,46,11,29,361,13,null,null,null,null,6,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,17,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,7,8,9,14,15,26,6,5,36,7,null,15,10,80,14,6,12,17,31,14,null,null,15,18,null,null,12,null,null,8,46,9,null,null,32],"branch":[[0,0],[1,0],[0,0],[0,1],[0,1],[0,1],[0,1],[0,1],[0,1],[0,1],[0,1],[0,1],[0,0],[0,0],[0,0],[0,1],[0,1],[0,0],[0,0],[0,0],[0,0],[0,1],[1,0],[1,0],[1,0],[1,0],[0,0],[1,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,1],[1,0],[0,1],[0,1],[1,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"condition":[[0,0,1],[1,0,0],[0,1,0],[1,0,0],[0,0],[0,0,0],[0,0,0],[0,0,0],[0,0,0],[0,0,0],[0,0,1]]}},"finish":1363964568.22767,"digests":{"bin/unburden-home-dir":"9c4bf4fb201e11b18ccd100dfb812731"},"collected":["branch","condition","pod","statement","subroutine","time"],"vec":{"bin/unburden-home-dir":{"subroutine":{"vec":"ÿ\u0007\u001c \u001e","size":39},"statement":{"vec":"ÿè7\u0000ð0ÿI\u0012Øÿÿÿÿ\u0003\u0000€ÿÿ\u0010\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0002\u0000\u0000üï?“\u0013\u0000\u0000\u0000","size":335},"branch":{"vec":"„ªª€\u0002XE\u0000\u0000\u0000\u0000\u0000\u0000\u0000¦\u0001\u0000","size":132},"condition":{"vec":"Œ\u0002\u0000€","size":32}}},"perl":"5.14.2","run":"bin/unburden-home-dir","OS":"linux","start":1363964568.2199},"1363964590.5800.42770":{"count":{"bin/unburden-home-dir":{"statement":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,0,0,0,0,2,0,1,1,1,2,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,2,2,1,1,1,6,6,6,0,0,1,1,0,0,1,1,1,1,7,4,4,4,3,0,0,3,0,0,3,0,0,3,0,0,3,0,0,0,0,0,0,3,3,0,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,0,0,1,0,0,0,0,0,0,1,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,1,1,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,4,1,1,1,1,1,0,1,0,0,1,0,0,1,1,1,0,1,1,1,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,0,1,3,3,3,3,3,5,5,1,0,0,3,3,0,0,3,2,2,1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"subroutine":[1,1,1,1,1,1,1,1,1,1,1,0,0,6,0,0,0,1,0,1,0,0,1,1,1,0,0,0,1,4,1,1,1,1,1,3,3,0,0],"time":[360275,13,6,6,16,6,6,6,6,1328,11,7,82,218,25,null,null,null,null,42,null,54,207,106,13,12,5,null,6,12,null,null,null,null,null,null,null,null,null,null,null,null,null,null,7,32,10,42,1531,12,13,23,20,6,74,62098,75,754,null,null,661,794,null,null,8,22,55,82,239,30,71,49,105,null,null,34,null,null,126,null,null,42,null,null,27,null,null,null,null,null,null,660,37,null,27,78,null,7476,38912,47,1182,2456,136,5685,153,242,14,5,236,15,4,204,761,4019,232,951,24206,160,981,57486,94,754,2776,162,14,4,89,1143,28668,160597,null,null,null,null,null,null,null,null,null,null,8,42,26,21,15,10,116,5139,null,null,46,null,null,null,null,null,null,6,185,22,null,null,14,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,13,7,14,6,4,6,16,null,null,null,null,null,null,null,null,null,null,10,8,5,19,250455,null,null,null,36,16,null,null,32,10,12,9,24,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,18,27,18,203,11,69,16,11,11,7,38,null,11,null,null,52,null,null,8,54,20,null,12,7,38,null,27,null,23,12,6,8,6,14,15,8,6,5,39,7,null,9,22,117,53,21,58,89,176,14,null,null,36,38,null,null,35,311,121,10,37,null,null,8,108],"branch":[[0,0],[1,0],[3,3],[0,1],[0,1],[0,1],[3,4],[1,3],[0,3],[0,3],[0,3],[0,3],[0,0],[0,0],[0,0],[0,3],[0,3],[1,0],[1,0],[1,0],[1,0],[0,0],[0,0],[0,0],[0,1],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[1,0],[0,0],[0,1],[0,1],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,1],[1,0],[0,1],[0,1],[0,1],[0,1],[0,1],[0,1],[1,0],[2,3],[3,0],[0,3],[2,1],[0,1],[0,1],[0,0],[0,0],[0,0],[0,0]],"condition":[[0,0,3],[3,0,0],[0,0,3],[0,3,0],[0,0],[0,1,0],[1,0,0],[0,1,0],[0,1,0],[0,0,1],[1,0,0]]}},"finish":1363964589.06433,"digests":{"bin/unburden-home-dir":"9c4bf4fb201e11b18ccd100dfb812731"},"collected":["branch","condition","pod","statement","subroutine","time"],"vec":{"bin/unburden-home-dir":{"subroutine":{"vec":"ÿ'Êñ\u001f","size":39},"statement":{"vec":"ÿè7\u0000ðÿ3ÿI\u0012Øÿÿÿÿ\u0003ðOà\u0004\u0000\u0000à\u000fÀÇ|\u0000\u0000ðÉ]ÿï?ó\u0019\u0000\u0000\u0000","size":335},"branch":{"vec":"´Úª€V\u0001\u0002\u0000\u0000¡\u0000€©j¦\n\u0000","size":132},"condition":{"vec":"\f…\"1","size":32}}},"perl":"5.14.2","run":"bin/unburden-home-dir","OS":"linux","start":1363964588.73541},"1363964575.5697.06533":{"count":{"t/find-per-user-stuff-xdg.t":{"statement":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],"subroutine":[1,1,1,1,1,1],"time":[10,8,8,10,6,15,322,1880,1224,1542,1595,1191,1518,1253,1258,1780,1765,2976901,1300,72,null,1863,284,1606,66,326,1627,1212,1324,8267,1123,4870,59062,63,2172,31506,256,16,5,179,975,53689,208,729,2991,166,1140,18452,568917],"branch":[[0,1]]}},"finish":1363964574.61407,"digests":{"t/find-per-user-stuff-xdg.t":"22a9c2dddaf09fcb617208937adc7faf"},"collected":["branch","condition","pod","statement","subroutine","time"],"perl":"5.14.2","vec":{"t/find-per-user-stuff-xdg.t":{"subroutine":{"vec":"?","size":6},"statement":{"vec":"ÿÿïÿÿÿ\u0001","size":49},"branch":{"vec":"\u0002","size":2}}},"run":"t/find-per-user-stuff-xdg.t","OS":"linux","start":1363964571.60176},"1363964607.5880.13773":{"count":{"bin/unburden-home-dir":{"statement":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,0,0,0,0,2,0,1,1,1,2,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,2,2,1,1,1,0,0,0,0,0,1,1,0,0,1,1,1,1,1,1,1,1,1,0,0,1,0,0,1,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"subroutine":[1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0],"time":[351055,20,11,8,20,10,8,12,8,1922,20,11,110,937,43,null,null,null,null,107,null,97,317,191,23,21,8,null,8,20,null,null,null,null,null,null,null,null,null,null,null,null,null,null,13,54,17,75,2500,20,23,35,27,8,126,null,null,null,null,null,953,1326,null,null,13,33,75,115,43,12,21,16,61,null,null,13,null,null,53,null,null,30,187,37,null,null,null,null,null,null,null,null,null,null,null,43,null,4738,27094,47,1156,2452,131,5072,150,234,12,5,283,16,4,220,792,3748,221,885,23401,162,981,91159,152,1037,4355,243,22,8,153,1710,68486,178835,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,29],"branch":[[0,0],[1,0],[0,0],[0,1],[0,1],[0,1],[0,1],[0,1],[0,1],[0,1],[0,1],[1,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"condition":[[0,0,1],[1,0,0],[0,0,1],[0,1,0],[0,0],[0,0,0],[0,0,0],[0,0,0],[0,0,0],[0,0,0],[0,0,0]]}},"finish":1363964606.65355,"digests":{"bin/unburden-home-dir":"9c4bf4fb201e11b18ccd100dfb812731"},"collected":["branch","condition","pod","statement","subroutine","time"],"vec":{"bin/unburden-home-dir":{"subroutine":{"vec":"ÿ\u0007\u0000 \u0000","size":39},"statement":{"vec":"ÿè7\u0000ð0ÿI\u000e€ÿÿÿÿ\u0003\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0002\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000","size":335},"branch":{"vec":"„ªj\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000","size":132},"condition":{"vec":"\f\u0005\u0000\u0000","size":32}}},"perl":"5.14.2","run":"bin/unburden-home-dir","OS":"linux","start":1363964606.64334},"1363964570.5683.64393":{"count":{"t/create-empty-directories.t":{"statement":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],"subroutine":[1,1,1,1,1,1],"time":[8,10,8,6,15,328,871,1210,1629,1338,1484,2535,2314,2516500,1993,72,null,2642,874,2399,62,380,2139,3066,1528,8600,1036,4918,47719,61,2175,33159,399,27,6,290,980,45095,210,972,2776,159,1600,27215,551802],"branch":[[0,1]]}},"finish":1363964569.5018,"digests":{"t/create-empty-directories.t":"e74b03dd8d81421a98c6401377371018"},"collected":["branch","condition","pod","statement","subroutine","time"],"perl":"5.14.2","vec":{"t/create-empty-directories.t":{"subroutine":{"vec":"?","size":6},"statement":{"vec":"ÿÿþÿÿ\u001f","size":45},"branch":{"vec":"\u0002","size":2}}},"run":"t/create-empty-directories.t","OS":"linux","start":1363964566.94783},"1363964612.5888.30333":{"count":{"bin/unburden-home-dir":{"statement":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,4,0,0,0,0,4,0,1,1,1,4,1,3,0,3,1,2,0,2,1,1,1,0,0,0,0,0,0,0,0,1,1,1,1,1,1,2,2,1,1,1,0,0,0,0,0,1,1,0,0,1,1,1,1,1,1,1,1,1,0,0,1,0,0,1,0,0,1,0,0,1,1,1,1,1,0,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,3,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,3,3,3,3,3,3,1],"subroutine":[1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,1,0,0,1,1],"time":[455816,13,6,5,6,7,6,6,6,1298,17,10,106,418,54,null,null,null,null,74,null,84,320,261,37,22,23,null,23,20,15,null,16,11,11,11,null,null,null,null,null,null,null,null,14,51,15,84,2325,19,21,33,27,9,115,null,null,null,null,null,6467,1296,null,null,12,34,76,107,55,10,23,16,59,null,null,15,null,null,48,null,null,18,null,null,16,13,17,361,21,null,25,null,null,null,null,40,null,4722,26580,48,1146,2402,132,5129,152,226,13,4,168,13,5,202,873,3720,230,896,26115,166,1194,63619,160,1177,4669,267,25,8,173,1507,17740,155105,null,null,null,null,null,null,null,null,null,null,14,16,12,null,null,null,null,null,null,null,12,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,28,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,11,115,16,26,24,73,14,32,93,25,105,23,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,16,21,null,null,20,44,56,125,14,11,18,17,17,15,null,46,13,8,37,40,30,280,69,33,81,26],"branch":[[0,0],[1,0],[0,0],[0,1],[0,1],[0,1],[0,1],[0,1],[0,1],[0,1],[0,1],[0,1],[0,0],[0,1],[0,0],[0,0],[1,0],[0,0],[0,0],[0,0],[0,1],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,1],[0,1],[1,0],[1,0]],"condition":[[0,0,1],[1,0,0],[0,0,1],[0,1,0],[0,0],[0,0,0],[0,0,0],[0,0,0],[0,0,0],[0,0,0],[0,0,0]]}},"finish":1363964611.32532,"digests":{"bin/unburden-home-dir":"9c4bf4fb201e11b18ccd100dfb812731"},"collected":["branch","condition","pod","statement","subroutine","time"],"vec":{"bin/unburden-home-dir":{"subroutine":{"vec":"ÿ\u0007\u0002 f","size":39},"statement":{"vec":"ÿèw\u000fð0ÿIò…ÿÿÿÿ\u0003p@\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0002\u0000\u0000ü?\u0000\u0000`þ÷","size":335},"branch":{"vec":"„ªª\b\u0001\u0002\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000 \u0005","size":132},"condition":{"vec":"\f\u0005\u0000\u0000","size":32}}},"perl":"5.14.2","run":"bin/unburden-home-dir","OS":"linux","start":1363964611.30905},"1363964561.5645.32286":{"count":{"t/check-symlinks-in-path.t":{"statement":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],"subroutine":[1,1,1,1,1,1],"time":[14,14,11,8,25,489,2532,1642,1803,1629,1161,1400,1342,1178,1754,1751,3301314,1278,80,null,1729,293,1595,60,320,1629,1218,1341,6187,1079,4716,45734,63,2279,33709,241,15,5,171,946,52382,208,725,2927,162,1107,18731,510248],"branch":[[0,1]]}},"finish":1363964560.59221,"digests":{"t/check-symlinks-in-path.t":"329796d345e715579efe5a374ed6d6c8"},"collected":["branch","condition","pod","statement","subroutine","time"],"perl":"5.14.2","vec":{"t/check-symlinks-in-path.t":{"subroutine":{"vec":"?","size":6},"statement":{"vec":"ÿÿ÷ÿÿÿ","size":48},"branch":{"vec":"\u0002","size":2}}},"run":"t/check-symlinks-in-path.t","OS":"linux","start":1363964557.25619},"1363964595.5828.06448":{"count":{"bin/unburden-home-dir":{"statement":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,0,0,0,0,3,0,1,1,1,3,1,2,0,2,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,2,2,1,1,1,0,0,0,0,0,1,1,0,0,1,1,1,1,1,1,1,1,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,0,0,0,0,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,1,1,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,1,2,1,1,1,1,1,0,1,0,0,1,0,0,1,1,1,0,1,1,1,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,2,2,1,0,0,1,1,0,0,1,0,0,1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"subroutine":[1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,1,0,1,0,0,1,1,1,0,0,0,1,2,1,1,1,1,1,1,1,0,0],"time":[360510,21,10,8,9,10,8,12,9,1881,10,7,87,255,27,null,null,null,null,49,null,54,202,108,15,12,9,null,9,12,6,null,6,7,null,null,null,null,null,null,null,null,null,null,8,34,9,42,2177,13,13,25,20,6,77,null,null,null,null,null,601,835,null,null,8,22,57,85,35,7,14,10,40,null,null,8,null,null,42,null,null,11,null,null,10,null,null,null,null,null,null,637,20,null,12,34,null,4649,33426,48,1150,2632,157,5248,150,235,13,4,351,22,9,220,753,3997,225,1248,38187,167,986,54031,112,771,2853,246,16,5,102,1131,20477,170427,null,null,null,null,null,null,null,null,null,null,9,11,8,null,null,null,null,null,null,null,9,null,null,null,null,null,null,7,184,75,35,20,6,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,11,6,14,10,5,4,16,null,null,null,null,null,null,null,null,null,null,12,7,6,17,263476,null,null,null,43,19,null,null,42,12,14,11,7,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,12,10,8,null,6,27,16,10,7,9,36,null,11,null,null,54,null,null,7,10,20,null,15,7,36,null,26,null,7,6,6,9,14,14,15,9,7,16,52,17,109,14,7,67,15,6,11,42,42,15,null,null,13,15,null,null,10,null,null,10,40,null,null,8,47],"branch":[[0,0],[1,0],[0,0],[0,1],[0,1],[0,1],[0,1],[0,1],[0,1],[0,1],[0,1],[0,1],[0,0],[0,0],[0,0],[0,1],[0,1],[0,0],[0,0],[0,0],[0,1],[0,0],[0,0],[0,1],[1,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[1,0],[0,0],[0,1],[0,1],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,1],[0,1],[0,1],[0,1],[0,1],[0,1],[0,1],[1,0],[0,2],[1,0],[0,1],[0,1],[0,1],[0,1],[0,0],[0,0],[0,0],[0,0]],"condition":[[0,0,1],[1,0,0],[0,0,1],[0,1,0],[0,0],[0,1,0],[1,0,0],[0,1,0],[0,1,0],[0,0,1],[1,0,0]]}},"finish":1363964594.26952,"digests":{"bin/unburden-home-dir":"9c4bf4fb201e11b18ccd100dfb812731"},"collected":["branch","condition","pod","statement","subroutine","time"],"vec":{"bin/unburden-home-dir":{"subroutine":{"vec":"ÿ\u0007Êñ\u001f","size":39},"statement":{"vec":"ÿèw\u0003ð0ÿI\u0012Øÿÿÿÿ\u0003p@à\u0007\u0000\u0000à\u000fÀÇ|\u0000\u0000pÉ]ÿÿ?“\u0019\u0000\u0000\u0000","size":335},"branch":{"vec":"„ªª€\u0002‚\u0001\u0000\u0000¡\u0000\u0000ªj¤\n\u0000","size":132},"condition":{"vec":"\f…\"1","size":32}}},"perl":"5.14.2","run":"bin/unburden-home-dir","OS":"linux","start":1363964593.99638},"1363964605.5874.20833":{"count":{"bin/unburden-home-dir":{"statement":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,0,0,0,0,2,0,1,1,1,2,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,2,2,1,1,1,0,0,0,0,0,1,1,0,0,1,1,1,1,1,1,1,1,1,0,0,1,0,0,1,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"subroutine":[1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0],"time":[371459,13,7,5,6,79,8,7,6,1559,11,6,81,221,27,null,null,null,null,40,null,53,206,108,12,12,6,null,6,11,null,null,null,null,null,null,null,null,null,null,null,null,null,null,8,31,9,44,1658,15,14,22,19,6,80,null,null,null,null,null,600,803,null,null,8,22,57,67,26,7,13,11,38,null,null,9,null,null,32,null,null,18,122,19,null,null,null,null,null,null,null,null,null,null,null,27,null,5149,29237,49,1329,2286,131,5133,151,227,15,4,175,14,4,197,754,3804,224,902,24294,158,1149,53306,94,759,2846,164,14,5,89,1138,17480,155908,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,16],"branch":[[0,0],[1,0],[0,0],[0,1],[0,1],[0,1],[0,1],[0,1],[0,1],[0,1],[0,1],[1,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"condition":[[0,0,1],[1,0,0],[0,0,1],[0,1,0],[0,0],[0,0,0],[0,0,0],[0,0,0],[0,0,0],[0,0,0],[0,0,0]]}},"finish":1363964603.93808,"digests":{"bin/unburden-home-dir":"9c4bf4fb201e11b18ccd100dfb812731"},"collected":["branch","condition","pod","statement","subroutine","time"],"vec":{"bin/unburden-home-dir":{"subroutine":{"vec":"ÿ\u0007\u0000 \u0000","size":39},"statement":{"vec":"ÿè7\u0000ð0ÿI\u000e€ÿÿÿÿ\u0003\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0002\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000","size":335},"branch":{"vec":"„ªj\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000","size":132},"condition":{"vec":"\f\u0005\u0000\u0000","size":32}}},"perl":"5.14.2","run":"bin/unburden-home-dir","OS":"linux","start":1363964603.93157},"1363964601.5841.49967":{"count":{"t/replacement-order.t":{"statement":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],"subroutine":[1,1,1,1,1],"time":[11,22,10,6,15,1749,1495,2298,2977550,1505,1566,1299,8549,1016,5031,45758,61,2317,31218,249,16,5,179,962,55539,207,1093,17797,495986]}},"finish":1363964600.52586,"digests":{"t/replacement-order.t":"53bee11db9df5d09ff737f434199d840"},"collected":["branch","condition","pod","statement","subroutine","time"],"perl":"5.14.2","vec":{"t/replacement-order.t":{"subroutine":{"vec":"\u001f","size":5},"statement":{"vec":"ÿÿÿ\u001f","size":29}}},"run":"t/replacement-order.t","OS":"linux","start":1363964597.52787},"1363964600.5844.05619":{"count":{"bin/unburden-home-dir":{"statement":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,0,0,0,0,2,0,1,1,1,2,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,2,2,1,1,1,6,6,6,0,0,1,1,0,0,1,1,1,1,1,1,1,1,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,0,0,0,0,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,0,0,1,0,0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,1,1,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,2,1,1,1,1,1,0,1,0,0,1,0,0,1,1,1,0,1,1,1,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,2,2,1,0,0,1,1,0,0,1,0,0,1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"subroutine":[1,1,1,1,1,1,1,1,1,1,1,0,0,6,0,0,0,1,0,1,0,0,1,1,1,0,0,0,1,2,1,1,1,1,1,1,1,0,0],"time":[358597,13,6,5,5,7,5,7,5,1366,11,7,82,222,24,null,null,null,null,43,null,54,205,105,13,12,5,null,7,11,null,null,null,null,null,null,null,null,null,null,null,null,null,null,8,32,9,44,1561,13,15,23,20,5,76,60364,61,506,null,null,1002,1243,null,null,14,35,72,96,55,10,20,16,59,null,null,13,null,null,59,null,null,19,null,null,15,null,null,null,null,null,null,539,26,null,17,60,null,7395,31318,48,1147,2473,137,5064,151,225,15,4,177,13,5,202,850,4387,228,888,23769,158,991,57546,96,761,2812,164,15,4,87,1210,18047,156931,null,null,null,null,null,null,null,null,null,null,8,11,10,22,19,12,123,4216,null,null,38,null,null,null,null,null,null,7,174,64,32,332,10,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,9,6,14,9,5,5,15,null,null,null,null,null,null,null,null,null,null,11,7,5,19,254164,null,null,null,38,16,null,null,33,12,8,9,12,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,17,22,15,212,14,39,14,10,10,8,34,null,11,null,null,52,null,null,8,13,19,null,15,8,37,null,28,null,36,10,10,11,11,17,16,10,6,16,63,17,59,14,11,89,21,11,20,45,74,43,null,null,14,23,null,null,16,null,null,14,46,null,null,76,81],"branch":[[0,0],[1,0],[3,3],[0,1],[0,1],[0,1],[0,1],[0,1],[0,1],[0,1],[0,1],[0,1],[0,0],[0,0],[0,0],[0,1],[0,1],[1,0],[1,0],[1,0],[1,0],[0,0],[0,0],[1,0],[1,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[1,0],[0,0],[0,1],[0,1],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,1],[1,0],[0,1],[0,1],[0,1],[0,1],[0,1],[0,1],[1,0],[0,2],[1,0],[0,1],[0,1],[0,1],[0,1],[0,0],[0,0],[0,0],[0,0]],"condition":[[0,0,1],[1,0,0],[0,0,1],[0,1,0],[0,0],[0,1,0],[1,0,0],[0,1,0],[0,1,0],[0,0,1],[1,0,0]]}},"finish":1363964599.08862,"digests":{"bin/unburden-home-dir":"9c4bf4fb201e11b18ccd100dfb812731"},"collected":["branch","condition","pod","statement","subroutine","time"],"vec":{"bin/unburden-home-dir":{"subroutine":{"vec":"ÿ'Êñ\u001f","size":39},"statement":{"vec":"ÿè7\u0000ðÿ3ÿI\u0012Øÿÿÿÿ\u0003ðOà\u0007\u0000\u0000à\u000fÀÇ|\u0000\u0000ðÉ]ÿÿ?“\u0019\u0000\u0000\u0000","size":335},"branch":{"vec":"´ªª€VA\u0001\u0000\u0000¡\u0000€©j¤\n\u0000","size":132},"condition":{"vec":"\f…\"1","size":32}}},"perl":"5.14.2","run":"bin/unburden-home-dir","OS":"linux","start":1363964598.759},"1363964579.5727.60621":{"count":{"bin/unburden-home-dir":{"statement":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,1,1,1,1,1,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,0,0,0,0,1,3,1,1,1,1,2,2,1,1,1,6,6,6,0,0,1,1,0,0,1,3,1,1,3,3,3,3,3,0,0,3,0,0,3,0,0,3,0,0,3,0,0,0,0,0,0,3,3,0,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,0,0,1,0,0,0,0,0,0,1,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,1,1,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,4,1,1,1,1,1,0,1,0,0,1,0,0,1,1,1,0,1,1,1,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,0,1,3,3,3,3,3,5,5,1,0,0,3,3,0,0,3,2,2,1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"subroutine":[1,1,1,1,1,1,1,1,1,1,1,0,0,6,0,0,0,1,0,1,0,0,1,1,1,0,0,0,1,4,1,1,1,1,1,3,3,0,0],"time":[364827,13,6,6,6,7,6,7,6,1242,12,7,79,181,20,null,null,null,null,31,14,54,206,105,8,null,5,null,6,null,5,null,6,null,5,null,5,null,9,null,null,null,null,null,8,1801,9,46,10,12,13,23,20,6,78,59897,69,573,null,null,599,791,null,null,8,116,56,80,127,25,46,28,90,null,null,25,null,null,102,null,null,35,null,null,23,null,null,null,null,null,null,558,32,null,29,34,null,4587,25977,50,1165,2410,135,5037,152,224,14,4,173,13,4,195,780,3859,195,972,25845,157,990,55758,155,1229,4055,165,13,5,88,1143,17472,176941,null,null,null,null,null,null,null,null,null,null,9,27,15,21,16,10,115,3351,null,null,32,null,null,null,null,null,null,6,186,43,null,null,6,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,10,6,14,6,8,4,18,null,null,null,null,null,null,null,null,null,null,20,8,5,17,308189,null,null,null,35,74,null,null,51,9,11,8,16,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,13,19,15,157,9,61,22,15,13,16,41,null,11,null,null,50,null,null,8,15,26,null,23,8,36,null,29,null,20,9,7,8,7,13,15,9,6,6,32,40,null,10,20,103,44,17,40,73,146,14,null,null,31,35,null,null,29,188,77,9,38,null,null,8,86],"branch":[[0,0],[1,2],[3,3],[0,1],[2,1],[0,1],[0,3],[0,3],[0,3],[0,3],[0,3],[0,3],[0,0],[0,0],[0,0],[0,3],[0,3],[1,0],[1,0],[1,0],[1,0],[0,0],[0,0],[0,0],[0,1],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[1,0],[0,0],[0,1],[0,1],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,1],[1,0],[0,1],[0,1],[0,1],[0,1],[0,1],[0,1],[1,0],[2,3],[3,0],[0,3],[2,1],[0,1],[0,1],[0,0],[0,0],[0,0],[0,0]],"condition":[[0,0,3],[3,0,0],[0,0,3],[0,3,0],[0,0],[0,1,0],[1,0,0],[0,1,0],[0,1,0],[0,0,1],[1,0,0]]}},"finish":1363964578.27061,"digests":{"bin/unburden-home-dir":"9c4bf4fb201e11b18ccd100dfb812731"},"collected":["branch","condition","pod","statement","subroutine","time"],"vec":{"bin/unburden-home-dir":{"subroutine":{"vec":"ÿ'Êñ\u001f","size":39},"statement":{"vec":"ÿøUUðÿ3ÿI\u0012Øÿÿÿÿ\u0003ðOà\u0004\u0000\u0000à\u000fÀÇ|\u0000\u0000ðÉ]ÿï?ó\u0019\u0000\u0000\u0000","size":335},"branch":{"vec":"´ªª€V\u0001\u0002\u0000\u0000¡\u0000€©j¦\n\u0000","size":132},"condition":{"vec":"\f…\"1","size":32}}},"perl":"5.14.2","run":"bin/unburden-home-dir","OS":"linux","start":1363964577.88877},"1363964596.5824.16167":{"count":{"t/replacement-order-dryrun.t":{"statement":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],"subroutine":[1,1,1,1,1],"time":[13,36,13,8,20,2229,5498,2381,2972900,1258,70,407,2257,1330,1188,4861,1178,5054,74442,94,2919,35723,396,26,9,329,1552,61669,206,1092,17939,563946]}},"finish":1363964595.68933,"digests":{"t/replacement-order-dryrun.t":"eb62134d113bae297c80dc4800f6b5fc"},"collected":["branch","condition","pod","statement","subroutine","time"],"perl":"5.14.2","vec":{"t/replacement-order-dryrun.t":{"subroutine":{"vec":"\u001f","size":5},"statement":{"vec":"ÿÿÿÿ","size":32}}},"run":"t/replacement-order-dryrun.t","OS":"linux","start":1363964592.69276},"1363964574.5707.30390":{"count":{"bin/unburden-home-dir":{"statement":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,1,1,1,1,1,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,0,0,0,0,1,3,1,1,1,1,2,2,1,1,1,6,6,6,0,0,1,1,0,0,1,3,1,1,3,3,3,3,3,0,0,3,0,0,3,0,0,3,0,0,3,0,0,0,0,0,0,3,3,0,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,0,0,1,0,0,0,0,0,0,1,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,1,1,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,4,1,1,1,1,1,0,1,0,0,1,0,0,1,1,1,0,1,1,1,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,0,1,3,3,3,3,3,5,5,1,0,0,3,3,0,0,3,2,2,1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"subroutine":[1,1,1,1,1,1,1,1,1,1,1,0,0,6,0,0,0,1,0,1,0,0,1,1,1,0,0,0,1,4,1,1,1,1,1,3,3,0,0],"time":[361921,12,6,5,7,7,5,6,6,1858,15,10,112,263,23,null,null,null,null,35,13,63,222,115,8,null,6,null,5,null,5,null,6,null,6,null,8,null,12,null,null,null,null,null,10,146,10,50,1550,12,14,22,20,5,75,62046,60,568,null,null,745,808,null,null,8,123,59,89,213,41,79,48,143,null,null,45,null,null,178,null,null,60,null,null,40,null,null,null,null,null,null,958,48,null,44,49,null,4548,29030,64,1858,2283,131,5313,155,233,13,5,174,13,5,194,791,4422,202,928,24473,215,1013,54501,94,878,3687,274,23,6,161,1813,25338,277109,null,null,null,null,null,null,null,null,null,null,8,27,15,20,16,10,116,3486,null,null,40,null,null,null,null,null,null,6,178,53,null,null,7,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,9,6,15,6,4,4,17,null,null,null,null,null,null,null,null,null,null,11,7,13,18,291486,null,null,null,36,19,null,null,36,9,11,8,21,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,17,25,19,205,13,91,15,10,8,11,37,null,12,null,null,52,null,null,8,14,20,null,15,8,35,null,31,null,28,11,7,8,6,14,15,8,6,6,32,42,null,10,38,155,297,30,68,119,240,23,null,null,57,69,null,null,51,343,130,9,36,null,null,8,204],"branch":[[0,0],[1,2],[3,3],[0,1],[2,1],[0,1],[0,3],[0,3],[0,3],[0,3],[0,3],[0,3],[0,0],[0,0],[0,0],[0,3],[0,3],[1,0],[1,0],[1,0],[1,0],[0,0],[0,0],[0,0],[0,1],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[1,0],[0,0],[0,1],[0,1],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,1],[1,0],[0,1],[0,1],[0,1],[0,1],[0,1],[0,1],[1,0],[2,3],[3,0],[0,3],[2,1],[0,1],[0,1],[0,0],[0,0],[0,0],[0,0]],"condition":[[0,0,3],[3,0,0],[0,0,3],[0,3,0],[0,0],[0,1,0],[1,0,0],[0,1,0],[0,1,0],[0,0,1],[1,0,0]]}},"finish":1363964573.32465,"digests":{"bin/unburden-home-dir":"9c4bf4fb201e11b18ccd100dfb812731"},"collected":["branch","condition","pod","statement","subroutine","time"],"vec":{"bin/unburden-home-dir":{"subroutine":{"vec":"ÿ'Êñ\u001f","size":39},"statement":{"vec":"ÿøUUðÿ3ÿI\u0012Øÿÿÿÿ\u0003ðOà\u0004\u0000\u0000à\u000fÀÇ|\u0000\u0000ðÉ]ÿï?ó\u0019\u0000\u0000\u0000","size":335},"branch":{"vec":"´ªª€V\u0001\u0002\u0000\u0000¡\u0000€©j¦\n\u0000","size":132},"condition":{"vec":"\f…\"1","size":32}}},"perl":"5.14.2","run":"bin/unburden-home-dir","OS":"linux","start":1363964572.95464},"1363964622.5932.24799":{"count":{"t/xsession-d.t":{"statement":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],"subroutine":[1,1,1,1,1,1,1],"time":[8,8,7,8,7,7,10,6,14,11,32,322,1350,1553,1785,1415,1197,2408,1802,1129,1794,6305,1310,73,772,1840,1152,123,324,1686,1035,8949,1249,71,734,2027,1017,58,347,1789,1149,1709,6322,1235,73,739,1875,1015,58,636,1714,4372,1019,4831,45896,62,2183,31661,235,16,5,168,928,9871,289,1434,52018,199,764,2797,159,1192,19873,574504]}},"finish":1363964621.4228,"digests":{"t/xsession-d.t":"53b54c214335e3d81a5f61b3a4ff1f02"},"collected":["branch","condition","pod","statement","subroutine","time"],"perl":"5.14.2","vec":{"t/xsession-d.t":{"subroutine":{"vec":"","size":7},"statement":{"vec":"ÿÿÿÿÿÿÿÿÿ\u0003","size":74}}},"run":"t/xsession-d.t","OS":"linux","start":1363964621.35415},"1363964591.5795.31512":{"count":{"t/parse-comments-and-blank-lines.t":{"statement":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],"subroutine":[1,1,1,1,1,1],"time":[8,9,7,6,15,339,1578,1210,1810,1452,1197,1487,1189,1186,1925,1681,3092054,1982,73,null,1550,420,3560,67,387,3037,1611,3278,11573,1617,5216,47187,61,2308,30764,254,15,5,171,1023,40424,205,730,2879,161,1122,18792,518197],"branch":[[0,1]]}},"finish":1363964590.56121,"digests":{"t/parse-comments-and-blank-lines.t":"5e9326a652f87d3d5a05bde10d45691d"},"collected":["branch","condition","pod","statement","subroutine","time"],"perl":"5.14.2","vec":{"t/parse-comments-and-blank-lines.t":{"subroutine":{"vec":"?","size":6},"statement":{"vec":"ÿÿ÷ÿÿÿ","size":48},"branch":{"vec":"\u0002","size":2}}},"run":"t/parse-comments-and-blank-lines.t","OS":"linux","start":1363964587.42297},"1363964618.5908.47602":{"count":{"t/undo.t":{"statement":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],"subroutine":[1,1,1,1,1,1],"time":[9,9,7,6,14,323,1362,1222,1773,1214,1176,1951,1742,2681183,1329,77,379,2055,71,null,1276,533,72,1541,1179,1378,7594,1582,7990,66867,91,3448,44815,310,16,4,175,992,43521,200,776,2849,164,1095,18973,626375],"branch":[[0,1]]}},"finish":1363964617.65479,"digests":{"t/undo.t":"13f12dadd47bb7557259afc245fb3e37"},"collected":["branch","condition","pod","statement","subroutine","time"],"perl":"5.14.2","vec":{"t/undo.t":{"subroutine":{"vec":"?","size":6},"statement":{"vec":"ÿÿ÷ÿÿ?","size":46},"branch":{"vec":"\u0002","size":2}}},"run":"t/undo.t","OS":"linux","start":1363964614.94306}}}unburden-home-dir-0.3.2.2/cover_db/cover.css0000644000000000000000000000250412123071317015477 0ustar /* Stylesheet for Devel::Cover HTML reports */ /* You may modify this file to alter the appearance of your coverage * reports. If you do, you should probably flag it read-only to prevent * future runs from overwriting it. */ /* Note: default values use the color-safe web palette. */ body { font-family: sans-serif; } h1 { background-color: #3399ff; border: solid 1px #999999; padding: 0.2em; -moz-border-radius: 10px; } a { color: #000000; } a:visited { color: #333333; } table { border-collapse: collapse; border-spacing: 0px; } tr { text-align : center; vertical-align: top; } th,.h { background-color: #cccccc; border: solid 1px #333333; padding: 0em 0.2em; } td { border: solid 1px #cccccc; } /* source code */ pre,.s { text-align: left; font-family: monospace; white-space: pre; padding: 0em 0.5em 0em 0.5em; } /* Classes for color-coding coverage information: * c0 : path not covered or coverage < 75% * c1 : coverage >= 75% * c2 : coverage >= 90% * c3 : path covered or coverage = 100% */ .c0, .c1, .c2, .c3 { text-align: right; } .c0 { background-color: #ff9999; border: solid 1px #cc0000; } .c1 { background-color: #ffcc99; border: solid 1px #ff9933; } .c2 { background-color: #ffff99; border: solid 1px #cccc66; } .c3 { background-color: #99ff99; border: solid 1px #009900; } unburden-home-dir-0.3.2.2/cover_db/coverage.html0000644000000000000000000001665112123071317016340 0ustar Coverage Summary

Coverage Summary

Database:/home/abe/dphys/unburden-home-dir/cover_db
Report Date:2013-03-22 16:03:43
Perl Version:v5.14.2
OS:linux
Thresholds: < 75%< 90%< 100%= 100%

filestmtbrancondsubpodtimetotal
bin/unburden-home-dir74.353.056.282.1n/a20.968.6
t/check-symlinks-in-path.t97.950.0n/a100.0n/a 6.596.4
t/check-symlinks-without-trailing-slash.t97.750.0n/a100.0n/a 5.496.1
t/create-empty-directories.t97.850.0n/a100.0n/a 5.396.2
t/find-per-user-stuff-xdg.t98.050.0n/a100.0n/a 6.196.5
t/find-per-user-stuff.t98.050.0n/a100.0n/a 6.096.5
t/moving-to-existing-subdir.t98.150.0n/a100.0n/a 7.696.7
t/parse-comments-and-blank-lines.t97.950.0n/a100.0n/a 6.296.4
t/replacement-order-dryrun.t100.0n/an/a100.0n/a 6.1100.0
t/replacement-order.t100.0n/an/a100.0n/a 5.9100.0
t/skip-non-home.t97.850.0n/a100.0n/a 9.996.3
t/undo-dryrun.t100.0n/an/a100.0n/a 6.0100.0
t/undo.t97.850.0n/a100.0n/a 5.796.3
t/version.t100.0n/an/a100.0n/a 1.0100.0
t/xsession-d.t100.0n/an/a100.0n/a 1.3100.0
Total90.052.756.294.2n/a100.085.1
unburden-home-dir-0.3.2.2/cover_db/bin-unburden-home-dir.html0000644000000000000000000035720112123071317020636 0ustar File Coverage: bin/unburden-home-dir

File Coverage

File:bin/unburden-home-dir
Coverage:68.6%

linestmtbrancondsubpodtimecode
1#!/usr/bin/perl
2#
3# This file causes a list of directories to be removed or moved off
4# the users home directory into a given other directory. Usually this
5# is used to relief NFS home directories of the burden of caches and
6# other performance needing directories.
7#
8# Copyright (C) 2010-2012 by Axel Beckert <beckert@phys.ethz.ch>,
9# Department of Physics, ETH Zurich.
10#
11# This program is free software: you can redistribute it and/or modify
12# it under the terms of the GNU General Public License as published by
13# the Free Software Foundation, either version 2 of the License, or
14# (at your option) any later version.
15#
16# This program is distributed in the hope that it will be useful, but
17# WITHOUT ANY WARRANTY; without even the implied warranty of
18# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
19# General Public License for more details.
20#
21# You should have received a copy of the GNU General Public License
22# along with this program. If not, see http://www.gnu.org/licenses/.
23#
24
25
13
13
13
68284
384421
658
use Modern::Perl;
26
27# Globally define version
28
13
5178775
our $VERSION = '0.3.2';
29
30# Configuration variables to be used in configuration files
31
13
188
my $CONFIG = {
32    TARGETDIR => '/tmp',
33    FILELAYOUT => '.unburden-%u/%s',
34};
35
36# Just show what would be done
37
13
91
my $DRYRUN = undef;
38
39# Undo feature
40
13
78
my $REVERT = 0;
41
42# Defaul base name
43
13
109
my $BASENAME = 'unburden-home-dir';
44
13
168
my $LISTSUFFIX = 'list';
45
46# Load Modules
47
13
13
13
16535
32356
2003
use Config::File;
48
13
13
13
13
86
73562
2059
3097
use Getopt::Std; $Getopt::Std::STANDARD_HELP_VERSION = 1;
49
13
13
13
186
60
2745
use File::Path qw(mkpath rmtree);
50
13
13
13
196
63
2901
use File::Basename;
51
13
13
13
10738
53676
3066
use File::BaseDir qw(config_home);
52
13
13
13
12911
344124
2324
use File::Touch;
53
13
13
13
14145
785750
1643
use File::Rsync;
54
13
13
13
12384
47811
2782
use File::Which;
55
13
13
13
243
73
1625
use IO::Handle;
56
13
13
13
18346
329142
2416478
use Data::Dumper;
57
58# Declare and initialise some variables
59
13
104
my %OPTIONS = ();
60
13
87
my $FILTER = undef;
61
13
19438
my $UID = getpwuid($<);
62
13
161
my $USE_LSOF = 1;
63
13
106
my $LSOF_CMD = undef;
64
65# Some messages for Getopt::Std
66sub VERSION_MESSAGE {
67
0
0
    my ($fh, $getoptpkg, $getoptversion, $cmdlineargs) = @_;
68
69
0
0
    say $fh "Unburden Home Directory $VERSION\n";
70
71
0
0
    return;
72}
73
74sub HELP_MESSAGE {
75
0
0
    my ($fh, $getoptpkg, $getoptversion, $cmdlineargs) = @_;
76
77
0
0
    say $fh "Usage: $0 [ -F | -n | -u | -b basename | (-c|-C) conffile | -f filter | (-l|-L) listfile ]
78       $0 ( -h | --help | --version )
79
80Options with parameters:
81
82  -b use the given string as basename instead of \"$BASENAME\".
83
84  -c read an additional configuration file
85
86  -C read only the given configuration file
87
88  -f just unburden those directory matched by the given filter (a perl
89      regular expression) -- it matches the already unburdened
90      directories if used together with -u.
91
92  -l read an additional list file
93
94  -L read only the given list file
95
96Options without parameters:
97
98  -F Do not check if to-be-(re)moved files and directories are still
99      in use (aka *F*orce (re)moving).
100
101  -n dry run (show what would be done)
102
103  -u undo (reverse the functionality and put stuff back into the home
104      directory)
105
106  -h, --help show this help
107
108  --version show the program's version
109";
110
111
0
0
    return;
112}
113
114# Parse command line options
115
13
1168
getopts('hnufFb:c:C:l:L:', \%OPTIONS);
116
117
13
3969
for (keys %OPTIONS) {
118
28
391
    when('h') {
119
0
0
        my $fh = IO::Handle->new_from_fd(fileno(STDERR),'w');
120
0
0
        VERSION_MESSAGE($fh);
121
0
0
        HELP_MESSAGE($fh);
122
0
0
        exit 0;
123    }
124
28
2
656
27
    when('b') { $BASENAME = $OPTIONS{b}; }
125}
126
127# By default check for a system wide and a user configuration and list file
128
13
817
my @CONFFILES = ("/etc/$BASENAME",
129                 "$ENV{HOME}/.$BASENAME",
130                 config_home($BASENAME).'/config');
131
13
3020
my @LISTFILES = ("/etc/$BASENAME.$LISTSUFFIX",
132                 "$ENV{HOME}/.$BASENAME.$LISTSUFFIX",
133                 config_home($BASENAME)."/$LISTSUFFIX");
134
135
13
1710
for (keys %OPTIONS) {
136
28
11
207
155
    when('C') { @CONFFILES = ($OPTIONS{C}); }
137
17
0
102
0
    when('c') { push(@CONFFILES, $OPTIONS{c}); }
138
17
11
106
152
    when('L') { @LISTFILES = ($OPTIONS{L}); }
139
6
0
37
0
    when('l') { push(@LISTFILES, $OPTIONS{l}); }
140
6
2
39
18
    when('n') { $DRYRUN = 1; }
141
4
2
28
17
    when('u') { $REVERT = 1; }
142
2
0
13
0
    when('F') { $USE_LSOF = 0; }
143
2
21
    when('f') {
144
0
0
0
0
        eval { $FILTER = qr/$OPTIONS{f}/; };
145
0
0
        if ($@) {
146
0
0
            report_serious_problem("parameter to -f", "\n$@");
147
0
0
            exit 2;
148        }
149    }
150}
151
152# Check for configuration files and read them
153
13
120
foreach my $configfile (@CONFFILES) {
154
17
2361
    if ( -e $configfile ) {
155
13
674
        $CONFIG = { %$CONFIG,
156
13
140
                    %{Config::File::read_config_file($configfile)} };
157    }
158}
159
160# Fix some values
161
13
22499
$UID =~ s/\s+//gs;
162
163# Remove quotes and line-feeds from values
164
13
189
foreach my $key (keys %$CONFIG) {
165
26
201
    chomp($CONFIG->{$key});
166
26
331
    $CONFIG->{$key} =~ s/^([\'\"])(.*)\1$/$2/;
167}
168
169# Set proper umask when creating files or directories. Save current
170# umask before.
171
13
279
my $OLDUMASK = umask();
172
13
83
umask(077);
173
174# Initialize rsync object
175my $rsync = File::Rsync->new({
176    archive => 1,
177    verbose => 1,
178    outfun => sub {
179
48
488967
        my $_ = shift;
180
48
503
        chomp;
181
48
4536
        say unless m(^sent |^total size|^\s*$);
182    },
183
0
0
0
0
    errfun => sub { chomp; warn "$_[0]\n"; },
184
13
1181
});
185
186# Check for lsof in search path
187
13
14993
my $which_lsof = which('lsof');
188
13
12344
if (!$which_lsof) {
189
0
0
    warn "WARNING: lsof not found, not checking for files in use.\n";
190
0
0
    $USE_LSOF = 0;
191}
192
193# Standard Error reporting function; Warning
194sub report_problem {
195
0
0
    warn "WARNING: Can't handle $_[0]: $_[1]";
196
0
0
    return;
197}
198
199# Standard Error reporting function; Error
200sub report_serious_problem {
201
0
0
    warn "ERROR: Can't handle $_[0]: $_[1]";
202
0
0
    return;
203}
204
205# Actually move a directory or file
206sub move ($$) {
207
11
98
    my ($from, $to) = @_;
208
11
282
    say "Moving $from -> $to";
209
11
163
    unless ($DRYRUN) {
210
9
185
        if (-d $from) {
211
8
141
            $from .= '/' unless $from =~ m(/$);
212
8
94
            $to .= '/' unless $to =~ m(/$);
213
214
8
969
            my $rc = $rsync->exec({
215                src => $from,
216                dst => $to,
217            });
218
8
33191
            rmtree($from);
219        } else {
220
1
5457
            my $rc = system(qw(mv -v), $from, $to);
221
1
77
            return !($? >> 8);
222        }
223    }
224
10
375
    return 1;
225}
226
227# Create a symlink. Create its parent directories if they don't yet
228# exist.
229sub create_symlink_and_parents {
230
1
10
    my ($old, $new) = @_;
231
1
7
    create_parent_directories($new);
232
1
11
    say "Symlinking $new -> $old";
233
1
10
    unless ($DRYRUN) {
234
1
134
        symlink($old, $new)
235            or die "Couldn't symlink $new -> $old: $!";
236    }
237
1
6
    return;
238}
239
240# Create those parent directories for a given file or directory name
241# which don't yet exist.
242sub create_parent_directories {
243
10
64
    my $file = shift;
244
10
1814
    my $parent_dir = dirname($file);
245
10
382
    unless (-d $parent_dir) {
246
3
78
        say "Create parent directories for $file";
247
3
585
        mkpath($parent_dir, { verbose => 1 }) unless $DRYRUN;
248    }
249
10
76
    return;
250}
251
252# In case of uppercase type letters, create symlinks as replacement
253# for directories files which may not even exist yet. Common cases are
254# trash directories which are created when something gets put into the
255# trashcan, etc.
256sub possibly_create_non_existing_stuff {
257
1
46
    my ($type, $item, $target) = @_;
258
259    # Shall we create not yet existing directories or files as symlink?
260    # Case 1: directory
261
1
11
    if ( $type eq 'D' ) {
262        # TODO: Refactor create_symlink_and_parents so that its
263        # create_parent_directories call isn't redundant in this case.
264
1
29
        say "Create directory $target and parents";
265
1
361
        mkpath($target, { verbose => 1 }) unless $DRYRUN;
266
1
13
        create_symlink_and_parents($target, $item);
267    }
268
269    # Case 2: file
270    elsif ( $type eq 'F' ) {
271
0
0
        create_parent_directories($target);
272
0
0
        say "Touching $target";
273
0
0
        touch($target) unless $DRYRUN;
274
0
0
        create_symlink_and_parents($target, $item)
275    }
276
1
6
    return 0;
277}
278
279# Dangling links may happen if the destination directory has been
280# weeped, e.g. due to being on an tmpfs mount or by tmpreaper, etc.
281sub fix_dangling_links {
282
1
97
    my ($type, $itemexpanded, $target) = @_;
283
1
36
    my $link = readlink($itemexpanded);
284
1
13
    my $is_dir = type_is_directory($type);
285
1
13
    my $is_file = type_is_file($type);
286
287    # Accept existing symlinks or unburden-home-dir.list entries for
288    # directories with or without trailing slash
289
1
15
    if ($is_dir) {
290
1
13
        $link =~ s{/$}{};
291
1
8
        $itemexpanded =~ s{/$}{};
292
1
23
        $target =~ s{/$}{};
293    }
294
295    # Check if link target is wanted target
296
1
13
    if ( $link ne $target ) {
297
0
0
        report_problem($itemexpanded, "$link not equal $target");
298
0
0
        return 1;
299    }
300
301    # Check if target exists and is same type
302
1
28
    if ( -e $target ) {
303
0
0
        my $unexpected_type = check_for_unexpected_type($type, $target);
304
0
0
        return $unexpected_type if $unexpected_type;
305    }
306    # Symlink is there, but file or directory not
307    else {
308
1
12
        create_object_of_type($type, $target);
309    }
310
1
10
    return 0;
311}
312
313# Find pid and command in lsof output
314sub parse_lsof_output {
315
9
100
    my ($output) = @_;
316
9
56
    chomp($output);
317
9
127
    my @lines = split(/\n/, $output);
318
319
9
67
    my $result = '';
320
9
45
    my $pid;
321
9
40
    my $cmd;
322
323
9
149
    foreach my $line (@lines) {
324
0
0
        if ($line =~ /^p(.*)$/) {
325
0
0
            $pid = $1;
326
0
0
            $cmd = undef;
327        } elsif ($line =~ /^c(.*)$/) {
328
0
0
            $cmd = $1;
329
0
0
            unless ($pid) {
330
0
0
                report_problem("lsof output", "No pid before command: $line");
331
0
0
                next;
332            }
333
0
0
            $result .= sprintf(" %5i (%s)\n", $pid, $cmd);
334
0
0
            $pid = undef;
335        } else {
336
0
0
            report_problem("line in lsof output", $line);
337        }
338    }
339
340
9
114
    return $result;
341
342}
343
344# Check if files in to be moved directories are currently in use.
345sub files_in_use {
346
9
83
    my ($item) = @_;
347
9
57
    my $lsof_output = undef;
348
349
9
186
    if (-d $item) {
350
8
2122731
        $lsof_output = `find '$item' -print0 | buffer | xargs -0 lsof -F c`;
351    } elsif (-f _) {
352
1
255645
        $lsof_output = `lsof -F c '$item'`;
353    } else {
354
0
0
        report_problem("Not checking for open files in $item: neither file nor directory");
355
0
0
        return;
356    }
357
358
9
344
    my $lsof_parsed = parse_lsof_output($lsof_output);
359
360
9
200
    if ($lsof_parsed) {
361
0
0
        report_problem($item, "in use, not (re)moving. Process list:\n$lsof_parsed");
362
0
0
        return 1;
363    } else {
364
9
323
        return 0;
365    }
366}
367
368# Move a directory or file (higher level function)
369sub action_move {
370
9
85
    my ($itemexpanded, $target) = @_;
371
372
9
137
    create_parent_directories($target);
373
9
93
    move($itemexpanded, $target)
374        or die "Couldn't move $itemexpanded -> $target: $!";
375
9
154
    return;
376}
377
378# Handle directory or file which should be emptied (higher level function)
379sub action_delete_and_recreate {
380
0
0
    my ($type, $itemexpanded, $target) = @_;
381
382
0
0
    my $is_file = type_is_file($type);
383
0
0
    my $is_dir = type_is_directory($type);
384
385
0
0
    say "Delete $itemexpanded";
386
0
0
    unless ($DRYRUN) {
387
0
0
        $is_dir and rmtree($itemexpanded, { verbose => 1 }) ;
388
0
0
        $is_file and (unlink($itemexpanded)
389                      || die "Couldn't delete $itemexpanded: $!");
390    }
391
0
0
    create_object_of_type($type, $target);
392
393
0
0
    return;
394}
395
396# Generic create function for both, directories and files
397sub create_object_of_type {
398
1
13
    my ($type, $target) = @_;
399
400
1
47
    say "Create $target";
401
1
15
    unless ($DRYRUN) {
402
1
11
        if (type_is_directory($type)) {
403
1
897
            mkpath($target, { verbose => 1 });
404        }
405        elsif (type_is_file($type)) {
406
0
0
            create_parent_directories($target);
407
0
0
            say "Touching $target";
408
0
0
            touch($target) || die "Couldn't touch $target: $!";
409        }
410    }
411
412
1
19
    return;
413}
414
415# Bail out on common assertion
416sub unknown_element {
417
0
0
    my ($what, $unknown) = @_;
418
419
0
0
    warn "Unknown $what '$unknown'. This should never happen.";
420
0
0
    return 255;
421}
422
423# Create a symlink
424sub create_symlink {
425
9
145
    my ($itemexpanded, $target) = @_;
426
427
9
195
    say "Symlinking $target -> $itemexpanded";
428
9
139
    unless ($DRYRUN) {
429
8
1680
        symlink($target, $itemexpanded)
430            or die "Couldn't symlink $target -> $itemexpanded: $!";
431    }
432
9
93
    return;
433}
434
435# Check if the expected type of an object is "directory"
436sub type_is_directory {
437
34
670
    return (lc(shift) eq 'd');
438}
439
440# Check if the expected type of an object is "file"
441sub type_is_file {
442
11
181
    return (lc(shift) eq 'f');
443}
444
445# Check if an object has an unexpected type (higher level function)
446sub check_for_unexpected_type {
447
9
92
    my ($type, $itemexpanded) = @_;
448
449
9
93
    my $is_file = type_is_file($type);
450
9
85
    my $is_dir = type_is_directory($type);
451
452
9
295
    unless ($is_file or $is_dir) {
453
0
0
        return unknown_element('type', $type);
454    }
455
456
9
147
    if ($is_file and !-f $itemexpanded) {
457
0
0
        report_serious_problem($itemexpanded,
458                               'Unexpected type (not a file)');
459
0
0
        return 1;
460    }
461
462
9
458
    if ($is_dir and !-d $itemexpanded) {
463
0
0
        report_serious_problem($itemexpanded,
464                               'Unexpected type (not a directory)');
465
0
0
        return 1;
466    }
467
468
9
67
    return;
469}
470
471# Top-level function run once per to-be-changed-item
472sub do_it {
473
9
243
    my ($type, $itemexpanded, $target, $action) = @_;
474
475
9
203
    if ( $USE_LSOF and files_in_use($itemexpanded) ) {
476
0
0
        return 0;
477    }
478
479
9
138
    my $unexpected_type = check_for_unexpected_type($type, $itemexpanded);
480
9
67
    return $unexpected_type if $unexpected_type;
481
482
9
294
    if ( $action eq 'r' or $action eq 'd' ) {
483
0
0
        action_delete_and_recreate($type, $itemexpanded, $target);
484    }
485    elsif ( $action eq 'm' ) {
486
9
226
        action_move($itemexpanded, $target);
487    }
488    else {
489
0
0
        return unknown_element('action', $action);
490    }
491
492
9
216
    create_symlink($itemexpanded, $target);
493
494
9
89
    return 0;
495}
496
497# Parse and fill placeholders in target definition
498sub calculate_target {
499
13
116
    my $replacement = shift;
500
13
231
    my $target = $CONFIG->{FILELAYOUT};
501
502
13
117
    $target =~ s|%u|$UID|g;
503
13
239
    $target =~ s|%s|$replacement|g;
504
505
13
236
    return $CONFIG->{TARGETDIR}."/$target";
506}
507
508# Parse and fill wildcards
509sub fill_in_wildcard_matches {
510
13
203
    my ($itemglob, $itemexpanded, $target) = @_;
511
512    # Replace %<n> (e.g. %1) with the n-th wildcard match. Uses perl
513    # here as it would be too complicated and way less readable if
514    # written as (bourne) shell script.
515
516    # Change from globbing to regexp
517
13
136
    $itemglob =~ s/\?/(.)/g;
518
13
158
    $itemglob =~ s/\*/(.*)/g;
519
520
13
689
    my @result = $itemexpanded =~ m($itemglob)g;
521
522
13
12
215
328
    $target =~ s/\%(\d+)/$result[$1-1]/eg;
523
524
13
180
    return $target;
525}
526
527# Check if the path to something to unburden already contains a symlink
528sub symlink_in_path {
529
19
183
    my $path = shift;
530    # Remove home directory, i.e. check just from below the home directory
531
19
1004
    if ($path =~ s($ENV{HOME}/?)()) {
532        # Split up into components, but remove the last one (which we
533        # are requested to handle, so we shouldn't check that now)
534
19
593
        my @path_elements = split(m(/), $path);
535
19
153
        pop(@path_elements);
536
537
19
347
        foreach my $i (0..$#path_elements) {
538
29
594
            my $path_to_check = $ENV{HOME}.'/'.join('/', @path_elements[0..$i]);
539            #say "Check if $path_to_check is a symlink";
540
29
1111
            return $path_to_check if -l $path_to_check;
541        }
542
11
208
        return 0;
543    } else {
544
0
0
        report_serious_problem("Can't find home directory ($ENV{HOME}) in $path!");
545    }
546
547
0
0
    return;
548}
549
550# Handle replacement requests and check if they're sane
551sub replace {
552    # replace $type $i $item $replacement
553
19
269
    my ($type, $itemexpanded, $itemglob, $replacement, $action) = @_;
554
555    # Skip entries where wildcard where passed
556
19
308
    if ($itemexpanded =~ /[][*?]/) {
557
0
0
        warn "Skipping '$itemexpanded' due to unmatched wildcard.\n";
558
0
0
        return 0;
559    }
560
561
19
247
    if (my $symlink = symlink_in_path($itemexpanded)) {
562
8
1228
        warn "Skipping '$itemexpanded' due to symlink in path: $symlink\n";
563
8
485
        return 0;
564    }
565
566
11
114
    my $target = fill_in_wildcard_matches($itemglob, $itemexpanded,
567                                          calculate_target($replacement));
568
569    # Check if the source exists
570
11
774
    if ( ! -e $itemexpanded and ! -l $itemexpanded ) {
571
1
9
        possibly_create_non_existing_stuff($type, $itemexpanded, $target);
572    }
573    # Check if source is already a symlink
574    elsif ( -l $itemexpanded ) {
575
1
16
        fix_dangling_links($type, $itemexpanded, $target);
576    }
577
578    # TODO: Check available disk space
579    # Should use report_serious_problem
580
581    # No symlink yet, then actually move or remove!
582    else {
583
9
152
        do_it($type, $itemexpanded, $target, $action);
584    }
585
586
11
1035
    return;
587}
588
589# Core functionality of the undo feature
590sub revert {
591
2
26
    my ($itemexpanded, $item_in_home, $target_glob) = @_;
592
593    # Skip entries where wildcard where passed
594
2
34
    if ($itemexpanded =~ /[][*?]/) {
595
0
0
        warn "Skipping '$target_glob' due to unmatched wildcard.\n";
596
0
0
        return 0;
597    }
598
599
2
33
    $item_in_home = "$ENV{HOME}/" .
600        fill_in_wildcard_matches($target_glob, $itemexpanded, $item_in_home);
601
2
77
    say "Trying to revert $itemexpanded to $item_in_home";
602
603
2
92
    if (-l $item_in_home) {
604
2
268
        my $link_target = readlink($item_in_home);
605
2
22
        $itemexpanded =~ s{/$}{};
606
2
16
        $link_target =~ s{/$}{};
607
608
2
30
        if ($itemexpanded eq $link_target) {
609
2
28
            say "Removing symlink $item_in_home";
610
2
219
            unlink($item_in_home) unless $DRYRUN;
611
2
27
            move($itemexpanded, $item_in_home);
612        } else {
613
0
0
            warn "Ignoring symlink $item_in_home as it points to $link_target ".
614                 "and not to $itemexpanded as expected.\n";
615        }
616    }
617
618
2
162
    return;
619}
620
621# Parse wildcards backwards
622sub exchange_wildcards_and_replacements {
623
2
21
    my ($wildcard, $replacement) = @_;
624
2
13
    my $i = 1;
625
2
56
    while ($replacement =~ /\%(\d+)/) {
626
6
66
        my $number = $1;
627
6
48
        my $prev = $number-1;
628
6
6
452
112
        $wildcard =~ s/^(([^*]*[*?]){$prev}[^*]*)([?*])/"$1\%".$i++/e;
629
6
55
        my $wildcardtype = $3;
630
6
129
        $replacement =~ s/\%(\d+)/$wildcardtype/;
631    }
632
2
40
    return ($wildcard, $replacement);
633}
634
635# Main loop over all items in list files
636
13
126
for my $list (@LISTFILES) {
637
17
530
    next unless -r $list;
638
639    # Clean up this and that
640
13
803
    open(LIST, '<', $list) or die "Can't open $list: $!";
641
13
1140
    while (<LIST>) {
642
27
1264
        next if /^#|^ *$/;
643
644
24
222
        chomp;
645
24
470
        my ($action, $type, $item, $replacement) = split;
646
647
24
302
        next unless defined $action;
648
649
23
984
        if (!defined($item) or !defined($replacement)) {
650
0
0
            warn "Can't parse '$_', skipping...";
651
0
0
            next;
652        }
653
23
275
        unless ( type_is_directory($type) or type_is_file($type) ) {
654
0
0
            warn "Can't parse type '$type', must be 'd', 'D', 'f' or 'F', skipping...";
655
0
0
            next;
656        }
657
23
1014
        if ( $action ne 'd' and $action ne 'r' and $action ne 'm' ) {
658
0
0
            warn "Can't parse action '$action', must be 'd', 'r' or 'm', skipping...";
659
0
0
            next;
660        }
661
662
23
397
        if ( $item =~ m(^(\.\.)?/) ) {
663
2
309
            warn "$item would be outside of the home directory, skipping...\n";
664
2
56
            next;
665        }
666
667
21
233
        if ($REVERT) {
668
2
22
            ($item, $replacement) = exchange_wildcards_and_replacements($item, $replacement);
669
670
2
27
            my $replacement_path = calculate_target($replacement);
671
2
618
            for my $i (glob($replacement_path)) {
672
2
33
                if (defined($FILTER)) {
673
0
0
                    next unless ($i =~ $FILTER);
674                }
675
2
34
                revert($i, $item, $replacement);
676            }
677        } else {
678
19
5362
            for my $i (glob("$ENV{HOME}/$item")) {
679
19
302
                if (defined($FILTER)) {
680
0
0
                    next unless ($i =~ $FILTER);
681                }
682
19
234
                replace($type, $i, $item, $replacement, $action);
683            }
684        }
685    }
686
13
617
    close(LIST);
687}
688
689# Restore original umask
690
13
0
umask($OLDUMASK);
unburden-home-dir-0.3.2.2/cover_db/bin-unburden-home-dir--branch.html0000644000000000000000000002635012123071317022144 0ustar Branch Coverage: bin/unburden-home-dir

Branch Coverage

File:bin/unburden-home-dir
Coverage:53.0%

line%coveragebranch
1450TFif ($@)
154100TFif (-e $configfile)
181100TFunless /^sent |^total size|^\s*$/
18850TFunless ($which_lsof)
209100TFunless ($DRYRUN)
210100TFif (-d $from) { }
21150TFunless $from =~ m[/$]
21250TFunless $to =~ m[/$]
23350TFunless ($DRYRUN)
23450TFunless symlink $old, $new
245100TFunless (-d $parent_dir)
247100TFunless $DRYRUN
26150TFif ($type eq 'D') { }
0TFelsif ($type eq 'F') { }
26550TFunless $DRYRUN
2730TFunless $DRYRUN
28950TFif ($is_dir)
29650TFif ($link ne $target)
30250TFif (-e $target) { }
3040TFif $unexpected_type
3240TFif ($line =~ /^p(.*)$/) { }
0TFelsif ($line =~ /^c(.*)$/) { }
3290TFunless ($pid)
349100TFif (-d $item) { }
50TFelsif (-f _) { }
36050TFif ($lsof_parsed) { }
37350TFunless move $itemexpanded, $target
3860TFunless ($DRYRUN)
3870TFif $is_dir
3880TFif $is_file
40150TFunless ($DRYRUN)
40250TFif (type_is_directory($type)) { }
0TFelsif (type_is_file($type)) { }
4080TFunless touch($target)
428100TFunless ($DRYRUN)
42950TFunless symlink $target, $itemexpanded
45250TFunless ($is_file or $is_dir)
45650TFif ($is_file and not -f $itemexpanded)
46250TFif ($is_dir and not -d $itemexpanded)
47550TFif ($USE_LSOF and files_in_use($itemexpanded))
48050TFif $unexpected_type
48250TFif ($action eq 'r' or $action eq 'd') { }
50TFelsif ($action eq 'm') { }
53150TFif ($path =~ s[$ENV{'HOME'}/?][]) { }
540100TFif -l $path_to_check
55650TFif ($itemexpanded =~ /[][*?]/)
561100TFif (my $symlink = symlink_in_path($itemexpanded))
570100TFif (not -e $itemexpanded || -l $itemexpanded) { }
100TFelsif (-l $itemexpanded) { }
59450TFif ($itemexpanded =~ /[][*?]/)
60350TFif (-l $item_in_home)
60850TFif ($itemexpanded eq $link_target) { }
610100TFunless $DRYRUN
637100TFunless -r $list
64050TFunless open LIST, '<', $list
642100TFif /^#|^ *$/
647100TFunless defined $action
64950TFunless (defined $item and defined $replacement)
65350TFunless (type_is_directory($type) or type_is_file($type))
65750TFif ($action ne 'd' and $action ne 'r' and $action ne 'm')
662100TFif ($item =~ m[^(\.\.)?/])
667100TFif ($REVERT) { }
67250TFif (defined $FILTER)
6730TFunless $i =~ /$FILTER/
67950TFif (defined $FILTER)
6800TFunless $i =~ /$FILTER/
unburden-home-dir-0.3.2.2/cover_db/bin-unburden-home-dir--condition.html0000644000000000000000000001346212123071317022675 0ustar Condition Coverage: bin/unburden-home-dir

Condition Coverage

File:bin/unburden-home-dir
Coverage:56.2%

line%coveragecondition
3880
Adec
00
11
unlink $itemexpanded or die "Couldn't delete ${itemexpanded}: $!"
45267
ABdec
000
011
1X1
$is_file or $is_dir
45667
ABdec
0X0
100
111
$is_file and not -f $itemexpanded
46267
ABdec
0X0
100
111
$is_dir and not -d $itemexpanded
47533
ABdec
0X0
100
111
$USE_LSOF and files_in_use($itemexpanded)
48233
ABdec
000
011
1X1
$action eq 'r' or $action eq 'd'
570100
ABdec
000
011
1X1
-e $itemexpanded || -l $itemexpanded
64933
ABdec
0X0
100
111
defined $item and defined $replacement
65367
ABdec
000
011
1X1
type_is_directory($type) or type_is_file($type)
65750
ABCdec
0XX0
10X0
1100
1111
$action ne 'd' and $action ne 'r' and $action ne 'm'
unburden-home-dir-0.3.2.2/cover_db/bin-unburden-home-dir--subroutine.html0000644000000000000000000001204412123071317023101 0ustar Subroutine Coverage: bin/unburden-home-dir

Subroutine Coverage

File:bin/unburden-home-dir
Coverage:82.1%

linesubroutine
25
BEGIN
47
BEGIN
48
BEGIN
49
BEGIN
50
BEGIN
51
BEGIN
52
BEGIN
53
BEGIN
54
BEGIN
55
BEGIN
56
BEGIN
67
VERSION_MESSAGE
75
HELP_MESSAGE
179
__ANON__
183
__ANON__
195
report_problem
201
report_serious_problem
207
move
230
create_symlink_and_parents
243
create_parent_directories
257
possibly_create_non_existing_stuff
282
fix_dangling_links
315
parse_lsof_output
346
files_in_use
370
action_move
380
action_delete_and_recreate
398
create_object_of_type
417
unknown_element
425
create_symlink
437
type_is_directory
442
type_is_file
447
check_for_unexpected_type
473
do_it
499
calculate_target
510
fill_in_wildcard_matches
529
symlink_in_path
553
replace
591
revert
623
exchange_wildcards_and_replacements
unburden-home-dir-0.3.2.2/cover_db/t-check-symlinks-in-path-t.html0000644000000000000000000002722212123071317021525 0ustar File Coverage: t/check-symlinks-in-path.t

File Coverage

File:t/check-symlinks-in-path.t
Coverage:96.4%

linestmtbrancondsubpodtimecode
1#!/usr/bin/perl -wl
2
3
1
1
1
4716
45734
63
use Test::More;
4
1
1
1
2279
33709
241
use Test::Differences;
5
1
1
1
15
5
171
use File::Path qw(mkpath rmtree);
6
1
1
1
946
52382
208
use File::Slurp;
7
1
1
1
725
2927
162
use File::Which;
8
1
1
1
1107
18731
510248
use Data::Dumper;
9
10
1
14
my $BASE = 't/check-symlinks-in-path';
11
1
14
my $HOME = "$BASE/1";
12
1
11
my $TARGET = "$BASE/2";
13
1
8
my $PREFIX = "u";
14
15# Set a debug environment
16
1
25
$ENV{HOME} = $HOME;
17
18# Clean up possible remainders of aborted tests
19
1
489
rmtree("$BASE");
20
21
1
2532
ok( mkpath("$HOME/.foobar/fnord/bla", "$TARGET", {}), "Create test environment (directories)" );
22
1
1642
ok( -d "$HOME/.foobar/fnord/bla", "Original directory has been created" );
23
1
1803
ok( -d "$TARGET", "Target directory has been created" );
24
25
1
1629
ok( symlink("$HOME/.foobar/fnord", "$HOME/.fnord"), "Create test environment (Symlink 1)" );
26
1
1161
ok( -l "$HOME/.fnord", "Symlink 1 has been created" );
27
1
1400
ok( symlink("fnord", "$HOME/.foobar/blafasel"), "Create test environment (Symlink 2)" );
28
1
1342
ok( -l "$HOME/.foobar/blafasel", "Symlink 2 has been created" );
29
30
1
1178
ok( write_file("$BASE/list", "m d .foobar/fnord/bla foobar-fnord-bla\nm d .fnord/bla fnord-bla\nm d .foobar/blafasel/bla foobar-blafasel-bla\n") );
31
1
1754
ok( write_file("$BASE/config", "TARGETDIR=$TARGET\nFILELAYOUT=$PREFIX-\%s") );
32
33
1
1751
my $cmd = "bin/unburden-home-dir -C $BASE/config -L $BASE/list > $BASE/output 2> $BASE/stderr";
34
1
3301314
ok( system($cmd) == 0, "Call '$cmd'" );
35
36
1
1278
my $wanted = "Skipping '$HOME/.fnord/bla' due to symlink in path: $HOME/.fnord
37Skipping '$HOME/.foobar/blafasel/bla' due to symlink in path: $HOME/.foobar/blafasel
38";
39
1
80
unless (which('lsof')) {
40
0
0
    $wanted = "WARNING: lsof not found, not checking for files in use.\n".$wanted;
41}
42
43
1
1729
my $stderr = read_file("$BASE/stderr");
44
1
293
eq_or_diff_text( $stderr, $wanted, "Check command STDERR output" );
45
46
1
1595
$wanted = "Moving $HOME/.foobar/fnord/bla -> $TARGET/u-foobar-fnord-bla
47sending incremental file list
48created directory $TARGET/u-foobar-fnord-bla
49./
50Symlinking $TARGET/u-foobar-fnord-bla -> $HOME/.foobar/fnord/bla
51";
52
53
1
60
my $output = read_file("$BASE/output");
54
1
320
eq_or_diff_text( $output, $wanted, "Check command STDOUT" );
55
56
1
1629
ok( -d "$TARGET/$PREFIX-foobar-fnord-bla", "First directory moved" );
57
1
1218
ok( ! -e "$TARGET/$PREFIX-fnord-bla", "Symlink 1 not moved" );
58
1
1341
ok( ! -e "$TARGET/$PREFIX-foobar-blafasel-bla", "Symlink 2 not moved" );
59
60
1
6187
ok( rmtree("$BASE"), "Clean up" );
61
62
1
1079
done_testing();
unburden-home-dir-0.3.2.2/cover_db/t-check-symlinks-in-path-t--branch.html0000644000000000000000000000250612123071317023033 0ustar Branch Coverage: t/check-symlinks-in-path.t

Branch Coverage

File:t/check-symlinks-in-path.t
Coverage:50.0%

line%coveragebranch
3950TFunless (which('lsof'))
unburden-home-dir-0.3.2.2/cover_db/t-check-symlinks-in-path-t--subroutine.html0000644000000000000000000000325612123071317024000 0ustar Subroutine Coverage: t/check-symlinks-in-path.t

Subroutine Coverage

File:t/check-symlinks-in-path.t
Coverage:100.0%

linesubroutine
3
BEGIN
4
BEGIN
5
BEGIN
6
BEGIN
7
BEGIN
8
BEGIN
unburden-home-dir-0.3.2.2/cover_db/t-check-symlinks-without-trailing-slash-t.html0000644000000000000000000002352412123071317024610 0ustar File Coverage: t/check-symlinks-without-trailing-slash.t

File Coverage

File:t/check-symlinks-without-trailing-slash.t
Coverage:96.1%

linestmtbrancondsubpodtimecode
1#!/usr/bin/perl -wl
2
3
1
1
1
4994
46366
62
use Test::More;
4
1
1
1
2250
30834
263
use Test::Differences;
5
1
1
1
17
5
182
use File::Path qw(mkpath rmtree);
6
1
1
1
947
40478
207
use File::Slurp;
7
1
1
1
736
3013
182
use File::Which;
8
1
1
1
1132
18205
497832
use Data::Dumper;
9
10
1
9
my $BASE = 't/check-symlinks-without-trailing-slash';
11
1
10
my $HOME = "$BASE/1";
12
1
8
my $TARGET = "$BASE/2";
13
1
6
my $PREFIX = "u";
14
15# Set a debug environment
16
1
14
$ENV{HOME} = $HOME;
17
18# Clean up possible remainders of aborted tests
19
1
323
rmtree("$BASE");
20
21
1
901
ok( mkpath("$HOME/.foobar", {}), "Create test environment (directories)" );
22
1
1277
ok( ! -d "$TARGET/fnord", "Target directory does not exist" );
23
24
1
1810
ok( symlink("$TARGET/u-foobar-fnord", "$HOME/.foobar/fnord"), "Create test environment (Symlink)" );
25
1
1771
ok( -l "$HOME/.foobar/fnord", "Symlink has been created" );
26
27
1
1603
ok( write_file("$BASE/list", "m d .foobar/fnord foobar-fnord/\n") );
28
1
2516
ok( write_file("$BASE/config", "TARGETDIR=$TARGET\nFILELAYOUT=$PREFIX-\%s") );
29
30
1
2410
my $cmd = "bin/unburden-home-dir -C $BASE/config -L $BASE/list > $BASE/output 2> $BASE/stderr";
31
1
2676031
ok( system($cmd) == 0, "Call '$cmd'" );
32
33
1
1303
my $wanted = "";
34
1
72
unless (which('lsof')) {
35
0
0
    $wanted = "WARNING: lsof not found, not checking for files in use.\n".$wanted;
36}
37
38
1
1590
my $stderr = read_file("$BASE/stderr");
39
1
581
eq_or_diff_text( $stderr, $wanted, "Check command STDERR output" );
40
41
1
1597
$wanted = "Create $TARGET/u-foobar-fnord
42mkdir $TARGET
43mkdir $TARGET/u-foobar-fnord
44";
45
46
1
61
my $output = read_file("$BASE/output");
47
1
343
eq_or_diff_text( $output, $wanted, "Check command STDOUT" );
48
49
1
1457
ok( -d "$TARGET/u-foobar-fnord", "Directory created" );
50
51
1
5414
ok( rmtree("$BASE"), "Clean up" );
52
53
1
1412
done_testing();
unburden-home-dir-0.3.2.2/cover_db/t-check-symlinks-without-trailing-slash-t--branch.html0000644000000000000000000000254412123071317026117 0ustar Branch Coverage: t/check-symlinks-without-trailing-slash.t

Branch Coverage

File:t/check-symlinks-without-trailing-slash.t
Coverage:50.0%

line%coveragebranch
3450TFunless (which('lsof'))
unburden-home-dir-0.3.2.2/cover_db/t-check-symlinks-without-trailing-slash-t--subroutine.html0000644000000000000000000000331412123071317027055 0ustar Subroutine Coverage: t/check-symlinks-without-trailing-slash.t

Subroutine Coverage

File:t/check-symlinks-without-trailing-slash.t
Coverage:100.0%

linesubroutine
3
BEGIN
4
BEGIN
5
BEGIN
6
BEGIN
7
BEGIN
8
BEGIN
unburden-home-dir-0.3.2.2/cover_db/t-create-empty-directories-t.html0000644000000000000000000002507312123071317022156 0ustar File Coverage: t/create-empty-directories.t

File Coverage

File:t/create-empty-directories.t
Coverage:96.2%

linestmtbrancondsubpodtimecode
1#!/usr/bin/perl -wl
2
3
1
1
1
4918
47719
61
use Test::More;
4
1
1
1
2175
33159
399
use Test::Differences;
5
1
1
1
27
6
290
use File::Path qw(mkpath rmtree);
6
1
1
1
980
45095
210
use File::Slurp;
7
1
1
1
972
2776
159
use File::Which;
8
1
1
1
1600
27215
551802
use Data::Dumper;
9
10
1
8
my $BASE = 't/create-empty-directories';
11
1
10
my $HOME = "$BASE/home";
12
1
8
my $TARGET = "$BASE/target";
13
1
6
my $PREFIX = "u";
14
15# Set a debug environment
16
1
15
$ENV{HOME} = $HOME;
17
18# Clean up possible remainders of aborted tests
19
1
328
rmtree("$BASE");
20
21
1
871
ok( mkpath("$HOME", "$TARGET", {}), "Create test environment (directories)" );
22
1
1210
ok( -d "$HOME", "Original directory has been created" );
23
1
1629
ok( -d "$TARGET", "Target directory has been created" );
24
1
1338
ok( ! -d "$TARGET/$PREFIX-foobar-fnord", "unburden directory doesn't yet exist" );
25
26
1
1484
ok( write_file("$BASE/list", "r D .foobar/fnord foobar-fnord"), "Create list" );
27
1
2535
ok( write_file("$BASE/config", "TARGETDIR=$TARGET\nFILELAYOUT=$PREFIX-\%s"), "Create config" );
28
29
1
2314
my $cmd = "bin/unburden-home-dir -C $BASE/config -L $BASE/list > $BASE/output 2> $BASE/stderr";
30
1
2516500
ok( system($cmd) == 0, "Call '$cmd'" );
31
32
1
1993
my $wanted = "";
33
1
72
unless (which('lsof')) {
34
0
0
    $wanted = "WARNING: lsof not found, not checking for files in use.\n".$wanted;
35}
36
37
1
2642
my $stderr = read_file("$BASE/stderr");
38
1
874
eq_or_diff_text( $stderr, $wanted, "Check command STDERR output (should be empty)" );
39
40
1
2399
$wanted = "Create directory t/create-empty-directories/target/u-foobar-fnord and parents
41mkdir t/create-empty-directories/target/u-foobar-fnord
42Create parent directories for $HOME/.foobar/fnord
43mkdir $HOME/.foobar
44Symlinking $HOME/.foobar/fnord -> $TARGET/u-foobar-fnord
45";
46
47
1
62
my $output = read_file("$BASE/output");
48
1
380
eq_or_diff_text( $output, $wanted, "Check command STDOUT" );
49
50
1
2139
ok( -d "$TARGET/$PREFIX-foobar-fnord", "Directory has been created" );
51
1
3066
ok( -d "$HOME/.foobar", "Parent directory of symlink has been created." );
52
1
1528
ok( -l "$HOME/.foobar/fnord", "Symlink has been created." );
53
54
1
8600
ok( rmtree("$BASE"), "Clean up" );
55
56
1
1036
done_testing();
unburden-home-dir-0.3.2.2/cover_db/t-create-empty-directories-t--branch.html0000644000000000000000000000251212123071317023457 0ustar Branch Coverage: t/create-empty-directories.t

Branch Coverage

File:t/create-empty-directories.t
Coverage:50.0%

line%coveragebranch
3350TFunless (which('lsof'))
unburden-home-dir-0.3.2.2/cover_db/t-create-empty-directories-t--subroutine.html0000644000000000000000000000326212123071317024424 0ustar Subroutine Coverage: t/create-empty-directories.t

Subroutine Coverage

File:t/create-empty-directories.t
Coverage:100.0%

linesubroutine
3
BEGIN
4
BEGIN
5
BEGIN
6
BEGIN
7
BEGIN
8
BEGIN
unburden-home-dir-0.3.2.2/cover_db/t-find-per-user-stuff-xdg-t.html0000644000000000000000000002761712123071317021640 0ustar File Coverage: t/find-per-user-stuff-xdg.t

File Coverage

File:t/find-per-user-stuff-xdg.t
Coverage:96.5%

linestmtbrancondsubpodtimecode
1#!/usr/bin/perl -wl
2
3
1
1
1
4870
59062
63
use Test::More;
4
1
1
1
2172
31506
256
use Test::Differences;
5
1
1
1
16
5
179
use File::Path qw(mkpath rmtree);
6
1
1
1
975
53689
208
use File::Slurp;
7
1
1
1
729
2991
166
use File::Which;
8
1
1
1
1140
18452
568917
use Data::Dumper;
9
10
1
10
my $BASE = 't/find-per-user-stuff';
11
1
8
my $HOME = "$BASE/1";
12
1
8
my $TARGET = "$BASE/2";
13
1
10
my $BASENAME = "unburden-home-dir_TEST_$$";
14
1
6
my $PREFIX = "u";
15
16# Set a debug environment
17
1
15
$ENV{HOME} = $HOME;
18
19# Clean up possible remainders of aborted tests
20
1
322
rmtree("$BASE");
21
22
1
1880
ok( mkpath("$HOME/.foobar/fnord/bla", "$TARGET", "$HOME/.config/$BASENAME", {}), "Create test environment (directories)" );
23
1
1224
ok( -d "$HOME/.foobar/fnord/bla", "Original directory has been created" );
24
1
1542
ok( -d "$TARGET", "Target directory has been created" );
25
26
1
1595
ok( symlink("$HOME/.foobar/fnord", "$HOME/.fnord"), "Create test environment (Symlink 1)" );
27
1
1191
ok( -l "$HOME/.fnord", "Symlink 1 has been created" );
28
1
1518
ok( symlink("fnord", "$HOME/.foobar/blafasel"), "Create test environment (Symlink 2)" );
29
1
1253
ok( -l "$HOME/.foobar/blafasel", "Symlink 2 has been created" );
30
31
1
1258
ok( write_file("$HOME/.config/$BASENAME/list", "m d .foobar/fnord/bla foobar-fnord-bla\nm d .fnord/bla fnord-bla\nm d .foobar/blafasel/bla foobar-blafasel-bla\n") );
32
1
1780
ok( write_file("$HOME/.config/$BASENAME/config", "TARGETDIR=$TARGET\nFILELAYOUT=$PREFIX-\%s") );
33
34
1
1765
my $cmd = "bin/unburden-home-dir -b $BASENAME > $BASE/output 2> $BASE/stderr";
35
1
2976901
ok( system($cmd) == 0, "Call '$cmd'" );
36
37
1
1300
my $wanted = "Skipping '$HOME/.fnord/bla' due to symlink in path: $HOME/.fnord
38Skipping '$HOME/.foobar/blafasel/bla' due to symlink in path: $HOME/.foobar/blafasel
39";
40
1
72
unless (which('lsof')) {
41
0
0
    $wanted = "WARNING: lsof not found, not checking for files in use.\n".$wanted;
42}
43
44
1
1863
my $stderr = read_file("$BASE/stderr");
45
1
284
eq_or_diff_text( $stderr, $wanted, "Check command STDERR output" );
46
47
1
1606
$wanted = "Moving $HOME/.foobar/fnord/bla -> $TARGET/u-foobar-fnord-bla
48sending incremental file list
49created directory $TARGET/u-foobar-fnord-bla
50./
51Symlinking $TARGET/u-foobar-fnord-bla -> $HOME/.foobar/fnord/bla
52";
53
54
1
66
my $output = read_file("$BASE/output");
55
1
326
eq_or_diff_text( $output, $wanted, "Check command STDOUT" );
56
57
1
1627
ok( -d "$TARGET/$PREFIX-foobar-fnord-bla", "First directory moved" );
58
1
1212
ok( ! -e "$TARGET/$PREFIX-fnord-bla", "Symlink 1 not moved" );
59
1
1324
ok( ! -e "$TARGET/$PREFIX-foobar-blafasel-bla", "Symlink 2 not moved" );
60
61
1
8267
ok( rmtree("$BASE"), "Clean up" );
62
63
1
1123
done_testing();
unburden-home-dir-0.3.2.2/cover_db/t-find-per-user-stuff-xdg-t--branch.html0000644000000000000000000000251012123071317023131 0ustar Branch Coverage: t/find-per-user-stuff-xdg.t

Branch Coverage

File:t/find-per-user-stuff-xdg.t
Coverage:50.0%

line%coveragebranch
4050TFunless (which('lsof'))
unburden-home-dir-0.3.2.2/cover_db/t-find-per-user-stuff-xdg-t--subroutine.html0000644000000000000000000000326012123071317024076 0ustar Subroutine Coverage: t/find-per-user-stuff-xdg.t

Subroutine Coverage

File:t/find-per-user-stuff-xdg.t
Coverage:100.0%

linesubroutine
3
BEGIN
4
BEGIN
5
BEGIN
6
BEGIN
7
BEGIN
8
BEGIN
unburden-home-dir-0.3.2.2/cover_db/t-find-per-user-stuff-t.html0000644000000000000000000002746312123071317021057 0ustar File Coverage: t/find-per-user-stuff.t

File Coverage

File:t/find-per-user-stuff.t
Coverage:96.5%

linestmtbrancondsubpodtimecode
1#!/usr/bin/perl -wl
2
3
1
1
1
5077
45703
62
use Test::More;
4
1
1
1
2852
33244
409
use Test::Differences;
5
1
1
1
25
8
323
use File::Path qw(mkpath rmtree);
6
1
1
1
1598
50791
216
use File::Slurp;
7
1
1
1
1168
2925
248
use File::Which;
8
1
1
1
1126
18270
605010
use Data::Dumper;
9
10
1
9
my $BASE = 't/find-per-user-stuff';
11
1
8
my $HOME = "$BASE/1";
12
1
8
my $TARGET = "$BASE/2";
13
1
10
my $BASENAME = "unburden-home-dir_TEST_$$";
14
1
6
my $PREFIX = "u";
15
16# Set a debug environment
17
1
16
$ENV{HOME} = $HOME;
18
19# Clean up possible remainders of aborted tests
20
1
347
rmtree("$BASE");
21
22
1
1398
ok( mkpath("$HOME/.foobar/fnord/bla", "$TARGET", {}), "Create test environment (directories)" );
23
1
1211
ok( -d "$HOME/.foobar/fnord/bla", "Original directory has been created" );
24
1
1859
ok( -d "$TARGET", "Target directory has been created" );
25
26
1
1438
ok( symlink("$HOME/.foobar/fnord", "$HOME/.fnord"), "Create test environment (Symlink 1)" );
27
1
1275
ok( -l "$HOME/.fnord", "Symlink 1 has been created" );
28
1
1509
ok( symlink("fnord", "$HOME/.foobar/blafasel"), "Create test environment (Symlink 2)" );
29
1
1159
ok( -l "$HOME/.foobar/blafasel", "Symlink 2 has been created" );
30
31
1
1253
ok( write_file("$HOME/.$BASENAME.list", "m d .foobar/fnord/bla foobar-fnord-bla\nm d .fnord/bla fnord-bla\nm d .foobar/blafasel/bla foobar-blafasel-bla\n") );
32
1
1771
ok( write_file("$HOME/.$BASENAME", "TARGETDIR=$TARGET\nFILELAYOUT=$PREFIX-\%s") );
33
34
1
1651
my $cmd = "bin/unburden-home-dir -b $BASENAME > $BASE/output 2> $BASE/stderr";
35
1
2883094
ok( system($cmd) == 0, "Call '$cmd'" );
36
37
1
2073
my $wanted = "Skipping '$HOME/.fnord/bla' due to symlink in path: $HOME/.fnord
38Skipping '$HOME/.foobar/blafasel/bla' due to symlink in path: $HOME/.foobar/blafasel
39";
40
1
75
unless (which('lsof')) {
41
0
0
    $wanted = "WARNING: lsof not found, not checking for files in use.\n".$wanted;
42}
43
44
1
1506
my $stderr = read_file("$BASE/stderr");
45
1
367
eq_or_diff_text( $stderr, $wanted, "Check command STDERR output" );
46
47
1
3504
$wanted = "Moving $HOME/.foobar/fnord/bla -> $TARGET/u-foobar-fnord-bla
48sending incremental file list
49created directory $TARGET/u-foobar-fnord-bla
50./
51Symlinking $TARGET/u-foobar-fnord-bla -> $HOME/.foobar/fnord/bla
52";
53
54
1
75
my $output = read_file("$BASE/output");
55
1
315
eq_or_diff_text( $output, $wanted, "Check command STDOUT" );
56
57
1
2997
ok( -d "$TARGET/$PREFIX-foobar-fnord-bla", "First directory moved" );
58
1
1554
ok( ! -e "$TARGET/$PREFIX-fnord-bla", "Symlink 1 not moved" );
59
1
3216
ok( ! -e "$TARGET/$PREFIX-foobar-blafasel-bla", "Symlink 2 not moved" );
60
61
1
10696
ok( rmtree("$BASE"), "Clean up" );
62
63
1
1614
done_testing();
unburden-home-dir-0.3.2.2/cover_db/t-find-per-user-stuff-t--branch.html0000644000000000000000000000250012123071317022350 0ustar Branch Coverage: t/find-per-user-stuff.t

Branch Coverage

File:t/find-per-user-stuff.t
Coverage:50.0%

line%coveragebranch
4050TFunless (which('lsof'))
unburden-home-dir-0.3.2.2/cover_db/t-find-per-user-stuff-t--subroutine.html0000644000000000000000000000325012123071317023315 0ustar Subroutine Coverage: t/find-per-user-stuff.t

Subroutine Coverage

File:t/find-per-user-stuff.t
Coverage:100.0%

linesubroutine
3
BEGIN
4
BEGIN
5
BEGIN
6
BEGIN
7
BEGIN
8
BEGIN
unburden-home-dir-0.3.2.2/cover_db/t-moving-to-existing-subdir-t.html0000644000000000000000000003437012123071317022302 0ustar File Coverage: t/moving-to-existing-subdir.t

File Coverage

File:t/moving-to-existing-subdir.t
Coverage:96.7%

linestmtbrancondsubpodtimecode
1#!/usr/bin/perl -wl
2
3
1
1
1
7392
80475
175
use Test::More;
4
1
1
1
4331
48957
436
use Test::Differences;
5
1
1
1
18
5
186
use File::Path qw(mkpath rmtree);
6
1
1
1
969
48528
340
use File::Slurp;
7
1
1
1
1135
4741
263
use File::Which;
8
1
1
1
1669
19976
661509
use Data::Dumper;
9
10
1
13
my $BASE = 't/moving-to-existing-subdir';
11
1
15
my $HOME = "$BASE/home";
12
1
15
my $TARGET = "$BASE/target";
13
1
11
my $PREFIX = "u";
14
15# Set a debug environment
16
1
20
$ENV{HOME} = $HOME;
17
1
16
$ENV{LANG} = 'C';
18
19# Clean up possible remainders of aborted tests
20
1
531
rmtree("$BASE");
21
22
1
2381
ok( mkpath("$HOME/.foobar/fnord", "$HOME/.foobar/gnarz",
23           "$TARGET/$PREFIX-foobar-gnarz", {}), "Create test environment (directories)" );
24
1
3257
ok( -d "$HOME/.foobar/fnord", "Original directory has been created" );
25
1
1697
ok( -d "$TARGET", "Target directory has been created" );
26
27
1
2547
ok( write_file("$HOME/.foobar/fnord/bla", "123\n"), "Create file 1" );
28
1
3336
ok( write_file("$HOME/.foobar/gnarz/goo", "456\n"), "Create file 2" );
29
1
2265
ok( write_file("$HOME/.foobar/foo", "abc\n"), "Create file 3" );
30
31
1
3682
ok( write_file("$BASE/list", "m d .foobar/fnord foobar-fnord\nm d .foobar/gnarz foobar-gnarz\nm f .foobar/foo foobar-foo\n"), "Create list" );
32
1
3116
ok( write_file("$BASE/config", "TARGETDIR=$TARGET\nFILELAYOUT=$PREFIX-\%s"), "Create config" );
33
34
1
3061
my $cmd = "bin/unburden-home-dir -C $BASE/config -L $BASE/list > $BASE/output 2> $BASE/stderr";
35
1
3742054
ok( system($cmd) == 0, "Call '$cmd'" );
36
37
1
1439
my $wanted = "";
38
1
69
unless (which('lsof')) {
39
0
0
    $wanted = "WARNING: lsof not found, not checking for files in use.\n".$wanted;
40}
41
42
1
1624
my $stderr = read_file("$BASE/stderr");
43
1
555
unified_diff;
44
1
100
eq_or_diff_text( $stderr, $wanted, "Check command STDERR output (should be empty)" );
45
46
1
1671
$wanted = "Moving $HOME/.foobar/fnord -> $TARGET/u-foobar-fnord
47sending incremental file list
48created directory $TARGET/u-foobar-fnord
49./
50bla
51Symlinking $TARGET/u-foobar-fnord -> $HOME/.foobar/fnord
52Moving $HOME/.foobar/gnarz -> $TARGET/u-foobar-gnarz
53sending incremental file list
54goo
55Symlinking $TARGET/u-foobar-gnarz -> $HOME/.foobar/gnarz
56Moving $HOME/.foobar/foo -> $TARGET/u-foobar-foo
57'$HOME/.foobar/foo' -> '$TARGET/u-foobar-foo'
58Symlinking $TARGET/u-foobar-foo -> $HOME/.foobar/foo
59";
60
61
1
71
my $output = read_file("$BASE/output");
62
63# Somewhere between coreutils 8.13 (until Wheezy/Quantal), and 8.20
64# (from Jessie/Raring on) the quoting characters in verbose output of
65# mv. changed. $wanted contains the newer style. In case this test
66# runs with older version of coreutils, we change the output to look
67# like the one from the newer versions.
68
1
326
$output =~ s/\`/\'/g;
69
70
1
65
eq_or_diff_text( $output, $wanted, "Check command STDOUT" );
71
72
1
1617
ok( -d "$TARGET/$PREFIX-foobar-fnord", "First directory moved" );
73
1
1316
ok( -d "$TARGET/$PREFIX-foobar-gnarz", "Second directory moved" );
74
1
1183
ok( -f "$TARGET/$PREFIX-foobar-fnord/bla", "File 1 moved" );
75
1
1173
ok( -f "$TARGET/$PREFIX-foobar-gnarz/goo", "File 2 moved" );
76
1
1284
ok( -f "$TARGET/$PREFIX-foobar-foo", "File 3 moved" );
77
78
1
6724
ok( rmtree("$BASE"), "Clean up" );
79
80
1
1036
done_testing();
unburden-home-dir-0.3.2.2/cover_db/t-moving-to-existing-subdir-t--branch.html0000644000000000000000000000251412123071317023605 0ustar Branch Coverage: t/moving-to-existing-subdir.t

Branch Coverage

File:t/moving-to-existing-subdir.t
Coverage:50.0%

line%coveragebranch
3850TFunless (which('lsof'))
unburden-home-dir-0.3.2.2/cover_db/t-moving-to-existing-subdir-t--subroutine.html0000644000000000000000000000326412123071317024552 0ustar Subroutine Coverage: t/moving-to-existing-subdir.t

Subroutine Coverage

File:t/moving-to-existing-subdir.t
Coverage:100.0%

linesubroutine
3
BEGIN
4
BEGIN
5
BEGIN
6
BEGIN
7
BEGIN
8
BEGIN
unburden-home-dir-0.3.2.2/cover_db/t-parse-comments-and-blank-lines-t.html0000644000000000000000000002736512123071317023145 0ustar File Coverage: t/parse-comments-and-blank-lines.t

File Coverage

File:t/parse-comments-and-blank-lines.t
Coverage:96.4%

linestmtbrancondsubpodtimecode
1#!/usr/bin/perl -wl
2
3
1
1
1
5216
47187
61
use Test::More;
4
1
1
1
2308
30764
254
use Test::Differences;
5
1
1
1
15
5
171
use File::Path qw(mkpath rmtree);
6
1
1
1
1023
40424
205
use File::Slurp;
7
1
1
1
730
2879
161
use File::Which;
8
1
1
1
1122
18792
518197
use Data::Dumper;
9
10
1
8
my $BASE = 't/parse-comments-and-blank-lines';
11
1
9
my $HOME = "$BASE/1";
12
1
7
my $TARGET = "$BASE/2";
13
1
6
my $PREFIX = "u";
14
15# Set a debug environment
16
1
15
$ENV{HOME} = $HOME;
17
18# Clean up possible remainders of aborted tests
19
1
339
rmtree("$BASE");
20
21
1
1578
ok( mkpath("$HOME/.foobar/fnord/bla", "$TARGET", {}), "Create test environment (directories)" );
22
1
1210
ok( -d "$HOME/.foobar/fnord/bla", "Original directory has been created" );
23
1
1810
ok( -d "$TARGET", "Target directory has been created" );
24
25
1
1452
ok( symlink("$HOME/.foobar/fnord", "$HOME/.fnord"), "Create test environment (Symlink 1)" );
26
1
1197
ok( -l "$HOME/.fnord", "Symlink 1 has been created" );
27
1
1487
ok( symlink("fnord", "$HOME/.foobar/blafasel"), "Create test environment (Symlink 2)" );
28
1
1189
ok( -l "$HOME/.foobar/blafasel", "Symlink 2 has been created" );
29
30
1
1186
ok( write_file("$BASE/list", "m d .foobar/fnord/bla foobar-fnord-bla\n# Comment\n\n \n \nm d .fnord/bla fnord-bla\nm d .foobar/blafasel/bla foobar-blafasel-bla\n") );
31
1
1925
ok( write_file("$BASE/config", "TARGETDIR=$TARGET\nFILELAYOUT=$PREFIX-\%s") );
32
33
1
1681
my $cmd = "bin/unburden-home-dir -C $BASE/config -L $BASE/list > $BASE/output 2> $BASE/stderr";
34
1
3092054
ok( system($cmd) == 0, "Call '$cmd'" );
35
36
1
1982
my $wanted = "Skipping '$HOME/.fnord/bla' due to symlink in path: $HOME/.fnord
37Skipping '$HOME/.foobar/blafasel/bla' due to symlink in path: $HOME/.foobar/blafasel
38";
39
1
73
unless (which('lsof')) {
40
0
0
    $wanted = "WARNING: lsof not found, not checking for files in use.\n".$wanted;
41}
42
43
1
1550
my $stderr = read_file("$BASE/stderr");
44
1
420
eq_or_diff_text( $stderr, $wanted, "Check command STDERR output" );
45
46
1
3560
$wanted = "Moving $HOME/.foobar/fnord/bla -> $TARGET/u-foobar-fnord-bla
47sending incremental file list
48created directory $TARGET/u-foobar-fnord-bla
49./
50Symlinking $TARGET/u-foobar-fnord-bla -> $HOME/.foobar/fnord/bla
51";
52
53
1
67
my $output = read_file("$BASE/output");
54
1
387
eq_or_diff_text( $output, $wanted, "Check command STDOUT" );
55
56
1
3037
ok( -d "$TARGET/$PREFIX-foobar-fnord-bla", "First directory moved" );
57
1
1611
ok( ! -e "$TARGET/$PREFIX-fnord-bla", "Symlink 1 not moved" );
58
1
3278
ok( ! -e "$TARGET/$PREFIX-foobar-blafasel-bla", "Symlink 2 not moved" );
59
60
1
11573
ok( rmtree("$BASE"), "Clean up" );
61
62
1
1617
done_testing();
unburden-home-dir-0.3.2.2/cover_db/t-parse-comments-and-blank-lines-t--branch.html0000644000000000000000000000252612123071317024445 0ustar Branch Coverage: t/parse-comments-and-blank-lines.t

Branch Coverage

File:t/parse-comments-and-blank-lines.t
Coverage:50.0%

line%coveragebranch
3950TFunless (which('lsof'))
unburden-home-dir-0.3.2.2/cover_db/t-parse-comments-and-blank-lines-t--subroutine.html0000644000000000000000000000327612123071317025412 0ustar Subroutine Coverage: t/parse-comments-and-blank-lines.t

Subroutine Coverage

File:t/parse-comments-and-blank-lines.t
Coverage:100.0%

linesubroutine
3
BEGIN
4
BEGIN
5
BEGIN
6
BEGIN
7
BEGIN
8
BEGIN
unburden-home-dir-0.3.2.2/cover_db/t-replacement-order-dryrun-t.html0000644000000000000000000001661212123071317022175 0ustar File Coverage: t/replacement-order-dryrun.t

File Coverage

File:t/replacement-order-dryrun.t
Coverage:100.0%

linestmtbrancondsubpodtimecode
1#!/usr/bin/perl -wl
2
3
1
1
1
5054
74442
94
use Test::More;
4
1
1
1
2919
35723
396
use Test::Differences;
5
1
1
1
26
9
329
use File::Path qw(mkpath rmtree);
6
1
1
1
1552
61669
206
use File::Slurp;
7
1
1
1
1092
17939
563946
use Data::Dumper;
8
9
1
13
my $BASE = 't/replacement-order-dryrun';
10
1
36
my $HOME = "$BASE/1";
11
1
13
my $TARGET = "$BASE/2";
12
1
8
my $PREFIX = "u";
13
14# Set a debug environment
15
1
20
$ENV{HOME} = $HOME;
16
17
1
2229
ok( mkpath("$HOME/.foobar/blatest/barba", "$TARGET") );
18
19
1
5498
ok( write_file("$BASE/list", 'm d .foo*/bla*/bar* bar%3-bla%2-foo%1') );
20
1
2381
ok( write_file("$BASE/config", "TARGETDIR=$TARGET\nFILELAYOUT=$PREFIX-\%s") );
21
22
1
2972900
ok( system("bin/unburden-home-dir -n -C $BASE/config -L $BASE/list > $BASE/output" ) == 0 );
23
24
1
1258
my $wanted = <<EOF;
25Create parent directories for $TARGET/u-barba-blatest-foobar
26Moving $HOME/.foobar/blatest/barba -> $TARGET/u-barba-blatest-foobar
27Symlinking $TARGET/u-barba-blatest-foobar -> $HOME/.foobar/blatest/barba
28EOF
29
30
1
70
my $output = read_file("$BASE/output");
31
1
407
eq_or_diff_text( $output, $wanted, "Check output if as expected" );
32
33
1
2257
ok( ! -e "$TARGET/$PREFIX-barba-blatest-foobar" );
34
1
1330
ok( ! -l "$HOME/.foobar/blatest/barba" );
35
1
1188
ok( -d "$HOME/.foobar/blatest/barba" );
36
37
1
4861
ok( rmtree("$BASE") );
38
39
1
1178
done_testing();
unburden-home-dir-0.3.2.2/cover_db/t-replacement-order-dryrun-t--subroutine.html0000644000000000000000000000312712123071317024444 0ustar Subroutine Coverage: t/replacement-order-dryrun.t

Subroutine Coverage

File:t/replacement-order-dryrun.t
Coverage:100.0%

linesubroutine
3
BEGIN
4
BEGIN
5
BEGIN
6
BEGIN
7
BEGIN
unburden-home-dir-0.3.2.2/cover_db/t-replacement-order-t.html0000644000000000000000000001511312123071317020647 0ustar File Coverage: t/replacement-order.t

File Coverage

File:t/replacement-order.t
Coverage:100.0%

linestmtbrancondsubpodtimecode
1#!/usr/bin/perl -wl
2
3
1
1
1
5031
45758
61
use Test::More;
4
1
1
1
2317
31218
249
use Test::Differences;
5
1
1
1
16
5
179
use File::Path qw(mkpath rmtree);
6
1
1
1
962
55539
207
use File::Slurp;
7
1
1
1
1093
17797
495986
use Data::Dumper;
8
9
1
11
my $BASE = 't/replacement-order';
10
1
22
my $HOME = "$BASE/1";
11
1
10
my $TARGET = "$BASE/2";
12
1
6
my $PREFIX = "u";
13
14# Set a debug environment
15
1
15
$ENV{HOME} = $HOME;
16
17
1
1749
ok( mkpath("$HOME/.foobar/blatest/barba", "$TARGET") );
18
19
1
1495
ok( write_file("$BASE/list", 'm d .foo*/bla*/bar* bar%3-bla%2-foo%1') );
20
1
2298
ok( write_file("$BASE/config", "TARGETDIR=$TARGET\nFILELAYOUT=$PREFIX-\%s") );
21
22
1
2977550
ok( system(qw(bin/unburden-home-dir -C), "$BASE/config", qw(-L), "$BASE/list" ) == 0 );
23
24
1
1505
ok( -d "$TARGET/$PREFIX-barba-blatest-foobar" );
25
1
1566
ok( -l "$HOME/.foobar/blatest/barba" );
26
1
1299
eq_or_diff_text( "$TARGET/$PREFIX-barba-blatest-foobar",
27                 readlink("$HOME/.foobar/blatest/barba"),
28                 "Symlink points to expected location." );
29
30
1
8549
ok( rmtree("$BASE") );
31
32
1
1016
done_testing();
unburden-home-dir-0.3.2.2/cover_db/t-replacement-order-t--subroutine.html0000644000000000000000000000311112123071317023114 0ustar Subroutine Coverage: t/replacement-order.t

Subroutine Coverage

File:t/replacement-order.t
Coverage:100.0%

linesubroutine
3
BEGIN
4
BEGIN
5
BEGIN
6
BEGIN
7
BEGIN
unburden-home-dir-0.3.2.2/cover_db/t-skip-non-home-t.html0000644000000000000000000002531012123071317017723 0ustar File Coverage: t/skip-non-home.t

File Coverage

File:t/skip-non-home.t
Coverage:96.3%

linestmtbrancondsubpodtimecode
1#!/usr/bin/perl -wl
2
3
1
1
1
4995
46798
62
use Test::More;
4
1
1
1
2295
30681
349
use Test::Differences;
5
1
1
1
26
8
272
use File::Path qw(mkpath rmtree);
6
1
1
1
1576
62929
334
use File::Slurp;
7
1
1
1
1134
4657
255
use File::Which;
8
1
1
1
1768
19511
524750
use Data::Dumper;
9
10
1
12
my $BASE = 't/skip-non-home';
11
1
13
my $HOME = "$BASE/1";
12
1
11
my $TARGET = "$BASE/2";
13
1
8
my $PREFIX = "u";
14
15# Set a debug environment
16
1
18
$ENV{HOME} = $HOME;
17
18# Clean up possible remainders of aborted tests
19
1
398
rmtree("$BASE");
20
21
1
13
foreach my $example (qw(/foobar ../foobar)) {
22    # Create test environment
23
2
77266
    ok( mkpath("$HOME/foobar", {}), "Create test environment (directories)" );
24
2
2621
    ok( -d "$HOME/foobar", "Original directory has been created" );
25
26
2
2729
    ok( ! -d "$BASE/foobar", "$BASE/foobar does not exist (check for safe environment)" );
27
2
5903
    ok( ! -d "/foobar", "$BASE/foobar does not exist (check for safe environment)" );
28
29
2
2877
    ok( write_file("$BASE/list", "m d $example foobar") );
30
2
5443
    ok( write_file("$BASE/config", "TARGETDIR=$TARGET\nFILELAYOUT=$PREFIX-\%s") );
31
32
2
4403
    my $cmd = "bin/unburden-home-dir -C $BASE/config -L $BASE/list > $BASE/output 2> $BASE/stderr";
33
2
5237301
    ok( system($cmd) == 0, "Call '$cmd'" );
34
35
2
2599
    my $wanted = "$example would be outside of the home directory, skipping...\n";
36
2
138
    unless (which('lsof')) {
37
0
0
        $wanted = "WARNING: lsof not found, not checking for files in use.\n".$wanted;
38    }
39
40
2
3199
    my $stderr = read_file("$BASE/stderr");
41
2
634
    eq_or_diff_text( $stderr, $wanted, "Check command STDERR output" );
42
43
2
3707
    my $output = read_file("$BASE/output");
44
2
1459
    eq_or_diff_text( $output, '', "Check command STDOUT (should be empty)" );
45
46
2
2770
    ok( ! -d "$TARGET/$PREFIX-foobar", "Nothing created" );
47
2
2582
    ok( ! -d "$TARGET", "Nothing created" );
48
49
2
2655
    ok( ! -d "$BASE/foobar", "$BASE/foobar still does not exist" );
50
2
2199
    ok( ! -d "/foobar", "$BASE/foobar still does not exist" );
51
52
2
9551
    ok( rmtree("$BASE"), "Clean up" );
53}
54
55
1
1232
done_testing();
unburden-home-dir-0.3.2.2/cover_db/t-skip-non-home-t--branch.html0000644000000000000000000000246412123071317021240 0ustar Branch Coverage: t/skip-non-home.t

Branch Coverage

File:t/skip-non-home.t
Coverage:50.0%

line%coveragebranch
3650TFunless (which('lsof'))
unburden-home-dir-0.3.2.2/cover_db/t-skip-non-home-t--subroutine.html0000644000000000000000000000323412123071317022176 0ustar Subroutine Coverage: t/skip-non-home.t

Subroutine Coverage

File:t/skip-non-home.t
Coverage:100.0%

linesubroutine
3
BEGIN
4
BEGIN
5
BEGIN
6
BEGIN
7
BEGIN
8
BEGIN
unburden-home-dir-0.3.2.2/cover_db/t-undo-dryrun-t.html0000644000000000000000000002157212123071317017533 0ustar File Coverage: t/undo-dryrun.t

File Coverage

File:t/undo-dryrun.t
Coverage:100.0%

linestmtbrancondsubpodtimecode
1#!/usr/bin/perl -wl
2
3
1
1
1
13796
46042
62
use Test::More;
4
1
1
1
2182
38668
393
use Test::Differences;
5
1
1
1
27
7
317
use File::Path qw(mkpath rmtree);
6
1
1
1
1519
56665
318
use File::Slurp;
7
1
1
1
1560
27475
587000
use Data::Dumper;
8
9
1
8
my $BASE = 't/undo-dryrun';
10
1
23
my $HOME = "$BASE/1";
11
1
8
my $TARGET = "$BASE/2";
12
1
6
my $PREFIX = "u";
13
14# Set a debug environment
15
1
14
$ENV{HOME} = $HOME;
16
17
1
1389
ok( mkpath("$HOME/.foobar/blatest", "$TARGET/$PREFIX-barba-blatest-foobar", {}), "Create test environment (directories)" );
18
1
1289
ok( -d "$TARGET", "Target directory has been created" );
19
1
1743
ok( symlink("$TARGET/$PREFIX-barba-blatest-foobar", "$HOME/.foobar/blatest/barba"), "Create test environment (symlink)" );
20
21
1
1155
ok( write_file("$BASE/list", 'm d .foo*/bla*/bar* bar%3-bla%2-foo%1'), "Create list" );
22
1
1861
ok( write_file("$BASE/config", "TARGETDIR=$TARGET\nFILELAYOUT=$PREFIX-\%s"), "Create config" );
23
24
1
1681
my $cmd = "bin/unburden-home-dir -n -u -C $BASE/config -L $BASE/list > $BASE/output 2> $BASE/stderr";
25
1
2868484
ok( system($cmd) == 0, "Call '$cmd'" );
26
27
1
2056
my $wanted = <<EOF;
28Trying to revert $TARGET/u-barba-blatest-foobar to $HOME/.foobar/blatest/barba
29Removing symlink $HOME/.foobar/blatest/barba
30Moving $TARGET/u-barba-blatest-foobar -> $HOME/.foobar/blatest/barba
31EOF
32
1
89
my $contents = read_file("$BASE/output");
33
1
383
eq_or_diff_text( $contents, $wanted, "Check command output" );
34
35
1
2313
ok( -d "$TARGET", "Base directory still exists" );
36
1
3182
ok( -d "$TARGET/$PREFIX-barba-blatest-foobar", "Directory still exists" );
37
1
2415
ok( -l "$HOME/.foobar/blatest/barba", "Symlink still exists" );
38
1
1487
eq_or_diff_text( "$TARGET/$PREFIX-barba-blatest-foobar",
39                 readlink("$HOME/.foobar/blatest/barba"),
40                 "Symlink still has right target" );
41
42
1
11117
ok( rmtree("$BASE"), "Remove test environment" );
43
44
1
1520
done_testing();
unburden-home-dir-0.3.2.2/cover_db/t-undo-dryrun-t--subroutine.html0000644000000000000000000000307512123071317022003 0ustar Subroutine Coverage: t/undo-dryrun.t

Subroutine Coverage

File:t/undo-dryrun.t
Coverage:100.0%

linesubroutine
3
BEGIN
4
BEGIN
5
BEGIN
6
BEGIN
7
BEGIN
unburden-home-dir-0.3.2.2/cover_db/t-undo-t.html0000644000000000000000000002543012123071317016207 0ustar File Coverage: t/undo.t

File Coverage

File:t/undo.t
Coverage:96.3%

linestmtbrancondsubpodtimecode
1#!/usr/bin/perl -w
2
3
1
1
1
7990
66867
91
use Test::More;
4
1
1
1
3448
44815
310
use Test::Differences;
5
1
1
1
16
4
175
use File::Path qw(mkpath rmtree);
6
1
1
1
992
43521
200
use File::Slurp;
7
1
1
1
776
2849
164
use File::Which;
8
1
1
1
1095
18973
626375
use Data::Dumper;
9
10
1
9
my $BASE = 't/undo';
11
1
9
my $HOME = "$BASE/1";
12
1
7
my $TARGET = "$BASE/2";
13
1
6
my $PREFIX = "u";
14
15# Set a debug environment
16
1
14
$ENV{HOME} = $HOME;
17
18# Clean up possible remainders of aborted tests
19
1
323
rmtree("$BASE");
20
21
1
1362
ok( mkpath("$HOME/.foobar/blatest", "$TARGET/$PREFIX-barba-blatest-foobar", {}), "Create test environment (directories)" );
22
1
1222
ok( -d "$TARGET", "Target directory has been created" );
23
1
1773
ok( symlink("$TARGET/$PREFIX-barba-blatest-foobar", "$HOME/.foobar/blatest/barba"), "Create test environment (symlink)" );
24
1
1214
ok( -l "$HOME/.foobar/blatest/barba", "Symlink has been created" );
25
26
1
1176
ok( write_file("$BASE/list", 'm d .foo*/bla*/bar* bar%3-bla%2-foo%1'), "Create list" );
27
1
1951
ok( write_file("$BASE/config", "TARGETDIR=$TARGET\nFILELAYOUT=$PREFIX-\%s"), "Create config" );
28
29
1
1742
my $cmd = "bin/unburden-home-dir -u -C $BASE/config -L $BASE/list > $BASE/output 2> $BASE/stderr";
30
1
2681183
ok( system($cmd) == 0, "Call '$cmd'" );
31
32
1
1329
my $wanted = "Trying to revert $TARGET/$PREFIX-barba-blatest-foobar to $HOME/.foobar/blatest/barba
33Removing symlink $HOME/.foobar/blatest/barba
34Moving $TARGET/$PREFIX-barba-blatest-foobar -> $HOME/.foobar/blatest/barba
35sending incremental file list
36created directory $HOME/.foobar/blatest/barba
37./
38";
39
40
1
77
my $contents = read_file("$BASE/output");
41
1
379
eq_or_diff_text( $contents, $wanted, "Check command output" );
42
43
1
2055
$wanted = '';
44
1
71
unless (which('lsof')) {
45
0
0
    $wanted = "WARNING: lsof not found, not checking for files in use.\n".$wanted;
46}
47
48
1
1276
my $stderr = read_file("$BASE/stderr");
49
1
533
print "\nSTDERR:\n\n$stderr\n";
50
1
72
eq_or_diff_text( $stderr, $wanted, "Check command STDERR output (should be empty)" );
51
52
1
1541
ok( -d "$TARGET", "Base directory still exists" );
53
1
1179
ok( ! -e "$TARGET/$PREFIX-barba-blatest-foobar", "Directory no more exists" );
54
1
1378
ok( -d "$HOME/.foobar/blatest/barba", "Symlink is a directory again" );
55
56
1
7594
ok( rmtree("$BASE"), "Remove test environment" );
57
58
1
1582
done_testing();
unburden-home-dir-0.3.2.2/cover_db/t-undo-t--branch.html0000644000000000000000000000244212123071317017515 0ustar Branch Coverage: t/undo.t

Branch Coverage

File:t/undo.t
Coverage:50.0%

line%coveragebranch
4450TFunless (which('lsof'))
unburden-home-dir-0.3.2.2/cover_db/t-undo-t--subroutine.html0000644000000000000000000000321212123071317020453 0ustar Subroutine Coverage: t/undo.t

Subroutine Coverage

File:t/undo.t
Coverage:100.0%

linesubroutine
3
BEGIN
4
BEGIN
5
BEGIN
6
BEGIN
7
BEGIN
8
BEGIN
unburden-home-dir-0.3.2.2/cover_db/t-version-t.html0000644000000000000000000001037112123071317016725 0ustar File Coverage: t/version.t

File Coverage

File:t/version.t
Coverage:100.0%

linestmtbrancondsubpodtimecode
1#!/usr/bin/perl -wl
2
3
1
1
1
4802
46207
70
use Test::More tests => 1;
4
1
1
1
2747
39903
201
use File::Slurp;
5
1
1
1
15
5
197
use File::Basename;
6
1
1
1
1
1
1
68
9
88
11
5
517334
use 5.010;
7
8
1
180
my $basedir = dirname($0).'/..';
9
10
1
10512
my $debian_changelog_version = `head -1 $basedir/debian/changelog | awk -F'[ ()]+' '{print \$2}'`;
11
1
26
chomp($debian_changelog_version);
12
1
8522
my $script_version = `egrep '^our .VERSION' $basedir/bin/unburden-home-dir`;
13
1
647
eval($script_version);
14
15
1
111
is( $debian_changelog_version, $VERSION,
16    'Version numbers in debian/changelog and bin/unburden-home-dir are the same' );
17
unburden-home-dir-0.3.2.2/cover_db/t-version-t--subroutine.html0000644000000000000000000000304512123071317021177 0ustar Subroutine Coverage: t/version.t

Subroutine Coverage

File:t/version.t
Coverage:100.0%

linesubroutine
3
BEGIN
4
BEGIN
5
BEGIN
6
BEGIN
BEGIN
unburden-home-dir-0.3.2.2/cover_db/t-xsession-d-t.html0000644000000000000000000003652712123071317017347 0ustar File Coverage: t/xsession-d.t

File Coverage

File:t/xsession-d.t
Coverage:100.0%

linestmtbrancondsubpodtimecode
1#!/usr/bin/perl -wl
2
3
1
1
1
4831
45896
62
use Test::More;
4
1
1
1
2183
31661
235
use Test::Differences;
5
1
1
1
16
5
168
use File::Path qw(mkpath rmtree);
6
1
1
1
928
9871
289
use File::Copy;
7
1
1
1
1434
52018
199
use File::Slurp;
8
1
1
1
764
2797
159
use File::Which;
9
1
1
1
1192
19873
574504
use Data::Dumper;
10
11
1
8
my $BASE = 't/xsession-d';
12
1
8
my $HOME = "$BASE/1";
13
1
7
my $TARGET = "$BASE/2";
14
1
8
my $BINDIR = "$BASE/bin";
15
1
7
my $XSESSIOND = "$BASE/Xsession.d";
16
1
7
my $RPSCRIPT = "95unburden-home-dir";
17
1
10
my $BASENAME = "unburden-home-dir_TEST_$$";
18
19
1
6
my ($cmd, $wanted, $output, $stderr);
20
21# Set a debug environment
22
1
14
$ENV{HOME} = $HOME;
23
1
11
$ENV{PATH} = $BINDIR;
24
1
32
$ENV{UNBURDEN_BASENAME} = $BASENAME;
25
26# Clean up possible remainders of aborted tests
27
1
322
rmtree("$BASE");
28
29
1
1350
ok( mkpath($HOME, $XSESSIOND, $BINDIR, {}), "Create test environment (directories)" );
30
1
1553
ok( -d "$HOME", "Home directory has been created" );
31
1
1785
ok( -d "$BINDIR", "Script directory has been created" );
32
1
1415
ok( -d "$XSESSIOND", "Xsession.d directory has been created" );
33
34
1
1197
ok( copy( "Xsession.d/$RPSCRIPT", "$XSESSIOND/" ), "Install Xsession.d script" );
35
1
2408
ok( write_file("$BINDIR/unburden-home-dir", "#!/bin/sh\necho \$0 called\n"), "Create test script" );
36
1
1802
ok( chmod( 0755, "$BINDIR/unburden-home-dir" ), "Set executable bit on testscript" );
37
1
1129
ok( write_file("$HOME/.$BASENAME", "UNBURDEN_HOME=yes\n"), "Configure Xsession.d script to run unburden-home-dir" );
38
39
1
1794
$cmd = "/bin/run-parts --list $XSESSIOND > $BASE/output 2> $BASE/stderr";
40
1
6305
ok( system($cmd) == 0, "Call '$cmd'" );
41
42
1
1310
$wanted = "";
43
44
1
73
$stderr = read_file("$BASE/stderr");
45
1
772
eq_or_diff_text( $stderr, $wanted, "Check run-parts STDERR output" );
46
1
1840
ok( unlink("$BASE/stderr"), "Clean output" );
47
48
1
1152
$wanted = "$XSESSIOND/$RPSCRIPT\n";
49
50
1
123
$output = read_file("$BASE/output");
51
1
324
eq_or_diff_text( $output, $wanted, "Check run-parts STDOUT" );
52
1
1686
ok( unlink("$BASE/output"), "Clean output" );
53
54
1
1035
$cmd = "/bin/sh $XSESSIOND/$RPSCRIPT > $BASE/output 2> $BASE/stderr";
55
1
8949
ok( system($cmd) == 0, "Call '$cmd'" );
56
57
1
1249
$wanted = "";
58
59
1
71
$stderr = read_file("$BASE/stderr");
60
1
734
eq_or_diff_text( $stderr, $wanted, "Check Xsession.d STDERR output" );
61
1
2027
ok( unlink("$BASE/stderr"), "Clean output" );
62
63
1
1017
$wanted = "$BINDIR/unburden-home-dir called\n";
64
65
1
58
$output = read_file("$BASE/output");
66
1
347
eq_or_diff_text( $output, $wanted, "Check Xsession.d STDOUT" );
67
1
1789
ok( unlink("$BASE/output"), "Clean output" );
68
69
1
1149
ok( write_file("$HOME/.$BASENAME", "UNBURDEN_HOME=no\n"), "Configure Xsession.d script to NOT run unburden-home-dir" );
70
71
1
1709
$cmd = "/bin/sh $XSESSIOND/$RPSCRIPT > $BASE/output 2> $BASE/stderr";
72
1
6322
ok( system($cmd) == 0, "Call '$cmd'" );
73
74
1
1235
$wanted = "";
75
76
1
73
$stderr = read_file("$BASE/stderr");
77
1
739
eq_or_diff_text( $stderr, $wanted, "Check Xsession.d STDERR output" );
78
1
1875
ok( unlink("$BASE/stderr"), "Clean output" );
79
80
1
1015
$wanted = "";
81
82
1
58
$output = read_file("$BASE/output");
83
1
636
eq_or_diff_text( $output, $wanted, "Check Xsession.d STDOUT" );
84
1
1714
ok( unlink("$BASE/output"), "Clean output" );
85
86
1
4372
ok( rmtree("$BASE"), "Clean up" );
87
88
1
1019
done_testing();
unburden-home-dir-0.3.2.2/cover_db/t-xsession-d-t--subroutine.html0000644000000000000000000000336112123071317021607 0ustar Subroutine Coverage: t/xsession-d.t

Subroutine Coverage

File:t/xsession-d.t
Coverage:100.0%

linesubroutine
3
BEGIN
4
BEGIN
5
BEGIN
6
BEGIN
7
BEGIN
8
BEGIN
9
BEGIN
unburden-home-dir-0.3.2.2/TODO.md0000644000000000000000000000504012165372367013170 0ustar TODO ==== * Add warnings if either `$HOME` or `$TARGET` do not begin with a slash. This can cause broken symlinks but may also break the test suite. :-) * Idea from Pietro Abate: Excludes for wildcards, like "all from `.cache/*` except `.cache/duplicity`". * Honor `$XDG_` variables in `unburden-home-dir.list` for alternative locations of `.cache` and friends. * Set `$XDG_CACHE_HOME` before other programs using this variable run, so that they use the wanted location even without moving files around or adding symlinks. Likely needs another `Xsession.d` file with a very low number. * Write test so that `mv` doesn't fall into interactive mode. Basically test what the previous commit ("2ec069d Unconditionally move files") fixed. To reproduce: Have directories to move off as well as a directory which is already moved off. * Warning if `UNBURDEN_HOME=no` or `UNBURDEN_HOME=off` is set in `~/.unburden-home-dir` (which would be for the `Xsession.d` hook). * Sorting subroutines. * Split off documentation so that it can be shipped as man pages as well as viewed in the web. The idea is to use something like `pandoc -t man -s -o README.1 README.md` * Maybe use POD instead of Markdown as base format. * `find | buffer | xargs lsof -F c` (bin/unburden-home-dir:325) will find the `find` process if the list of files output by `find` is larger than 1 MB, so that `buffer` starts piping them to `xargs` before `find` finishes. `xargs` will then split up the list and call `lsof` more than once, which again will list the `find` process as having the directory open. Possible solutions: * Store `find` output in a temporary file and then `cat` that file to `xargs`. Should use `mktemp` and friends. * Use a bigger buffer size for `buffer`. Can't be infinite, i.e. just delays the issue to even bigger directories. * Call `rsync` in dry-run mode if `unburden-home-dir` is called in dry-run mode instead of not calling `rsync` at all in that case. * Find a nice way to handle the global `unburden-home-dir.list`, maybe by by using something like `/etc/unburden-home-dir.list.d/` or maybe even put symlinks to the (splitted) example file(s) in `/etc/unburden-home-dir.list.d/`. I've wrote a Perl interface to `run-parts` named [Run::Parts](https://metacpan.org/release/Run-Parts) as standalone Perl module which is planned to be used by `aptitude-robot`, too. * Check if there are common tasks of xdg-user-dirs (its package description is not so helpful there) of if it can be useful for unburden-home-dir. unburden-home-dir-0.3.2.2/README.md0000644000000000000000000004363512165372323013364 0ustar Unburden Your Home Directory ============================ unburden-home-dir allows users to move cache files from browsers, etc. off their home directory, i.e. on a local harddisk or tmpfs and replace them with a symbolic link to the new location (e.g. on `/tmp/` or `/scratch/`) upon login. Optionally the contents of the directories and files can be removed instead of moved. This is helpful at least in the following cases: * The idea-giving case are big workstation setups where `$HOME` is on NFS and all those caches put an unnecessary burden (hence the name) on the file server since caching over NFS doesn't have the best performance and may clog the NFS server, too. * A similar case, but with different purpose is reducing I/O on mobile devices like laptops or netbooks to extend the battery life: Moving browser caches etc. off the real disk into a tmpfs filesystem reduces the amount of disk I/O which reduces the power consumption of the disk. * The other type of use cases for unburden-home-dir is to reduce disk space usage, e.g. on devices with small disk space but a lot of RAM as seen often on boxes with flash disks or early netbooks, especially the EeePC, where configurations with 4GB disk space and 2GB RAM are not seldom. In this case you want to move off as many cache files, etc. as possible to some tmpfs filesystem, e.g. `/tmp/`. * It may also help to reduce the amount of needed backup disk space by keeping those files in places where they don't get backed up. In that case it's an alternative to keeping the blacklist in your backup software up-to-date. * Another pragmatic use case may be to stay — as an user — within a given disk quota. :-) This project initially started as an `Xsession` hook. It now consists of a perl script which optionally can also be called from a provided `Xsession` hook. While the default configuration includes no logout hook as Debian's Xsession script, you can run `unburden-home-dir -u` to reverse the effect of `unburden-home-dir` and to move all (moved) directories back to your home directory. Nevertheless unburden-home-dir was written with non-valuable data (cache files, pid files, thumbnails, temporary data, etc.) in mind and not for preservation of the handled data. So it is likely less suitable for cases where the handled data should be preserved on logout or shutdown. See [this wiki page about application cache files][wiki] for the detailed reasoning behind this project. [wiki]: http://wiki.phys.ethz.ch/readme/application_cache_files (General thoughts about application cache files in home directories) How To ====== The best way to introduce unburden-home-dir in your setup is the following: * Look through `/etc/unburden-home-dir.list` and either uncomment what you need globally and/or copy it to either `~/.unburden-home-dir.list` or `~/.config/unburden-home-dir/list` and then edit it there for per-user settings. * Check in `/etc/unburden-home-dir` if the target and file name template suite your needs. If not either edit the file for global settings and/or copy it to either `~/.unburden-home-dir` or `~/.config/unburden-home-dir/config` and then edit it there for per-user settings. * Make a dry run with > unburden-home-dir -n to see what `unburden-home-dir` would do. If you have `lsof` installed it should warn you if any of the files are currently in use. Check the above steps until you're satisfied. * Exit all affected applications (guess them if no `lsof` is available, `fuser` may help if available) as opened files which should be moved can cause `unburden-home-dir` to fail. (May not be necessary if the target is on the same file system, but that's usually not the case.) Also exit shells or file browser windows (Nautilus, Konqueror, Caja, etc.) which have any of the to-be-unburdened directories open. If you use a full featured desktop (GNOME, KDE, Unity, Enlightenment/E17) including desktop search or similar tools which have some files in `~/.cache` permanently opened (Zeitgeist, gvfs, etc.) it's likely the best to logout from your X session and do the remaining steps in a failsafe session, on the text console or remotely via SSH. * Run > unburden-home-dir * Start your applications again. If everything works fine, enable `unburden-home-dir` permanently, either per user or globally for all users. See below. Enabling unburden-home-dir Globally ----------------------------------- If you want to enable `unburden-home-dir` for all users of a machine.on an Xsession based login, edit `/etc/default/unburden-home-dir` and either uncomment or add a line that looks like this: > UNBURDEN_HOME=yes But please be aware that if you do that on a machine with NFS homes, you should do that on all (Unix) machines which have those NFS homes mounted. Enabling unburden-home-dir Per User ----------------------------------- For installations where each user should be able to decide on his own if `unburden-home-dir` should be run on X session start, add a line saying > UNBURDEN_HOME=yes to either `~/.unburden-home-dir` or `~/.config/unburden-home-dir/config` (create the file if it doesn't exist yet) which are sourced by the Xsession startup script in the same way as `/etc/default/unburden-home-dir` (while beingq configuration files for unburden-home-dir itself at the same time, too). Common Issues / Troubleshooting =============================== * If you get error messages like > cannot remove directory for ~/.something/Cache: Directory not empty at /usr/bin/unburden-home-dir line 203 there is likely a process running which still has files open in that directory or a subdirectory thereof. Exit that program and try again. `unburden-home-dir` is idempotent, i.e. it can be called several times without doing different things. * In case `unburden-home-dir` moved something it wasn't expected to, you can try to undo all of unburden-home-dir's doing by running > unburden-home-dir -u Nevertheless this functionality is less well tested as unburden-home-dir's normal operation mode, so it may not be able to undo everything. unburden-home-dir's undo mode (of course) can't undo modifications where it has been told to remove all files and create an empty directory instead. See the `r` action in the Configuration Files section below. Configuration Files =================== There are three types of configuration files for unburden-home-dir: Global Xsession Hook Configuration File --------------------------------------- * `/etc/default/unburden-home-dir` It is sourced by unburden-home-dir's Xsession hook and configures the global on-login behaviour. ### Recognized Settings * `UNBURDEN_HOME`: If set to `yes`, unburden-home-dir will run for all users upon X login. * `UNBURDEN_BASENAME`: Sets the basename of the configuration files to use. Defaults to `unburden-home-dir`. Equivalent to the `-b` commandline option. General Configuration File -------------------------- * `/etc/unburden-home-dir` (Global configuration file) * `~/.unburden-home-dir` (Per user configuration file) * `~/.config/unburden-home-dir/config` (XDG style per user configuration file) All three file are parsed by [Config::File](http://metacpan.org/release/Config-File/) in the above given order. ### Recognized Settings The files may contain one or more of the following settings: * `TARGETDIR`: To where the files should be unburdened, e.g. `TARGETDIR=/tmp` or`TARGETDIR=/scratch` * `FILELAYOUT`: File name template for the target locations. `%u` is replaced by the user name, `%s` by the target identifier defined in the list file. Examples: `FILELAYOUT='.unburden-%u/%s'`, `FILELAYOUT='unburden/%u/%s'` For per user activation of unburden-home-dir upon X login, `UNBURDEN_HOME=yes` (see above) may be used in the per-user configuration files, too. List Files ---------- `unburden-home-dir` looks at the following places for list of files to take care of: * `/etc/unburden-home-dir.list` (Global list of files to take care of) * `~/.unburden-home-dir.list` (Per user list of files to take care of) * `~/.config/unburden-home-dir/list` (XDG style per user list of files to take care of) ### File Format of unburden-home-dir.list `unburden-home-dir.list` lists files and directories to take care of and how to take care of them. Each lines contains space separated values. The columns are interpreted as follows: 1. column: **Action** (`d`/`r` or `m`: delete/remove or move; the first two are equivalent) 2. column: **Type** (`d`, `D`, `f` or `F`: directory or file, capital letter means "create it if it doesn't exist") 3. column: **Path** relative to `$HOME` to move off to some other location. 4. column: **Identifier** for file or directory in the other location. The (partial) path names given in the third and fourth column initially must be of the type declared in the second column, i.e. you can't list a file's name in the third column but then only give the path to the subdirectory to where it should be unburden in the fourth column. The fourth column must contain the path to the symlink target itself, too. ### What To Unburden? The Debian package comes with a lot of commented examples in `/etc/unburden-home-dir.list`. See `etc/unburden-home-dir.list` in the Git repository or source tar ball. A good start for checking what kind of caches you have in your own home directory is running > find ~ -type d -iname '*cache*' -not -path '*/.git/*' -not -path '*/.hg/*' -print0 | xargs -0 du -sh | sort -h Older versions of the `sort` utility (e.g. GNU Coreutils versions before 7.5, i.e. before Debian 6.0 Squeeze) don't have the `-h` option. In that case drop the `-h` from the `du` call as well and use `sort -n` instead: > find ~ -type d -iname '*cache*' -not -path '*/.git/*' -not -path '*/.hg/*' -print0 | xargs -0 du -s | sort -n Or check [Mundus Project's modules](http://files.mundusproject.org/) which cache files they would clean up. Example Configuration Files --------------------------- See `/usr/share/doc/unburden-home-dir/examples/` on debianoid installations or `etc/` in the source tar ball for example files. User Contributed Examples and Setups ------------------------------------ * [Reburden on Logout](http://www.mancoosi.org/~abate/unburden-my-home-dir#comment-299) Source Code =========== You should always find the newest code via git at either * [GitHub](http://github.com/xtaran/unburden-home-dir), * the [Git Repository at D-PHYS](http://git.phys.ethz.ch/?p=unburden-home-dir.git), or * [Gitorious](http://gitorious.org/unburden-home-dir/). GitHub is used as primary hub, git.phys.ethz.ch is usually up-to-date, too, Gitorious gets pushed less often, but should get all major updates in time, too. Getting Unburden-Home-Dir ========================= Besides installing from source code, several Linux distributions ship unburden-home-dir as package: * [Debian since 7.0 Wheezy](http://packages.debian.org/unburden-home-dir) * [Ubuntu since 12.10 Quantal](http://packages.ubuntu.com/unburden-home-dir) * [Korora 18 Flo](https://kororaproject.org/korora-18-flo-released/) ([GitHub repository](https://github.com/kororaproject/kp-unburden-home-dir)) Author ====== [Axel Beckert](http://noone.org/abe/) unburden-home-dir initially has been developed for usage at [Dept. of Physics](http://www.phys.ethz.ch/), [ETH Zurich](http://www.ethz.ch/). License ======= All stuff in here is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program in the file COPYING. If not, see [GNU's license web page](http://www.gnu.org/licenses/). Thanks ====== Quite some people contributed to unburden-home-dir in one way or the other, e.g. by being my guinea pigs, finding bugs, sending patches, contributing to the list of files to move off, etc. or just by [writing motivating blog postings](http://www.mancoosi.org/~abate/unburden-my-home-dir). :-) * Pietro Abate * Johan van den Dorpe * Klaus Ethgen * Elmar Heeb * Christian Herzog * Carsten Hey * Daniel Koch * Touko Korpela * Marcus Möller * Mika Pflüger * Patrick Schmid * Klaus Umbach See Also ======== Reducing Sync Calls ------------------- ### eatmydata Another possible solution for saving non-crucial I/O is using [eatmydata](http://www.flamingspork.com/projects/libeatmydata/) to ignore a software's `fsync` calls. Be careful. This may cause data loss in case of a power loss or an operating system crash. It's called "eat my data" for a reason. ### Firefox/Gecko/XULRunner: toolkit.storage.synchronous One notorious case of an annoyingly amount of `fsync` calls is [Firefox](https://www.mozilla.org/firefox) and other Mozilla/Gecko/XULRunner based programs, because they use [SQLite](http://sqlite.org/) databases as backend for many features (history, bookmarks, cookies, etc.). Instead of calling `eatmydata firefox` you can use [about:config](about:config) to set [toolkit.storage.synchronous](http://kb.mozillazine.org/About:config_entries#Toolkit.) to `0`. This specifies the [SQLite disk sync mode](http://www.sqlite.org/pragma.html#pragma_synchronous) used by the Mozilla rendering engine. Nevertheless `unburden-home-dir` usually doesn't help here, because it's used for volatile data like caches while those SQLite databases usually contain stuff you don't want to loose. But then again, setting `toolkit.storage.synchronous` to `0` may cause database corruption if the OS crashes or the computer loses power. ### APT/dpkg Not related to the home directory and hence not solvable at all with `unburden-home-dir` but nevertheless similar is the amount of sync calls in dpkg and APT. #### Package list Diffs If there's too much I/O and CPU usage during `apt-get update` due to downloading and merging a lots of diffs, you may want to set `Acquire::PDiffs` to `false` to always download the whole package list instead of just diffs. Of couse this only makes sense if you have a decent network connection. #### I/O during upgrading packages dpkg cares about a consistent state of files when unpacking packages, so it instructs the kernel to sync stuff to disk quite often, too. It hough has an option named `--force-unsafe-io` to turn this safety off. From dpkg's man-page about `--force-unsafe-io`: > Do not perform safe I/O operations when unpacking. Currently this > implies not performing file system syncs before file renames, which > is known to cause substantial performance degradation on some file > systems, unfortunately the ones that require the safe I/O on the > first place due to their unreliable behaviour causing zero-length > files on abrupt system crashes. > > Note: For ext4, the main offender, consider using instead the mount > option `nodelalloc`, which will fix both the performance degradation > and the data safety issues, the latter by making the file system not > produce zero-length files on abrupt system crashes with any software > not doing syncs before atomic renames. > > Warning: Using this option might improve performance at the cost of > losing data, use with care. ### Core dumps If you want core dumps for debugging purposes, but don't want to clutter your home directory with them, [Corekeeper](http://openvswitch.org/cgi-bin/gitweb.cgi?p=corekeeper) offers saving core dumps to `/var/crash` and also automatically cleans them up after a week by just installing one Debian package. Cleaning Up Your Home Directory Half-Automatically -------------------------------------------------- ### Autotrash > [Autotrash](http://www.logfish.net/pr/autotrash/) is a simple Python > script which will purge files from your trash based on their age or > the amount of free space left on the device. Using autotrash -d 30 > will delete files which have been in the trash for more then 30 > days. ### BleachBit [BleachBit](http://bleachbit.sourceforge.net/) is a GUI program which … > […] quickly frees disk space and tirelessly guards your > privacy. Free cache, delete cookies, clear Internet history, shred > temporary files, delete logs, and discard junk you didn't know was > there. Designed for Linux and Windows systems, it wipes clean 90 > applications including Firefox, Internet Explorer, Adobe Flash, > Google Chrome, Opera, Safari,and more. Beyond simply deleting files, > BleachBit includes advanced features such as shredding files to > prevent recovery, wiping free disk space to hide traces of files > deleted by other applications, and vacuuming Firefox to make it > faster. ### Mundus [Mundus](http://www.mundusproject.org/) is GUI program which … > […] can help you keep your /home folder clean. It keeps an internal > database of known applications and folders, and automagically > detects those apps that where uninstalled but left configuration > files. Each supported application is also called a module, and each > folder it describes is called a submodule. ### Computer Janitor [Computer Janitor](https://launchpad.net/computer-janitor) was a command-line and GUI program to … > … clean up a system so it's more like a freshly installed one. > > Over time, a computer system tends to get cluttered. For example, > software packages that are no longer needed can be uninstalled. > When the system is upgraded from release to release, it may miss out > on configuration tweaks that freshly installed systems get. > > Computer Janitor is an application to fix these kinds of problems. > It attempts to find software packages that can be removed, and tweak > the system configuration in useful ways. Unfortunately its development has stalled, it doesn't work together with current APT versions and it has been removed from Debian and recent Ubuntu releases.