git-fastclone 1.1.2 → 1.2.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 +5 -5
- data/README.md +2 -2
- data/Rakefile +9 -4
- data/bin/git-fastclone +1 -0
- data/lib/git-fastclone.rb +24 -22
- data/lib/git-fastclone/version.rb +3 -1
- data/spec/git_fastclone_runner_spec.rb +27 -24
- data/spec/git_fastclone_url_helper_spec.rb +2 -0
- data/spec/spec_helper.rb +2 -0
- metadata +11 -12
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 9383bab9258efe9c7f106182b92ffbe0a66031a799f61313286c5525353a6676
|
4
|
+
data.tar.gz: f8611d4f1c8afc78b1fb0a65af35e386b5c7ecdfe9b8bafe36c391670e2f4622
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4182af8e5b3e978167466329df3fceb3e0b14808e71425d121d447bb84b0d37490eae4cad9a8c1c8b05f4fecdc1bc0e9da2a5743fd6d761bd6c33e66d2fa5dd7
|
7
|
+
data.tar.gz: 42fb710ef3ec9ab6eae8c7f176ea4f4dffca799326b590130c4c8fc8649430f9f367ffa9edbbebeb7db89ec272620750c5368d681f57dcb05f79e4be64156fca
|
data/README.md
CHANGED
@@ -75,7 +75,7 @@ Before accepting any pull requests, we need you to sign an [Individual Contribut
|
|
75
75
|
|
76
76
|
Acknowledgements
|
77
77
|
----------------
|
78
|
-
[thoughtbot/
|
78
|
+
[thoughtbot/terrapin][3] - jyurek and collaborators
|
79
79
|
|
80
80
|
[robolson][4]
|
81
81
|
|
@@ -104,7 +104,7 @@ License
|
|
104
104
|
|
105
105
|
[1]: https://corner.squareup.com/2015/11/fastclone.html
|
106
106
|
[2]: https://docs.google.com/a/squareup.com/forms/d/13WR8m5uZ2nAkJH41k7GdVBXAAbzDk00vxtEYjd6Imzg/viewform?formkey=dDViT2xzUHAwRkI3X3k5Z0lQM091OGc6MQ&ndplr=1
|
107
|
-
[3]: https://github.com/thoughtbot/
|
107
|
+
[3]: https://github.com/thoughtbot/terrapin
|
108
108
|
[4]: https://github.com/robolson
|
109
109
|
[5]: https://github.com/ianchesal
|
110
110
|
[6]: https://github.com/mtauraso
|
data/Rakefile
CHANGED
@@ -1,11 +1,16 @@
|
|
1
|
-
#
|
1
|
+
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require 'bundler/setup'
|
4
4
|
|
5
|
-
task default: %w
|
5
|
+
task default: %w[spec]
|
6
6
|
|
7
7
|
require 'rspec/core/rake_task'
|
8
8
|
RSpec::Core::RakeTask.new
|
9
9
|
|
10
|
-
|
11
|
-
|
10
|
+
begin
|
11
|
+
require 'rubocop/rake_task'
|
12
|
+
RuboCop::RakeTask.new
|
13
|
+
task default: :rubocop
|
14
|
+
rescue LoadError => e
|
15
|
+
raise unless e.path == 'rubocop/rake_task'
|
16
|
+
end
|
data/bin/git-fastclone
CHANGED
data/lib/git-fastclone.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
# Copyright 2015 Square Inc.
|
2
4
|
|
3
5
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
@@ -15,7 +17,7 @@
|
|
15
17
|
require 'optparse'
|
16
18
|
require 'fileutils'
|
17
19
|
require 'logger'
|
18
|
-
require '
|
20
|
+
require 'terrapin'
|
19
21
|
require 'timeout'
|
20
22
|
|
21
23
|
# Contains helper module UrlHelper and execution class GitFastClone::Runner
|
@@ -53,7 +55,7 @@ module GitFastClone
|
|
53
55
|
|
54
56
|
def reference_repo_lock_file(url, reference_dir, using_local_repo)
|
55
57
|
lock_file_name = "#{reference_repo_dir(url, reference_dir, using_local_repo)}:lock"
|
56
|
-
File.open(lock_file_name, File::RDWR | File::CREAT,
|
58
|
+
File.open(lock_file_name, File::RDWR | File::CREAT, 0o644)
|
57
59
|
end
|
58
60
|
module_function :reference_repo_lock_file
|
59
61
|
end
|
@@ -117,7 +119,7 @@ module GitFastClone
|
|
117
119
|
end
|
118
120
|
|
119
121
|
puts "Cloning #{path_from_git_url(url)} to #{File.join(abs_clone_path, path)}"
|
120
|
-
|
122
|
+
Terrapin::CommandLine.environment['GIT_ALLOW_PROTOCOL'] =
|
121
123
|
ENV['GIT_ALLOW_PROTOCOL'] || DEFAULT_GIT_ALLOW_PROTOCOL
|
122
124
|
clone(url, options[:branch], path)
|
123
125
|
end
|
@@ -139,7 +141,7 @@ module GitFastClone
|
|
139
141
|
logger.formatter = proc do |_severity, _datetime, _progname, msg|
|
140
142
|
"#{msg}\n"
|
141
143
|
end
|
142
|
-
|
144
|
+
Terrapin::CommandLine.logger = logger
|
143
145
|
end
|
144
146
|
|
145
147
|
opts.on('-c', '--color', 'Display colored output') do
|
@@ -172,8 +174,9 @@ module GitFastClone
|
|
172
174
|
|
173
175
|
if Dir.exist?(path)
|
174
176
|
msg = "Clone destination #{File.join(abs_clone_path, path)} already exists!"
|
175
|
-
|
176
|
-
|
177
|
+
raise msg.red if color
|
178
|
+
|
179
|
+
raise msg
|
177
180
|
end
|
178
181
|
|
179
182
|
self.reference_dir = ENV['REFERENCE_REPO_DIR'] || DEFAULT_REFERENCE_REPO_DIR
|
@@ -188,16 +191,16 @@ module GitFastClone
|
|
188
191
|
initial_time = Time.now
|
189
192
|
|
190
193
|
with_git_mirror(url) do |mirror|
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
194
|
+
Terrapin::CommandLine.new('git clone', '--quiet --reference :mirror :url :path')
|
195
|
+
.run(mirror: mirror.to_s,
|
196
|
+
url: url.to_s,
|
197
|
+
path: File.join(abs_clone_path, src_dir).to_s)
|
195
198
|
end
|
196
199
|
|
197
200
|
# Only checkout if we're changing branches to a non-default branch
|
198
201
|
if rev
|
199
202
|
Dir.chdir(File.join(abs_clone_path, src_dir)) do
|
200
|
-
|
203
|
+
Terrapin::CommandLine.new('git checkout', '--quiet :rev').run(rev: rev.to_s)
|
201
204
|
end
|
202
205
|
end
|
203
206
|
|
@@ -221,8 +224,8 @@ module GitFastClone
|
|
221
224
|
threads = []
|
222
225
|
submodule_url_list = []
|
223
226
|
|
224
|
-
|
225
|
-
|
227
|
+
Terrapin::CommandLine.new('cd', ':path; git submodule init 2>&1')
|
228
|
+
.run(path: File.join(abs_clone_path, pwd)).split("\n").each do |line|
|
226
229
|
submodule_path, submodule_url = parse_update_info(line)
|
227
230
|
submodule_url_list << submodule_url
|
228
231
|
|
@@ -236,10 +239,10 @@ module GitFastClone
|
|
236
239
|
def thread_update_submodule(submodule_url, submodule_path, threads, pwd)
|
237
240
|
threads << Thread.new do
|
238
241
|
with_git_mirror(submodule_url) do |mirror|
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
242
|
+
Terrapin::CommandLine.new('cd', ':dir; git submodule update --quiet --reference :mirror :path')
|
243
|
+
.run(dir: File.join(abs_clone_path, pwd).to_s,
|
244
|
+
mirror: mirror.to_s,
|
245
|
+
path: submodule_path.to_s)
|
243
246
|
end
|
244
247
|
|
245
248
|
update_submodules(File.join(pwd, submodule_path), submodule_url)
|
@@ -313,15 +316,14 @@ module GitFastClone
|
|
313
316
|
# that this repo has been updated on this run of fastclone
|
314
317
|
def store_updated_repo(url, mirror, repo_name, fail_hard)
|
315
318
|
unless Dir.exist?(mirror)
|
316
|
-
|
317
|
-
|
319
|
+
Terrapin::CommandLine.new('git clone', '--mirror :url :mirror')
|
320
|
+
.run(url: url.to_s, mirror: mirror.to_s)
|
318
321
|
end
|
319
322
|
|
320
|
-
|
323
|
+
Terrapin::CommandLine.new('cd', ':path; git remote update --prune').run(path: mirror)
|
321
324
|
|
322
325
|
reference_updated[repo_name] = true
|
323
|
-
|
324
|
-
rescue Cocaine::ExitStatusError => e
|
326
|
+
rescue Terrapin::ExitStatusError => e
|
325
327
|
# To avoid corruption of the cache, if we failed to update or check out we remove
|
326
328
|
# the cache directory entirely. This may cause the current clone to fail, but if the
|
327
329
|
# underlying error from git is transient it will not affect future clones.
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
# Copyright 2015 Square Inc.
|
2
4
|
|
3
5
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
@@ -30,8 +32,9 @@ describe GitFastClone::Runner do
|
|
30
32
|
lockfile
|
31
33
|
end
|
32
34
|
|
33
|
-
|
34
|
-
|
35
|
+
before do
|
36
|
+
stub_const('ARGV', ['ssh://git@git.com/git-fastclone.git', 'test_reference_dir'])
|
37
|
+
end
|
35
38
|
|
36
39
|
let(:yielded) { [] }
|
37
40
|
|
@@ -72,14 +75,14 @@ describe GitFastClone::Runner do
|
|
72
75
|
|
73
76
|
describe '.clone' do
|
74
77
|
it 'should clone correctly' do
|
75
|
-
|
78
|
+
terrapin_commandline_double = double('new_terrapin_commandline')
|
76
79
|
allow(subject).to receive(:with_git_mirror) {}
|
77
|
-
allow(
|
78
|
-
allow(
|
80
|
+
allow(terrapin_commandline_double).to receive(:run) {}
|
81
|
+
allow(Terrapin::CommandLine).to receive(:new) { terrapin_commandline_double }
|
79
82
|
|
80
83
|
expect(Time).to receive(:now).twice { 0 }
|
81
|
-
expect(
|
82
|
-
expect(
|
84
|
+
expect(Terrapin::CommandLine).to receive(:new)
|
85
|
+
expect(terrapin_commandline_double).to receive(:run)
|
83
86
|
|
84
87
|
subject.clone(placeholder_arg, placeholder_arg, '.')
|
85
88
|
end
|
@@ -104,7 +107,7 @@ describe GitFastClone::Runner do
|
|
104
107
|
describe '.thread_update_submodule' do
|
105
108
|
it 'should update correctly' do
|
106
109
|
pending('need to figure out how to test this')
|
107
|
-
|
110
|
+
raise
|
108
111
|
end
|
109
112
|
end
|
110
113
|
|
@@ -127,7 +130,7 @@ describe GitFastClone::Runner do
|
|
127
130
|
|
128
131
|
expect do
|
129
132
|
subject.with_reference_repo_lock(test_url_valid) do
|
130
|
-
|
133
|
+
raise placeholder_arg
|
131
134
|
end
|
132
135
|
end.to raise_error(placeholder_arg)
|
133
136
|
end
|
@@ -184,7 +187,7 @@ describe GitFastClone::Runner do
|
|
184
187
|
end
|
185
188
|
end
|
186
189
|
|
187
|
-
let(:placeholder_hash) {
|
190
|
+
let(:placeholder_hash) { {} }
|
188
191
|
|
189
192
|
context 'when already have a hash' do
|
190
193
|
it 'should not store' do
|
@@ -218,7 +221,7 @@ describe GitFastClone::Runner do
|
|
218
221
|
it 'should go through the submodule file properly' do
|
219
222
|
expect(Thread).to receive(:new).exactly(3).times
|
220
223
|
|
221
|
-
allow(File).to receive(:readlines) { %w
|
224
|
+
allow(File).to receive(:readlines) { %w[1 2 3] }
|
222
225
|
subject.prefetch_submodules = true
|
223
226
|
subject.prefetch(placeholder_arg)
|
224
227
|
end
|
@@ -226,22 +229,22 @@ describe GitFastClone::Runner do
|
|
226
229
|
|
227
230
|
describe '.store_updated_repo' do
|
228
231
|
context 'when fail_hard is true' do
|
229
|
-
it 'should raise a
|
230
|
-
|
231
|
-
allow(
|
232
|
-
allow(
|
232
|
+
it 'should raise a Terrapin error' do
|
233
|
+
terrapin_commandline_double = double('new_terrapin_commandline')
|
234
|
+
allow(terrapin_commandline_double).to receive(:run) { raise Terrapin::ExitStatusError }
|
235
|
+
allow(Terrapin::CommandLine).to receive(:new) { terrapin_commandline_double }
|
233
236
|
expect(FileUtils).to receive(:remove_entry_secure).with(placeholder_arg, force: true)
|
234
237
|
expect do
|
235
238
|
subject.store_updated_repo(placeholder_arg, placeholder_arg, placeholder_arg, true)
|
236
|
-
end.to raise_error(
|
239
|
+
end.to raise_error(Terrapin::ExitStatusError)
|
237
240
|
end
|
238
241
|
end
|
239
242
|
|
240
243
|
context 'when fail_hard is false' do
|
241
|
-
it 'should not raise a
|
242
|
-
|
243
|
-
allow(
|
244
|
-
allow(
|
244
|
+
it 'should not raise a terrapin error' do
|
245
|
+
terrapin_commandline_double = double('new_terrapin_commandline')
|
246
|
+
allow(terrapin_commandline_double).to receive(:run) { raise Terrapin::ExitStatusError }
|
247
|
+
allow(Terrapin::CommandLine).to receive(:new) { terrapin_commandline_double }
|
245
248
|
expect(FileUtils).to receive(:remove_entry_secure).with(placeholder_arg, force: true)
|
246
249
|
|
247
250
|
expect do
|
@@ -250,12 +253,12 @@ describe GitFastClone::Runner do
|
|
250
253
|
end
|
251
254
|
end
|
252
255
|
|
253
|
-
let(:placeholder_hash) {
|
256
|
+
let(:placeholder_hash) { {} }
|
254
257
|
|
255
258
|
it 'should correctly update the hash' do
|
256
|
-
|
257
|
-
allow(
|
258
|
-
allow(
|
259
|
+
terrapin_commandline_double = double('new_terrapin_commandline')
|
260
|
+
allow(terrapin_commandline_double).to receive(:run) {}
|
261
|
+
allow(Terrapin::CommandLine).to receive(:new) { terrapin_commandline_double }
|
259
262
|
allow(Dir).to receive(:chdir) {}
|
260
263
|
|
261
264
|
subject.reference_updated = placeholder_hash
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: git-fastclone
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Michael Tauraso
|
@@ -9,10 +9,10 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2019-01-17 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
|
-
name:
|
15
|
+
name: colorize
|
16
16
|
requirement: !ruby/object:Gem::Requirement
|
17
17
|
requirements:
|
18
18
|
- - ">="
|
@@ -26,21 +26,21 @@ dependencies:
|
|
26
26
|
- !ruby/object:Gem::Version
|
27
27
|
version: '0'
|
28
28
|
- !ruby/object:Gem::Dependency
|
29
|
-
name:
|
29
|
+
name: terrapin
|
30
30
|
requirement: !ruby/object:Gem::Requirement
|
31
31
|
requirements:
|
32
|
-
- - "
|
32
|
+
- - "~>"
|
33
33
|
- !ruby/object:Gem::Version
|
34
|
-
version:
|
34
|
+
version: 0.6.0
|
35
35
|
type: :runtime
|
36
36
|
prerelease: false
|
37
37
|
version_requirements: !ruby/object:Gem::Requirement
|
38
38
|
requirements:
|
39
|
-
- - "
|
39
|
+
- - "~>"
|
40
40
|
- !ruby/object:Gem::Version
|
41
|
-
version:
|
42
|
-
description: A git command that uses reference repositories and threading to
|
43
|
-
|
41
|
+
version: 0.6.0
|
42
|
+
description: A git command that uses reference repositories and threading to quicklyand
|
43
|
+
recursively clone repositories with many nested submodules
|
44
44
|
email:
|
45
45
|
- mtauraso@squareup.com
|
46
46
|
- jchang@squareup.com
|
@@ -77,8 +77,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
77
77
|
- !ruby/object:Gem::Version
|
78
78
|
version: '0'
|
79
79
|
requirements: []
|
80
|
-
|
81
|
-
rubygems_version: 2.5.1
|
80
|
+
rubygems_version: 3.0.2
|
82
81
|
signing_key:
|
83
82
|
specification_version: 4
|
84
83
|
summary: git-clone --recursive on steroids!
|