From 8e58a3f5e2545ed5c6603fe60153aeb44a3284df Mon Sep 17 00:00:00 2001 From: muratayusuke Date: Tue, 4 Jun 2013 17:36:47 +0000 Subject: [PATCH] deal with edge case: the parent and descendant are both listed in the manifest --- lib/homesick.rb | 16 +++++++--------- spec/homesick_spec.rb | 19 +++++++++++++++++++ 2 files changed, 26 insertions(+), 9 deletions(-) diff --git a/lib/homesick.rb b/lib/homesick.rb index 67b9ac3..43fdd53 100644 --- a/lib/homesick.rb +++ b/lib/homesick.rb @@ -306,7 +306,7 @@ class Homesick < Thor end def symlink_each(castle, basedir, subdirs) - basedir = Pathname.new(basedir).expand_path + absolute_basedir = Pathname.new(basedir).expand_path inside basedir do files = Pathname.glob('{.*,*}').reject{|a| [".", ".."].include?(a.to_s)} files.each do |path| @@ -319,25 +319,23 @@ class Homesick < Thor # make ignore dirs ignore_dirs = [] subdirs.each do |subdir| - splited_subdir = Pathname.new(subdir).split - ignore_dir = splited_subdir[0].to_s - if ignore_dir == "." then - ignore_dir = splited_subdir[1].to_s + # ignore all parent of each line in subdir file + Pathname.new(subdir).ascend do |p| + ignore_dirs.push(p) end - ignore_dirs.push(ignore_dir) end # ignore dirs written in subdir file matched = false - ignore_dirs.each do |ignore_dir| + ignore_dirs.uniq.each do |ignore_dir| if absolute_path == castle_home.join(ignore_dir) matched = true - next + break end end next if matched - relative_dir = basedir.relative_path_from(castle_home) + relative_dir = absolute_basedir.relative_path_from(castle_home) home_path = home_dir.join(relative_dir).join(path) ln_s absolute_path, home_path end diff --git a/spec/homesick_spec.rb b/spec/homesick_spec.rb index 774741a..7493d94 100644 --- a/spec/homesick_spec.rb +++ b/spec/homesick_spec.rb @@ -148,6 +148,25 @@ describe "homesick" do home_dotdir.join(".some_dotfile").readlink.should == dotfile end end + + context "with '.config' and '.config/appA' in .homesick_subdir" do + let(:castle) { given_castle("glencairn", [".config", ".config/appA"]) } + it "can symlink under both of .config and .config/appA" do + config_dir = castle.directory(".config") + config_dotfile = config_dir.file(".some_dotfile") + appA_dir = config_dir.directory("appA") + appA_dotfile = appA_dir.file(".some_appfile") + + homesick.symlink("glencairn") + + home_config_dir = home.join(".config") + home_appA_dir = home_config_dir.join("appA") + home_config_dir.symlink?.should == false + home_config_dir.join(".some_dotfile").readlink.should == config_dotfile + home_appA_dir.symlink?.should == false + home_appA_dir.join(".some_appfile").readlink.should == appA_dotfile + end + end end describe "list" do