arpm 0.9.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.
- checksums.yaml +7 -0
- data/.gitignore +23 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +92 -0
- data/Rakefile +2 -0
- data/arpm.gemspec +27 -0
- data/bin/arpm +6 -0
- data/lib/arpm.rb +14 -0
- data/lib/arpm/cli.rb +250 -0
- data/lib/arpm/config.rb +16 -0
- data/lib/arpm/libfile.rb +33 -0
- data/lib/arpm/list.rb +106 -0
- data/lib/arpm/os.rb +17 -0
- data/lib/arpm/package.rb +120 -0
- data/lib/arpm/string.rb +24 -0
- data/lib/arpm/vendor/ruby-git/git.rb +148 -0
- data/lib/arpm/vendor/ruby-git/git/author.rb +14 -0
- data/lib/arpm/vendor/ruby-git/git/base.rb +560 -0
- data/lib/arpm/vendor/ruby-git/git/branch.rb +122 -0
- data/lib/arpm/vendor/ruby-git/git/branches.rb +71 -0
- data/lib/arpm/vendor/ruby-git/git/diff.rb +146 -0
- data/lib/arpm/vendor/ruby-git/git/index.rb +5 -0
- data/lib/arpm/vendor/ruby-git/git/lib.rb +848 -0
- data/lib/arpm/vendor/ruby-git/git/log.rb +128 -0
- data/lib/arpm/vendor/ruby-git/git/object.rb +282 -0
- data/lib/arpm/vendor/ruby-git/git/path.rb +31 -0
- data/lib/arpm/vendor/ruby-git/git/remote.rb +36 -0
- data/lib/arpm/vendor/ruby-git/git/repository.rb +6 -0
- data/lib/arpm/vendor/ruby-git/git/stash.rb +27 -0
- data/lib/arpm/vendor/ruby-git/git/stashes.rb +44 -0
- data/lib/arpm/vendor/ruby-git/git/status.rb +117 -0
- data/lib/arpm/vendor/ruby-git/git/version.rb +7 -0
- data/lib/arpm/vendor/ruby-git/git/working_directory.rb +4 -0
- data/lib/arpm/version.rb +3 -0
- data/packages.json +8 -0
- metadata +122 -0
data/lib/arpm/config.rb
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
module ARPM
|
2
|
+
class Config
|
3
|
+
|
4
|
+
def self.base_directory
|
5
|
+
if OS.windows?
|
6
|
+
lib_dir = "/My Documents/Arduino/libraries/"
|
7
|
+
else OS.mac?
|
8
|
+
lib_dir = "/Documents/Arduino/libraries/"
|
9
|
+
end
|
10
|
+
|
11
|
+
base = File.expand_path("~")
|
12
|
+
|
13
|
+
"#{base}#{lib_dir}"
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
data/lib/arpm/libfile.rb
ADDED
@@ -0,0 +1,33 @@
|
|
1
|
+
module ARPM
|
2
|
+
class Libfile
|
3
|
+
|
4
|
+
attr_accessor :content
|
5
|
+
|
6
|
+
def initialize(content)
|
7
|
+
@content = content
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.location
|
11
|
+
Dir.pwd + "/Libfile"
|
12
|
+
end
|
13
|
+
|
14
|
+
def dependencies
|
15
|
+
|
16
|
+
packages = []
|
17
|
+
|
18
|
+
content.gsub!(/\r\n?/, "\n")
|
19
|
+
content.each_line do |line|
|
20
|
+
|
21
|
+
if line.start_with?('lib')
|
22
|
+
elements = line.scan(/"([^"]*)"/) + line.scan(/'([^']*)'/)
|
23
|
+
packages << {elements[0][0] => elements[1][0]}
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
27
|
+
|
28
|
+
packages
|
29
|
+
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
33
|
+
end
|
data/lib/arpm/list.rb
ADDED
@@ -0,0 +1,106 @@
|
|
1
|
+
module ARPM
|
2
|
+
class List
|
3
|
+
|
4
|
+
def self.register(package, version)
|
5
|
+
# Make sure the list exists
|
6
|
+
FileUtils.touch(path) unless File.exists?(path)
|
7
|
+
|
8
|
+
packages = JSON.parse(File.read(path)) rescue []
|
9
|
+
|
10
|
+
# Is any version of this pacakge installed?
|
11
|
+
if ARPM::List.includes?(package.name)
|
12
|
+
|
13
|
+
# Is this version already installed?
|
14
|
+
unless ARPM::List.includes?(package.name, version)
|
15
|
+
|
16
|
+
# No it isn't, so add this version to the list
|
17
|
+
packages.select { |p| p.keys[0] == package.name }.first[package.name] << version
|
18
|
+
|
19
|
+
end
|
20
|
+
|
21
|
+
else
|
22
|
+
|
23
|
+
# It isn't so add the whole package
|
24
|
+
packages << {package.name => [version]}
|
25
|
+
|
26
|
+
end
|
27
|
+
|
28
|
+
# Write that shit down
|
29
|
+
f = File.open(path, 'w')
|
30
|
+
f.write(JSON.generate(packages, :quirks_mode => true))
|
31
|
+
f.close
|
32
|
+
|
33
|
+
end
|
34
|
+
|
35
|
+
def self.unregister(package, version)
|
36
|
+
|
37
|
+
packages = JSON.parse(File.read(path)) rescue []
|
38
|
+
|
39
|
+
# Is any version of this pacakge installed?
|
40
|
+
if ARPM::List.includes?(package.name)
|
41
|
+
if package.installed_versions.size > 0
|
42
|
+
|
43
|
+
# Get the remaining versions
|
44
|
+
remaining_versions = packages.select { |p| p.keys[0] == package.name }.first[package.name] - [version]
|
45
|
+
|
46
|
+
packages.select { |p| p.keys[0] == package.name }.first[package.name] = remaining_versions
|
47
|
+
else
|
48
|
+
packages.delete(package.name)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
# Write that shit down
|
53
|
+
f = File.open(path, 'w')
|
54
|
+
f.write(JSON.generate(packages, :quirks_mode => true))
|
55
|
+
f.close
|
56
|
+
|
57
|
+
end
|
58
|
+
|
59
|
+
def self.includes?(package_name, version = nil)
|
60
|
+
|
61
|
+
# Get all the packages
|
62
|
+
packages = JSON.parse(File.read(path)) rescue []
|
63
|
+
|
64
|
+
# Search for the specified package
|
65
|
+
list_package = packages.select { |p| p.keys[0] == package_name }
|
66
|
+
|
67
|
+
# Was the version specified?
|
68
|
+
if version
|
69
|
+
|
70
|
+
# Yes, so only return yes if the specified version is installed
|
71
|
+
return list_package.first[package_name].include?(version)
|
72
|
+
|
73
|
+
else
|
74
|
+
|
75
|
+
# No, so return yes if any versions of the package are installed
|
76
|
+
return list_package.first
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
def self.versions(package_name)
|
81
|
+
# Get all the packages
|
82
|
+
packages = JSON.parse(File.read(path)) rescue []
|
83
|
+
|
84
|
+
# Search for the specified package
|
85
|
+
list_package = packages.select { |p| p.keys[0] == package_name }.first
|
86
|
+
|
87
|
+
# Return an array of the versions
|
88
|
+
list_package[package_name]
|
89
|
+
|
90
|
+
end
|
91
|
+
|
92
|
+
def self.all
|
93
|
+
# Get all the packages
|
94
|
+
packages = JSON.parse(File.read(path)) rescue []
|
95
|
+
|
96
|
+
packages
|
97
|
+
end
|
98
|
+
|
99
|
+
private
|
100
|
+
|
101
|
+
def self.path
|
102
|
+
ARPM::Config.base_directory + "/arpm.txt"
|
103
|
+
end
|
104
|
+
|
105
|
+
end
|
106
|
+
end
|
data/lib/arpm/os.rb
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
module OS
|
2
|
+
def OS.windows?
|
3
|
+
(/cygwin|mswin|mingw|bccwin|wince|emx/ =~ RUBY_PLATFORM) != nil
|
4
|
+
end
|
5
|
+
|
6
|
+
def OS.mac?
|
7
|
+
(/darwin/ =~ RUBY_PLATFORM) != nil
|
8
|
+
end
|
9
|
+
|
10
|
+
def OS.unix?
|
11
|
+
!OS.windows?
|
12
|
+
end
|
13
|
+
|
14
|
+
def OS.linux?
|
15
|
+
OS.unix? and not OS.mac?
|
16
|
+
end
|
17
|
+
end
|
data/lib/arpm/package.rb
ADDED
@@ -0,0 +1,120 @@
|
|
1
|
+
module ARPM
|
2
|
+
class Package
|
3
|
+
|
4
|
+
attr_accessor :name
|
5
|
+
attr_accessor :authors
|
6
|
+
attr_accessor :versions
|
7
|
+
attr_accessor :repository
|
8
|
+
|
9
|
+
def initialize(opts = {})
|
10
|
+
opts.each { |k,v| instance_variable_set("@#{k}", v) }
|
11
|
+
end
|
12
|
+
|
13
|
+
# Search for a new package
|
14
|
+
def self.search(name, exact_match = true)
|
15
|
+
|
16
|
+
# Grab the package list
|
17
|
+
data = URI.parse("https://raw.githubusercontent.com/alfo/arpm/master/packages.json").read
|
18
|
+
packages = JSON.parse(data)
|
19
|
+
|
20
|
+
if exact_match
|
21
|
+
|
22
|
+
# Search the packages for one with the same name
|
23
|
+
remote_packages = packages.select { |p| p['name'] == name }
|
24
|
+
|
25
|
+
else
|
26
|
+
|
27
|
+
# Search for packages with similar names and return them
|
28
|
+
remote_packages = packages.select { |p| p['name'].include? name }
|
29
|
+
|
30
|
+
end
|
31
|
+
|
32
|
+
# Did the search return any results?
|
33
|
+
if remote_packages.any?
|
34
|
+
|
35
|
+
packages = []
|
36
|
+
remote_packages.each do |remote_package|
|
37
|
+
|
38
|
+
# Get a list of tags from the remote repo
|
39
|
+
tags = Git::Lib.new.ls_remote(remote_package["repository"])["tags"]
|
40
|
+
|
41
|
+
# Delete any tags that aren't version numbers
|
42
|
+
tags.each { |t| tags.delete(t) unless t[0].is_number? }
|
43
|
+
|
44
|
+
# Sort the tags newest to oldest
|
45
|
+
versions = Hash[tags.sort.reverse]
|
46
|
+
|
47
|
+
# Create a new package object and return it
|
48
|
+
packages << Package.new(:name => remote_package["name"],
|
49
|
+
:authors => remote_package["authors"],
|
50
|
+
:repository => remote_package["repository"],
|
51
|
+
:versions => versions)
|
52
|
+
|
53
|
+
end
|
54
|
+
|
55
|
+
if exact_match
|
56
|
+
return packages.first
|
57
|
+
else
|
58
|
+
return packages
|
59
|
+
end
|
60
|
+
|
61
|
+
else
|
62
|
+
# The package doesn't exist, so return false
|
63
|
+
false
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
def latest_version
|
68
|
+
if versions.kind_of?(Array)
|
69
|
+
versions.first
|
70
|
+
else
|
71
|
+
versions.keys.first.to_s
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
def install_path(version = nil)
|
76
|
+
|
77
|
+
# Take the latest_version unless it's been specified
|
78
|
+
version = latest_version unless version
|
79
|
+
|
80
|
+
# Creat the install path
|
81
|
+
path = ARPM::Config.base_directory + name
|
82
|
+
|
83
|
+
# Arduino doesn't like dots or dashes in library names
|
84
|
+
path = path + "_#{version.gsub('.', '_')}"
|
85
|
+
|
86
|
+
end
|
87
|
+
|
88
|
+
def install(version)
|
89
|
+
# Clone the repository!
|
90
|
+
repo = Git.clone(repository, install_path(version))
|
91
|
+
|
92
|
+
# It does, so checkout the right version
|
93
|
+
repo.checkout("tags/#{version}")
|
94
|
+
|
95
|
+
# Register the package to the list
|
96
|
+
register(version)
|
97
|
+
end
|
98
|
+
|
99
|
+
def uninstall(version)
|
100
|
+
# Remove the files
|
101
|
+
FileUtils.rm_r(install_path(version)) rescue ""
|
102
|
+
|
103
|
+
# Unregister it
|
104
|
+
unregister(version)
|
105
|
+
end
|
106
|
+
|
107
|
+
def register(version)
|
108
|
+
ARPM::List.register(self, version)
|
109
|
+
end
|
110
|
+
|
111
|
+
def unregister(version)
|
112
|
+
ARPM::List.unregister(self, version)
|
113
|
+
end
|
114
|
+
|
115
|
+
def installed_versions
|
116
|
+
ARPM::List.versions(self.name)
|
117
|
+
end
|
118
|
+
|
119
|
+
end
|
120
|
+
end
|
data/lib/arpm/string.rb
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
class String
|
2
|
+
def black; "\033[30m#{self}\033[0m" end
|
3
|
+
def red; "\033[31m#{self}\033[0m" end
|
4
|
+
def green; "\033[32m#{self}\033[0m" end
|
5
|
+
def brown; "\033[33m#{self}\033[0m" end
|
6
|
+
def blue; "\033[34m#{self}\033[0m" end
|
7
|
+
def magenta; "\033[35m#{self}\033[0m" end
|
8
|
+
def cyan; "\033[36m#{self}\033[0m" end
|
9
|
+
def gray; "\033[37m#{self}\033[0m" end
|
10
|
+
def bg_black; "\033[40m#{self}\0330m" end
|
11
|
+
def bg_red; "\033[41m#{self}\033[0m" end
|
12
|
+
def bg_green; "\033[42m#{self}\033[0m" end
|
13
|
+
def bg_brown; "\033[43m#{self}\033[0m" end
|
14
|
+
def bg_blue; "\033[44m#{self}\033[0m" end
|
15
|
+
def bg_magenta; "\033[45m#{self}\033[0m" end
|
16
|
+
def bg_cyan; "\033[46m#{self}\033[0m" end
|
17
|
+
def bg_gray; "\033[47m#{self}\033[0m" end
|
18
|
+
def bold; "\033[1m#{self}\033[22m" end
|
19
|
+
def reverse_color; "\033[7m#{self}\033[27m" end
|
20
|
+
|
21
|
+
def is_number?
|
22
|
+
true if Float(self) rescue false
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,148 @@
|
|
1
|
+
# Add the directory containing this file to the start of the load path if it
|
2
|
+
# isn't there already.
|
3
|
+
$:.unshift(File.dirname(__FILE__)) unless
|
4
|
+
$:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
|
5
|
+
|
6
|
+
require 'git/author'
|
7
|
+
require 'git/base'
|
8
|
+
require 'git/branch'
|
9
|
+
require 'git/branches'
|
10
|
+
require 'git/diff'
|
11
|
+
require 'git/index'
|
12
|
+
require 'git/lib'
|
13
|
+
require 'git/log'
|
14
|
+
require 'git/object'
|
15
|
+
require 'git/path'
|
16
|
+
require 'git/remote'
|
17
|
+
require 'git/repository'
|
18
|
+
require 'git/status'
|
19
|
+
require 'git/stash'
|
20
|
+
require 'git/stashes'
|
21
|
+
require 'git/working_directory'
|
22
|
+
|
23
|
+
lib = Git::Lib.new(nil, nil)
|
24
|
+
unless lib.meets_required_version?
|
25
|
+
$stderr.puts "[WARNING] The git gem requires git #{lib.required_command_version.join('.')} or later, but only found #{lib.current_command_version.join('.')}. You should probably upgrade."
|
26
|
+
end
|
27
|
+
|
28
|
+
# Git/Ruby Library
|
29
|
+
#
|
30
|
+
# This provides bindings for working with git in complex
|
31
|
+
# interactions, including branching and merging, object
|
32
|
+
# inspection and manipulation, history, patch generation
|
33
|
+
# and more. You should be able to do most fundamental git
|
34
|
+
# operations with this library.
|
35
|
+
#
|
36
|
+
# This module provides the basic functions to open a git
|
37
|
+
# reference to work with. You can open a working directory,
|
38
|
+
# open a bare repository, initialize a new repo or clone an
|
39
|
+
# existing remote repository.
|
40
|
+
#
|
41
|
+
# Author:: Scott Chacon (mailto:schacon@gmail.com)
|
42
|
+
# License:: MIT License
|
43
|
+
module Git
|
44
|
+
|
45
|
+
#g.config('user.name', 'Scott Chacon') # sets value
|
46
|
+
#g.config('user.email', 'email@email.com') # sets value
|
47
|
+
#g.config('user.name') # returns 'Scott Chacon'
|
48
|
+
#g.config # returns whole config hash
|
49
|
+
def config(name = nil, value = nil)
|
50
|
+
lib = Git::Lib.new
|
51
|
+
if(name && value)
|
52
|
+
# set value
|
53
|
+
lib.config_set(name, value)
|
54
|
+
elsif (name)
|
55
|
+
# return value
|
56
|
+
lib.config_get(name)
|
57
|
+
else
|
58
|
+
# return hash
|
59
|
+
lib.config_list
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
def global_config(name = nil, value = nil)
|
64
|
+
self.class.global_config(name, value)
|
65
|
+
end
|
66
|
+
|
67
|
+
# open a bare repository
|
68
|
+
#
|
69
|
+
# this takes the path to a bare git repo
|
70
|
+
# it expects not to be able to use a working directory
|
71
|
+
# so you can't checkout stuff, commit things, etc.
|
72
|
+
# but you can do most read operations
|
73
|
+
def self.bare(git_dir, options = {})
|
74
|
+
Base.bare(git_dir, options)
|
75
|
+
end
|
76
|
+
|
77
|
+
# clones a remote repository
|
78
|
+
#
|
79
|
+
# options
|
80
|
+
# :bare => true (does a bare clone)
|
81
|
+
# :repository => '/path/to/alt_git_dir'
|
82
|
+
# :index => '/path/to/alt_index_file'
|
83
|
+
#
|
84
|
+
# example
|
85
|
+
# Git.clone('git://repo.or.cz/rubygit.git', 'clone.git', :bare => true)
|
86
|
+
#
|
87
|
+
def self.clone(repository, name, options = {})
|
88
|
+
Base.clone(repository, name, options)
|
89
|
+
end
|
90
|
+
|
91
|
+
# Export the current HEAD (or a branch, if <tt>options[:branch]</tt>
|
92
|
+
# is specified) into the +name+ directory, then remove all traces of git from the
|
93
|
+
# directory.
|
94
|
+
#
|
95
|
+
# See +clone+ for options. Does not obey the <tt>:remote</tt> option,
|
96
|
+
# since the .git info will be deleted anyway; always uses the default
|
97
|
+
# remote, 'origin.'
|
98
|
+
def self.export(repository, name, options = {})
|
99
|
+
options.delete(:remote)
|
100
|
+
repo = clone(repository, name, {:depth => 1}.merge(options))
|
101
|
+
repo.checkout("origin/#{options[:branch]}") if options[:branch]
|
102
|
+
Dir.chdir(repo.dir.to_s) { FileUtils.rm_r '.git' }
|
103
|
+
end
|
104
|
+
|
105
|
+
# Same as g.config, but forces it to be at the global level
|
106
|
+
#
|
107
|
+
#g.config('user.name', 'Scott Chacon') # sets value
|
108
|
+
#g.config('user.email', 'email@email.com') # sets value
|
109
|
+
#g.config('user.name') # returns 'Scott Chacon'
|
110
|
+
#g.config # returns whole config hash
|
111
|
+
def self.global_config(name = nil, value = nil)
|
112
|
+
lib = Git::Lib.new(nil, nil)
|
113
|
+
if(name && value)
|
114
|
+
# set value
|
115
|
+
lib.global_config_set(name, value)
|
116
|
+
elsif (name)
|
117
|
+
# return value
|
118
|
+
lib.global_config_get(name)
|
119
|
+
else
|
120
|
+
# return hash
|
121
|
+
lib.global_config_list
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
# initialize a new git repository, defaults to the current working directory
|
126
|
+
#
|
127
|
+
# options
|
128
|
+
# :repository => '/path/to/alt_git_dir'
|
129
|
+
# :index => '/path/to/alt_index_file'
|
130
|
+
def self.init(working_dir = '.', options = {})
|
131
|
+
Base.init(working_dir, options)
|
132
|
+
end
|
133
|
+
|
134
|
+
# open an existing git working directory
|
135
|
+
#
|
136
|
+
# this will most likely be the most common way to create
|
137
|
+
# a git reference, referring to a working directory.
|
138
|
+
# if not provided in the options, the library will assume
|
139
|
+
# your git_dir and index are in the default place (.git/, .git/index)
|
140
|
+
#
|
141
|
+
# options
|
142
|
+
# :repository => '/path/to/alt_git_dir'
|
143
|
+
# :index => '/path/to/alt_index_file'
|
144
|
+
def self.open(working_dir, options = {})
|
145
|
+
Base.open(working_dir, options)
|
146
|
+
end
|
147
|
+
|
148
|
+
end
|