aurb 0.9.3

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.rdoc +54 -0
  2. data/aurb.gemspec +19 -0
  3. data/bin/aurb +224 -0
  4. metadata +81 -0
@@ -0,0 +1,54 @@
1
+ == Usage
2
+
3
+ See <tt>aurb --help</tt> for a full list of commands.
4
+
5
+ === Quick Overview
6
+
7
+ Required options:
8
+
9
+ <tt>--download</tt>:: Downloads a specified package and untars it
10
+ <tt>--search</tt>:: Searches the AUR for a specified name or description
11
+ <tt>--upgrade</tt>:: Searches the AUR for updates to foreign local packages
12
+
13
+ Optional options:
14
+
15
+ <tt>--no-color</tt>:: Suppress colored output
16
+ <tt>--path</tt>:: Override the default save path (defined as DlPath)
17
+
18
+ Other:
19
+
20
+ <tt>--version</tt>:: Print version and exit
21
+
22
+ == Installation
23
+
24
+ Quick and dirty:
25
+
26
+ # ruby setup.rb all
27
+
28
+ Or you can install it in ~/bin:
29
+
30
+ % ruby setup.rb config --bindir=$HOME/bin
31
+ % ruby setup.rb install
32
+
33
+ For more information about setup.rb, see <tt>ruby setup.rb --help</tt>.
34
+
35
+ There is also a ruby gemspec available.
36
+
37
+ === Dependencies
38
+
39
+ Aurb requires the 'facets' and 'yajl-ruby' rubygems to be installed.
40
+
41
+ Facets for:
42
+
43
+ * Checking version numbers
44
+ * Coloring text
45
+ * Untarring
46
+
47
+ Yajl for:
48
+
49
+ * Parsing the AUR
50
+
51
+ == Todo
52
+
53
+ * Automatically build (and install) the package after download?
54
+ * Add dependency checking/downloading?
@@ -0,0 +1,19 @@
1
+ # aurb.gemspec
2
+
3
+ Gem::Specification.new do |s|
4
+ s.name = 'aurb'
5
+ s.version = '0.9.3'
6
+ s.date = %q{2009-12-02}
7
+ s.summary = %q{An AUR (Arch User Repository) script}
8
+ s.email = %q{gigamo@gmail.com}
9
+ s.homepage = %q{http://github.com/gigamo/aurb}
10
+ s.description = s.summary
11
+ s.rubyforge_project = %q{aurb}
12
+ s.executables = ['aurb']
13
+ s.has_rdoc = true
14
+ s.rdoc_options = ['--line-numbers', '--inline-source', '--title', 'Aurb', '--main', 'README.rdoc']
15
+ s.authors = ['Gigamo']
16
+ s.files = ['bin/aurb', 'aurb.gemspec', 'README.rdoc']
17
+ s.add_dependency 'yajl-ruby'
18
+ s.add_dependency 'facets'
19
+ end
@@ -0,0 +1,224 @@
1
+ #!/usr/bin/env ruby
2
+ # encoding: utf-8
3
+ #
4
+ #--
5
+ # Copyright protects this work.
6
+ # See LICENSE file for details.
7
+ #++
8
+ %w[rubygems getoptlong pathname zlib open-uri yajl gettext
9
+ facets/ansicode facets/minitar facets/version].each do |lib|
10
+ begin
11
+ require lib
12
+ rescue LoadError
13
+ abort "F: You're missing '#{lib}'.\nPlease make sure you have the necessary rubygems installed."
14
+ end
15
+ end
16
+
17
+ def _ str
18
+ GetText::_(str)
19
+ end
20
+
21
+ module Aurb
22
+ DlPath = File.join ENV['HOME'], 'abs'
23
+ PrInfo = {:name => 'Aurb', :version => [0, 9, 3].join('.'), :release => '2009-12-02'}
24
+
25
+ module Util
26
+ def ansi text, effect
27
+ (@config[:color] ? ANSICode.send(effect.to_sym) : '') << text.to_s << ANSICode.clear
28
+ end
29
+ end
30
+
31
+ class Aur
32
+ include Aurb::Util
33
+
34
+ class << self
35
+ def start
36
+ trap :INT do
37
+ $stderr.puts _("\nInterrupt signal received\n\n")
38
+ exit 0
39
+ end
40
+
41
+ self.new :rpc => proc {|type, arg| "http://aur.archlinux.org/rpc.php?type=#{type}&arg=#{arg}"}
42
+ end
43
+ end
44
+
45
+ def initialize config
46
+ opts = Opts.new
47
+ @config = config.merge(opts.config)
48
+
49
+ opts.cmd.each do |cmd|
50
+ cmd.length == 1 ? __send__(cmd.first) : __send__(cmd.first, cmd.last)
51
+ $stdout.puts "\n\n-----" unless cmd == opts.cmd.last
52
+ end
53
+ end
54
+
55
+ def download packages
56
+ packages.delete_if {|pkg| in_sync?(pkg)}
57
+ abort _('E: The package(s) you specified was/were found in the community repository') if packages.empty?
58
+ $stdout.puts _("Targets (#{ansi packages.length, :magenta}): #{packages.join(', ')}")
59
+ packages.each do |package|
60
+ begin
61
+ Dir.chdir @config[:path] do
62
+ fetch package
63
+ untar package
64
+ end
65
+ rescue OpenURI::HTTPError
66
+ warn _("W: Something went wrong downloading '#{package}'. Are you sure it exists?")
67
+ package == packages.last ? exit : next
68
+ end
69
+ $stdout.puts _("(#{packages.index(package)+1}/#{packages.length}) downloaded #{package}")
70
+ end
71
+ end
72
+
73
+ def search packages
74
+ packages.each do |package|
75
+ list(package).each do |id|
76
+ result = json @config[:rpc]['info', id]
77
+ unless result['type'] =~ /error/
78
+ result = result['results']
79
+ next if in_sync? result['Name']
80
+ if package.split.any? {|pac| (result['Name'] + result['Description']).include?(pac)}
81
+ $stdout.puts _("[#{result['OutOfDate'] == '1' ? ansi('✘', :red) : ansi('✔', :green)}] " +
82
+ "#{ansi result['Name'], :blue} (#{result['Version']})\n #{result['Description']}")
83
+ end
84
+ end
85
+ end
86
+ end
87
+ end
88
+
89
+ def check_upgrade
90
+ upgradables = []
91
+ IO.popen('pacman -Qm', IO::RDONLY) {|pm| pm.read.lines}.each do |line|
92
+ name, version = line.chomp.split
93
+ result = json @config[:rpc]['info', name]
94
+ unless result['type'] =~ /error/
95
+ result = result['results']
96
+ next if in_sync? result['Name']
97
+ if VersionNumber.new(result['Version']) > VersionNumber.new(version)
98
+ upgradables << result['Name']
99
+ $stdout.puts _("* #{name}: #{ansi version, :red} => #{ansi result['Version'], :green}")
100
+ end
101
+ end
102
+ end
103
+ upgradables.any? ? (download upgradables) : ($stdout.puts _('Nothing to update'))
104
+ end
105
+
106
+ private
107
+ def in_sync? package
108
+ !!Dir["/var/lib/pacman/sync/community/#{package}-*"].first
109
+ end
110
+
111
+ def list package
112
+ list = []
113
+ info = json @config[:rpc]['search', URI.escape(package)]
114
+ unless info['type'] =~ /error/
115
+ info['results'].each do |result|
116
+ list << result['ID']
117
+ end
118
+ end
119
+ list
120
+ end
121
+
122
+ def fetch package
123
+ open "http://aur.archlinux.org/packages/#{package}/#{package}.tar.gz" do |remote|
124
+ File.open "#{package}.tar.gz", 'wb' do |local|
125
+ local.write remote.read
126
+ end
127
+ end
128
+ end
129
+
130
+ def untar package
131
+ Archive::Tar::Minitar.unpack \
132
+ Zlib::GzipReader.new(File.open("#{package}.tar.gz", 'rb')),
133
+ Dir.pwd
134
+ File.delete "#{package}.tar.gz"
135
+ end
136
+
137
+ def json item
138
+ Yajl::Parser.new.parse(open(item).read)
139
+ end
140
+ end
141
+
142
+ class Opts
143
+ attr_reader :config, :cmd
144
+
145
+ def initialize
146
+ @cmd = []
147
+ @config = {:path => DlPath, :color => true}
148
+
149
+ parse!
150
+ self
151
+ end
152
+
153
+ private
154
+ def parse!
155
+ ARGV.unshift '-h' if ARGV.empty?
156
+
157
+ gopts = GetoptLong.new \
158
+ ['--download', '-d', GetoptLong::REQUIRED_ARGUMENT],
159
+ ['--search', '-s', GetoptLong::REQUIRED_ARGUMENT],
160
+ ['--upgrade', '-u', GetoptLong::NO_ARGUMENT ],
161
+ ['--no-color', GetoptLong::NO_ARGUMENT ],
162
+ ['--path', GetoptLong::OPTIONAL_ARGUMENT],
163
+ ['--version', '-v', GetoptLong::NO_ARGUMENT ],
164
+ ['--help', '-h', GetoptLong::NO_ARGUMENT ]
165
+
166
+ gopts.each do |opt, arg|
167
+ case opt
168
+ when '--download' then @cmd << ['download', arg.split]
169
+ when '--search' then @cmd << ['search', arg.split]
170
+ when '--upgrade' then @cmd << ['check_upgrade' ]
171
+ when '--no-color' then @config[:color] = false
172
+ when '--path'
173
+ if File.exists? arg = (arg[0...1] == '/' ? arg : File.join(Dir.pwd, arg))
174
+ @config[:path] = Pathname.new(arg).realpath || File.expand_path(arg)
175
+ else
176
+ warn _("W: '#{arg}' does not exist. Fell back to [#{@config[:path]}]\n")
177
+ end
178
+ when '--version'
179
+ $stdout.puts _('%s %s (%s)' % [:name, :version, :release].map {|key| PrInfo[key]})
180
+ exit -1
181
+ when '--help' then print_help
182
+ end
183
+ end
184
+ rescue GetoptLong::Error; exit 2
185
+ end
186
+
187
+ def print_help out = $stdout
188
+ out.puts _(<<-HELP)
189
+ Aurb - An AUR (Arch User Repository) script
190
+
191
+ Usage:
192
+ #{name = File.basename $0} [options]
193
+
194
+ Options (Required):
195
+ -d, --download PACKAGE Download package(s).
196
+ -s, --search PACKAGE Search for package(s).
197
+ -u, --upgrade Search for package updates.
198
+
199
+ Optional:
200
+ --no-color Disable colored output.
201
+ --path [PATH] Override the default save path. [#{@config[:path]}]
202
+
203
+ Other:
204
+ --version Show version and exit.
205
+ --help You're looking at it.
206
+
207
+ Examples:
208
+ #{name} -d 'package1 package2' --path ~/downloads
209
+ #{name} -s 'package1 package2' --no-color
210
+ #{name} --upgrade
211
+
212
+ Aurb was inspired by arson. Have a look at http://evaryont.github.com/arson
213
+ HELP
214
+ exit -1
215
+ end
216
+ end
217
+ end
218
+
219
+ at_exit do
220
+ if __FILE__ == $0
221
+ raise $! if $!
222
+ Aurb::Aur.start
223
+ end
224
+ end
metadata ADDED
@@ -0,0 +1,81 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: aurb
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.9.3
5
+ platform: ruby
6
+ authors:
7
+ - Gigamo
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2009-12-02 00:00:00 +01:00
13
+ default_executable:
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: yajl-ruby
17
+ type: :runtime
18
+ version_requirement:
19
+ version_requirements: !ruby/object:Gem::Requirement
20
+ requirements:
21
+ - - ">="
22
+ - !ruby/object:Gem::Version
23
+ version: "0"
24
+ version:
25
+ - !ruby/object:Gem::Dependency
26
+ name: facets
27
+ type: :runtime
28
+ version_requirement:
29
+ version_requirements: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: "0"
34
+ version:
35
+ description: An AUR (Arch User Repository) script
36
+ email: gigamo@gmail.com
37
+ executables:
38
+ - aurb
39
+ extensions: []
40
+
41
+ extra_rdoc_files: []
42
+
43
+ files:
44
+ - bin/aurb
45
+ - aurb.gemspec
46
+ - README.rdoc
47
+ has_rdoc: true
48
+ homepage: http://github.com/gigamo/aurb
49
+ licenses: []
50
+
51
+ post_install_message:
52
+ rdoc_options:
53
+ - --line-numbers
54
+ - --inline-source
55
+ - --title
56
+ - Aurb
57
+ - --main
58
+ - README.rdoc
59
+ require_paths:
60
+ - lib
61
+ required_ruby_version: !ruby/object:Gem::Requirement
62
+ requirements:
63
+ - - ">="
64
+ - !ruby/object:Gem::Version
65
+ version: "0"
66
+ version:
67
+ required_rubygems_version: !ruby/object:Gem::Requirement
68
+ requirements:
69
+ - - ">="
70
+ - !ruby/object:Gem::Version
71
+ version: "0"
72
+ version:
73
+ requirements: []
74
+
75
+ rubyforge_project: aurb
76
+ rubygems_version: 1.3.5
77
+ signing_key:
78
+ specification_version: 3
79
+ summary: An AUR (Arch User Repository) script
80
+ test_files: []
81
+