distributable:
  url: https://github.com/rubygems/rubygems/archive/refs/tags/v{{version}}.tar.gz
  strip-components: 1

versions:
  github: rubygems/rubygems

dependencies:
  ruby-lang.org: '>=2.3'

runtime:
  env:
    RUBYLIB: ${{prefix}}/lib:$RUBYLIB

build:
  dependencies:
    ruby-lang.org:
      ~3.1 # testing a theory
      # NOTE ^^ we don’t know what this comment means either!
  script:
    - ruby setup.rb
      --prefix={{prefix}}
      --env-shebang
      --no-ri
      --no-rdoc

    # 3.5.5 fixed this
    - run: patch -p1 --no-backup-if-mismatch < $PROP
      if: <3.5.5
      working-directory: ${{prefix}}
      prop: |+
        --- a/lib/rubygems/defaults.rb
        +++ b/lib/rubygems/defaults.rb
        @@ -20,13 +20,7 @@ def self.default_sources
           # specified in the environment

           def self.default_spec_cache_dir
        -    default_spec_cache_dir = File.join Gem.user_home, ".gem", "specs"
        -
        -    unless File.exist?(default_spec_cache_dir)
        -      default_spec_cache_dir = File.join Gem.data_home, "gem", "specs"
        -    end
        -
        -    default_spec_cache_dir
        +    File.join Gem.cache_home, "gem", "specs"
           end

           ##

    - run: patch -p1 --no-backup-if-mismatch < "$SRCROOT"/props/fit-n-finish.patch
      working-directory: ${{prefix}}

    # 3.5.7 removed some redunant parens, breaking patching
    - run: patch -p1 --no-backup-if-mismatch < "$SRCROOT"/props/fit-n-finish2-pre357.patch
      if: <3.5.7
      working-directory: ${{prefix}}
    - run: patch -p1 --no-backup-if-mismatch < "$SRCROOT"/props/fit-n-finish2-post357.patch
      if: '>=3.5.7'
      working-directory: ${{prefix}}

    # makes ruby’s default system dir be fixed in /usr/local/lib/ruby
    # rather the relative to ~/.pkgx/ruby-lang.org
    - run: |
        patch -p1 --no-backup-if-mismatch < "$SRCROOT"/props/default-sys-dir.patch
        sed -i -e 's/Gem.default_dir/Gem.default_system_dir/' lib/rubygems/path_support.rb
      working-directory: ${{prefix}}

    # removes redudnant `gem` directory that looks gross in our directory formatting
    - run: sed -i -e 's/Gem.state_home, "gem",/Gem.state_home,/' defaults.rb
      working-directory: ${{prefix}}/lib/rubygems
      if: '>=3.4'

    # ensure `gem` tries to install to ~/.gem if /usr/local is not writable
    - run: patch -p1 --no-backup-if-mismatch < "$SRCROOT"/props/user-install-pre3.5.patch
      working-directory: ${{prefix}}
      if: '<3.5'
    - run: patch -p1 --no-backup-if-mismatch < "$SRCROOT"/props/user-install-post3.5.patch
      working-directory: ${{prefix}}
      if: '>=3.5'

    # fixes bug where gem won’t create the full directory path when installing
    # which typically isn’t a problem since the directory already exists in a standard
    # install but we fuck with the paths way more
    - run: sed -i -e
        's/Dir\.mkdir dir, \*\[options\[:dir_mode\].*/FileUtils.mkdir_p dir, *[options[:dir_mode] \&\& 0o755].compact/'
        installer.rb
      working-directory: ${{prefix}}/lib/rubygems

    # these are provided by ruby-lang.org
    # they turn up here since that is how gem handles deps
    # but ruby is in PATH and has these and that is the preference
    - run: for PROG in rake rbs rdbg typeprof; do if test -f $PROG; then rm $PROG; fi; done
      working-directory: ${{prefix}}/bin

    # ruby has a neat feature where it will look for a ruby shebang and
    # ignore everything from before that, so we can make scripts that execute
    # as POSIX shell and then re-exec themselves as ruby scripts
    # REF https://github.com/pkgxdev/pantry/issues/4010
    - run: |
        for tool in bundle bundler; do
          echo "$(cat $PROP gems/bundler-*/exe/$tool)" > bin/$tool
        done
        echo "$(cat $PROP bin/gem)" > bin/gem
      prop: |
        #!/bin/sh
        d="$(cd "$(dirname "$0")"/.. && pwd)"
        export RUBYLIB="$d/lib"
        if [ -z "$GEM_PATH" ]; then
          export GEM_PATH="$d"
        else
          export GEM_PATH="$d:$GEM_PATH"
        fi
        exec ruby "$0" "$@"
      working-directory: ${{prefix}}

    # no longer needed
    - rm -rf {{prefix}}/gems

    # the bundler code figures out the “gem path” for itself by checking for this directory structure
    # for some reason we are not installed in a gem-compatible way and
    # `GEM_PATH` is not used here (but it is later)
    # FIXME this stuff is messy, ideally we’d do much less stuff since it breaks easily with new releases
    - run: ln -s bin exe
      working-directory: ${{prefix}}

    # clean up empty, unused directory
    - rmdir {{prefix}}/plugins

test:
  env:
    vRUBY: ${{deps.ruby-lang.org.version.marketing}}.0
  script:
    # for debug
    - gem env

    - |
      gem install awesome_print --verbose
      ruby -e 'require "rubygems"' -e 'require "awesome_print"' -e'ap $LOAD_PATH'

    - |
      gem install hexapdf  --verbose

      if [ -w /usr/local/lib/ruby/ ]; then
        v="$(/usr/local/bin/hexapdf version | cut -d' ' -f2)"
        test -d /usr/local/lib/ruby/gems/$vRUBY/gems/hexapdf-$v
      else
        v="$(~/.local/bin/hexapdf version | cut -d' ' -f2)"
        test -d ~/.gem/ruby/$vRUBY/gems/hexapdf-$v
      fi

    # test for https://github.com/pkgxdev/pantry/issues/4010
    - run: |
        mv $FIXTURE Gemfile
        GEM_HOME=$HOME/.bundler bundle install --path vendor/bundle
      fixture: |
        source 'https://rubygems.org'
        gem 'warbler', platforms: :jruby

    # verifies that our bundler can be used as a gem
    - run: rm -rf {{deps.ruby-lang.org.prefix}}/lib/ruby/gems/*/bundler*
        rm -rf {{deps.ruby-lang.org.prefix}}/lib/ruby/gems/*/rubygems*
        GEM_HOME=$HOME/.bundler ruby $FIXTURE
      fixture:
        content: |
          require 'bundler/inline'
          gemfile do
            source 'https://rubygems.org'
            gem 'ruby-macho', '~> 3'
          end
        extname: rb

provides:
  - bin/bundle
  - bin/bundler
  - bin/gem
