multi_repo 0.2.3 → 0.3.1
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/.github/workflows/ci.yaml +3 -3
- data/CHANGELOG.md +14 -0
- data/lib/multi_repo/helpers/pull_request_blaster_outer.rb +55 -47
- data/lib/multi_repo/version.rb +1 -1
- data/multi_repo.gemspec +1 -4
- data/scripts/pull_request_blaster_outer +9 -4
- data/scripts/pull_request_merger +3 -3
- data/scripts/show_commit_history +18 -2
- metadata +4 -17
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA256:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: 313d72f8febb801872f9f65ade31381a3104b32a21d1628e8c56ee3186b78164
         | 
| 4 | 
            +
              data.tar.gz: 1850ed479241b145ba84295dcfe0a0cde15bce8d28f81c2fb11df90e69349d40
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: 9e5ce408edfeab47540e55241c6508cc6d0d84be9e31cc9531ecf7136d44c2b8be3797c7a909128fa22a0ba67f864e485eac32f121c68bd5afba674d983845be
         | 
| 7 | 
            +
              data.tar.gz: c178885fe71a1f399d25f661081cb7560bdaba988d9b4a4ac1ec0c4b207858c798f18b751da988c7aa864a6a1854af96d6de361b55530b37ac8069699e9241e8
         | 
    
        data/.github/workflows/ci.yaml
    CHANGED
    
    | @@ -12,12 +12,12 @@ jobs: | |
| 12 12 | 
             
                strategy:
         | 
| 13 13 | 
             
                  matrix:
         | 
| 14 14 | 
             
                    ruby-version:
         | 
| 15 | 
            -
                    - '2.7'
         | 
| 16 15 | 
             
                    - '3.0'
         | 
| 16 | 
            +
                    - '3.1'
         | 
| 17 17 | 
             
                env:
         | 
| 18 18 | 
             
                  CC_TEST_REPORTER_ID: ${{ secrets.CC_TEST_REPORTER_ID }}
         | 
| 19 19 | 
             
                steps:
         | 
| 20 | 
            -
                - uses: actions/checkout@ | 
| 20 | 
            +
                - uses: actions/checkout@v4
         | 
| 21 21 | 
             
                - name: Set up Ruby
         | 
| 22 22 | 
             
                  uses: ruby/setup-ruby@v1
         | 
| 23 23 | 
             
                  with:
         | 
| @@ -27,6 +27,6 @@ jobs: | |
| 27 27 | 
             
                - name: Run tests
         | 
| 28 28 | 
             
                  run: bundle exec rake
         | 
| 29 29 | 
             
                - name: Report code coverage
         | 
