obazoud-git-external 0.2.0 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- data/bin/git-external +152 -71
- metadata +10 -8
data/bin/git-external
CHANGED
@@ -1,9 +1,58 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
# encoding: utf-8
|
3
3
|
|
4
|
-
|
5
|
-
|
6
|
-
|
4
|
+
require 'rbconfig'
|
5
|
+
|
6
|
+
module OS
|
7
|
+
class << self
|
8
|
+
def is?(what)
|
9
|
+
what === RbConfig::CONFIG['host_os']
|
10
|
+
end
|
11
|
+
alias is is?
|
12
|
+
|
13
|
+
def to_s
|
14
|
+
RbConfig::CONFIG['host_os']
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
module_function
|
19
|
+
|
20
|
+
def linux?
|
21
|
+
OS.is? /linux|cygwin/
|
22
|
+
end
|
23
|
+
|
24
|
+
def mac?
|
25
|
+
OS.is? /mac|darwin/
|
26
|
+
end
|
27
|
+
|
28
|
+
def bsd?
|
29
|
+
OS.is? /bsd/
|
30
|
+
end
|
31
|
+
|
32
|
+
def windows?
|
33
|
+
OS.is? /mswin|win|mingw|mingw32/
|
34
|
+
end
|
35
|
+
|
36
|
+
def solaris?
|
37
|
+
OS.is? /solaris|sunos/
|
38
|
+
end
|
39
|
+
|
40
|
+
def posix?
|
41
|
+
linux? or mac? or bsd? or solaris? # or Process.respond_to?(:fork)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
if OS.posix?
|
46
|
+
$root_dir = `git rev-parse --show-toplevel`.chomp + '/'
|
47
|
+
$externals_file = "#{$root_dir}.gitexternals"
|
48
|
+
$ignore_file = "#{$root_dir}.gitignore"
|
49
|
+
else
|
50
|
+
# puts "Not posix os, you must run git-external from top level directory"
|
51
|
+
$root_dir = ''
|
52
|
+
$externals_file = "#{$root_dir}.gitexternals".gsub(' ', '\\ ')
|
53
|
+
$ignore_file = "#{$root_dir}.gitignore".gsub(' ', '\\ ')
|
54
|
+
end
|
55
|
+
|
7
56
|
$configurations = {}
|
8
57
|
|
9
58
|
def usage
|
@@ -15,56 +64,37 @@ def usage
|
|
15
64
|
puts " or: git external list"
|
16
65
|
end
|
17
66
|
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
end
|
67
|
+
# Load .gitexternals
|
68
|
+
def load_configuration(file)
|
69
|
+
$configurations = {}
|
70
|
+
linesExit, lines = execute('git config', ['--list', '--file', file])
|
71
|
+
lines.each do |line|
|
72
|
+
if line =~ /^external\.([^$]+)\.([^=]+)=(.*)$/
|
73
|
+
$configurations[$1.chomp] ||= {}
|
74
|
+
$configurations[$1.chomp][$2.chomp] = $3.chomp
|
27
75
|
end
|
28
76
|
end
|
29
77
|
end
|
30
78
|
|
79
|
+
# Print .gitexternals content
|
31
80
|
def print_configuration
|
32
81
|
$configurations.each do |name, config|
|
33
|
-
puts name
|
82
|
+
puts "* #{name}"
|
34
83
|
config.each do |key, value|
|
35
84
|
puts "\t#{key}: #{value}"
|
36
85
|
end
|
37
86
|
end
|
38
87
|
end
|
39
88
|
|
40
|
-
def normalize_url(url)
|
41
|
-
if url =~ /^\./
|
42
|
-
origin_url = `git config --get remote.origin.url`.chomp
|
43
|
-
|
44
|
-
unless origin_url =~ /^\w+:\/\//
|
45
|
-
if origin_url =~ /^([^:\/]+):([^:]+)/
|
46
|
-
origin_url = "ssh://#{$1}/#{$2}"
|
47
|
-
end
|
48
|
-
end
|
49
|
-
|
50
|
-
require 'uri'
|
51
|
-
uri = URI.parse URI.encode origin_url
|
52
|
-
uri.path = File.expand_path(url, uri.path)
|
53
|
-
uri.to_s
|
54
|
-
else
|
55
|
-
url
|
56
|
-
end
|
57
|
-
end
|
58
|
-
|
59
89
|
# Check for uncommitted changes
|
60
90
|
def uncommitted_changes?(path)
|
61
|
-
|
62
|
-
|
91
|
+
diffExit, diff = execute('git diff-index', ['--quiet', 'HEAD'], path)
|
92
|
+
return ((diffExit == 1) ? true : false)
|
63
93
|
end
|
64
94
|
|
65
95
|
# Check if a branch exists
|
66
96
|
def branch_exists(path, branch)
|
67
|
-
branches =
|
97
|
+
branchesExit, branches = execute('git branch', [], path)
|
68
98
|
regex = Regexp.new('[\\n\\s\\*]+' + Regexp.escape(branch.to_s) + '\\n')
|
69
99
|
result = ((branches =~ regex) ? true : false)
|
70
100
|
return result
|
@@ -77,17 +107,17 @@ def init_external(url, path, branch='master')
|
|
77
107
|
else
|
78
108
|
FileUtils.makedirs File.dirname(path)
|
79
109
|
url = normalize_url url
|
80
|
-
|
110
|
+
execute('git clone', ["#{url}", path], Dir.getwd, '')
|
81
111
|
|
82
112
|
# Create a local tracking branch if it doesn't exist already
|
83
113
|
unless branch_exists(path, branch)
|
84
114
|
puts "- Creating local tracking branch: #{branch} -> origin/#{branch}"
|
85
|
-
|
115
|
+
execute('git branch', ['checkout', '--track', "#{branch}", "origin/#{branch}"], path)
|
86
116
|
end
|
87
117
|
|
88
118
|
# Check out the local branch
|
89
119
|
puts "- Checkout local branch: #{branch}"
|
90
|
-
|
120
|
+
execute('git checkout', ["#{branch}"], path)
|
91
121
|
end
|
92
122
|
end
|
93
123
|
|
@@ -98,20 +128,11 @@ def update_external(url, path, branch='master')
|
|
98
128
|
if uncommitted_changes?(path)
|
99
129
|
puts "#{path} - uncommitted changes detected, can not update repository"
|
100
130
|
else
|
101
|
-
|
131
|
+
execute('git pull', ['origin', "#{branch}"], path, '')
|
102
132
|
end
|
103
133
|
end
|
104
134
|
end
|
105
135
|
|
106
|
-
def execute(cmd)
|
107
|
-
values = []
|
108
|
-
IO.popen(cmd) do |f|
|
109
|
-
tmp = f.gets
|
110
|
-
values.push(tmp.gsub(/\r/, '').gsub(/\n/, '')) unless tmp.nil?
|
111
|
-
end
|
112
|
-
return $?.exitstatus, values
|
113
|
-
end
|
114
|
-
|
115
136
|
def command_status
|
116
137
|
ok = 0
|
117
138
|
broken = 0
|
@@ -120,8 +141,11 @@ def command_status
|
|
120
141
|
url = config["url"]
|
121
142
|
path = config["path"]
|
122
143
|
|
123
|
-
|
124
|
-
|
144
|
+
symbolicExit, symbolic = execute('git symbolic-ref', ['HEAD', '--short'], path)
|
145
|
+
gitBranchExit, gitBranch = execute('git config', ["branch.#{symbolic}.merge"], path)
|
146
|
+
gitBranch = gitBranch.gsub('refs/heads/', '')
|
147
|
+
remoteExit, remote = execute('git config', ["branch.#{symbolic}.remote"], path)
|
148
|
+
gitRemoteExit, gitRemote = execute('git config', ["remote.#{remote}.url"], path)
|
125
149
|
|
126
150
|
if uncommitted_changes?(path)
|
127
151
|
changesString = "(Uncommitted Changes) "
|
@@ -129,20 +153,20 @@ def command_status
|
|
129
153
|
changesString = ""
|
130
154
|
end
|
131
155
|
|
132
|
-
if gitBranchExit != 0 && gitRemoteExit != 0
|
133
|
-
puts " ✗ #{path}
|
156
|
+
if gitBranchExit != 0 && gitBranchExit != 1 && gitRemoteExit != 0 && gitRemoteExit != 1
|
157
|
+
puts " ✗ #{path} -- exit code #{gitBranchExit}, #{gitRemoteExit}"
|
134
158
|
broken += 1
|
135
159
|
else
|
136
|
-
if branch == gitBranch
|
137
|
-
if url == gitRemote
|
160
|
+
if branch == gitBranch
|
161
|
+
if url == gitRemote
|
138
162
|
puts " ✓ #{path} #{changesString}"
|
139
163
|
ok += 1
|
140
164
|
else
|
141
|
-
puts " ✗ #{path} #{changesString} -- expected url '#{url}' but was '#{gitRemote
|
165
|
+
puts " ✗ #{path} #{changesString} -- expected url '#{url}' but was '#{gitRemote}'"
|
142
166
|
broken +=1
|
143
167
|
end
|
144
168
|
else
|
145
|
-
puts " ✗ #{path} #{changesString} -- expected branch '#{branch}' but was '#{gitBranch
|
169
|
+
puts " ✗ #{path} #{changesString} -- expected branch '#{branch}' but was '#{gitBranch}'"
|
146
170
|
broken +=1
|
147
171
|
end
|
148
172
|
end
|
@@ -152,23 +176,31 @@ end
|
|
152
176
|
|
153
177
|
def command_add(url, path, branch='master')
|
154
178
|
command_rm(path)
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
179
|
+
execute('git config', ['--file', $externals_file, '--add', "external.#{path}.path", "#{path}"])
|
180
|
+
execute('git config', ['--file', $externals_file, '--add', "external.#{path}.url", "#{url}"])
|
181
|
+
execute('git config', ['--file', $externals_file, '--add', "external.#{path}.branch", "#{branch}"])
|
182
|
+
|
183
|
+
File.open("#{$ignore_file}", 'a+') do |f|
|
184
|
+
f.puts("#{path}")
|
185
|
+
end
|
186
|
+
|
159
187
|
end
|
160
188
|
|
161
189
|
def command_rm(path)
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
File.delete $externals_file if `wc -l #{$externals_file}`.chomp.to_i == 0
|
168
|
-
end
|
190
|
+
execute('git config', ['--file', $externals_file, '--unset', "external.#{path}.path"])
|
191
|
+
execute('git config', ['--file', $externals_file, '--unset', "external.#{path}.url"])
|
192
|
+
execute('git config', ['--file', $externals_file, '--unset', "external.#{path}.branch"])
|
193
|
+
execute('git config', ['--file', $externals_file, '--remove-section', "external.#{path}"])
|
194
|
+
|
169
195
|
if File.file? $ignore_file
|
170
|
-
|
171
|
-
|
196
|
+
ignores = []
|
197
|
+
File.open($ignore_file, 'r').each_line do |line|
|
198
|
+
ignores.push line.gsub(/\n/, '')
|
199
|
+
end
|
200
|
+
ignores.delete(path)
|
201
|
+
File.open($ignore_file, 'w+') do |file|
|
202
|
+
file.puts ignores
|
203
|
+
end
|
172
204
|
end
|
173
205
|
end
|
174
206
|
|
@@ -188,7 +220,9 @@ end
|
|
188
220
|
def command_cmd(cmd)
|
189
221
|
$configurations.each do |name, config|
|
190
222
|
path = config['path']
|
191
|
-
|
223
|
+
puts "- Executing '#{cmd}' in #{path}"
|
224
|
+
exitCmd, output = execute(cmd, [], path, '')
|
225
|
+
puts output
|
192
226
|
end
|
193
227
|
end
|
194
228
|
|
@@ -196,7 +230,54 @@ def command_list
|
|
196
230
|
print_configuration
|
197
231
|
end
|
198
232
|
|
199
|
-
|
233
|
+
#########
|
234
|
+
def normalize_url(url)
|
235
|
+
if url =~ /^\./
|
236
|
+
origin_url = `git config --get remote.origin.url`.chomp
|
237
|
+
|
238
|
+
unless origin_url =~ /^\w+:\/\//
|
239
|
+
if origin_url =~ /^([^:\/]+):([^:]+)/
|
240
|
+
origin_url = "ssh://#{$1}/#{$2}"
|
241
|
+
end
|
242
|
+
end
|
243
|
+
|
244
|
+
require 'uri'
|
245
|
+
uri = URI.parse URI.encode origin_url
|
246
|
+
uri.path = File.expand_path(url, uri.path)
|
247
|
+
uri.to_s
|
248
|
+
else
|
249
|
+
url
|
250
|
+
end
|
251
|
+
end
|
252
|
+
|
253
|
+
def execute(cmd, opts=[], path=Dir.getwd, redirect='2>&1')
|
254
|
+
opts = [opts].flatten.map {|s| escape(s) }.join(' ')
|
255
|
+
cmd = "#{cmd} #{opts} #{redirect}"
|
256
|
+
|
257
|
+
out = nil
|
258
|
+
if path && (Dir.getwd != path)
|
259
|
+
Dir.chdir(path) { out = execute_now(cmd) }
|
260
|
+
else
|
261
|
+
out = execute_now(cmd)
|
262
|
+
end
|
263
|
+
return $?.exitstatus, out
|
264
|
+
end
|
265
|
+
|
266
|
+
def execute_now(cmd)
|
267
|
+
if block_given?
|
268
|
+
IO.popen(cmd)
|
269
|
+
else
|
270
|
+
`#{cmd}`.chomp
|
271
|
+
end
|
272
|
+
end
|
273
|
+
|
274
|
+
def escape(s)
|
275
|
+
escaped = s.to_s.gsub('\'', '\'\\\'\'')
|
276
|
+
%Q{"#{escaped}"}
|
277
|
+
end
|
278
|
+
#########
|
279
|
+
|
280
|
+
load_configuration $externals_file
|
200
281
|
|
201
282
|
command=ARGV[0]
|
202
283
|
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: obazoud-git-external
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 19
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
|
-
-
|
8
|
+
- 3
|
9
9
|
- 0
|
10
|
-
version: 0.
|
10
|
+
version: 0.3.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Daniel Cestari
|
@@ -17,7 +17,7 @@ autorequire:
|
|
17
17
|
bindir: bin
|
18
18
|
cert_chain: []
|
19
19
|
|
20
|
-
date: 2012-10-
|
20
|
+
date: 2012-10-28 00:00:00 Z
|
21
21
|
dependencies: []
|
22
22
|
|
23
23
|
description: Extension for git which adds a command providing similar functionality to git submodules but without attaching each module to a single version
|
@@ -42,12 +42,14 @@ require_paths:
|
|
42
42
|
required_ruby_version: !ruby/object:Gem::Requirement
|
43
43
|
none: false
|
44
44
|
requirements:
|
45
|
-
- -
|
45
|
+
- - ~>
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
hash:
|
47
|
+
hash: 57
|
48
48
|
segments:
|
49
|
-
-
|
50
|
-
|
49
|
+
- 1
|
50
|
+
- 8
|
51
|
+
- 7
|
52
|
+
version: 1.8.7
|
51
53
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
52
54
|
none: false
|
53
55
|
requirements:
|