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



121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
# File 'lib/libcfruby/fileops.rb', line 121

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)



158
159
160
161
162
163
164
165
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
# File 'lib/libcfruby/fileops.rb', line 158

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)



73
74
75
76
77
78
79
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
# File 'lib/libcfruby/fileops.rb', line 73

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