diff --git a/lib/thor/actions/file_manipulation.rb b/lib/thor/actions/file_manipulation.rb index b45bfbd44..725548236 100644 --- a/lib/thor/actions/file_manipulation.rb +++ b/lib/thor/actions/file_manipulation.rb @@ -23,14 +23,14 @@ def copy_file(source, *args, &block) destination = args.first || source source = File.expand_path(find_in_source_paths(source.to_s)) - create_file destination, nil, config do + resulting_destination = create_file destination, nil, config do content = File.binread(source) content = yield(content) if block content end if config[:mode] == :preserve mode = File.stat(source).mode - chmod(destination, mode, config) + chmod(resulting_destination, mode, config) end end diff --git a/spec/actions/file_manipulation_spec.rb b/spec/actions/file_manipulation_spec.rb index 5ebd3c7da..1e4c177fe 100644 --- a/spec/actions/file_manipulation_spec.rb +++ b/spec/actions/file_manipulation_spec.rb @@ -76,6 +76,14 @@ def file expect(File.stat(original).mode).to eq(File.stat(copy).mode) end + it "copies file from source to default destination and preserves file mode for templated filenames" do + expect(runner).to receive(:filename).and_return("app") + action :copy_file, "preserve/%filename%.sh", :mode => :preserve + original = File.join(source_root, "preserve/%filename%.sh") + copy = File.join(destination_root, "preserve/app.sh") + expect(File.stat(original).mode).to eq(File.stat(copy).mode) + end + it "logs status" do expect(action(:copy_file, "command.thor")).to eq(" create command.thor\n") end diff --git a/spec/fixtures/preserve/%filename%.sh b/spec/fixtures/preserve/%filename%.sh new file mode 100755 index 000000000..c52d3c26b --- /dev/null +++ b/spec/fixtures/preserve/%filename%.sh @@ -0,0 +1,3 @@ +#!/bin/sh + +exit 0