utils 0.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/Rakefile +68 -0
- data/VERSION +1 -0
- data/bin/chroot-exec +12 -0
- data/bin/chroot-libs +18 -0
- data/bin/classify +37 -0
- data/bin/discover +137 -0
- data/bin/edit +74 -0
- data/bin/errf +32 -0
- data/bin/git-empty +8 -0
- data/bin/myex +90 -0
- data/bin/number_files +26 -0
- data/bin/same_files +37 -0
- data/bin/search +205 -0
- data/bin/sedit +3 -0
- data/bin/sshscreen +68 -0
- data/bin/term +21 -0
- data/bin/unquarantine_apps +8 -0
- data/bin/untest +17 -0
- data/bin/utils-install-config +10 -0
- data/bin/vacuum_firefox_sqlite +22 -0
- data/bin/xmp +74 -0
- data/lib/utils.rb +8 -0
- data/lib/utils/config.rb +23 -0
- data/lib/utils/config/gdb/asm +179 -0
- data/lib/utils/config/gdb/ruby +528 -0
- data/lib/utils/config/gdbinit +8 -0
- data/lib/utils/config/irbrc +455 -0
- data/lib/utils/config/rdebugrc +2 -0
- data/lib/utils/config/screenrc +143 -0
- data/lib/utils/config/vim/autoload/Align.vim +1029 -0
- data/lib/utils/config/vim/autoload/AlignMaps.vim +330 -0
- data/lib/utils/config/vim/autoload/rails.vim +4744 -0
- data/lib/utils/config/vim/autoload/rubycomplete.vim +801 -0
- data/lib/utils/config/vim/autoload/sqlcomplete.vim +741 -0
- data/lib/utils/config/vim/autoload/vimball.vim +750 -0
- data/lib/utils/config/vim/colors/flori.vim +113 -0
- data/lib/utils/config/vim/compiler/eruby.vim +40 -0
- data/lib/utils/config/vim/compiler/ruby.vim +67 -0
- data/lib/utils/config/vim/compiler/rubyunit.vim +34 -0
- data/lib/utils/config/vim/ftdetect/ragel.vim +2 -0
- data/lib/utils/config/vim/ftdetect/ruby.vim +17 -0
- data/lib/utils/config/vim/ftplugin/eruby.vim +100 -0
- data/lib/utils/config/vim/ftplugin/ruby.vim +260 -0
- data/lib/utils/config/vim/ftplugin/xml.vim +941 -0
- data/lib/utils/config/vim/indent/IndentAnything_html.vim +35 -0
- data/lib/utils/config/vim/indent/eruby.vim +77 -0
- data/lib/utils/config/vim/indent/javascript.vim +116 -0
- data/lib/utils/config/vim/indent/ruby.vim +377 -0
- data/lib/utils/config/vim/plugin/AlignMapsPlugin.vim +242 -0
- data/lib/utils/config/vim/plugin/AlignPlugin.vim +41 -0
- data/lib/utils/config/vim/plugin/Decho.vim +592 -0
- data/lib/utils/config/vim/plugin/IndentAnything.vim +675 -0
- data/lib/utils/config/vim/plugin/bufexplorer.vim +1144 -0
- data/lib/utils/config/vim/plugin/cecutil.vim +482 -0
- data/lib/utils/config/vim/plugin/fugitive.vim +1703 -0
- data/lib/utils/config/vim/plugin/lusty-explorer.vim +1509 -0
- data/lib/utils/config/vim/plugin/rails.vim +340 -0
- data/lib/utils/config/vim/plugin/rubyextra.vim +193 -0
- data/lib/utils/config/vim/plugin/surround.vim +628 -0
- data/lib/utils/config/vim/plugin/taglist.vim +4546 -0
- data/lib/utils/config/vim/plugin/test/IndentAnything/test.js +131 -0
- data/lib/utils/config/vim/plugin/vimballPlugin.vim +40 -0
- data/lib/utils/config/vim/syntax/Decho.vim +101 -0
- data/lib/utils/config/vim/syntax/eruby.vim +73 -0
- data/lib/utils/config/vim/syntax/javascript.vim +246 -0
- data/lib/utils/config/vim/syntax/ragel.vim +165 -0
- data/lib/utils/config/vim/syntax/ruby.vim +367 -0
- data/lib/utils/config/vimrc +461 -0
- data/lib/utils/file.rb +49 -0
- data/lib/utils/find.rb +54 -0
- data/lib/utils/md5.rb +23 -0
- data/lib/utils/patterns.rb +34 -0
- data/lib/utils/version.rb +8 -0
- data/utils.gemspec +33 -0
- metadata +183 -0
data/Rakefile
ADDED
@@ -0,0 +1,68 @@
|
|
1
|
+
begin
|
2
|
+
require 'rake/gempackagetask'
|
3
|
+
rescue LoadError
|
4
|
+
end
|
5
|
+
require 'rake/clean'
|
6
|
+
require 'rbconfig'
|
7
|
+
include Config
|
8
|
+
|
9
|
+
PKG_NAME = 'utils'
|
10
|
+
PKG_VERSION = File.read('VERSION').chomp
|
11
|
+
PKG_FILES = Dir['**/*']#FileList['**/*'].exclude(/(CVS|\.svn|pkg|.git*)/)
|
12
|
+
PKG_FILES.reject! { |f| f =~ /\Apkg/ }
|
13
|
+
|
14
|
+
if defined? Gem
|
15
|
+
spec = Gem::Specification.new do |s|
|
16
|
+
s.name = PKG_NAME
|
17
|
+
s.version = PKG_VERSION
|
18
|
+
s.summary = "Some useful command line utilities"
|
19
|
+
s.description = "This ruby gem provides some useful command line utilities"
|
20
|
+
|
21
|
+
s.files = PKG_FILES
|
22
|
+
|
23
|
+
s.require_path = 'lib'
|
24
|
+
|
25
|
+
s.bindir = "bin"
|
26
|
+
s.executables.concat Dir['bin/*'].map { |f| File.basename(f) }
|
27
|
+
s.add_dependency 'spruz'
|
28
|
+
s.add_dependency 'term-ansicolor'
|
29
|
+
|
30
|
+
s.author = "Florian Frank"
|
31
|
+
s.email = "flori@ping.de"
|
32
|
+
s.homepage = "http://flori.github.com/utils"
|
33
|
+
end
|
34
|
+
|
35
|
+
task :gemspec do
|
36
|
+
File.open('utils.gemspec', 'w') do |output|
|
37
|
+
output.write spec.to_ruby
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
Rake::GemPackageTask.new(spec) do |pkg|
|
42
|
+
pkg.need_tar = true
|
43
|
+
pkg.package_files += PKG_FILES
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
desc m = "Writing version information for #{PKG_VERSION}"
|
48
|
+
task :version do
|
49
|
+
puts m
|
50
|
+
File.open(File.join('lib', PKG_NAME, 'version.rb'), 'w') do |v|
|
51
|
+
v.puts <<EOT
|
52
|
+
module Utils
|
53
|
+
# Utils version
|
54
|
+
VERSION = '#{PKG_VERSION}'
|
55
|
+
VERSION_ARRAY = VERSION.split(/\\./).map { |x| x.to_i } # :nodoc:
|
56
|
+
VERSION_MAJOR = VERSION_ARRAY[0] # :nodoc:
|
57
|
+
VERSION_MINOR = VERSION_ARRAY[1] # :nodoc:
|
58
|
+
VERSION_BUILD = VERSION_ARRAY[2] # :nodoc:
|
59
|
+
end
|
60
|
+
EOT
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
desc "Default task: write version and test"
|
65
|
+
task :default => [ :version, :test ]
|
66
|
+
|
67
|
+
desc "Prepare a release"
|
68
|
+
task :release => [ :clean, :version, :gemspec, :package ]
|
data/VERSION
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
0.0.0
|
data/bin/chroot-exec
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
#!/bin/sh
|
2
|
+
DIR=$1
|
3
|
+
test -z "$DIR" && exit 1
|
4
|
+
PRG=$2
|
5
|
+
test -z "$PRG" && PRG=/bin/bash
|
6
|
+
mount -t proc none $DIR/proc
|
7
|
+
mount -o bind /dev $DIR/dev
|
8
|
+
[ -e "$DIR/etc/resolv.conf" ] && cp -vLf "$DIR/etc/resolv.conf" "$DIR/etc/resolv.conf.bak"
|
9
|
+
cp -vLf /etc/resolv.conf "$DIR/etc/resolv.conf"
|
10
|
+
chroot $DIR $PRG
|
11
|
+
umount $DIR/proc
|
12
|
+
umount $DIR/dev
|
data/bin/chroot-libs
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'fileutils'
|
4
|
+
include FileUtils::Verbose
|
5
|
+
|
6
|
+
msg = "Usage: #$0 EXECUTABLE DIR [LIB ..]"
|
7
|
+
executable = ARGV.shift or fail msg
|
8
|
+
dir = ARGV.shift or fail msg
|
9
|
+
dir = File.expand_path dir
|
10
|
+
mkdir_p dir
|
11
|
+
|
12
|
+
executable = `which #{executable}`.chomp
|
13
|
+
libs = `ldd #{executable}`.gsub(/^(?:.*?\s+=>\s+|\s+)(.*?)\(.*/, '\1').grep(/\S/).map { |x| x.strip }
|
14
|
+
libs.concat ARGV
|
15
|
+
cd dir
|
16
|
+
for l in libs
|
17
|
+
cp l, File.basename(l)
|
18
|
+
end
|
data/bin/classify
ADDED
@@ -0,0 +1,37 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'spruz/go'
|
4
|
+
include Spruz::GO
|
5
|
+
|
6
|
+
class ::String
|
7
|
+
def camelize(first_letter_in_uppercase = true)
|
8
|
+
if first_letter_in_uppercase
|
9
|
+
gsub(/\/(.?)/) { "::#{$1.upcase}" }.gsub(/(?:^|_)(.)/) { $1.upcase }
|
10
|
+
else
|
11
|
+
self[0].chr.downcase + camelize(self)[1..-1]
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def underscore
|
16
|
+
word = dup
|
17
|
+
word.gsub!(/::/, '/')
|
18
|
+
word.gsub!(/([A-Z]+)([A-Z][a-z])/,'\1_\2')
|
19
|
+
word.gsub!(/([a-z\d])([A-Z])/,'\1_\2')
|
20
|
+
word.tr!("-", "_")
|
21
|
+
word.downcase!
|
22
|
+
word
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
opts = go 'bd'
|
27
|
+
|
28
|
+
string = ARGV.shift or fail "need a class/filepath/filename"
|
29
|
+
|
30
|
+
if opts['d']
|
31
|
+
string = string.sub(/.*::/, '') if opts['b']
|
32
|
+
print string.underscore + '.rb'
|
33
|
+
else
|
34
|
+
string = File.basename(string) if opts['b']
|
35
|
+
string = string.gsub(/#{Regexp.quote(File.extname(string))}\Z/, '')
|
36
|
+
print string.camelize
|
37
|
+
end
|
data/bin/discover
ADDED
@@ -0,0 +1,137 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'utils'
|
4
|
+
include Utils::Patterns
|
5
|
+
require 'term/ansicolor'
|
6
|
+
require 'spruz/xt'
|
7
|
+
|
8
|
+
class ::String
|
9
|
+
include Term::ANSIColor
|
10
|
+
end
|
11
|
+
|
12
|
+
class ::File
|
13
|
+
include Utils::FileXt
|
14
|
+
end
|
15
|
+
|
16
|
+
class Finder
|
17
|
+
include Utils::Find
|
18
|
+
|
19
|
+
def initialize(opts = {})
|
20
|
+
@args = opts[:args] || {}
|
21
|
+
@roots = opts[:roots] || []
|
22
|
+
pattern_opts = opts.subhash(:pattern) | {
|
23
|
+
:cset => @args['a'],
|
24
|
+
:icase => @args['i'],
|
25
|
+
}
|
26
|
+
@pattern = @args['r'] ?
|
27
|
+
RegexpPattern.new(pattern_opts) :
|
28
|
+
FuzzyPattern.new(pattern_opts)
|
29
|
+
@directory = @args['d']
|
30
|
+
@only_directory = @args['D']
|
31
|
+
@pathes = []
|
32
|
+
end
|
33
|
+
|
34
|
+
attr_reader :pathes
|
35
|
+
|
36
|
+
def attempt_match?(path)
|
37
|
+
stat = File.stat(path)
|
38
|
+
stat.symlink? and stat = File.lstat(path)
|
39
|
+
if @only_directory
|
40
|
+
stat.directory?
|
41
|
+
elsif @directory
|
42
|
+
stat.directory? || stat.file? && (stat.size == 0 || File.ascii?(path))
|
43
|
+
else
|
44
|
+
stat.file? && (stat.size == 0 || File.ascii?(path))
|
45
|
+
end
|
46
|
+
rescue SystemCallError => e
|
47
|
+
warn "Caught #{e.class}: #{e}"
|
48
|
+
nil
|
49
|
+
end
|
50
|
+
|
51
|
+
def search
|
52
|
+
pathes = []
|
53
|
+
find(*@roots) { |file| pathes << file }
|
54
|
+
pathes.flatten!
|
55
|
+
pathes.uniq!
|
56
|
+
pathes.map! { |p| a = File.split(p) ; a.unshift(p) ; a }
|
57
|
+
pathes = pathes.map! do |path, dir, file|
|
58
|
+
if do_match = attempt_match?(path) and $DEBUG
|
59
|
+
warn "Attempt match of #{path.inspect}"
|
60
|
+
end
|
61
|
+
if do_match and match = @pattern.match(file)
|
62
|
+
if FuzzyPattern === @pattern
|
63
|
+
current = 0
|
64
|
+
bold_file = ''
|
65
|
+
score, e = 0, 0
|
66
|
+
for i in 1...(match.size)
|
67
|
+
match[i] or next
|
68
|
+
b = match.begin(i)
|
69
|
+
bold_file << file[current...b]
|
70
|
+
bold_file << file[b, 1].bold
|
71
|
+
score += (b - e)
|
72
|
+
e = match.end(i)
|
73
|
+
current = b + 1
|
74
|
+
end
|
75
|
+
bold_file << match.post_match
|
76
|
+
[ score, file.size, path, File.join(dir, bold_file) ]
|
77
|
+
else
|
78
|
+
bold_file = file[0...match.begin(0)] <<
|
79
|
+
file[match.begin(0)...match.end(0)].bold <<
|
80
|
+
file[match.end(0)..-1]
|
81
|
+
[ 0, file.size, path, File.join(dir, bold_file) ]
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
pathes.compact!
|
86
|
+
@pathes, output = pathes.sort.transpose.values_at(-2, -1)
|
87
|
+
if !@args['e'] && output && !output.empty?
|
88
|
+
puts output
|
89
|
+
end
|
90
|
+
self
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
include Spruz::GO
|
95
|
+
|
96
|
+
def edit_files(pathes)
|
97
|
+
system "edit #{pathes.map { |x| "'#{x}'" } * ' '}"
|
98
|
+
end
|
99
|
+
|
100
|
+
def usage
|
101
|
+
puts <<-EOT
|
102
|
+
Usage: #{File.basename($0)} [OPTS] PATTERN [PATHES]
|
103
|
+
|
104
|
+
PATTERN is a pattern expression which is find the files. PATHES are the
|
105
|
+
directory and file pathes that are searched.
|
106
|
+
|
107
|
+
Options are
|
108
|
+
|
109
|
+
-r interpret PATTERN argument as regex not fuzzy
|
110
|
+
-d discover directorіes as well
|
111
|
+
-D discover only directories
|
112
|
+
-c disable color output
|
113
|
+
-i use case insensitive matches
|
114
|
+
-e open the matching files with edit command
|
115
|
+
-a CSET use only character set CSET from PATTERN
|
116
|
+
-h display this help
|
117
|
+
|
118
|
+
EOT
|
119
|
+
exit 1
|
120
|
+
end
|
121
|
+
|
122
|
+
args = go 'a:rdDcieh'
|
123
|
+
args['h'] and usage
|
124
|
+
pattern = ARGV.shift or usage
|
125
|
+
roots = (ARGV.empty? ? [ Dir.pwd ] : ARGV).map { |f| File.expand_path(f) }
|
126
|
+
|
127
|
+
Term::ANSIColor.coloring = (STDIN.tty? && ENV['TERM'] !~ /dumb/) && !args['c']
|
128
|
+
STDOUT.sync = true
|
129
|
+
|
130
|
+
finder = Finder.new(
|
131
|
+
:pattern => pattern,
|
132
|
+
:args => args,
|
133
|
+
:roots => roots
|
134
|
+
).search
|
135
|
+
if args['e']
|
136
|
+
edit_files finder.pathes
|
137
|
+
end
|
data/bin/edit
ADDED
@@ -0,0 +1,74 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'tempfile'
|
4
|
+
|
5
|
+
def cmd(*parts)
|
6
|
+
command = parts.inject([]) do |a, p|
|
7
|
+
case
|
8
|
+
when p == nil, p == []
|
9
|
+
a
|
10
|
+
when p.respond_to?(:to_ary)
|
11
|
+
a.concat p.to_ary
|
12
|
+
else
|
13
|
+
a << p.to_s
|
14
|
+
end
|
15
|
+
end
|
16
|
+
$DEBUG and warn command * ' '
|
17
|
+
command
|
18
|
+
end
|
19
|
+
|
20
|
+
case `uname -s`
|
21
|
+
when /\Adarwin/i
|
22
|
+
vim = if File.directory?('/Applications/Installed')
|
23
|
+
'/Applications/Installed/MacVim.app/Contents/MacOS/Vim'
|
24
|
+
elsif File.directory?('/Applications')
|
25
|
+
'/Applications/MacVim.app/Contents/MacOS/Vim'
|
26
|
+
else
|
27
|
+
fail "cannot find MacVim.app"
|
28
|
+
end
|
29
|
+
else
|
30
|
+
vim = 'gvim'
|
31
|
+
geometry = [ '-geometry', '80x59' ]
|
32
|
+
end
|
33
|
+
servername = [ '--servername', "G#{ENV['USER'].upcase}" ]
|
34
|
+
|
35
|
+
argv = ARGV.dup
|
36
|
+
if argv.empty?
|
37
|
+
if !STDIN.tty?
|
38
|
+
file = File.new(File.join(Dir.tmpdir, "edit_tmp.#$$"), 'w')
|
39
|
+
until STDIN.eof?
|
40
|
+
buffer = STDIN.read(8192)
|
41
|
+
file.write buffer
|
42
|
+
end
|
43
|
+
file.close
|
44
|
+
argv << file.path
|
45
|
+
elsif `#{vim} -g --serverlist`.split.member?(servername)
|
46
|
+
system *cmd(vim, '-g', geometry, servername, '--remote', "stupid_trick#{rand}")
|
47
|
+
sleep 1
|
48
|
+
exec *cmd(vim, '-g', geometry, servername, '--remote-send', '<ESC>:bw<CR>')
|
49
|
+
else
|
50
|
+
exec *cmd(vim, '-g', geometry, servername)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
unless argv.empty?
|
54
|
+
lineno_re = /^\s*([^:]+):(\d+)/
|
55
|
+
if argv.first =~ lineno_re
|
56
|
+
for a in argv
|
57
|
+
if a =~ lineno_re
|
58
|
+
system *cmd(vim, '-g', geometry, servername, '--remote', $1)
|
59
|
+
sleep 1
|
60
|
+
system *cmd(vim, '-g', geometry, servername, '--remote-send', "<ESC>:#$2<CR>")
|
61
|
+
else
|
62
|
+
system *cmd(vim, '-g', geometry, servername, '--remote', a)
|
63
|
+
end
|
64
|
+
if a != argv.last
|
65
|
+
STDOUT.print "Press enter to edit the next file."
|
66
|
+
STDOUT.flush
|
67
|
+
STDIN.gets
|
68
|
+
end
|
69
|
+
end
|
70
|
+
else
|
71
|
+
exec *cmd(vim, '-g', geometry, servername, '--remote', *argv)
|
72
|
+
end
|
73
|
+
end
|
74
|
+
exit 0
|
data/bin/errf
ADDED
@@ -0,0 +1,32 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'term/ansicolor'
|
4
|
+
|
5
|
+
class String
|
6
|
+
include Term::ANSIColor
|
7
|
+
end
|
8
|
+
|
9
|
+
file = ARGV.shift
|
10
|
+
name = ARGV.shift
|
11
|
+
ENV['RUBYOPT'] = "#{ENV['RUBYOPT']} -Iext:lib:test:tests"
|
12
|
+
|
13
|
+
STDOUT.sync = true
|
14
|
+
begin
|
15
|
+
output =
|
16
|
+
if name
|
17
|
+
IO.popen("testrb -p '' -n #{name} #{file}", 'r')
|
18
|
+
else
|
19
|
+
IO.popen("testrb -p '' #{file}", 'r')
|
20
|
+
end
|
21
|
+
until output.eof?
|
22
|
+
line = output.readline.uncolored
|
23
|
+
new_line = line.chomp
|
24
|
+
if new_line.sub!(%r(^(?:\s|[\/\[])*([^:]+):(\d+):(.*))) { "#$1:#$2:#$3" }
|
25
|
+
puts new_line
|
26
|
+
else
|
27
|
+
puts line
|
28
|
+
end
|
29
|
+
end
|
30
|
+
ensure
|
31
|
+
output and output.close
|
32
|
+
end
|
data/bin/git-empty
ADDED
data/bin/myex
ADDED
@@ -0,0 +1,90 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'spruz'
|
4
|
+
include Spruz::GO
|
5
|
+
|
6
|
+
def usage
|
7
|
+
puts <<EOT
|
8
|
+
Usage: #{File.basename($0)} list|create|truncate|insert|replace [OPTION] [TABLES]
|
9
|
+
|
10
|
+
Commands are
|
11
|
+
- list: display all tables in the backup
|
12
|
+
|
13
|
+
- create: display all create table statements in the backup. If TABLES
|
14
|
+
are given, display only those statements.
|
15
|
+
-d if this OPTION is given, first drop the table (if it exists)
|
16
|
+
before creation.
|
17
|
+
|
18
|
+
- truncate: all tables or the given TABLES, if they exist.
|
19
|
+
|
20
|
+
- insert: extract insert statemnts from the backup. If TABLES are given,
|
21
|
+
extract only those statements for these TABLES.
|
22
|
+
-t if this OPTION is given, truncate the table, before starting
|
23
|
+
to insert.
|
24
|
+
|
25
|
+
- replace: extract insert statemnts from the backup, and convert them
|
26
|
+
into replace statements. If TABLES are given, extract only
|
27
|
+
those statements for these TABLES.
|
28
|
+
EOT
|
29
|
+
exit 1
|
30
|
+
end
|
31
|
+
|
32
|
+
def bell(n = 1, s = 1)
|
33
|
+
n.times do
|
34
|
+
STDERR.print "\a\b"
|
35
|
+
sleep s
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
cmd = ARGV.shift or usage
|
40
|
+
opts = go('dtD')
|
41
|
+
|
42
|
+
STDOUT.sync = true
|
43
|
+
case cmd
|
44
|
+
when 'list'
|
45
|
+
STDIN.grep(/^CREATE TABLE `([^`]+)` \(/) { puts $1 }
|
46
|
+
when 'create'
|
47
|
+
STDIN.grep(/^CREATE TABLE `([^`]+)` \(/) do |stmt|
|
48
|
+
table = $1
|
49
|
+
next unless ARGV.empty? or ARGV.member?(table)
|
50
|
+
if opts['d']
|
51
|
+
puts "DROP TABLE IF EXISTS `#{table}`;"
|
52
|
+
warn "Dropped table #{table}."
|
53
|
+
end
|
54
|
+
line = stmt
|
55
|
+
puts line
|
56
|
+
until line =~ /;$/
|
57
|
+
line = STDIN.readline
|
58
|
+
puts line
|
59
|
+
end
|
60
|
+
warn "Created table #{table}."
|
61
|
+
end
|
62
|
+
when 'truncate'
|
63
|
+
STDIN.grep(/^CREATE TABLE `([^`]+)` \(/) do |stmt|
|
64
|
+
table = $1
|
65
|
+
next unless ARGV.empty? or ARGV.member?(table)
|
66
|
+
puts "TRUNCATE TABLE `#{table}`;"
|
67
|
+
warn "Truncated table #{table}."
|
68
|
+
end
|
69
|
+
when 'insert'
|
70
|
+
truncated = {}
|
71
|
+
STDIN.grep(/^INSERT INTO `(#{ARGV.empty? ? '[^`]+' : ARGV * '|'})`/) do |stmt|
|
72
|
+
table = $1
|
73
|
+
if opts['t'] and not truncated.key?(table)
|
74
|
+
puts "TRUNCATE TABLE `#{table}`;"
|
75
|
+
truncated[table] = true
|
76
|
+
warn "Truncated table #{table}."
|
77
|
+
end
|
78
|
+
puts stmt
|
79
|
+
warn "Inserted into table #{table}."
|
80
|
+
end
|
81
|
+
when 'replace'
|
82
|
+
STDIN.grep(/^INSERT INTO `(#{ARGV.empty? ? '[^`]+' : ARGV * '|'})`/) do |stmt|
|
83
|
+
table = $1
|
84
|
+
puts stmt.sub(/^INSERT INTO `(?:[^`]+)`/, "REPLACE INTO `#{table}`")
|
85
|
+
warn "Replaced into table #{table}."
|
86
|
+
end
|
87
|
+
else
|
88
|
+
usage
|
89
|
+
end
|
90
|
+
bell 3
|