@@ -77,6 +77,12 @@ def capture(cmd, **opts, &block)
7777 tool_context . capture ( cmd , **opts , &block )
7878 end
7979
80+ def capture_ruby ( code , **opts , &block )
81+ opts [ :in ] = [ :string , code ]
82+ opts = modify_exec_opts ( opts , "ruby" )
83+ tool_context . capture_ruby ( [ ] , **opts , &block )
84+ end
85+
8086 def ensure_gh_binary
8187 result = exec ( [ "gh" , "--version" ] , out : :capture , exit_on_nonzero_status : false )
8288 match = /^gh version (\d +)\. (\d +)\. (\d +)/ . match ( result . captured_out . to_s )
@@ -184,14 +190,17 @@ def add_pr_message(pr_number, message)
184190 self
185191 end
186192
187- def current_library_version ( gem_name )
188- path = gem_version_rb_path ( gem_name , from : :absolute )
189- require path
190- const = ::Object
191- gem_version_constant ( gem_name ) . each do |name |
192- const = const . const_get ( name )
193- end
194- const
193+ def current_library_version ( gem_name , at : nil )
194+ content =
195+ if at
196+ path = gem_version_rb_path ( gem_name , from : :context )
197+ capture ( [ "git" , "show" , "#{ at } :#{ path } " ] )
198+ else
199+ File . read ( gem_version_rb_path ( gem_name , from : :absolute ) )
200+ end
201+ const = gem_version_constant ( gem_name ) . join ( "::" )
202+ content += "\n puts ::#{ const } \n "
203+ capture_ruby ( content ) . strip
195204 end
196205
197206 def verify_library_version ( gem_name , gem_vers )
@@ -331,6 +340,10 @@ def git_set_user_info
331340 self
332341 end
333342
343+ def released_gems_and_versions ( pr_info )
344+ single_released_gem_and_version ( pr_info ) || multiple_released_gems_and_versions ( pr_info )
345+ end
346+
334347 def log ( message )
335348 logger . info ( message )
336349 end
@@ -397,4 +410,32 @@ def wait_github_checks_internal(ref, deadline)
397410 interval += 10 unless interval >= 60
398411 end
399412 end
413+
414+ def single_released_gem_and_version ( pr_info )
415+ gem_name =
416+ if all_gems . size == 1
417+ default_gem
418+ else
419+ gem_name_from_release_branch ( pr_info [ "head" ] [ "ref" ] )
420+ end
421+ return nil unless gem_name
422+ merge_sha = pr_info [ "merge_commit_sha" ]
423+ gem_version = current_library_version ( gem_name , at : merge_sha )
424+ logger . info ( "Found single gem to release: #{ gem_name } #{ gem_version } ." )
425+ { gem_name => gem_version }
426+ end
427+
428+ def multiple_released_gems_and_versions ( pr_info )
429+ merge_sha = pr_info [ "merge_commit_sha" ]
430+ output = capture ( [ "git" , "diff" , "--name-only" , "#{ merge_sha } ^..#{ merge_sha } " ] )
431+ files = output . split ( "\n " )
432+ gems = all_gems . find_all do |gem_name |
433+ dir = gem_directory ( gem_name )
434+ files . any? { |file | file . start_with? ( dir ) }
435+ end
436+ gems . each_with_object ( { } ) do |gem_name , result |
437+ result [ gem_name ] = gem_version = current_library_version ( gem_name , at : merge_sha )
438+ logger . info ( "Releasing gem due to file changes: #{ gem_name } #{ gem_version } ." )
439+ end
440+ end
400441end
0 commit comments