about summary refs log blame commit diff stats
path: root/code/runcontext.rb
blob: 1e10aa8de0273fe89bc2bdc9c4d0a34ab78aa822 (plain) (tree)



















































































































                                                                       













                                                                   




                                          
                                    






                                          
class RunContext
	## accessors {{{
	attr_accessor( *%w[
		all detach wait new_term
		files handlers paths
		mode
		exec
		multi
	])
	attr_reader( :flags )
	def flags=(x)
		assert x, Array, String

		if x.is_a? Array
			@flagstring = x.join('')
			@flags = x
		elsif x.is_a? String
			@flagstring = x
			@flags = x.split(//)
		end

		parse_flags
		return x
	end
	## }}}

	def initialize(files, mode=0, flags='')
		@mode = mode.to_i
		@files = files.dup
		self.flags = flags
		
		@files.reject! {|file|
			file.handler == nil or !file.exists?
		}
		@handlers = @files.map {|file| file.handler}
		@paths = @files.map {|file| file.path}
		@handler = @handlers.first

		@multi = (@files.size > 1 and @handlers.uniq.size == 1)

		@exec = Application.send(@handler, self)
	end

	def has_flag? x
		if x.is_a? Regexp
			@flagstring =~ x
		elsif x.is_a? String
			@flags.include? x
		else
			false
		end
	end

	def parse_flags
		@all = @detach = @new_term = @wait = false

		## Positive flags
		if has_flag? 'a'
			@all = true
		end
		if has_flag? /[de]/
			@detach = true
		end
		if has_flag? 't'
			@new_term = true
			@detach = true
		end
		if has_flag? 'w'
			@wait = true
		end

		## Negative flags
		if has_flag? 'A'
			@all = false
		end
		if has_flag? /[DE]/
			@detach = false
		end
		if has_flag? 'T'
			@new_term = false
		end
		if has_flag? 'W'
			@wait = false
		end
	end

	def newway() true end

	def no_mode?()
		@mode == 0
	end

	def no_flags?()
		@flagstring.empty?
	end

	def default_flags=(x)
		if @flagstring.empty?
			self.flags = x
		end
		x
	end

	## set the mode and return self.
	def with_mode(n)
		@mode = n
		self
	end

	## wrapper {{{

	## escape all files for direct use in the shell.
	## if the _multi_ attribute is true, this is a shortcut for
	##   rc.paths.map {|x| ~x}.join(' ')
	## otherwise:
	##   ~(rc.paths.first)
	def ~
		if @multi
			@paths.map {|x| ~x}.join(' ')
		else
			~@paths.first
		end
	end

	## escape one (the first) file for direct use in the shell.
	## this is a shortcut for:
	##   ~(rc.paths.first)
	def one
		~@paths.first
	end

	## shortcut for _files.size_
	def size() @files.size end

	## shortcut for _files.first.path_
	def first() @files.first end

	## shortcut for _files.first.name_
	def name() @files.first.name end

	## }}}
end