git-projects 0.0.2 → 0.0.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.
- checksums.yaml +4 -4
- data/lib/git-projects/version.rb +1 -1
- data/lib/git-projects.rb +22 -21
- data/lib/helpers/git_project.rb +67 -25
- data/lib/helpers/project.rb +15 -2
- metadata +18 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1bf0e0af220a8b22f1b3543c7d929b4b4a6e0ed1
|
4
|
+
data.tar.gz: 11c9b54a6a523373e405cb361ea9a8ce8a14d15d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 01d2cce71c5173d68e3fca746593a7f628be481f3175f6d1cc84737906692f373ef54950afd18561410d960316e227cb369d58d1ce07985b15830e9cc64b1cba
|
7
|
+
data.tar.gz: 72742b92441389515054902dad5edcbaf6ebf05a4676044459775fb95068787940f0667c228ed8a77ecb5ea912fec38b482c54a4af9f37fa738bf40aeedaad00
|
data/lib/git-projects/version.rb
CHANGED
data/lib/git-projects.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
require 'gli'
|
3
3
|
require 'json'
|
4
|
+
require 'colorize'
|
4
5
|
require_relative 'helpers/project'
|
5
6
|
require_relative 'helpers/git_project'
|
6
7
|
|
@@ -8,40 +9,40 @@ include GLI::App
|
|
8
9
|
|
9
10
|
program_desc 'Easily manage Git projects'
|
10
11
|
|
11
|
-
pre do |global_options,command,options,args|
|
12
|
-
if ENV['GIT_PROJECTS']
|
13
|
-
p "Checking repositories. If things go wrong, update #{ENV['GIT_PROJECTS']}"
|
14
|
-
else
|
15
|
-
raise "Please add the path your git projects config. \n export GIT_PROJECTS=/path/to/git_projects.yml"
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
12
|
desc 'Create a config'
|
20
|
-
skips_pre
|
21
13
|
command :config do |c|
|
22
14
|
c.action do |global_options,options,args|
|
23
|
-
config_path = "#{args
|
24
|
-
|
15
|
+
config_path = "#{args[0]}/git-projects.yml"
|
16
|
+
group = args[1] || nil
|
17
|
+
GitProject.create_config(args[0], group)
|
25
18
|
if File.open(config_path)
|
26
|
-
|
19
|
+
puts "Successfully created git-projects.yml".green
|
27
20
|
end
|
28
21
|
end
|
29
22
|
end
|
30
23
|
|
31
|
-
desc 'Clone all projects'
|
32
|
-
command :
|
24
|
+
desc 'Clone or initialize all projects'
|
25
|
+
command :init do |c|
|
33
26
|
c.action do
|
34
|
-
|
35
|
-
|
36
|
-
end
|
27
|
+
GitProject.check_config # the pre feature of GLI has a bug. investigate later.
|
28
|
+
GitProject.new(ENV['GIT_PROJECTS']).init
|
37
29
|
end
|
38
30
|
end
|
39
31
|
|
40
|
-
desc '
|
41
|
-
command :
|
32
|
+
desc 'Add missing remotes'
|
33
|
+
command :'add-remotes' do |c|
|
42
34
|
c.action do
|
43
|
-
|
44
|
-
|
35
|
+
GitProject.check_config
|
36
|
+
GitProject.new(ENV['GIT_PROJECTS']).add_remotes
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
desc 'Fetch changes from all remotes'
|
41
|
+
command :fetch do |c|
|
42
|
+
c.action do |global_options,options,args|
|
43
|
+
GitProject.check_config
|
44
|
+
if GitProject.new(ENV['GIT_PROJECTS']).fetch_all(args[0])
|
45
|
+
puts "Successfully fetched changes".green
|
45
46
|
end
|
46
47
|
end
|
47
48
|
end
|
data/lib/helpers/git_project.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
require_relative 'project'
|
2
2
|
require 'git'
|
3
3
|
require 'yaml'
|
4
|
+
require 'colorize'
|
4
5
|
|
5
6
|
class GitProject
|
6
7
|
|
@@ -11,6 +12,7 @@ class GitProject
|
|
11
12
|
end
|
12
13
|
|
13
14
|
class << self
|
15
|
+
|
14
16
|
# Create YAML file
|
15
17
|
def create_yaml_file(config_file, projects)
|
16
18
|
File.open(config_file, "w") do |f|
|
@@ -33,18 +35,22 @@ class GitProject
|
|
33
35
|
end
|
34
36
|
|
35
37
|
# Create a configuration file based on a root path
|
36
|
-
def create_config(dir)
|
38
|
+
def create_config(dir, group=nil)
|
37
39
|
dir = dir.is_a?(Array) ? dir.first : dir
|
38
40
|
config_file = "#{dir}/git-projects.yml"
|
41
|
+
group ||= dir.split(File::SEPARATOR).last
|
42
|
+
|
39
43
|
unless File.exists?(config_file)
|
40
44
|
projects = []
|
41
45
|
Dir.entries(dir)[2..-1].each do |project|
|
42
46
|
g = Git.open("#{dir}/#{project}")
|
43
47
|
p = {}
|
44
|
-
p[project]
|
48
|
+
p[project] = add_remotes_to_hash(g, p, dir)
|
49
|
+
p[project]['group'] = group
|
45
50
|
projects << p
|
46
51
|
create_yaml_file(config_file, projects)
|
47
52
|
end
|
53
|
+
puts "You can later fetch changes through: git-projects fetch #{group}".green
|
48
54
|
else
|
49
55
|
raise "The config file, #{config_file} exists"
|
50
56
|
end
|
@@ -57,8 +63,8 @@ class GitProject
|
|
57
63
|
# Create dir unless it exists
|
58
64
|
def create_directory(path)
|
59
65
|
unless File.directory?(path)
|
60
|
-
`mkdir -
|
61
|
-
|
66
|
+
`mkdir -puts #{path}`
|
67
|
+
puts "Creating directory: ".green+"#{path}".blue
|
62
68
|
end
|
63
69
|
end
|
64
70
|
|
@@ -67,38 +73,48 @@ class GitProject
|
|
67
73
|
GitProject.create_directory(path) unless File.directory?(path)
|
68
74
|
end
|
69
75
|
|
76
|
+
# Check for the config
|
77
|
+
def check_config
|
78
|
+
if ENV['GIT_PROJECTS']
|
79
|
+
puts "Checking repositories. If things go wrong, update #{ENV['GIT_PROJECTS']}".green
|
80
|
+
else
|
81
|
+
raise "Please add the path your git projects config. \n export GIT_PROJECTS=/path/to/git_projects.yml"
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
70
85
|
# Clone unless dir exists
|
71
86
|
def clone(url, name, path)
|
72
87
|
r = "#{path}/#{name}"
|
73
88
|
if Git.open(r)
|
74
|
-
|
89
|
+
puts "Already cloned ".yellow+ "#{url}".blue
|
75
90
|
else
|
76
91
|
Git.clone(url, name, path: path) || Git.init(r)
|
77
92
|
g = Git.open(r)
|
78
|
-
|
93
|
+
puts "Cloning #{url} as #{name} into #{path}".green
|
79
94
|
end
|
80
95
|
g
|
81
96
|
end
|
82
97
|
|
83
98
|
# Add remote
|
84
99
|
def add_remote(g, v)
|
85
|
-
g.add_remote('all', v['origin'])
|
100
|
+
g.add_remote('all', v['origin']) unless g.remotes.map(&:name).include?('all')
|
86
101
|
v.each do |name, remote|
|
87
|
-
unless ['root_dir', '
|
88
|
-
g.add_remote(name, remote)
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
102
|
+
unless ['root_dir', 'all', 'group'].include?(name) || g.remotes.map(&:name).include?(name)
|
103
|
+
if g.add_remote(name, remote)
|
104
|
+
# add to all remote
|
105
|
+
# useful when you want to do git push all --all
|
106
|
+
`git remote set-url --add all #{remote}`
|
107
|
+
puts "Added remote #{name}".green
|
108
|
+
end
|
93
109
|
end
|
94
110
|
end
|
95
111
|
end
|
96
112
|
|
97
113
|
def fetch(g, url)
|
98
114
|
g.remotes.each do |r|
|
99
|
-
unless
|
115
|
+
unless ['root_dir', 'all', 'group'].include?(name)
|
100
116
|
r.fetch
|
101
|
-
|
117
|
+
puts "Fetching updates from #{r.name}: #{r.url}".green
|
102
118
|
end
|
103
119
|
end
|
104
120
|
end
|
@@ -106,11 +122,11 @@ class GitProject
|
|
106
122
|
|
107
123
|
# 1. Clone all repositories based on the origin key
|
108
124
|
# 2. Add all other remotes unless it is origin
|
109
|
-
def
|
125
|
+
def init
|
110
126
|
@project.all.each do |k,v|
|
111
127
|
begin
|
112
|
-
|
113
|
-
|
128
|
+
puts "root_dir isn't defined for #{k}" unless v['root_dir']
|
129
|
+
puts "The dir #{v['root_dir']} does not exist" unless File.directory?(v['root_dir'])
|
114
130
|
GitProject.create_root_dir(v['root_dir'])
|
115
131
|
g = GitProject.clone(v.values[0], k, v['root_dir'])
|
116
132
|
GitProject.add_remote(g,v) if g
|
@@ -120,22 +136,48 @@ class GitProject
|
|
120
136
|
GitProject.add_remote(g,v)
|
121
137
|
GitProject.fetch(g, v)
|
122
138
|
end
|
123
|
-
|
124
|
-
|
139
|
+
puts "Please check paths and permissions for #{k}. Error: #{e}".red
|
140
|
+
puts "Failed to clone #{v.values[0]}. Initialized & fetch update from remotes instead.".yellow
|
125
141
|
end
|
126
142
|
end
|
127
143
|
end
|
128
144
|
|
129
|
-
|
130
|
-
|
131
|
-
|
145
|
+
def projects
|
146
|
+
@project.all
|
147
|
+
end
|
148
|
+
|
149
|
+
# Add a new remote
|
150
|
+
def new_remote(project, name, url)
|
151
|
+
@project.new_remote(project, name, url)
|
152
|
+
end
|
153
|
+
|
154
|
+
# Change group
|
155
|
+
def new_group(project, name)
|
156
|
+
@project.new_group(project, name)
|
157
|
+
end
|
158
|
+
|
159
|
+
# Add missing remotes
|
160
|
+
def add_remotes
|
161
|
+
puts "Found #{@project.all.size} projects".green
|
132
162
|
@project.all.each do |k,v|
|
133
|
-
|
163
|
+
working_dir = "#{v['root_dir']}/#{k}"
|
164
|
+
g = Git.open(working_dir) || Git.init(working_dir)
|
165
|
+
GitProject.add_remote(g,v)
|
166
|
+
puts "Checking new remotes for #{k}".green
|
167
|
+
end
|
168
|
+
end
|
169
|
+
|
170
|
+
# Fetch all updates
|
171
|
+
# Group is optional
|
172
|
+
# By default, fetch from all
|
173
|
+
def fetch_all(group=nil)
|
174
|
+
puts "Found #{@project.all.size} projects".green
|
175
|
+
@project.all(group).each do |k,v|
|
176
|
+
puts "Fetching changes for #{k}".green
|
134
177
|
GitProject.create_root_dir(v['root_dir'])
|
135
178
|
working_dir = "#{v['root_dir']}/#{k}"
|
136
179
|
g = Git.open(working_dir) || Git.init(working_dir)
|
137
180
|
GitProject.fetch(g, v)
|
138
|
-
GitProject.add_remote(g,v)
|
139
181
|
end
|
140
182
|
return true
|
141
183
|
end
|
data/lib/helpers/project.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'yaml'
|
2
|
+
require 'colorize'
|
2
3
|
|
3
4
|
class Project
|
4
5
|
|
@@ -8,8 +9,8 @@ class Project
|
|
8
9
|
@projects = YAML.load_file(config)
|
9
10
|
end
|
10
11
|
|
11
|
-
def all
|
12
|
-
@projects
|
12
|
+
def all(group=nil)
|
13
|
+
group ? @projects.select { |k, v| v['group'].include?(group) } : @projects
|
13
14
|
end
|
14
15
|
|
15
16
|
def first
|
@@ -23,4 +24,16 @@ class Project
|
|
23
24
|
end
|
24
25
|
end
|
25
26
|
end
|
27
|
+
|
28
|
+
def new_remote(remote, name, url)
|
29
|
+
@projects.tap do |project|
|
30
|
+
project[remote][name] = url
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def new_group(remote, name)
|
35
|
+
@projects.tap do |project|
|
36
|
+
project[remote]['group'] = name
|
37
|
+
end
|
38
|
+
end
|
26
39
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: git-projects
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Katherine Pe
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-01-
|
11
|
+
date: 2014-01-31 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: git
|
@@ -25,13 +25,13 @@ dependencies:
|
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: 1.2.6
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
|
-
name:
|
28
|
+
name: colorize
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
31
|
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
33
|
version: '0'
|
34
|
-
type: :
|
34
|
+
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
@@ -52,6 +52,20 @@ dependencies:
|
|
52
52
|
- - ">="
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: rake
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
55
69
|
- !ruby/object:Gem::Dependency
|
56
70
|
name: gli
|
57
71
|
requirement: !ruby/object:Gem::Requirement
|