onboard 0.1.2 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +8 -8
- data/README.md +19 -16
- data/lib/onboard/cli.rb +63 -66
- data/lib/onboard/confirm.rb +27 -0
- data/lib/onboard/find.rb +31 -0
- data/lib/onboard/msg.rb +24 -0
- data/lib/onboard/{codebase.rb → project.rb} +24 -5
- data/lib/onboard/repo.rb +26 -12
- data/lib/onboard/version.rb +1 -1
- metadata +6 -4
- data/lib/onboard/contrib.rb +0 -28
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
ZDFmNjkwZDVlMGFmMmI1NjYzY2I5OGZmMTgwNzRiYjkwMjBlNGI3YQ==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
NWMyMTdkYTYwNTdmOWM0NDkyZTc3ZGQyMTEwMjJiYzM3MTcyNDE2Ng==
|
7
7
|
SHA512:
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
NWRkOTUyMzMxOTJjMGY2MDJmZDQxZDEyMDkxYjJkM2RhNmE0N2ZmM2I3YjE4
|
10
|
+
YTBlMGM1ODg5ZGRlM2UxZThkODkxNWM0ZWI2MjAxZTUxNzY0MTRjYWJiMjFi
|
11
|
+
NjYyZmNhYmI4OTQ2NzM3MWRjNzA1NTg4YTFiYWI1MmRiNzhmNjQ=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
MzQ3NzYwOWNiODMxNzJhNWViZDljODcyOTQyNzk3NWIzOWIzYWIwMzc3ODYw
|
14
|
+
NjNhZTkxNmFkNTgxMTU3MjQ1OGU3YTcyYmIwNTg2OTc4YjBhYTA2NDg4YWQ2
|
15
|
+
ZGJhMjcxODhhM2QyY2MyZTc0YjdjMmE3YjExYTYyZTcwZGEzOGM=
|
data/README.md
CHANGED
@@ -21,32 +21,35 @@ Or install it yourself as:
|
|
21
21
|
__COMMANDS:__
|
22
22
|
```
|
23
23
|
Commands:
|
24
|
-
onboard help [COMMAND]
|
25
|
-
onboard
|
24
|
+
onboard help [COMMAND] # Describe available commands or one specific command
|
25
|
+
onboard projects CODEBASE -c, --core=N -p, --path=PATH # add projects to CODEBASE
|
26
26
|
```
|
27
27
|
|
28
28
|
__MODULES:__
|
29
29
|
```
|
30
30
|
Usage:
|
31
|
-
onboard
|
31
|
+
onboard projects CODEBASE -c, --core=N -p, --path=PATH
|
32
32
|
|
33
33
|
Options:
|
34
|
-
-
|
35
|
-
-c, --core=N
|
36
|
-
-
|
37
|
-
-f, [--force=FORCE]
|
38
|
-
-n, [--no=NO]
|
39
|
-
-
|
40
|
-
-
|
41
|
-
|
34
|
+
-b, [--branch=BRANCH] # Specify repository branch to update
|
35
|
+
-c, --core=N # Specify Drupal core version
|
36
|
+
-p, --path=PATH # Specify project path relative to CODEBASE
|
37
|
+
-f, [--force=FORCE] # Force add modules (even if already present)
|
38
|
+
-n, [--no=NO] # Assume 'no' for all prompts
|
39
|
+
-m, [--modules=one two three] # Pass a list of modules
|
40
|
+
-t, [--themes=one two three] # Pass a list of themes
|
41
|
+
[--vc], [--no-vc] # Enable/Disable version control handling
|
42
|
+
# Default: true
|
43
|
+
-y, [--yes=YES] # Assume 'yes' for all prompts
|
42
44
|
|
43
45
|
Description:
|
44
|
-
onboard
|
45
|
-
modules (acquia_connector, fast_404, memcache):
|
46
|
+
`onboard projects` performs multiple tasks when installing contrib projects:
|
46
47
|
|
47
|
-
|
48
|
-
|
49
|
-
|
48
|
+
* Checks for each project in the CODEBASE
|
49
|
+
|
50
|
+
* Downloads the latest version of each project
|
51
|
+
|
52
|
+
* Adds and commits each project
|
50
53
|
```
|
51
54
|
|
52
55
|
## Contributing
|
data/lib/onboard/cli.rb
CHANGED
@@ -1,95 +1,82 @@
|
|
1
1
|
# encoding: utf-8
|
2
|
-
|
2
|
+
|
3
3
|
require 'open-uri/cached'
|
4
|
-
|
4
|
+
require 'thor'
|
5
|
+
|
6
|
+
require_relative 'confirm'
|
7
|
+
require_relative 'find'
|
8
|
+
require_relative 'project'
|
9
|
+
require_relative 'repo'
|
5
10
|
|
6
11
|
module Onboard
|
7
12
|
class CLI < Thor
|
8
13
|
# TODO: switch from DOCROOT to CODEBASE to enable more comprehensive searching
|
9
|
-
desc "
|
14
|
+
desc "projects CODEBASE", "add projects to CODEBASE"
|
10
15
|
long_desc <<-LONGDESC
|
11
|
-
`onboard
|
12
|
-
|
16
|
+
`onboard projects` performs multiple tasks when installing contrib
|
17
|
+
projects:
|
13
18
|
|
14
|
-
* Checks for each
|
19
|
+
* Checks for each project in the CODEBASE
|
15
20
|
|
16
|
-
* Downloads the latest version of each
|
21
|
+
* Downloads the latest version of each project
|
17
22
|
|
18
|
-
* Adds and commits each
|
23
|
+
* Adds and commits each project
|
19
24
|
|
20
|
-
Default contrib modules: acquia_connector, fast_404, memcache
|
21
25
|
LONGDESC
|
22
|
-
|
23
|
-
# TODO: Analyze codebase for core version?
|
26
|
+
# TODO: Analyze codebase for project version
|
24
27
|
# ala - find ./CODEBASE -type f -name '*.info' | xargs -I {} grep -rn '^version = \"' {}
|
28
|
+
option :branch, :aliases => "-b", :desc => "Specify repository branch to update"
|
25
29
|
option :core, :required => true, :aliases => "-c", :type => :numeric, :desc => "Specify Drupal core version"
|
26
|
-
option :
|
30
|
+
option :path, :required => true, :aliases => "-p", :desc => "Specify project path relative to CODEBASE"
|
27
31
|
option :force, :aliases => "-f", :desc => "Force add modules (even if already present)"
|
28
32
|
option :no, :aliases => "-n", :desc => "Assume 'no' for all prompts"
|
29
|
-
option :
|
30
|
-
# option :
|
31
|
-
option :
|
33
|
+
option :modules, :aliases => "-m", :type => :array, :desc => "Pass a list of modules"
|
34
|
+
# option :delete, :aliases => "-d", :desc => "Delete existing projects"
|
35
|
+
# option :source, :aliases => "-s", :desc => "Specify a project source other than drupal.org"
|
36
|
+
option :themes, :aliases => "-t", :type => :array, :desc => "Pass a list of themes"
|
32
37
|
option :vc, :type => :boolean, :default => true, :desc => "Enable/Disable version control handling"
|
33
38
|
option :yes, :aliases => "-y", :desc => "Assume 'yes' for all prompts"
|
34
|
-
def
|
39
|
+
def projects(codebase)
|
35
40
|
core = "#{options[:core]}.x"
|
36
|
-
|
37
|
-
if options[:
|
38
|
-
options[:
|
39
|
-
|
40
|
-
|
41
|
-
end
|
42
|
-
if options[:addendum].nil? == false
|
43
|
-
options[:addendum].each { |x| modules.push x }
|
44
|
-
end
|
45
|
-
subdir = options[:subdir].nil? == true ? "" : "/#{options[:subdir]}"
|
46
|
-
destination = options[:destination].nil? ? "sites/all/modules#{subdir}" : "#{options[:destination]}#{subdir}"
|
47
|
-
require 'find'
|
48
|
-
found = []
|
49
|
-
Find.find(docroot) do |e|
|
50
|
-
if File.directory?(e)
|
51
|
-
if modules.include?(File.basename(e))
|
52
|
-
found.push e
|
53
|
-
end
|
54
|
-
end
|
41
|
+
projects = []
|
42
|
+
if options[:modules].nil? == false
|
43
|
+
options[:modules].each { |x| projects.push x }
|
44
|
+
elsif options[:themes].nil? == false
|
45
|
+
options[:themes].each { |x| projects.push x }
|
55
46
|
end
|
47
|
+
path = "#{options[:path]}"
|
48
|
+
found = Finder.new(projects, codebase).locate
|
56
49
|
if found.any?
|
57
50
|
say("Projects exist at the following locations:", :yellow)
|
58
|
-
found.each
|
59
|
-
puts " " + project
|
60
|
-
end
|
51
|
+
found.each { |x| puts " " + x }
|
61
52
|
puts ""
|
62
53
|
end
|
63
54
|
if options[:force] != 'force'
|
64
55
|
found.each do |x|
|
65
|
-
|
56
|
+
projects.delete(File.basename(x))
|
66
57
|
end
|
67
58
|
end
|
68
|
-
if
|
59
|
+
if projects.empty? == false
|
69
60
|
say("Ready to add the following projects:", :green)
|
70
|
-
|
71
|
-
puts " " + "#{
|
61
|
+
projects.each do |x|
|
62
|
+
puts " " + "#{codebase}/#{path}/#{x}"
|
72
63
|
end
|
73
64
|
puts ""
|
74
65
|
if options[:no].nil? && options[:yes].nil?
|
75
|
-
|
76
|
-
while answer !~ /^[Y|N]$/i do
|
77
|
-
answer = ask("Proceed? [Y|N]: ")
|
78
|
-
puts ""
|
79
|
-
end
|
80
|
-
if answer =~ /^[N]$/i
|
81
|
-
say("Script was exited.")
|
82
|
-
exit
|
83
|
-
end
|
66
|
+
Confirm.new("Proceed?").yes?
|
84
67
|
elsif options[:no] == 'no'
|
85
68
|
say("Script was exited.")
|
86
69
|
exit
|
87
70
|
end
|
88
|
-
|
89
|
-
|
71
|
+
projects.each do |x|
|
72
|
+
prm = {}
|
73
|
+
prm['path'] = "#{codebase}/#{path}/#{x}"
|
74
|
+
Project.new(prm).rm
|
90
75
|
# TODO: replace 'open().read' with custom caching solution
|
91
|
-
|
92
|
-
|
76
|
+
pdl = {}
|
77
|
+
pdl['project'] = x
|
78
|
+
pdl['core'] = core
|
79
|
+
dl = Project.new(pdl).dl
|
93
80
|
feed_md5, archive = dl
|
94
81
|
# TODO: replace 'open().read' with custom caching solution
|
95
82
|
open(archive).read
|
@@ -98,26 +85,36 @@ module Onboard
|
|
98
85
|
md5 = Digest::MD5.file(targz).hexdigest
|
99
86
|
# TODO: retry download after failed download verification
|
100
87
|
if md5 == feed_md5
|
101
|
-
|
88
|
+
pex = {}
|
89
|
+
pex['dest'] = "#{codebase}/#{path}"
|
90
|
+
pex['path'] = targz
|
91
|
+
Project.new(pex).extract
|
102
92
|
else
|
103
93
|
say("Verification failed for #{x} archive!", :red)
|
104
94
|
exit
|
105
95
|
end
|
106
96
|
end
|
107
97
|
if options[:vc] == true
|
108
|
-
require_relative '
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
98
|
+
require_relative 'msg'
|
99
|
+
branch = options[:branch].nil? ? '' : options[:branch]
|
100
|
+
repo = {}
|
101
|
+
repo['branch'] = branch
|
102
|
+
repo['codebase'] = codebase
|
103
|
+
repo_info = Repo.new(repo).info
|
104
|
+
projects.each do |x|
|
105
|
+
acmsg = "Committing #{x} on #{repo_info['current_branch']} branch..."
|
106
|
+
say(Msg.new(acmsg).format)
|
107
|
+
repo['path'] = "#{path}/#{x}"
|
108
|
+
Repo.new(repo).update
|
117
109
|
say(" [done]", :green)
|
110
|
+
# TODO: error handling and conditional messaging for failures
|
118
111
|
end
|
112
|
+
pmsg = "Pushing all changes to #{repo_info['remotes']}..."
|
113
|
+
say(Msg.new(pmsg).format)
|
114
|
+
Repo.new(repo).push
|
115
|
+
say(" [done]", :green)
|
119
116
|
else
|
120
|
-
|
117
|
+
projects.each do |x|
|
121
118
|
say("#{x} added to codebase but changes are not yet tracked in version control.", :yellow)
|
122
119
|
end
|
123
120
|
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'thor'
|
4
|
+
|
5
|
+
module Onboard
|
6
|
+
class Confirm < Thor
|
7
|
+
attr_reader :message
|
8
|
+
|
9
|
+
no_tasks do
|
10
|
+
def initialize(message)
|
11
|
+
@message = message
|
12
|
+
end
|
13
|
+
|
14
|
+
def yes?
|
15
|
+
answer = ""
|
16
|
+
while answer !~ /^[Y|N]$/i do
|
17
|
+
answer = ask(message + " [Y|N]: ")
|
18
|
+
puts ""
|
19
|
+
end
|
20
|
+
if answer =~ /^[N]$/i
|
21
|
+
say("Script was exited.")
|
22
|
+
exit
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
data/lib/onboard/find.rb
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'find'
|
4
|
+
|
5
|
+
module Onboard
|
6
|
+
class Finder
|
7
|
+
attr_reader :needle, :haystack
|
8
|
+
|
9
|
+
def initialize(needle, haystack)
|
10
|
+
@needle = needle
|
11
|
+
@haystack = haystack
|
12
|
+
end
|
13
|
+
|
14
|
+
def locate
|
15
|
+
found = []
|
16
|
+
Find.find(haystack) do |e|
|
17
|
+
if File.directory?(e)
|
18
|
+
if needle.include?(File.basename(e))
|
19
|
+
Find.find(e) do |f|
|
20
|
+
if File.extname(f) == '.info'
|
21
|
+
found.push e
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
return found.uniq
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
data/lib/onboard/msg.rb
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'thor'
|
4
|
+
|
5
|
+
require_relative 'screen'
|
6
|
+
|
7
|
+
module Onboard
|
8
|
+
class Msg < Thor
|
9
|
+
attr_reader :msg
|
10
|
+
|
11
|
+
no_tasks do
|
12
|
+
def initialize(msg = '')
|
13
|
+
@msg = msg
|
14
|
+
end
|
15
|
+
|
16
|
+
def format
|
17
|
+
width = Screen.new().width
|
18
|
+
spaces = " " * (width - msg.length - 8)
|
19
|
+
return msg + spaces
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
@@ -1,6 +1,7 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
require 'fileutils'
|
3
3
|
require 'find'
|
4
|
+
require 'nokogiri'
|
4
5
|
require 'rubygems/package'
|
5
6
|
require 'zlib'
|
6
7
|
|
@@ -8,12 +9,29 @@ module Onboard
|
|
8
9
|
|
9
10
|
TAR_LONGLINK = '././@LongLink'
|
10
11
|
|
11
|
-
class
|
12
|
-
attr_reader :path, :dest
|
12
|
+
class Project
|
13
|
+
attr_reader :feed, :path, :dest
|
13
14
|
|
14
|
-
def initialize(
|
15
|
-
@
|
16
|
-
@
|
15
|
+
def initialize(args = {})
|
16
|
+
@feed = "http://updates.drupal.org/release-history/#{args['project']}/#{args['core']}"
|
17
|
+
@path = args['path']
|
18
|
+
@dest = args['dest']
|
19
|
+
end
|
20
|
+
|
21
|
+
def dl
|
22
|
+
doc = Nokogiri::XML(open(@feed).read)
|
23
|
+
releases = {}
|
24
|
+
doc.xpath('//releases//release').each do |item|
|
25
|
+
if !item.at_xpath('version_extra')
|
26
|
+
releases[item.at_xpath('mdhash').content] = item.at_xpath('download_link').content
|
27
|
+
end
|
28
|
+
end
|
29
|
+
if releases.nil?
|
30
|
+
doc.xpath('//releases//release').each do |item|
|
31
|
+
releases[item.at_xpath('mdhash').content] = item.at_xpath('download_link').content
|
32
|
+
end
|
33
|
+
end
|
34
|
+
return releases.first
|
17
35
|
end
|
18
36
|
|
19
37
|
def rm
|
@@ -47,3 +65,4 @@ module Onboard
|
|
47
65
|
end
|
48
66
|
end
|
49
67
|
end
|
68
|
+
|
data/lib/onboard/repo.rb
CHANGED
@@ -6,21 +6,32 @@ require 'pathname'
|
|
6
6
|
|
7
7
|
module Onboard
|
8
8
|
class Repo
|
9
|
-
attr_reader :
|
9
|
+
attr_reader :g, :path, :branch
|
10
10
|
|
11
|
-
def initialize(
|
12
|
-
@
|
13
|
-
@
|
11
|
+
def initialize(repo)
|
12
|
+
@codebase = repo['codebase']
|
13
|
+
@g = self.prepare(repo)
|
14
|
+
@path = repo['path']
|
15
|
+
@branch = repo['branch']
|
16
|
+
end
|
17
|
+
|
18
|
+
def info
|
19
|
+
repo = {}
|
20
|
+
repo['current_branch'] = g.current_branch
|
21
|
+
repo['remotes'] = g.remotes
|
22
|
+
return repo
|
23
|
+
end
|
24
|
+
|
25
|
+
def prepare(args)
|
26
|
+
repo = Git.open((Pathname.new(args['codebase'])).to_s)
|
27
|
+
selection = args['branch'].empty? ? repo.current_branch : args['branch']
|
28
|
+
repo.branch(selection).checkout
|
29
|
+
return repo
|
14
30
|
end
|
15
31
|
|
16
32
|
def update
|
17
|
-
prj_root = Pathname.new(docroot)
|
18
|
-
workdir = prj_root.parent.to_s
|
19
33
|
project = File.basename(path)
|
20
34
|
|
21
|
-
g = Git.open(workdir)
|
22
|
-
g.branch('master').checkout
|
23
|
-
|
24
35
|
changes = []
|
25
36
|
g.status.changed.keys.each { |x| changes.push x }
|
26
37
|
g.status.deleted.keys.each { |x| changes.push x }
|
@@ -28,11 +39,14 @@ module Onboard
|
|
28
39
|
|
29
40
|
if changes.nil? == false
|
30
41
|
g.add(path, :all=>true)
|
31
|
-
g.commit("
|
32
|
-
g.push
|
42
|
+
g.commit("Add #{project}")
|
33
43
|
else
|
34
44
|
puts "No changes to commit for #{project}"
|
35
45
|
end
|
36
46
|
end
|
47
|
+
|
48
|
+
def push
|
49
|
+
g.push
|
50
|
+
end
|
37
51
|
end
|
38
|
-
end
|
52
|
+
end
|
data/lib/onboard/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: onboard
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Nathaniel Hoag
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-08-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: nokogiri
|
@@ -122,8 +122,10 @@ files:
|
|
122
122
|
- bin/onboard
|
123
123
|
- lib/onboard.rb
|
124
124
|
- lib/onboard/cli.rb
|
125
|
-
- lib/onboard/
|
126
|
-
- lib/onboard/
|
125
|
+
- lib/onboard/confirm.rb
|
126
|
+
- lib/onboard/find.rb
|
127
|
+
- lib/onboard/msg.rb
|
128
|
+
- lib/onboard/project.rb
|
127
129
|
- lib/onboard/repo.rb
|
128
130
|
- lib/onboard/screen.rb
|
129
131
|
- lib/onboard/version.rb
|
data/lib/onboard/contrib.rb
DELETED
@@ -1,28 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
require 'nokogiri'
|
3
|
-
|
4
|
-
module Onboard
|
5
|
-
class Contrib
|
6
|
-
attr_reader :project, :core
|
7
|
-
|
8
|
-
def initialize(project, core)
|
9
|
-
@feed = "http://updates.drupal.org/release-history/#{project}/#{core}"
|
10
|
-
end
|
11
|
-
|
12
|
-
def dl
|
13
|
-
doc = Nokogiri::XML(open(@feed).read)
|
14
|
-
releases = {}
|
15
|
-
doc.xpath('//releases//release').each do |item|
|
16
|
-
if !item.at_xpath('version_extra')
|
17
|
-
releases[item.at_xpath('mdhash').content] = item.at_xpath('download_link').content
|
18
|
-
end
|
19
|
-
end
|
20
|
-
if releases.nil?
|
21
|
-
doc.xpath('//releases//release').each do |item|
|
22
|
-
releases[item.at_xpath('mdhash').content] = item.at_xpath('download_link').content
|
23
|
-
end
|
24
|
-
end
|
25
|
-
return releases.first
|
26
|
-
end
|
27
|
-
end
|
28
|
-
end
|