aboutsummaryrefslogtreecommitdiff
path: root/describe.rb
blob: 38fabf98a4548c2e1d7dbf85ce003b5b58cc9482 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
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