@@ -1391,6 +1391,141 @@ def test_reinstalling_content_addressed_gem_is_idempotent
13911391 assert_equal 1 , Dir [ File . join ( @gemhome , "specifications" , "3.4" , "a-2*.gemspec" ) ] . size
13921392 end
13931393
1394+ def test_reinstalling_a_content_addressed_gem_with_a_widened_sha_removes_the_old_gem
1395+ install_home = @gemhome
1396+
1397+ # Exercise cleanup through a symlinked gem home when supported.
1398+ if symlink_supported?
1399+ install_home = File . join ( @tempdir , "symlinked_gemhome" )
1400+ FileUtils . ln_s ( @gemhome , install_home )
1401+ end
1402+
1403+ source_spec , a_gem = util_gem ( "a" , 2 ) do |spec |
1404+ spec . required_ruby_version = "~> 3.4.0"
1405+ spec . platform = "x86_64-linux"
1406+ end
1407+ FileUtils . rm_rf source_spec . gem_dir
1408+
1409+ digest = Digest ::SHA256 . file ( a_gem ) . hexdigest
1410+ address = digest [ 0 , 8 ]
1411+ dir = File . dirname ( a_gem )
1412+ filename = File . join ( dir , "a-2-#{ address } .gem" )
1413+ FileUtils . cp a_gem , filename
1414+ installer = Gem ::Installer . at filename , install_dir : install_home , force : true
1415+
1416+ # Make the short installation create a build info file
1417+ # To later ensure they are also removed
1418+ installer . build_args = [ "--example" ]
1419+ short_spec = installer . install
1420+ short_build_info_file = short_spec . build_info_file
1421+ assert_path_exist short_build_info_file
1422+
1423+ short_extension_dir = short_spec . extension_dir
1424+ FileUtils . mkdir_p short_extension_dir
1425+ assert_path_exist short_extension_dir
1426+
1427+ widened_address = digest [ 0 , 12 ]
1428+ widened_filename = File . join ( dir , "a-2-#{ widened_address } .gem" )
1429+ FileUtils . cp a_gem , widened_filename
1430+ installer2 = Gem ::Installer . at widened_filename , install_dir : install_home , force : true
1431+ spec2 = installer2 . install
1432+
1433+ assert_path_not_exist short_extension_dir
1434+ assert_equal "a-2-#{ widened_address } " , spec2 . full_name
1435+ assert_path_exist File . join ( @gemhome , "gems" , "a-2-#{ widened_address } " )
1436+ assert_path_exist File . join ( @gemhome , "specifications" , "3.4" , "a-2-#{ widened_address } .gemspec" )
1437+ assert_equal 1 , Dir [ File . join ( @gemhome , "gems" , "a-2*" ) ] . size
1438+ assert_equal 1 , Dir [ File . join ( @gemhome , "specifications" , "3.4" , "a-2*.gemspec" ) ] . size
1439+ assert_path_not_exist short_build_info_file
1440+ end
1441+
1442+ def test_reinstalling_with_a_widened_sha_removes_the_old_specification_from_the_record
1443+ source_spec , a_gem = util_gem ( "a" , 2 ) do |spec |
1444+ spec . required_ruby_version = "~> #{ Gem . ruby_abi } .0"
1445+ spec . platform = Gem ::Platform . local
1446+ end
1447+ FileUtils . rm_rf source_spec . gem_dir
1448+
1449+ digest = Digest ::SHA256 . file ( a_gem ) . hexdigest
1450+ address = digest [ 0 , 8 ]
1451+ dir = File . dirname ( a_gem )
1452+ filename = File . join ( dir , "a-2-#{ address } .gem" )
1453+ FileUtils . cp a_gem , filename
1454+ short_spec = Gem ::Installer . at ( filename , force : true ) . install
1455+
1456+ assert_includes Gem ::Specification . stubs . map ( &:full_name ) , short_spec . full_name
1457+
1458+ widened_address = digest [ 0 , 12 ]
1459+ widened_filename = File . join ( dir , "a-2-#{ widened_address } .gem" )
1460+ FileUtils . cp a_gem , widened_filename
1461+ widened_spec = Gem ::Installer . at ( widened_filename , force : true ) . install
1462+
1463+ refute_includes Gem ::Specification . stubs . map ( &:full_name ) , short_spec . full_name
1464+ assert_includes Gem ::Specification . stubs . map ( &:full_name ) , widened_spec . full_name
1465+ end
1466+
1467+ def test_installing_widened_gem_does_not_remove_short_gem_when_checksums_differ
1468+ source_spec , a_gem = util_gem ( "a" , 2 ) do |spec |
1469+ spec . required_ruby_version = "~> 3.4.0"
1470+ spec . platform = "x86_64-linux"
1471+ end
1472+ FileUtils . rm_rf source_spec . gem_dir
1473+
1474+ digest = Digest ::SHA256 . file ( a_gem ) . hexdigest
1475+ address = digest [ 0 , 8 ]
1476+ dir = File . dirname ( a_gem )
1477+ filename = File . join ( dir , "a-2-#{ address } .gem" )
1478+ FileUtils . cp a_gem , filename
1479+ installer = Gem ::Installer . at filename , install_dir : @gemhome , force : true
1480+ short_spec = installer . install
1481+ File . binwrite ( short_spec . cache_file , "different gem contents" )
1482+
1483+ widened_address = digest [ 0 , 12 ]
1484+ widened_filename = File . join ( dir , "a-2-#{ widened_address } .gem" )
1485+ FileUtils . cp a_gem , widened_filename
1486+ installer2 = Gem ::Installer . at widened_filename , install_dir : @gemhome , force : true
1487+ spec2 = installer2 . install
1488+
1489+ assert_path_exist File . join ( @gemhome , "gems" , "a-2-#{ address } " )
1490+ assert_path_exist short_spec . spec_file
1491+ assert_equal "a-2-#{ widened_address } " , spec2 . full_name
1492+ assert_path_exist File . join ( @gemhome , "gems" , "a-2-#{ widened_address } " )
1493+ assert_path_exist spec2 . spec_file
1494+ assert_equal 2 , Dir [ File . join ( @gemhome , "gems" , "a-2*" ) ] . size
1495+ assert_equal 2 , Dir [ File . join ( File . dirname ( spec2 . spec_file ) , "a-2*.gemspec" ) ] . size
1496+ assert_path_exist short_spec . cache_file
1497+ end
1498+
1499+ def test_failed_widened_install_does_not_remove_existing_short_gem
1500+ source_spec , a_gem = util_gem ( "a" , 2 ) do |spec |
1501+ spec . required_ruby_version = "~> 3.4.0"
1502+ spec . platform = "x86_64-linux"
1503+ end
1504+ FileUtils . rm_rf source_spec . gem_dir
1505+
1506+ digest = Digest ::SHA256 . file ( a_gem ) . hexdigest
1507+ address = digest [ 0 , 8 ]
1508+ dir = File . dirname ( a_gem )
1509+ filename = File . join ( dir , "a-2-#{ address } .gem" )
1510+ FileUtils . cp a_gem , filename
1511+ short_spec = Gem ::Installer . at ( filename , install_dir : @gemhome , force : true ) . install
1512+
1513+ widened_address = digest [ 0 , 12 ]
1514+ widened_filename = File . join ( dir , "a-2-#{ widened_address } .gem" )
1515+ FileUtils . cp a_gem , widened_filename
1516+ widened_installer = Gem ::Installer . at widened_filename , install_dir : @gemhome , force : true
1517+
1518+ Gem . pre_install { false }
1519+
1520+ assert_raise Gem ::InstallError do
1521+ widened_installer . install
1522+ end
1523+
1524+ assert_path_exist short_spec . full_gem_path
1525+ assert_path_exist short_spec . spec_file
1526+ assert_path_exist short_spec . cache_file
1527+ end
1528+
13941529 def test_install_assigns_content_address_from_filename_with_full_sha
13951530 _ , a_gem = util_gem ( "a" , 2 ) do |spec |
13961531 spec . required_ruby_version = "~> 3.4.0"
0 commit comments