Class: Cfruby::FileOps::LocalFileCommand

Inherits:
Object
  • Object
show all
Defined in:
lib/libcfruby/fileops.rb

Overview

FileCommand interface for local to local operations

Instance Method Summary collapse

Instance Method Details

#copy(filename, newfilename, options = {}) ⇒ Object

Executes FileUtils.cp followed by FileOps.chmod and FileOps.chown (using :user, :group, and :mode). If filename is a glob it will be expanded and all resultant filenames will be copied with the assumption that newfilename is a directory. Options:

:backup

true to make a backup of newfilename before copying

:force

(defaults to true) force the copy even if newfilename exists

:onlyonchange

only copy if the file has changed (implies force)

:recursive

recursively copy



129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
# File 'lib/libcfruby/fileops.rb', line 129

def copy(filename, newfilename, options = {})
	# set default options
	if(options[:force] == nil)
		options[:force] = true
	end
	if(options[:onlyonchange])
		options[:force] = true
	end
	
	# first, a basic check that filename exists somehow
	if(Dir.glob(filename).length == 0)
		raise(FileOpsFileExistError, "\"#{filename}\" does not exist")
	end

	# get the base directory of the copy
	basedir = File.dirname(Pathname.new(Dir.glob(filename)[0]).realpath.to_s)
	basedirregex = Regexp.new(Regexp.escape(basedir) + "/?(.*)$")

	# use file find to get a list of files to copy
	FileFind.find(filename, options) { |filename|
		# copy each file after adjusting for the base directories
		basename = basedirregex.match(filename)[1]
		if(File.directory?(newfilename))
			copy_single(filename, newfilename + "/#{basename}", options)
		else
			copy_single(filename, newfilename, options)
		end
	}
end

#copy_single(filename, newfilename, options = {}) ⇒ Object

Executes FileUtils.cp followed by FileOps.chmod and FileOps.chown (using :user, :group, and :mode). filename and newfilename must be single files Options:

:backup

true to make a backup of newfilename before copying

:force

(defaults to true) force the copy even if newfilename exists

:onlyonchange

only copy if the file has changed (implies force)



166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
# File 'lib/libcfruby/fileops.rb', line 166

def copy_single(filename, newfilename, options = {})
	mode	= options[:mode]
	owner = options[:user]
	group = options[:group]
	options.delete :mode
	options.delete :user
	options.delete :group

	force = options[:force]
	if(force == nil)
		force = true
	end
	
	Cfruby.controller.attempt("copy #{filename} to #{newfilename}", 'destructive') {
		if(!File.exists?(filename))
			raise(FileOpsFileExistError, "\"#{filename}\" does not exist")
		end
		if(!force and File.exists?(newfilename))
			raise(FileOpsOverwriteError, "\"#{newfilename}\" already exists")
		end
	
		if(options[:onlyonchange] and File.exist?(newfilename))
			options[:force] = true
			originalsum = Cfruby::Checksum::Checksum.get_checksums(filename)
			newsum = Cfruby::Checksum::Checksum.get_checksums(newfilename)
			if(originalsum.sha1 == newsum.sha1)
				Cfruby.controller.attempt_abort("files have the same sha1 hash")
			end
		end
	
		if options[:backup]
			FileOps.backup(newfilename) if File.exist? newfilename
			options.delete :backup
			options.delete :onlyonchange
		end
	
		if(File.exists?(newfilename) and force)
			FileOps.delete(newfilename)
		end
		
		if(File.directory?(filename))
			FileUtils.mkdir(newfilename)
		else
			FileUtils.cp(filename, newfilename, :preserve => true)
		end
	}

	# change ownership and mode if we need to
	FileOps.chown(newfilename,owner,group,options) if owner or group
	FileOps.chmod(newfilename,mode) if mode
end

#move(filename, newfilename, options = {}) ⇒ Object

Options:

:force

(defaults to true) force the move

:mode

set the mode of newfilename

:preserve

attempts to preserve the mode and ownership of newfilename if it exists

:onlyonchange

only copy if the file has changed (implies force)



80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
# File 'lib/libcfruby/fileops.rb', line 80

def move(filename, newfilename, options = {})
	if(options[:force] == nil)
		options[:force] = true
	end
	
	currentstat = nil
	Cfruby.controller.attempt("move #{filename} to #{newfilename}", 'destructive') {
		if(options[:onlyonchange] and File.exist?(newfilename))
			options[:force] = true
			originalsum = Cfruby::Checksum::Checksum.get_checksums(filename)
			newsum = Cfruby::Checksum::Checksum.get_checksums(newfilename)
			if(originalsum.sha1 == newsum.sha1)
				Cfruby.controller.attempt_abort("files have the same sha1 hash")
			end
		end

		if(File.exists?(newfilename))
			if(options[:preserve])
				currentstat = File.stat(newfilename)
			end

			if(options[:force])
				FileOps.delete(newfilename)
			else
				raise(FileOpsOverwriteError, "\"#{newfilename}\" already exists")
			end						
		end
		FileUtils.mv(filename, newfilename)
		
		if(currentstat and options[:preserve])
			FileOps.chmod(newfilename, currentstat.mode)
			FileOps.chown(newfilename, currentstat.uid, currentstat.gid)
		end
		
		if(options[:mode] != nil)
			FileOps.chmod(newfilename, options[:mode])
		end
	}
end