diff --git a/lib/homesick.rb b/lib/homesick.rb index fd7a050..09647f9 100644 --- a/lib/homesick.rb +++ b/lib/homesick.rb @@ -79,6 +79,7 @@ class Homesick < Thor end desc "symlink NAME", "Symlinks all dotfiles from the specified castle" + method_option :force, :default => false, :desc => "Overwrite existing conflicting symlinks without prompting." def symlink(name) check_castle_existance(name, "symlink") diff --git a/lib/homesick/actions.rb b/lib/homesick/actions.rb index f42bcf4..603ad68 100644 --- a/lib/homesick/actions.rb +++ b/lib/homesick/actions.rb @@ -86,7 +86,7 @@ class Homesick say_status :conflict, "#{destination} exists and points to #{destination.readlink}", :red unless options[:quiet] if options[:force] || shell.file_collision(destination) { source } - system "ln -sf #{source} #{destination}" unless options[:pretend] + system "ln -nsf #{source} #{destination}" unless options[:pretend] end end elsif destination.exist? diff --git a/spec/homesick_spec.rb b/spec/homesick_spec.rb index 672a223..5dd2b6d 100644 --- a/spec/homesick_spec.rb +++ b/spec/homesick_spec.rb @@ -7,6 +7,7 @@ describe "homesick" do let(:castles) { home.directory(".homesick/repos") } let(:homesick) { Homesick.new } + before { homesick.stub!(:repos_dir).and_return(castles) } describe "clone" do @@ -104,6 +105,21 @@ describe "homesick" do home.join("bin").readlink.should == dotfile end + context "when forced" do + let(:homesick) { Homesick.new [], :force => true } + + it "can override symlinks to directories" do + somewhere_else = create_construct + existing_dotdir_link = home.join(".vim") + FileUtils.ln_s somewhere_else, existing_dotdir_link + + dotdir = castle.directory(".vim") + + homesick.symlink("glencairn") + + existing_dotdir_link.readlink.should == dotdir + end + end end describe "list" do