diff --git a/bin/xgrep b/bin/xgrep index f30d043..46aabcf 100755 --- a/bin/xgrep +++ b/bin/xgrep @@ -1,70 +1,10 @@ #!/usr/bin/env ruby require_relative '../lib/xgrep/commander' -require_relative '../lib/xgrep/rails_env' - -commander = Commander.new +commander = Xgrep::Commander.new(ARGV) if commander.valid? commander.execute else commander.help end - -exit - -ands = [ ] -ors = [ ] -nots = [ ] -current = ands - -paths = %w{Rakefile app config db lib spec} - -debug = false - -options = %w{-E -I} - -ARGV.each do |x| - case x - when "-d","--debug" then debug = true - when "-i","--ignore" then options << "--ignore-case" - when "-l","--names" then options << "--name-only" - when "--clean" then options << "--no-color" - when "--core" then paths -= ["spec"] - when "--spec" then paths = ["spec"] - when "--model" then paths = ["app/models"] - when "--view" then paths = ["app/views"] - when "--controller" then paths = ["app/controllers"] - when "--lib" then paths = ["lib"] - when "--config" then paths = ["config"] - when "--db" then paths = ["db"] - - when /^-+(and|or|not)$/ then current << $1 - when "and" then current = ands - when "or" then current = ors - when "not" then current = nots - else current << x - end -end - -ands = ands.map { |x| "-e \"#{x}\"" } -ors = ors.map { |x| "-e \"#{x}\"" } -nots = nots.map { |x| "-e \"#{x}\"" } - -if ors.size == 1 - ands << ors.first -elsif ors.size > 1 - ands << "\\( #{ors.join(' --or ')} \\)" -end -ands << "--not \\( #{nots.join(' --or ')} \\)" unless nots.empty? -ands = ands.join(" --and ") - -command = "git grep #{options.join(' ')} #{ands} -- #{paths.sort.join(' ')}" - -if debug - puts - puts command -end - -puts -exec command diff --git a/lib/xgrep/commander.rb b/lib/xgrep/commander.rb index c52581b..d65fe96 100644 --- a/lib/xgrep/commander.rb +++ b/lib/xgrep/commander.rb @@ -1,122 +1,136 @@ require 'ostruct' require 'optparse' -class Commander +require_relative './custom_env' +require_relative './node_env' +require_relative './rails_env' +require_relative './simple_env' - attr_accessor :options +module Xgrep - def initialize - @options = OpenStruct.new - options.debug = false - options.git_grep = %w{-E} - options.pathspec = [] - options.environment = default_environment + class Commander - @option_parser = OptionParser.new do |op| - op.banner = "Usage: xgrep options term(s)" + attr_accessor :options + + def initialize (argv) + @options = OpenStruct.new + options.debug = false + options.git_grep = %w{-E} + options.pathspec = [] + options.environment = default_environment + + @option_parser = OptionParser.new do |op| + op.banner = "Usage: xgrep options term(s)" + + op.on('-a','--asset') do |argument| + options.pathspec << :asset + end + + op.on('-b','--db') do |argument| + options.pathspec << :db + end + + op.on('-c','--controller') do |argument| + options.pathspec << :controller + end + + op.on('-d','--[no-]debug') do |argument| + options.debug = argument + end + + op.on('-f','--file') do |argument| + options.git_grep << "-L" + end + + op.on('-g','--config') do |argument| + options.pathspec << :config + end + + op.on('-i','--invert') do |argument| + options.git_grep << '-v' + end + + op.on('-l','--lib') do |argument| + options.pathspec << :lib + end + + op.on('-m','--model') do |argument| + options.pathspec << :model + end + + op.on('-o','--core') do |argument| + options.pathspec << :core + end + + op.on_tail('-h','--help') do |argument| + puts op + exit + end - op.on('-a','--asset') do |argument| - options.pathspec << :asset - end - - op.on('-b','--db') do |argument| - options.pathspec << :db - end - - op.on('-c','--controller') do |argument| - options.pathspec << :controller - end - - op.on('-d','--[no-]debug') do |argument| - options.debug = argument - end - - op.on('-f','--file') do |argument| - options.git_grep << "-L" - end - - op.on('-g','--config') do |argument| - options.pathspec << :config - end - - op.on('-i','--invert') do |argument| - options.git_grep << '-v' - end - - op.on('-l','--lib') do |argument| - options.pathspec << :lib - end - - op.on('-m','--model') do |argument| - options.pathspec << :model - end - - op.on('-o','--core') do |argument| - options.pathspec << :core - end - - op.on_tail('-h','--help') do |argument| - puts op - exit end + @option_parser.parse!(argv) + options.terms = argv # must be after parse! end - @option_parser.parse!(ARGV) - options.terms = ARGV # must be after parse! - end + def valid? + options.terms.size > 0 + end - def valid? - options.terms.size > 0 - end + def help + puts @option_parser + exit + end - def help - puts @option_parser - exit - end + def execute + env = options.environment + env.update_pathspec(options.pathspec) - def execute - env = Object.const_get(options.environment).new - env.update_pathspec(options.pathspec) + ands = [] + ors = [] + nots = [] + current_op = ands - ands = [] - ors = [] - nots = [] - current_op = ands + options.terms.each do |x| + case x + when 'and' then current_op = ands + when 'or' then current_op = ors + when 'not' then current_op = nots + when /^-+(and|or|not)$/i then current_op << $1 + else current_op << x + end + end - options.terms.each do |x| - case x - when 'and' then current_op = ands - when 'or' then current_op = ors - when 'not' then current_op = nots - when /^-+(and|or|not)$/i then current_op << $1 - else current_op << x + ands = ands.map { |x| "-e \"#{x}\"" } + ors = ors.map { |x| "-e \"#{x}\"" } + nots = nots.map { |x| "-e \"#{x}\"" } + + ands << "\\( #{ors.join(' --or ')} \\)" unless ors.empty? + ands << "--not \\( #{nots.join(' --or ')} \\)" unless nots.empty? + + command = "git grep #{options.git_grep.join(' ')} #{ands.join(' --and ')} -- #{env.pathspec.sort.join(' ')}" + puts + if options.debug + puts command + else + system command + end + puts + end + + private + + def default_environment + if File.exist?('./.xgrep') + Xgrep::CustomEnv.new + elsif File.exist?("Gemfile") + Xgrep::RailsEnv.new + elsif File.exist?("package.json") + Xgrep::NodeEnv.new + else + Xgrep::SimpleEnv.new end end - - ands = ands.map { |x| "-e \"#{x}\"" } - ors = ors.map { |x| "-e \"#{x}\"" } - nots = nots.map { |x| "-e \"#{x}\"" } - - ands << "\\( #{ors.join(' --or ')} \\)" unless ors.empty? - ands << "--not \\( #{nots.join(' --or ')} \\)" unless nots.empty? - - command = "git grep #{options.git_grep.join(' ')} #{ands.join(' --and ')} -- #{env.pathspec.sort.join(' ')}" end - private - - def default_environment - if File.exist?('./.xgrep') - "CustomEnv" - elsif File.exist?("Gemfile") and File.exist?("package.json") - "NodeEnv" - elsif File.exist?("Gemfile") - "RailsEnv" - elsif File.exist?("package.json") - "NodeEnv" - else - "RailsEnv" - end - end end diff --git a/lib/xgrep/custom_env.rb b/lib/xgrep/custom_env.rb new file mode 100644 index 0000000..b77653c --- /dev/null +++ b/lib/xgrep/custom_env.rb @@ -0,0 +1,12 @@ +module Xgrep + class CustomEnv + attr_accessor :pathspec + + def initialize + @pathspec = { } + end + + def update_pathspec ( pathspec ) + end + end +end diff --git a/lib/xgrep/node_env.rb b/lib/xgrep/node_env.rb new file mode 100644 index 0000000..18b71a0 --- /dev/null +++ b/lib/xgrep/node_env.rb @@ -0,0 +1,12 @@ +module Xgrep + class NodeEnv + attr_accessor :pathspec + + def initialize + @pathspec = { } + end + + def update_pathspec ( pathspec ) + end + end +end diff --git a/lib/xgrep/rails_env.rb b/lib/xgrep/rails_env.rb index dda65d0..e0df1e0 100644 --- a/lib/xgrep/rails_env.rb +++ b/lib/xgrep/rails_env.rb @@ -1,6 +1,12 @@ -class RailsEnv +module Xgrep + class RailsEnv + attr_accessor :pathspec - def update_pathspec ( pathspec ) + def initialize + @pathspec = { } + end + + def update_pathspec ( pathspec ) + end end - end diff --git a/lib/xgrep/simple_env.rb b/lib/xgrep/simple_env.rb new file mode 100644 index 0000000..e2a29f4 --- /dev/null +++ b/lib/xgrep/simple_env.rb @@ -0,0 +1,12 @@ +module Xgrep + class SimpleEnv + attr_accessor :pathspec + + def initialize + @pathspec = { } + end + + def update_pathspec ( pathspec ) + end + end +end