evaryont-arson 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
data/README.mkd ADDED
@@ -0,0 +1,42 @@
1
+ # This is arson 2.0, the hot AUR search helper!
2
+
3
+ There is 3 primary (and only, ever) functions of arson:
4
+
5
+ * Searching
6
+ * Downloading
7
+ * Updating
8
+
9
+ -----
10
+
11
+ ### Searching
12
+
13
+ arson's default fall back action. If arson doesn't understand your parameter,
14
+ it will search the AUR with them (after URL escaping them) and display the
15
+ results to you, in color.
16
+
17
+ -----
18
+
19
+ ### Downloading
20
+
21
+ If you pass arson the parameter "aur/foo" (however many spaces between) it will
22
+ attempt to download the package. Or, if the search results only have 1 result,
23
+ arson will download that package instead of displaying only 1. If you pass the
24
+ category (i.e. "aur-system/arson") arson will understand that as well.
25
+
26
+
27
+ -----
28
+
29
+ ### Updating
30
+
31
+ If you pass "?" as the only parameter, arson will search through the locally
32
+ installed foreign packages (as reported by `pacman -Qm') and return a list
33
+ of possible updates available in the AUR.
34
+
35
+ -----
36
+
37
+ You can not pass anything to arson to get a quick summary of these options.
38
+
39
+
40
+ (ps: Yes, I did report arson as dead, and within the hour restart development
41
+ on it. I'm crazy like that, I guess. Also, Daenyth and rson wanted me to
42
+ continue. Yay having people who actually like my software!)
data/Rakefile ADDED
@@ -0,0 +1,44 @@
1
+ begin; require 'rubygems'; rescue LoadError; end
2
+
3
+ require 'rake'
4
+
5
+ begin
6
+ require 'jeweler'
7
+ Jeweler::Tasks.new do |gemspec|
8
+ gemspec.name = 'arson'
9
+ gemspec.author = "Colin 'Evaryont' Shea"
10
+ gemspec.summary = "The HOT AUR search helper"
11
+ gemspec.description = gemspec.summary
12
+ gemspec.email = 'evaryont@saphrix.com'
13
+ gemspec.homepage = 'http://evaryont.github.com/arson/'
14
+ gemspec.platform = Gem::Platform::RUBY
15
+ gemspec.files = `git ls-files`.split("\n").sort
16
+ gemspec.has_rdoc = true
17
+ gemspec.require_path = 'lib'
18
+ gemspec.bindir = "bin"
19
+ gemspec.executables = ["arson"]
20
+
21
+ gemspec.add_dependency('json', '>= 1.1.3')
22
+ gemspec.add_dependency('facets', '>= 2.5.1')
23
+ end
24
+ rescue LoadError
25
+ puts "Jeweler not available. Install it with: sudo gem install technicalpickles-jeweler -s http://gems.github.com"
26
+ end
27
+
28
+ namespace :version do
29
+ desc "Writes the version to lib/arson/version.rb"
30
+ task :ruby do
31
+ version = Jeweler::Version.new(".")
32
+ # TODO: This is hard coded 'arson' but it should be dynamic, given
33
+ # the gem spec
34
+ file = File.open("lib/arson/version.rb", "w")
35
+ # TODO: and so should this class template
36
+ file.write <<-CLASS
37
+ # Automattically generated by `rake version:write' - use version:bump to change
38
+ # this, do not edit this directly, as it will be overwritten!
39
+ class Arson
40
+ VERSION = [#{version.major}, #{version.minor}, #{version.patch}]
41
+ end
42
+ CLASS
43
+ end
44
+ end
data/VERSION.yml ADDED
@@ -0,0 +1,4 @@
1
+ ---
2
+ :minor: 0
3
+ :patch: 0
4
+ :major: 2
data/arson.gemspec ADDED
@@ -0,0 +1,37 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ Gem::Specification.new do |s|
4
+ s.name = %q{arson}
5
+ s.version = "2.0.0"
6
+
7
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
8
+ s.authors = ["Colin 'Evaryont' Shea"]
9
+ s.date = %q{2009-04-28}
10
+ s.default_executable = %q{arson}
11
+ s.description = %q{The HOT AUR search helper}
12
+ s.email = %q{evaryont@saphrix.com}
13
+ s.executables = ["arson"]
14
+ s.files = ["README.mkd", "Rakefile", "VERSION.yml", "arson.gemspec", "bin/arson", "lib/arson.rb", "lib/arson/colorful.rb", "lib/arson/download.rb", "lib/arson/search.rb", "lib/arson/upgrade.rb", "lib/arson/version.rb"]
15
+ s.has_rdoc = true
16
+ s.homepage = %q{http://evaryont.github.com/arson/}
17
+ s.rdoc_options = ["--inline-source", "--charset=UTF-8"]
18
+ s.require_paths = ["lib"]
19
+ s.rubygems_version = %q{1.3.1}
20
+ s.summary = %q{The HOT AUR search helper}
21
+
22
+ if s.respond_to? :specification_version then
23
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
24
+ s.specification_version = 2
25
+
26
+ if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
27
+ s.add_runtime_dependency(%q<json>, [">= 1.1.3"])
28
+ s.add_runtime_dependency(%q<facets>, [">= 2.5.1"])
29
+ else
30
+ s.add_dependency(%q<json>, [">= 1.1.3"])
31
+ s.add_dependency(%q<facets>, [">= 2.5.1"])
32
+ end
33
+ else
34
+ s.add_dependency(%q<json>, [">= 1.1.3"])
35
+ s.add_dependency(%q<facets>, [">= 2.5.1"])
36
+ end
37
+ end
data/bin/arson ADDED
@@ -0,0 +1,74 @@
1
+ #!/usr/bin/ruby
2
+
3
+ $:.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
4
+
5
+ require 'arson'
6
+ require 'arson/colorful'
7
+
8
+
9
+ if ARGV.to_s == ""
10
+ puts "arson #{Arson::VERSION.join('.')} [Colin 'Evaryont' Shea <evaryont@saphrix.com>]"
11
+ puts "Please specifiy what to search for as the parameters to this script:"
12
+ puts Arson.colorful(:italic, " #{Arson::PROGRAM} pacman")
13
+ puts ""
14
+ puts "If you want to download a package, run #{Arson::PROGRAM} as such:"
15
+ puts Arson.colorful(:italic, " #{Arson::PROGRAM} aur/arson")
16
+ puts "(note: you can include the -category bit if you wish)"
17
+ puts ""
18
+ puts "Passing '?' to arson will cause it to check for any upgrades"
19
+ exit 1
20
+ end
21
+
22
+ if pkg = ARGV.to_s.scan(/^aur(?:-.*)\/(.*)$/).flatten[0]
23
+ if pkg = Arson.find_exact(pkg)
24
+ puts "Downloading #{pkg}..."
25
+ Arson.download(pkg)
26
+ exit 0
27
+ else
28
+ warn "I think you attempted to download a package, but I couldn't find it"
29
+ end
30
+ end
31
+
32
+ if ARGV.to_s =~ /\?/
33
+ print "Checking for upgrades..."
34
+ $stdout.flush
35
+ upgrades = Arson.check_upgrades
36
+ unless upgrades.empty?
37
+ print "\n"
38
+ $stdout.flush
39
+ upgrades.each do |line, new_version|
40
+ puts "#{line.strip} #{Arson::ASCII_CHECK} #{Arson.colorful("Green", new_version)}"
41
+ end
42
+ else
43
+ puts "Nothing to update"
44
+ end
45
+ exit 0
46
+ end
47
+
48
+ packages = Arson.search(ARGV)
49
+ if packages.length > 1
50
+ packages.each do |pkg|
51
+ name = Arson.colorful("White", pkg['Name'])
52
+ name = Arson.colorful("Red", name) if pkg["OutOfDate"] == "1"
53
+ if Arson::Categories[pkg['CategoryID'].to_i] && Arson::Categories[pkg['CategoryID'].to_i] != "nil"
54
+ category = "-#{Arson::Categories[pkg['CategoryID'].to_i]}"
55
+ else
56
+ category = ""
57
+ end
58
+
59
+ puts <<-HERE
60
+ #{Arson.colorful("Magenta", "aur#{category}")}/#{name} #{Arson.colorful("Green",pkg['Version'])}
61
+ #{pkg['Description']}
62
+ HERE
63
+ $stdout.flush
64
+ end
65
+
66
+ if File.exists? "/usr/bin/pacman-color"
67
+ exec "/usr/bin/pacman-color -Ss #{ARGV.join(' ')}"
68
+ else
69
+ exec "/usr/bin/pacman -Ss #{ARGV.join(' ')}"
70
+ end
71
+ else
72
+ puts "Downloading #{packages.first['Name']}..."
73
+ Arson.download(packages.first)
74
+ end
@@ -0,0 +1,18 @@
1
+ class Arson
2
+ class << self
3
+ def colorful(color, string)
4
+ return string unless $stdout.tty?
5
+ colored = ""
6
+ if color.is_a? String
7
+ Colors[color].each do |effect|
8
+ colored << "#{::ANSICode.send(effect)}"
9
+ end
10
+ elsif color.is_a? Symbol
11
+ colored << "#{::ANSICode.send(color)}"
12
+ else
13
+ return colorful(color.to_s, string)
14
+ end
15
+ colored << (string || "") << "#{::ANSICode.clear}"
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,35 @@
1
+ class Arson
2
+ class << self
3
+ # +package+ is expected to be a Hash, matching the structure the AUR
4
+ # RPC returns.
5
+ # TODO: Add automatic dependency tracking (gleaned parsing the PKGBUILD)
6
+ def download(package, depends=false)
7
+ begin
8
+ real_download("http://aur.archlinux.org"+package['URLPath'])
9
+ rescue Errno::EEXIST => e
10
+ warn e.message
11
+ exit 2
12
+ end
13
+ end
14
+
15
+ private
16
+
17
+ # The real downloading code, the parameter is expected to be a valid
18
+ # URL. No error checking is done.
19
+ #
20
+ # After the file is downloaded, it is attempted to be unpacked using
21
+ # tar and gunzip formats.
22
+ def real_download(url)
23
+ open(url) do |tar|
24
+ # Write the stream to a file, b is JIC
25
+ File.open(File.basename(url), "wb") do |file|
26
+ file.write(tar.read)
27
+ end
28
+ end
29
+ tgz = Zlib::GzipReader.new(File.open(File.basename(url), 'rb'))
30
+ # Extract pkg.tar.gz to `pwd`, instead of `pwd`/pkg
31
+ Archive::Tar::Minitar.unpack(tgz, Dir.pwd)
32
+ FileUtils.mv File.basename(url), File.join(Dir.pwd, File.basename(url)[0..-8])
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,44 @@
1
+ class Arson
2
+ class << self
3
+ # Given an array of search parameters, return an array of hashes
4
+ # describing each package search result.
5
+ def search(*args)
6
+ keywords = args.join(' ')
7
+ json = open("http://aur.archlinux.org/rpc.php?type=search&arg=#{URI.escape(keywords)}").read
8
+ hash = JSON.parse(json)
9
+ packages = []
10
+
11
+ if hash["type"] == "search"
12
+
13
+ # Alt search orders: [pkg['CategoryID'],pkg['Name']] - ID num, then name
14
+ # [Categories[pkg['CategoryID'].to_i],pkg['Name']] - Category name, then pkg name
15
+ hash["results"].sort_by{|pkg|[pkg['Name']]}.each do |pkg|
16
+ # Dir["/var/lib/pacman/sync/community/#{pkg['Name']}-*"].first
17
+ next if File.exists? "/var/lib/pacman/sync/community/#{pkg['Name']}-#{pkg['Version']}"
18
+ packages << pkg
19
+ end
20
+ end
21
+
22
+ packages
23
+ end
24
+
25
+ # Attempts to find an exact matching package in AUR
26
+ def find_exact(arg)
27
+ hash = JSON.parse(open("http://aur.archlinux.org/rpc.php?type=search&arg=#{URI.escape(arg)}").read)
28
+ packages = []
29
+
30
+ if hash["type"] == "search"
31
+
32
+ # Alt search orders: [pkg['CategoryID'],pkg['Name']] - ID num, then name
33
+ # [Categories[pkg['CategoryID'].to_i],pkg['Name']] - Category name, then pkg name
34
+ hash["results"].sort_by{|pkg|[pkg['Name']]}.each do |pkg|
35
+ # Dir["/var/lib/pacman/sync/community/#{pkg['Name']}-*"].first
36
+ next if File.exists? "/var/lib/pacman/sync/community/#{pkg['Name']}-#{pkg['Version']}"
37
+ return pkg if pkg['Name'] == arg
38
+ end
39
+ end
40
+
41
+ return nil
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,26 @@
1
+ class Arson
2
+ class << self
3
+ # Thanks for the cleaned up version, Gigamo! Here I go dirtying
4
+ # it up, however. ;)
5
+ #
6
+ # Calls `pacman -Qm', and given each line, finds upgrades for
7
+ # that package.
8
+ def check_upgrades
9
+ upgradable = Hash.new
10
+
11
+ ::IO.popen('pacman -Qm', ::IO::RDONLY) {|pm| pm.read.lines}.each do |line|
12
+ name, version = line.chomp.split
13
+ result = find_exact(name)
14
+
15
+ if result
16
+ if ::VersionNumber.new(result['Version']) > ::VersionNumber.new(version)
17
+ upgradable[line] = result['Version']
18
+ end
19
+ end
20
+ end
21
+
22
+ upgradable#.any? ? download(upgradable) : say('Nothing to update')
23
+ end
24
+
25
+ end
26
+ end
@@ -0,0 +1,5 @@
1
+ # Automattically generated by `rake version:write' - use version:bump to change
2
+ # this, do not edit this directly, as it will be overwritten!
3
+ class Arson
4
+ VERSION = [2, 0, 0]
5
+ end
data/lib/arson.rb ADDED
@@ -0,0 +1,42 @@
1
+ require 'open-uri'
2
+ require 'zlib'
3
+ require 'rubygems'
4
+ require 'json'
5
+ require 'facets/ansicode'
6
+ require 'facets/minitar'
7
+ require 'facets/version'
8
+
9
+ require 'arson/version'
10
+ require 'arson/search'
11
+ require 'arson/download'
12
+ require 'arson/upgrade'
13
+
14
+ class Arson
15
+ # I wish the AUR had an RPC for these, or replaced CategoryID with the name
16
+ # instead. The first 'nil' is padding, since the categories start at index
17
+ # 1, going through 18, instead of being sensible and starting from 0.
18
+ Categories = %w{nil nil daemons devel editors emulators games gnome
19
+ i18n kde lib modules multimedia network office
20
+ science system x11 xfce kernels}
21
+ # Defaults from pacman-color
22
+ Colors = {"Magenta" => [:bold, :magenta],
23
+ "White" => [:bold],
24
+ "Cyan" => [:bold, :cyan],
25
+ "Blue" => [:bold, :blue],
26
+ "Yellow" => [:bold, :yellow],
27
+ "Red" => [:bold, :red],
28
+ "Green" => [:bold, :green]}
29
+ # And support for user modifications. Note that inline comments (ie
30
+ # "White = gray # blah blah") aren't supported and cause this to crash
31
+ Colors.merge!( Hash[ open("/etc/pacman.d/color.conf").readlines.map(&:strip).reject do |line|
32
+ line=~ /^#/||line=~ /^$/
33
+ end.map do |line|
34
+ a=line.split("=").map(&:strip); [a[0], a[1].sub(/intensive/, "bold").split.map(&:to_sym)]
35
+ end ] ) if File.exists? "/etc/pacman.d/color.conf"
36
+
37
+ PROGRAM = File.basename($0)
38
+
39
+ # These will possibly be redefined later.
40
+ ASCII_X = '✘'
41
+ ASCII_CHECK = '✔'
42
+ end
metadata ADDED
@@ -0,0 +1,83 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: evaryont-arson
3
+ version: !ruby/object:Gem::Version
4
+ version: 2.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Colin 'Evaryont' Shea
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2009-04-28 00:00:00 -07:00
13
+ default_executable: arson
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: json
17
+ type: :runtime
18
+ version_requirement:
19
+ version_requirements: !ruby/object:Gem::Requirement
20
+ requirements:
21
+ - - ">="
22
+ - !ruby/object:Gem::Version
23
+ version: 1.1.3
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: 2.5.1
34
+ version:
35
+ description: The HOT AUR search helper
36
+ email: evaryont@saphrix.com
37
+ executables:
38
+ - arson
39
+ extensions: []
40
+
41
+ extra_rdoc_files: []
42
+
43
+ files:
44
+ - README.mkd
45
+ - Rakefile
46
+ - VERSION.yml
47
+ - arson.gemspec
48
+ - bin/arson
49
+ - lib/arson.rb
50
+ - lib/arson/colorful.rb
51
+ - lib/arson/download.rb
52
+ - lib/arson/search.rb
53
+ - lib/arson/upgrade.rb
54
+ - lib/arson/version.rb
55
+ has_rdoc: true
56
+ homepage: http://evaryont.github.com/arson/
57
+ post_install_message:
58
+ rdoc_options:
59
+ - --inline-source
60
+ - --charset=UTF-8
61
+ require_paths:
62
+ - lib
63
+ required_ruby_version: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - ">="
66
+ - !ruby/object:Gem::Version
67
+ version: "0"
68
+ version:
69
+ required_rubygems_version: !ruby/object:Gem::Requirement
70
+ requirements:
71
+ - - ">="
72
+ - !ruby/object:Gem::Version
73
+ version: "0"
74
+ version:
75
+ requirements: []
76
+
77
+ rubyforge_project:
78
+ rubygems_version: 1.2.0
79
+ signing_key:
80
+ specification_version: 2
81
+ summary: The HOT AUR search helper
82
+ test_files: []
83
+