aboutsummaryrefslogtreecommitdiff
path: root/describe.rb
diff options
context:
space:
mode:
Diffstat (limited to 'describe.rb')
-rw-r--r--describe.rb47
1 files changed, 47 insertions, 0 deletions
diff --git a/describe.rb b/describe.rb
new file mode 100644
index 0000000..38fabf9
--- /dev/null
+++ b/describe.rb
@@ -0,0 +1,47 @@
+#!/usr/bin/env ruby
+
+#!DESCRIBE: Describe the purpose of an executable
+
+require 'ptools'
+
+def fatal(filename, msg)
+ $stderr.puts("[ERR] #{filename}: #{msg}")
+ exit 1
+end
+
+filename = ARGV.shift
+
+fatal("???", "File name not given.") if filename.nil?
+
+unless File.exist?(filename)
+ ENV["PATH"].split(?:).each do |path|
+ test = File.join(path, filename)
+ if File.exist?(test)
+ filename = test
+ break
+ end
+ end
+end
+
+basename = File.basename(filename)
+
+fatal(basename, "File does not exist.") unless File.exist?(filename)
+fatal(basename, "File is not executable.") unless File.executable?(filename)
+fatal(basename, "File is binary.") if File.binary?(filename)
+
+file = File.readlines(filename)
+
+describelines = file.select { |line|
+ line =~ /\A[#\/]*!DESCRIBE:/
+ }.map { |line|
+ line.split("!DESCRIBE:")[1].strip
+ }
+
+fatal(basename, "File is indescribable!") if describelines.empty?
+
+puts "#{basename}: #{describelines[0]}"
+describelines[1..-1].each { |line|
+ puts "#{" " * (basename.length + 2)}#{line}"
+}
+
+#!DESCRIBE: Usage: describe FILE