Skip to content

Commit

Permalink
Add el9toel10 actor to handle symlink -> directory with ruby IRB.
Browse files Browse the repository at this point in the history
The `/usr/share/ruby/irb` path is a symlink in RHEL 9,
but a regular directory in RHEL 10.
This puts us back in line with RHEL 8 and Fedora in terms of the
path's file type regarding the rubygem-irb package.

Since this was not handled on RPM level, handle it as actor again.
This was copied and adjusted from same-named el8->el9 actor.

We do not care about the validity or target of the symlink, we just
remove it to allow DNF create the correct directory on upgrade.

Without this workaround, the upgrade will fail in transaction test with
reports of file conflicts on the directory path.

Users should not expect to ever retain anything in this directory.
  • Loading branch information
jackorp authored and pirat89 committed Nov 13, 2024
1 parent abcf7a5 commit 866a4b9
Show file tree
Hide file tree
Showing 3 changed files with 64 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
from leapp.actors import Actor
from leapp.models import DNFWorkaround
from leapp.tags import FactsPhaseTag, IPUWorkflowTag


class RegisterRubyIRBAdjustment(Actor):
"""
Register a workaround to allow rubygem-irb's symlink -> directory conversion.
The /usr/share/ruby/irb has been moved from a symlink to a directory
in RHEL 10 and this conversion was not handled on the RPM level.
This leads to DNF reporting package file conflicts when a major upgrade
is attempted and rubygem-irb is installed.
Register "handlerubyirbsymlink" script that removes the symlink prior
to DNF upgrade and allows it to create the expected directory in place of
the removed symlink.
"""

name = 'register_ruby_irb_adjustment'
consumes = ()
produces = (DNFWorkaround,)
tags = (IPUWorkflowTag, FactsPhaseTag)

def process(self):
self.produce(
DNFWorkaround(
display_name='IRB directory fix',
script_path=self.get_tool_path('handlerubyirbsymlink'),
)
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
import os.path

from leapp.models import DNFWorkaround


def test_register_ruby_irb_adjustments(current_actor_context):
current_actor_context.run()
assert len(current_actor_context.consume(DNFWorkaround)) == 1
assert current_actor_context.consume(DNFWorkaround)[0].display_name == 'IRB directory fix'
assert os.path.basename(current_actor_context.consume(DNFWorkaround)[0].script_path) == 'handlerubyirbsymlink'
assert os.path.exists(current_actor_context.consume(DNFWorkaround)[0].script_path)
22 changes: 22 additions & 0 deletions repos/system_upgrade/el9toel10/tools/handlerubyirbsymlink
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
#!/usr/bin/bash -e

# just in case of hidden files.. not sure why would someone do that, it's more
# like forgotten cache file possibility, but rather do that..
shopt -s dotglob

handle_dir() {
# Check that $1 is a symlink then unlink it so that RPM
# can freely create the directory.
if [ ! -L "$1" ]; then
return
fi

# There is no configuration or anything that the user should ever customize
# and expect to retain.
unlink "$1"

return 0
}


handle_dir /usr/share/ruby/irb

0 comments on commit 866a4b9

Please sign in to comment.