1717require 'logger'
1818require 'cocaine'
1919
20- # Contains helper module UrlHelper and execution class GitFastClone::Runner
20+ # Contains helper module UrlHelper, CocaineWrapper, and execution class GitFastClone::Runner
2121module GitFastClone
2222 # Helper methods for fastclone url operations
2323 module UrlHelper
@@ -51,17 +51,73 @@ def reference_repo_submodule_file(url, reference_dir, using_local_repo)
5151 module_function :reference_repo_submodule_file
5252 end
5353
54+ # Helper methods to call cocaine functionality
55+ module CocaineWrapper
56+ DEFAULT_GIT_ALLOW_PROTOCOL = 'file:git:http:https:ssh'
57+
58+ attr_accessor :clone_ref_cmd , :checkout_cmd , :submodule_init_cmd , :submodule_update_cmd ,
59+ :clone_mirror_cmd , :remote_update_cmd
60+
61+ def cocaine_setup
62+ Cocaine ::CommandLine . environment [ 'GIT_ALLOW_PROTOCOL' ] =
63+ ENV [ 'GIT_ALLOW_PROTOCOL' ] || DEFAULT_GIT_ALLOW_PROTOCOL
64+
65+ self . clone_ref_cmd = Cocaine ::CommandLine . new ( 'git clone --quiet --reference' , ':var' )
66+ self . checkout_cmd = Cocaine ::CommandLine . new ( 'git checkout --quiet' , ':var' )
67+ self . submodule_init_cmd = Cocaine ::CommandLine . new ( 'git submodule init' )
68+ self . submodule_update_cmd = Cocaine ::CommandLine . new ( 'git submodule update ' \
69+ '--quiet --reference' , ':var' )
70+ self . clone_mirror_cmd = Cocaine ::CommandLine . new ( 'git clone --mirror' , ':var' )
71+ self . remote_update_cmd = Cocaine ::CommandLine . new ( 'git remote update --prune' )
72+ end
73+ module_function :cocaine_setup
74+
75+ def attach_logger ( logger )
76+ Cocaine ::CommandLine . logger = logger
77+ end
78+ module_function :attach_logger
79+
80+ def clone_ref ( args )
81+ clone_ref_cmd . run ( var : args )
82+ end
83+ module_function :clone_ref
84+
85+ def checkout ( args )
86+ checkout_cmd . run ( var : args )
87+ end
88+ module_function :checkout
89+
90+ def submodule_init
91+ submodule_init_cmd . run
92+ end
93+ module_function :submodule_init
94+
95+ def submodule_update ( args )
96+ submodule_update_cmd . run ( var : args )
97+ end
98+ module_function :submodule_update
99+
100+ def clone_mirror ( args )
101+ clone_mirror_cmd . run ( var : args )
102+ end
103+ module_function :clone_mirror
104+
105+ def remote_update
106+ remote_update_cmd . run
107+ end
108+ module_function :remote_update
109+ end
110+
54111 # Spawns one thread per submodule, and updates them in parallel. They will be
55112 # cached in the reference directory (see DEFAULT_REFERENCE_REPO_DIR), and their
56113 # index will be incrementally updated. This prevents a large amount of data
57114 # copying.
58115 class Runner
59116 include GitFastClone ::UrlHelper
117+ include GitFastClone ::CocaineWrapper
60118
61119 DEFAULT_REFERENCE_REPO_DIR = '/var/tmp/git-fastclone/reference'
62120
63- DEFAULT_GIT_ALLOW_PROTOCOL = 'file:git:http:https:ssh'
64-
65121 attr_accessor :reference_dir , :prefetch_submodules , :reference_mutex , :reference_updated ,
66122 :options , :logger , :abs_clone_path , :using_local_repo
67123
@@ -92,8 +148,7 @@ def initialize
92148 def run
93149 url , path , options = parse_inputs
94150 logger . info ( "Cloning #{ url } to #{ path } " ) if logger
95- Cocaine ::CommandLine . environment [ 'GIT_ALLOW_PROTOCOL' ] =
96- ENV [ 'GIT_ALLOW_PROTOCOL' ] || DEFAULT_GIT_ALLOW_PROTOCOL
151+ cocaine_setup
97152 clone ( url , options [ :branch ] , path )
98153 end
99154
@@ -110,7 +165,7 @@ def parse_inputs
110165 end
111166 opts . on ( '-v' , '--verbose' , 'Verbose mode' ) do
112167 self . logger = Logger . new ( STDOUT )
113- Cocaine :: CommandLine . logger = logger
168+ attach_logger ( logger )
114169 end
115170 end . parse!
116171
@@ -144,16 +199,11 @@ def clone(url, rev, src_dir)
144199 initial_time = Time . now
145200
146201 with_git_mirror ( url ) do |mirror |
147- Cocaine ::CommandLine . new ( 'git clone --quiet --reference' , ':var' )
148- . run ( var : [ "#{ mirror } " , "#{ url } " , "#{ File . join ( abs_clone_path , src_dir ) } " ] )
202+ clone_ref ( [ "#{ mirror } " , "#{ url } " , "#{ File . join ( abs_clone_path , src_dir ) } " ] )
149203 end
150204
151205 # Only checkout if we're changing branches to a non-default branch
152- if rev
153- Dir . chdir ( src_dir ) do
154- Cocaine ::CommandLine . new ( 'git checkout --quiet' , ':var' ) . run ( var : "#{ rev } " )
155- end
156- end
206+ Dir . chdir ( src_dir ) { checkout ( "#{ rev } " ) } if rev
157207
158208 update_submodules ( src_dir , url )
159209
@@ -170,7 +220,7 @@ def update_submodules(pwd, url)
170220 submodule_url_list = [ ]
171221
172222 Dir . chdir ( "#{ File . join ( abs_clone_path , pwd ) } " ) do
173- Cocaine :: CommandLine . new ( 'git submodule init' ) . run . split ( "\n " ) . each do |line |
223+ submodule_init . split ( "\n " ) . each do |line |
174224 submodule_path , submodule_url = parse_update_info ( line )
175225 submodule_url_list << submodule_url
176226
@@ -186,8 +236,7 @@ def thread_update_submodule(submodule_url, submodule_path, threads, pwd)
186236 threads << Thread . new do
187237 with_git_mirror ( submodule_url ) do |mirror |
188238 Dir . chdir ( "#{ File . join ( abs_clone_path , pwd ) } " ) do
189- Cocaine ::CommandLine . new ( 'git submodule update --quiet --reference' , ':var' )
190- . run ( var : [ "#{ mirror } " , "#{ submodule_path } " ] )
239+ submodule_update ( [ "#{ mirror } " , "#{ submodule_path } " ] )
191240 end
192241 end
193242
@@ -196,9 +245,7 @@ def thread_update_submodule(submodule_url, submodule_path, threads, pwd)
196245 end
197246
198247 def with_reference_repo_lock ( url )
199- reference_mutex [ reference_repo_name ( url ) ] . synchronize do
200- yield
201- end
248+ reference_mutex [ reference_repo_name ( url ) ] . synchronize { yield }
202249 end
203250
204251 def update_submodule_reference ( url , submodule_url_list )
@@ -242,13 +289,9 @@ def prefetch(submodule_file)
242289
243290 # Stores the fact that our repo has been updated
244291 def store_updated_repo ( url , mirror , repo_name , fail_hard )
245- unless Dir . exist? ( mirror )
246- Cocaine ::CommandLine . new ( 'git clone --mirror' , ':var' ) . run ( var : [ "#{ url } " , "#{ mirror } " ] )
247- end
292+ clone_mirror ( [ "#{ url } " , "#{ mirror } " ] ) unless Dir . exist? ( mirror )
248293
249- Dir . chdir ( "#{ mirror } " ) do
250- Cocaine ::CommandLine . new ( 'git remote update --prune' ) . run
251- end
294+ Dir . chdir ( "#{ mirror } " ) { remote_update }
252295
253296 reference_updated [ repo_name ] = true
254297
0 commit comments