guns 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (4) hide show
  1. data/README.md +44 -0
  2. data/guns.gemspec +26 -0
  3. data/lib/guns.rb +56 -0
  4. metadata +57 -0
@@ -0,0 +1,44 @@
1
+ # Guns
2
+ It has two pipes; got tickets to the show?
3
+
4
+ A low overhead sh utility to replace [session](http://www.codeforpeople.com/lib/ruby/session/)
5
+
6
+
7
+ ## Install
8
+
9
+ gem install guns -s http://gemcutter.org
10
+
11
+ ## Flexing
12
+
13
+ DISCLAIMER: It's not recommended to use guns in place of you shell
14
+ I'm purely using IRB for demonstration
15
+
16
+ $ irb -r rubygems -r guns
17
+ >> Guns.sh "ls not-a-dir"
18
+ => ["", "ls: not-a-dir: No such file or directory\n", 1]
19
+
20
+ The `sh` method returns a tuple containing `stdout`, `stderr`, and `exitstatus`.
21
+
22
+ ### Die hard
23
+
24
+ >> Guns.sh! "ls not-a-dir"
25
+ Guns::Failure: ls: not-a-dir: No such file or directory
26
+
27
+ from ./lib/guns.rb:50:in `sh!'
28
+ from (irb):3
29
+ `sh!` will raise an error on a non-zero exit status
30
+
31
+ ### Environment variables
32
+
33
+ >> Guns.sh "echo $FOO", "FOO" => "bar"
34
+ ["bar\n", "", 0]
35
+
36
+ ## Further Reading
37
+
38
+ If you need more flexability and features, see [Rush](http://github.com/adamwiggins/rush)
39
+
40
+ TODO: Replace popen3
41
+
42
+ ## Thanks
43
+ [Joe Ruscio](http://github.com/josephruscio) for helping me debug that nasty deadlock
44
+ [Ryan Tomayko](http://www.tomayko.com) for Shotgun; where I got started with this
@@ -0,0 +1,26 @@
1
+ Gem::Specification.new do |s|
2
+ s.specification_version = 2 if s.respond_to? :specification_version=
3
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
4
+
5
+ s.name = 'guns'
6
+ s.version = '0.1.0'
7
+ s.date = '2009-10-30'
8
+
9
+ s.description = "Guns - It's got two pipes; got tickets to the show?"
10
+ s.summary = s.description
11
+
12
+ s.authors = ["Blake Mizerany"]
13
+ s.email = "blake.mizerany@gmail.com"
14
+
15
+ s.files = %w[
16
+ README.md
17
+ guns.gemspec
18
+ lib/guns.rb
19
+ ]
20
+
21
+ s.extra_rdoc_files = %w[README.md]
22
+
23
+ s.homepage = "http://github.com/bmizerany/guns/"
24
+ s.require_paths = %w[lib]
25
+ s.rubygems_version = '1.1.1'
26
+ end
@@ -0,0 +1,56 @@
1
+ module Guns
2
+
3
+ class Failure < Exception ; end
4
+
5
+ def sh(cmd, *args)
6
+ env = args.pop if args.last.kind_of?(Hash)
7
+
8
+ rout, wout = IO.pipe
9
+ rerr, werr = IO.pipe
10
+
11
+ # Disable GC before forking in an attempt to get some advantage
12
+ # out of COW.
13
+
14
+ GC.disable
15
+
16
+ if fork
17
+ # Parent
18
+ wout.close
19
+ werr.close
20
+
21
+ Process.wait
22
+
23
+ exitstatus = $?.exitstatus
24
+ out = rout.read
25
+ err = rerr.read
26
+
27
+ [out, err, exitstatus]
28
+ else
29
+ # Child
30
+
31
+ if env
32
+ env.each {|k,v| ENV[k] = v}
33
+ end
34
+
35
+ STDOUT.reopen(wout)
36
+ STDERR.reopen(werr)
37
+
38
+ $0 = "#$0 -> [guns] #{cmd}"
39
+
40
+ system(cmd, *args)
41
+
42
+ exit! $?.exitstatus
43
+ end
44
+
45
+ ensure
46
+ GC.enable
47
+ end
48
+ module_function :sh
49
+
50
+ def sh!(*args)
51
+ out, err, code = sh(*args)
52
+ raise Failure, err if code != 0
53
+ end
54
+ module_function :sh!
55
+
56
+ end
metadata ADDED
@@ -0,0 +1,57 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: guns
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Blake Mizerany
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2009-10-30 00:00:00 -07:00
13
+ default_executable:
14
+ dependencies: []
15
+
16
+ description: Guns - It's got two pipes; got tickets to the show?
17
+ email: blake.mizerany@gmail.com
18
+ executables: []
19
+
20
+ extensions: []
21
+
22
+ extra_rdoc_files:
23
+ - README.md
24
+ files:
25
+ - README.md
26
+ - guns.gemspec
27
+ - lib/guns.rb
28
+ has_rdoc: true
29
+ homepage: http://github.com/bmizerany/guns/
30
+ licenses: []
31
+
32
+ post_install_message:
33
+ rdoc_options: []
34
+
35
+ require_paths:
36
+ - lib
37
+ required_ruby_version: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - ">="
40
+ - !ruby/object:Gem::Version
41
+ version: "0"
42
+ version:
43
+ required_rubygems_version: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: "0"
48
+ version:
49
+ requirements: []
50
+
51
+ rubyforge_project:
52
+ rubygems_version: 1.3.5
53
+ signing_key:
54
+ specification_version: 2
55
+ summary: Guns - It's got two pipes; got tickets to the show?
56
+ test_files: []
57
+