diff --git a/lib/rscons/application.rb b/lib/rscons/application.rb index c325b04..921bc5b 100644 --- a/lib/rscons/application.rb +++ b/lib/rscons/application.rb @@ -167,15 +167,21 @@ module Rscons def uninstall cache = Cache.instance cache.targets(true).each do |target| + cache.remove_target(target) + next unless File.exists?(target) + puts "Removing #{target}" if verbose FileUtils.rm_f(target) end # remove all created directories if they are empty cache.directories(true).sort {|a, b| b.size <=> a.size}.each do |directory| + cache.remove_directory(directory) next unless File.directory?(directory) if (Dir.entries(directory) - ['.', '..']).empty? + puts "Removing #{directory}" if verbose Dir.rmdir(directory) rescue nil end end + cache.write 0 end diff --git a/lib/rscons/cache.rb b/lib/rscons/cache.rb index e734a77..5d499e7 100644 --- a/lib/rscons/cache.rb +++ b/lib/rscons/cache.rb @@ -320,6 +320,20 @@ module Rscons end.map(&:first) end + # Remove a target from the cache. + # + # @return [void] + def remove_target(target) + @cache["targets"].delete(target) + end + + # Remove a directory from the cache. + # + # @return [void] + def remove_directory(directory) + @cache["directories"].delete(directory) + end + private # Return a String key based on the target name to use in the on-disk cache. diff --git a/spec/build_tests_spec.rb b/spec/build_tests_spec.rb index 029d4e1..66c7d2c 100644 --- a/spec/build_tests_spec.rb +++ b/spec/build_tests_spec.rb @@ -2207,11 +2207,54 @@ EOF result = run_rscons(rsconscript: "install.rb", op: %W[uninstall]) expect(result.stderr).to eq "" + expect(result.stdout).to_not match /Removing/ expect(File.exists?("#{prefix}/bin/program.exe")).to be_falsey expect(File.exists?("build/e.1/src/one/one.o")).to be_truthy expect(Dir.entries(prefix)).to match_array %w[. ..] end end + + it "prints removed files and directories when running verbosely" do + test_dir "typical" + + Dir.mktmpdir do |prefix| + result = run_rscons(rsconscript: "install.rb", op: %W[configure --prefix=#{prefix}]) + expect(result.stderr).to eq "" + + result = run_rscons(rsconscript: "install.rb", op: %W[install]) + expect(result.stderr).to eq "" + + result = run_rscons(rsconscript: "install.rb", op: %W[uninstall -v]) + expect(result.stderr).to eq "" + expect(result.stdout).to match %r{Removing #{prefix}/bin/program.exe} + expect(File.exists?("#{prefix}/bin/program.exe")).to be_falsey + expect(Dir.entries(prefix)).to match_array %w[. ..] + end + end + + it "removes cache entries when uninstalling" do + test_dir "typical" + + Dir.mktmpdir do |prefix| + result = run_rscons(rsconscript: "install.rb", op: %W[configure --prefix=#{prefix}]) + expect(result.stderr).to eq "" + + result = run_rscons(rsconscript: "install.rb", op: %W[install]) + expect(result.stderr).to eq "" + + result = run_rscons(rsconscript: "install.rb", op: %W[uninstall -v]) + expect(result.stderr).to eq "" + expect(result.stdout).to match %r{Removing #{prefix}/bin/program.exe} + expect(File.exists?("#{prefix}/bin/program.exe")).to be_falsey + expect(Dir.entries(prefix)).to match_array %w[. ..] + + FileUtils.mkdir_p("#{prefix}/bin") + File.open("#{prefix}/bin/program.exe", "w") {|fh| fh.write("hi")} + result = run_rscons(rsconscript: "install.rb", op: %W[uninstall -v]) + expect(result.stderr).to eq "" + expect(result.stdout).to_not match /Removing/ + end + end end end