| 30 | 
            -
                  if: ${{ github.ref == 'refs/heads/master' && matrix.ruby-version == '3. | 
| 30 | 
            +
                  if: ${{ github.ref == 'refs/heads/master' && matrix.ruby-version == '3.1' }}
         | 
| 31 31 | 
             
                  continue-on-error: true
         | 
| 32 32 | 
             
                  uses: paambaati/codeclimate-action@v5
         | 
    
        data/CHANGELOG.md
    ADDED
    
    | @@ -0,0 +1,14 @@ | |
| 1 | 
            +
            # Change Log
         | 
| 2 | 
            +
            All notable changes to this project will be documented in this file.
         | 
| 3 | 
            +
            This project adheres to [Semantic Versioning](http://semver.org/).
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            ## [Unreleased]
         | 
| 6 | 
            +
             | 
| 7 | 
            +
            ## [0.3.1] - 2024-01-31
         | 
| 8 | 
            +
            ### Fixed
         | 
| 9 | 
            +
            - [pull_request_blaster_outer] Various fixes and cleanup output [[#21](https://github.com/ManageIQ/multi_repo/pull/21)]
         | 
| 10 | 
            +
            - [show_commit_history] Prevent missing ranges from failing the entire run [[#22](https://github.com/ManageIQ/multi_repo/pull/22)]
         | 
| 11 | 
            +
            - [pull_request_merger] Fixing issue passing kwargs on Ruby 3 [[#23](https://github.com/ManageIQ/multi_repo/pull/23)]
         | 
| 12 | 
            +
             | 
| 13 | 
            +
            [Unreleased]: https://github.com/ManageIQ/more_core_extensions/compare/v0.3.1...HEAD
         | 
| 14 | 
            +
            [0.3.1]: https://github.com/ManageIQ/more_core_extensions/compare/v0.3.0...v0.3.1
         | 
| @@ -9,8 +9,7 @@ module MultiRepo::Helpers | |
| 9 9 | 
             
                  @base    = base
         | 
| 10 10 | 
             
                  @head    = head
         | 
| 11 11 | 
             
                  @script  = begin
         | 
| 12 | 
            -
                    s = Pathname.new(script)
         | 
| 13 | 
            -
                    s = Pathname.new(Dir.pwd).join(script) if s.relative?
         | 
| 12 | 
            +
                    s = Pathname.new(script).expand_path
         | 
| 14 13 | 
             
                    raise "File not found #{s}" unless s.exist?
         | 
| 15 14 | 
             
                    s.to_s
         | 
| 16 15 | 
             
                  end
         | 
| @@ -20,12 +19,10 @@ module MultiRepo::Helpers | |
| 20 19 | 
             
                end
         | 
| 21 20 |  | 
| 22 21 | 
             
                def blast
         | 
| 23 | 
            -
                  puts "+++ blasting #{repo.name}..."
         | 
| 24 | 
            -
             | 
| 25 22 | 
             
                  repo.git.fetch
         | 
| 26 23 |  | 
| 27 24 | 
             
                  unless repo.git.remote_branch?("origin", base)
         | 
| 28 | 
            -
                    puts " | 
| 25 | 
            +
                    puts "!! Skipping #{repo.name}: 'origin/#{base}' not found".light_yellow
         | 
| 29 26 | 
             
                    return
         | 
| 30 27 | 
             
                  end
         | 
| 31 28 |  | 
| @@ -33,20 +30,31 @@ module MultiRepo::Helpers | |
| 33 30 | 
             
                  run_script
         | 
| 34 31 |  | 
| 35 32 | 
             
                  result = false
         | 
| 36 | 
            -
                  if ! | 
| 37 | 
            -
                    puts | 
| 38 | 
            -
             | 
| 39 | 
            -
                    result = " | 
| 33 | 
            +
                  if !changes_found?
         | 
| 34 | 
            +
                    puts
         | 
| 35 | 
            +
                    puts "!! Skipping #{repo.name}: No changes found".light_yellow
         | 
| 36 | 
            +
                    result = "no changes".light_yellow
         | 
| 40 37 | 
             
                  else
         | 
| 41 | 
            -
                     | 
| 42 | 
            -
                     | 
| 43 | 
            -
                     | 
| 44 | 
            -
             | 
| 45 | 
            -
             | 
| 46 | 
            -
                       | 
| 38 | 
            +
                    commit_changes
         | 
| 39 | 
            +
                    show_commit
         | 
| 40 | 
            +
                    puts
         | 
| 41 | 
            +
             | 
| 42 | 
            +
                    if dry_run
         | 
| 43 | 
            +
                      puts "** dry-run: Skipping opening pull request".light_black
         | 
| 44 | 
            +
                      result = "dry run".light_black
         | 
| 45 | 
            +
                    else
         | 
| 46 | 
            +
                      print "Do you want to open a pull request on #{repo.name} with the above changes? (y/N): "
         | 
| 47 | 
            +
                      answer = $stdin.gets.chomp
         | 
| 48 | 
            +
                      if answer.upcase.start_with?("Y")
         | 
| 49 | 
            +
                        fork_repo unless forked?
         | 
| 50 | 
            +
                        push_branch
         | 
| 51 | 
            +
                        result = open_pull_request
         | 
| 52 | 
            +
                      else
         | 
| 53 | 
            +
                        puts "!! Skipping #{repo.name}: User ignored".light_yellow
         | 
| 54 | 
            +
                        result = "ignored".light_yellow
         | 
| 55 | 
            +
                      end
         | 
| 47 56 | 
             
                    end
         | 
| 48 57 | 
             
                  end
         | 
| 49 | 
            -
                  puts "--- blasting #{repo.name} complete"
         | 
| 50 58 | 
             
                  result
         | 
| 51 59 | 
             
                end
         | 
| 52 60 |  | 
| @@ -57,7 +65,9 @@ module MultiRepo::Helpers | |
| 57 65 | 
             
                end
         | 
| 58 66 |  | 
| 59 67 | 
             
                def forked?
         | 
| 60 | 
            -
                   | 
| 68 | 
            +
                  # NOTE: There is an assumption here that the fork's name will match the source's name.
         | 
| 69 | 
            +
                  #   Ideally there would be a "forked from" field in the repo metadata, but there isn't.
         | 
| 70 | 
            +
                  github.client.repos(github.client.login, :type => "forks").any? { |m| m.name == repo.short_name }
         | 
| 61 71 | 
             
                end
         | 
| 62 72 |  | 
| 63 73 | 
             
                def fork_repo
         | 
| @@ -70,41 +80,41 @@ module MultiRepo::Helpers | |
| 70 80 |  | 
| 71 81 | 
             
                def run_script
         | 
| 72 82 | 
             
                  repo.chdir do
         | 
| 73 | 
            -
                     | 
| 74 | 
            -
             | 
| 75 | 
            -
             | 
| 76 | 
            -
             | 
| 77 | 
            -
             | 
| 78 | 
            -
             | 
| 79 | 
            -
             | 
| 80 | 
            -
                       | 
| 81 | 
            -
             | 
| 83 | 
            +
                    Bundler.with_unbundled_env do
         | 
| 84 | 
            +
                      parts = []
         | 
| 85 | 
            +
                      parts << "GITHUB_REPO=#{repo.name}"
         | 
| 86 | 
            +
                      parts << "DRY_RUN=true" if dry_run
         | 
| 87 | 
            +
                      parts << script
         | 
| 88 | 
            +
                      cmd = parts.join(" ")
         | 
| 89 | 
            +
             | 
| 90 | 
            +
                      unless system(cmd)
         | 
| 91 | 
            +
                        puts "!! Script execution failed.".light_red
         | 
| 92 | 
            +
                        exit $?.exitstatus
         | 
| 93 | 
            +
                      end
         | 
| 82 94 | 
             
                    end
         | 
| 83 95 | 
             
                  end
         | 
| 84 96 | 
             
                end
         | 
| 85 97 |  | 
| 98 | 
            +
                def changes_found?
         | 
| 99 | 
            +
                  repo.git.client.capturing.status("--porcelain").chomp.present?
         | 
| 100 | 
            +
                end
         | 
| 101 | 
            +
             | 
| 86 102 | 
             
                def commit_changes
         | 
| 87 | 
            -
                  repo. | 
| 88 | 
            -
             | 
| 89 | 
            -
             | 
| 90 | 
            -
             | 
| 91 | 
            -
             | 
| 92 | 
            -
             | 
| 93 | 
            -
                        puts "!!! --dry-run enabled: If the above commit in #{repo.path} looks good, run again without dry run to fork the repo, push the branch and open a pull request."
         | 
| 94 | 
            -
                      end
         | 
| 95 | 
            -
                      true
         | 
| 96 | 
            -
                    rescue MiniGit::GitError => e
         | 
| 97 | 
            -
                      e.status.exitstatus == 0
         | 
| 98 | 
            -
                    end
         | 
| 99 | 
            -
                  end
         | 
| 103 | 
            +
                  repo.git.client.add("-v", ".")
         | 
| 104 | 
            +
                  repo.git.client.commit("-m", message)
         | 
| 105 | 
            +
                end
         | 
| 106 | 
            +
             | 
| 107 | 
            +
                def show_commit
         | 
| 108 | 
            +
                  repo.git.client.show
         | 
| 100 109 | 
             
                end
         | 
| 101 110 |  | 
| 102 | 
            -
                def  | 
| 111 | 
            +
                def blast_remote
         | 
| 103 112 | 
             
                  "pr_blaster_outer"
         | 
| 104 113 | 
             
                end
         | 
| 105 114 |  | 
| 106 | 
            -
                def  | 
| 107 | 
            -
                   | 
| 115 | 
            +
                def blast_remote_url
         | 
| 116 | 
            +
                  # NOTE: Similar to `forked?`, there is an assumption here that the fork's name will match the source's name.
         | 
| 117 | 
            +
                  "git@github.com:#{github.client.login}/#{repo.short_name}.git"
         | 
| 108 118 | 
             
                end
         | 
| 109 119 |  | 
| 110 120 | 
             
                def pr_head
         | 
| @@ -112,10 +122,8 @@ module MultiRepo::Helpers | |
| 112 122 | 
             
                end
         | 
| 113 123 |  | 
| 114 124 | 
             
                def push_branch
         | 
| 115 | 
            -
                  repo. | 
| 116 | 
            -
             | 
| 117 | 
            -
                    repo.git.client.push("-f", origin_remote, "#{head}:#{head}")
         | 
| 118 | 
            -
                  end
         | 
| 125 | 
            +
                  repo.git.client.remote("add", blast_remote, blast_remote_url) unless repo.git.remote?(blast_remote)
         | 
| 126 | 
            +
                  repo.git.client.push("-f", blast_remote, "#{head}:#{head}")
         | 
| 119 127 | 
             
                end
         | 
| 120 128 |  | 
| 121 129 | 
             
                def open_pull_request
         | 
| @@ -123,7 +131,7 @@ module MultiRepo::Helpers | |
| 123 131 | 
             
                  pr.html_url
         | 
| 124 132 | 
             
                rescue => err
         | 
| 125 133 | 
             
                  raise unless err.message.include?("A pull request already exists")
         | 
| 126 | 
            -
                  puts " | 
| 134 | 
            +
                  puts "!! Skipping #{repo.name}: #{err.message}".light_yellow
         | 
| 127 135 | 
             
                end
         | 
| 128 136 | 
             
              end
         | 
| 129 137 | 
             
            end
         | 
    
        data/lib/multi_repo/version.rb
    CHANGED
    
    
    
        data/multi_repo.gemspec
    CHANGED
    
    | @@ -20,7 +20,7 @@ Gem::Specification.new do |spec| | |
| 20 20 | 
             
              spec.executables   = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
         | 
| 21 21 | 
             
              spec.require_paths = ["lib"]
         | 
| 22 22 |  | 
| 23 | 
            -
              spec.required_ruby_version = ">=  | 
| 23 | 
            +
              spec.required_ruby_version = ">= 3.0.0"
         | 
| 24 24 |  | 
| 25 25 | 
             
              spec.add_runtime_dependency "activesupport"
         | 
| 26 26 | 
             
              spec.add_runtime_dependency "colorize"
         | 
| @@ -36,9 +36,6 @@ Gem::Specification.new do |spec| | |
| 36 36 | 
             
              spec.add_runtime_dependency "rest-client"
         | 
| 37 37 | 
             
              spec.add_runtime_dependency "travis"
         | 
| 38 38 |  | 
| 39 | 
            -
              # config gem brings in newer versions of dry-configurable that are not compatible with Ruby 2.7
         | 
| 40 | 
            -
              spec.add_runtime_dependency "dry-configurable", "= 1.0.1"
         | 
| 41 | 
            -
             | 
| 42 39 | 
             
              spec.add_development_dependency "bundler"
         | 
| 43 40 | 
             
              spec.add_development_dependency "manageiq-style"
         | 
| 44 41 | 
             
              spec.add_development_dependency "rake"
         | 
| @@ -4,7 +4,9 @@ require "bundler/inline" | |
| 4 4 | 
             
            gemfile do
         | 
| 5 5 | 
             
              source "https://rubygems.org"
         | 
| 6 6 | 
             
              gem "multi_repo", require: "multi_repo/cli", path: File.expand_path("..", __dir__)
         | 
| 7 | 
            +
              gem "more_core_extensions"
         | 
| 7 8 | 
             
            end
         | 
| 9 | 
            +
            require "more_core_extensions/core_ext/array/tableize"
         | 
| 8 10 |  | 
| 9 11 | 
             
            opts = Optimist.options do
         | 
| 10 12 | 
             
              synopsis "Create a pull request on all repos."
         | 
| @@ -19,8 +21,11 @@ opts = Optimist.options do | |
| 19 21 | 
             
            end
         | 
| 20 22 |  | 
| 21 23 | 
             
            results = {}
         | 
| 22 | 
            -
             | 
| 23 | 
            -
               | 
| 24 | 
            +
            begin
         | 
| 25 | 
            +
              MultiRepo::CLI.each_repo(**opts) do |repo|
         | 
| 26 | 
            +
                results[repo.name] = MultiRepo::Helpers::PullRequestBlasterOuter.new(repo, **opts).blast
         | 
| 27 | 
            +
              end
         | 
| 28 | 
            +
            ensure
         | 
| 29 | 
            +
              puts "Summary:"
         | 
| 30 | 
            +
              puts results.to_a.tableize(:header => false) unless results.empty?
         | 
| 24 31 | 
             
            end
         | 
| 25 | 
            -
             | 
| 26 | 
            -
            pp results
         | 
    
        data/scripts/pull_request_merger
    CHANGED
    
    | @@ -57,9 +57,9 @@ opts[:prs].each do |pr| | |
| 57 57 |  | 
| 58 58 | 
             
              repo_name, pr_number = PR_REGEX.match(pr).captures
         | 
| 59 59 |  | 
| 60 | 
            -
              merge_pull_request(repo_name, pr_number, opts)
         | 
| 61 | 
            -
              add_labels(repo_name, pr_number, opts) if opts[:labels].present?
         | 
| 62 | 
            -
              assign_user(repo_name, pr_number, opts)
         | 
| 60 | 
            +
              merge_pull_request(repo_name, pr_number, **opts)
         | 
| 61 | 
            +
              add_labels(repo_name, pr_number, **opts) if opts[:labels].present?
         | 
| 62 | 
            +
              assign_user(repo_name, pr_number, **opts)
         | 
| 63 63 |  | 
| 64 64 | 
             
              puts
         | 
| 65 65 | 
             
            end
         | 
    
        data/scripts/show_commit_history
    CHANGED
    
    | @@ -48,7 +48,15 @@ MultiRepo::CLI.repos_for(**opts).each do |repo| | |
| 48 48 | 
             
                end
         | 
| 49 49 | 
             
                results["other"] = []
         | 
| 50 50 |  | 
| 51 | 
            -
                log = | 
| 51 | 
            +
                log =
         | 
| 52 | 
            +
                  begin
         | 
| 53 | 
            +
                    repo.git.client.capturing.log({:oneline => true}, range)
         | 
| 54 | 
            +
                  rescue MiniGit::GitError
         | 
| 55 | 
            +
                    puts "ERROR: commit range not found.".light_red
         | 
| 56 | 
            +
                    puts
         | 
| 57 | 
            +
                    next
         | 
| 58 | 
            +
                  end
         | 
| 59 | 
            +
             | 
| 52 60 | 
             
                log.lines.each do |line|
         | 
| 53 61 | 
             
                  next unless (match = line.match(/Merge pull request #(\d+)\b/))
         | 
| 54 62 |  | 
| @@ -71,7 +79,15 @@ MultiRepo::CLI.repos_for(**opts).each do |repo| | |
| 71 79 |  | 
| 72 80 | 
             
                repos_with_changes << repo if changes_found
         | 
| 73 81 | 
             
              when "commit"
         | 
| 74 | 
            -
                output = | 
| 82 | 
            +
                output =
         | 
| 83 | 
            +
                  begin
         | 
| 84 | 
            +
                    repo.git.client.capturing.log({:oneline => true, :decorate => true, :graph => true}, range)
         | 
| 85 | 
            +
                  rescue MiniGit::GitError
         | 
| 86 | 
            +
                    puts "ERROR: commit range not found.".light_red
         | 
| 87 | 
            +
                    puts
         | 
| 88 | 
            +
                    next
         | 
| 89 | 
            +
                  end
         | 
| 90 | 
            +
             | 
| 75 91 | 
             
                puts output
         | 
| 76 92 | 
             
                repos_with_changes << repo if output.present?
         | 
| 77 93 | 
             
              end
         | 
    
        metadata
    CHANGED
    
    | @@ -1,14 +1,14 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: multi_repo
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 0. | 
| 4 | 
            +
              version: 0.3.1
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - ManageIQ Authors
         | 
| 8 8 | 
             
            autorequire:
         | 
| 9 9 | 
             
            bindir: exe
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 | 
            -
            date:  | 
| 11 | 
            +
            date: 2024-01-31 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 14 | 
             
              name: activesupport
         | 
| @@ -192,20 +192,6 @@ dependencies: | |
| 192 192 | 
             
                - - ">="
         | 
| 193 193 | 
             
                  - !ruby/object:Gem::Version
         | 
| 194 194 | 
             
                    version: '0'
         | 
| 195 | 
            -
            - !ruby/object:Gem::Dependency
         | 
| 196 | 
            -
              name: dry-configurable
         | 
| 197 | 
            -
              requirement: !ruby/object:Gem::Requirement
         | 
| 198 | 
            -
                requirements:
         | 
| 199 | 
            -
                - - '='
         | 
| 200 | 
            -
                  - !ruby/object:Gem::Version
         | 
| 201 | 
            -
                    version: 1.0.1
         | 
| 202 | 
            -
              type: :runtime
         | 
| 203 | 
            -
              prerelease: false
         | 
| 204 | 
            -
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 205 | 
            -
                requirements:
         | 
| 206 | 
            -
                - - '='
         | 
| 207 | 
            -
                  - !ruby/object:Gem::Version
         | 
| 208 | 
            -
                    version: 1.0.1
         | 
| 209 195 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 210 196 | 
             
              name: bundler
         | 
| 211 197 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| @@ -293,6 +279,7 @@ files: | |
| 293 279 | 
             
            - ".rubocop_cc.yml"
         | 
| 294 280 | 
             
            - ".rubocop_local.yml"
         | 
| 295 281 | 
             
            - ".whitesource"
         | 
| 282 | 
            +
            - CHANGELOG.md
         | 
| 296 283 | 
             
            - Gemfile
         | 
| 297 284 | 
             
            - LICENSE.txt
         | 
| 298 285 | 
             
            - README.md
         | 
| @@ -365,7 +352,7 @@ required_ruby_version: !ruby/object:Gem::Requirement | |
| 365 352 | 
             
              requirements:
         | 
| 366 353 | 
             
              - - ">="
         | 
| 367 354 | 
             
                - !ruby/object:Gem::Version
         | 
| 368 | 
            -
                  version:  | 
| 355 | 
            +
                  version: 3.0.0
         | 
| 369 356 | 
             
            required_rubygems_version: !ruby/object:Gem::Requirement
         | 
| 370 357 | 
             
              requirements:
         | 
| 371 358 | 
             
              - - ">="
         |