Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

ignore based on package dirent name prior to dot- adjustment #116

Merged
merged 3 commits into from
Sep 8, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions NEWS
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,18 @@ News file for Stow.
which reintroduced this warning when running Stow on Perl >= 5.40.0.
This has now been fixed.

*** =--dotfiles= option now works correctly with ignore lists

If the =--dotfiles= option was enabled, files in the package such
as =dot-gitignore= would be translated to =.gitignore= prior to
stowing, and consequently ignored by the default ignore list.
However any file named =dot-*= in a package is obviously intended
to be stowed as a dot file, so should not be ignored.

To fix this, Stow now ignores based on the name in the package,
not the potentially translated name used for stowing, and
similarly for unstowing.

*** Use shell-like parsing for =.stowrc= arguments

If a file path or regex in =.stowrc= has a space, the option
Expand Down
7 changes: 7 additions & 0 deletions doc/stow.texi
Original file line number Diff line number Diff line change
Expand Up @@ -437,6 +437,13 @@ option, Stow will create symlinks from @file{.bashrc} to
@file{stow/dot-emacs.d/init.el}. Any other files, whose name does not
begin with @samp{dot-}, will be processed as usual.

Note that when this option is enabled, any package file or directory
prefixed with @samp{dot-} is assumed to be named deliberately to be
stowed with a @samp{.} prefix, and therefore will only be ignored if
there is an entry in the ignore list (@xref{Ignore Lists}) which matches
this prefix. So for example, by default @file{dot-gitignore} would not
be ignored even though @samp{\.gitignore} is in the default ignore list.

@item --no-folding

This disables any further tree folding (@pxref{tree folding}) or
Expand Down
13 changes: 7 additions & 6 deletions lib/Stow.pm.in
Original file line number Diff line number Diff line change
Expand Up @@ -431,17 +431,17 @@ sub stow_contents {

my $package_node_path = join_paths($pkg_subdir, $node);
my $target_node = $node;
my $target_node_path = join_paths($target_subdir, $target_node);
next NODE if $self->ignore($stow_path, $package, $target_node_path);

if ($self->{dotfiles}) {
my $adjusted = adjust_dotfile($node);
if ($adjusted ne $node) {
debug(4, 1, "Adjusting: $node => $adjusted");
$target_node = $adjusted;
$target_node_path = join_paths($target_subdir, $target_node);
}
}
my $target_node_path = join_paths($target_subdir, $target_node);

next NODE if $self->ignore($stow_path, $package, $target_node_path);

$self->stow_node(
$stow_path,
Expand Down Expand Up @@ -800,6 +800,9 @@ sub unstow_contents {

my $package_node = $node;
my $target_node = $node;
my $target_node_path = join_paths($target_subdir, $target_node);

next NODE if $self->ignore($self->{stow_path}, $package, $target_node_path);

if ($self->{dotfiles}) {
if ($self->{compat}) {
Expand All @@ -819,13 +822,11 @@ sub unstow_contents {
if ($adjusted ne $node) {
debug(4, 1, "Adjusting: $node => $adjusted");
$target_node = $adjusted;
$target_node_path = join_paths($target_subdir, $target_node);
}
}
}
my $package_node_path = join_paths($pkg_subdir, $package_node);
my $target_node_path = join_paths($target_subdir, $target_node);

next NODE if $self->ignore($self->{stow_path}, $package, $target_node_path);

$self->unstow_node(
$package,
Expand Down
33 changes: 32 additions & 1 deletion t/dotfiles.t
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@
use strict;
use warnings;

use Test::More tests => 12;
use Test::More tests => 14;
use English qw(-no_match_vars);

use Stow::Util qw(adjust_dotfile unadjust_dotfile);
Expand Down Expand Up @@ -185,6 +185,21 @@ subtest("dot-. should not have that part expanded.", sub {
);
});

subtest("when stowing, dot-gitignore is not ignored by default", sub {
plan tests => 1;
$stow = new_Stow(dir => '../stow', dotfiles => 1);

make_file('../stow/dotfiles/dot-gitignore');

$stow->plan_stow('dotfiles');
$stow->process_tasks();
is(
readlink('.gitignore'),
'../stow/dotfiles/dot-gitignore',
=> "dot-gitignore shouldn't have been ignored"
);
});

subtest("unstow .bar from dot-bar", sub {
plan tests => 3;
$stow = new_Stow(dir => '../stow', dotfiles => 1);
Expand Down Expand Up @@ -233,3 +248,19 @@ subtest("unstow dot-emacs.d/init.el in --compat mode", sub {
ok(! -e '.emacs.d/init.el', '.emacs.d/init.el unstowed');
ok(-d '.emacs.d/' => '.emacs.d left behind');
});

subtest("when unstowing, dot-gitignore is not ignored by default", sub {
plan tests => 1;
$stow = new_Stow(dir => '../stow', dotfiles => 1);

system('pwd');
make_file('../stow/dotfiles/dot-gitignore');
-e '.gitignore' or make_link('.gitignore', '../stow/dotfiles/dot-gitignore');

$stow->plan_unstow('dotfiles');
$stow->process_tasks();
ok(
! -e ('.gitignore')
=> "dot-gitignore shouldn't have been ignored"
);
});
9 changes: 4 additions & 5 deletions t/ignore.t
Original file line number Diff line number Diff line change
Expand Up @@ -112,7 +112,7 @@ sub test_user_global_list {
sub setup_user_global_list {
# Now test with global ignore list in home directory
$ENV{HOME} = tempdir();
make_file(join_paths($ENV{HOME}, $Stow::GLOBAL_IGNORE_FILE), <<EOF);
setup_global_ignore(<<EOF);
exact
.+substring.+ # here's a comment
.+\.extension
Expand All @@ -124,10 +124,9 @@ sub setup_package_local_list {
my ($stow_path, $package, $list) = @_;
my $package_path = join_paths($stow_path, $package);
make_path($package_path);
my $local_ignore = join_paths($package_path, $Stow::LOCAL_IGNORE_FILE);
make_file($local_ignore, $list);
$stow->invalidate_memoized_regexp($local_ignore);
return $local_ignore;
my $package_ignore = setup_package_ignore($package_path, $list);
$stow->invalidate_memoized_regexp($package_ignore);
return $package_ignore;
}

sub main {
Expand Down
17 changes: 16 additions & 1 deletion t/testutil.pm
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ use File::Spec;
use Test::More;

use Stow;
use Stow::Util qw(parent canon_path);
use Stow::Util qw(parent canon_path join_paths);

use base qw(Exporter);
our @EXPORT = qw(
Expand All @@ -41,6 +41,7 @@ our @EXPORT = qw(
cd
new_Stow new_compat_Stow
make_path make_link make_invalid_link make_file
setup_global_ignore setup_package_ignore
remove_dir remove_file remove_link
cat_file
is_link is_dir_not_symlink is_nonexistent_path
Expand Down Expand Up @@ -160,6 +161,20 @@ sub make_file {
close $FILE;
}

sub setup_global_ignore {
my ($contents) = @_;
my $global_ignore_file = join_paths($ENV{HOME}, $Stow::GLOBAL_IGNORE_FILE);
make_file($global_ignore_file, $contents);
return $global_ignore_file;
}

sub setup_package_ignore {
my ($package_path, $contents) = @_;
my $package_ignore_file = join_paths($package_path, $Stow::LOCAL_IGNORE_FILE);
make_file($package_ignore_file, $contents);
return $package_ignore_file;
}

#===== SUBROUTINE ===========================================================
# Name : remove_link()
# Purpose : remove an esiting symbolic link
Expand Down
Loading