@@ -1390,6 +1390,125 @@ def test_reinstalling_content_addressed_gem_is_idempotent
13901390 assert_equal 1 , Dir [ File . join ( @gemhome , "specifications" , "a-2*.gemspec" ) ] . size
13911391 end
13921392
1393+ def test_reinstalling_a_content_addressed_gem_with_a_widened_sha_removes_the_old_gem
1394+ source_spec , a_gem = util_gem ( "a" , 2 ) do |spec |
1395+ spec . required_ruby_version = "~> 3.4.0"
1396+ spec . platform = "x86_64-linux"
1397+ end
1398+ FileUtils . rm_rf source_spec . gem_dir
1399+
1400+ digest = Digest ::SHA256 . file ( a_gem ) . hexdigest
1401+ address = digest [ 0 , 8 ]
1402+ dir = File . dirname ( a_gem )
1403+ filename = File . join ( dir , "a-2-#{ address } .gem" )
1404+ FileUtils . cp a_gem , filename
1405+ installer = Gem ::Installer . at filename , install_dir : @gemhome , force : true
1406+ short_spec = installer . install
1407+ short_extension_dir = short_spec . extension_dir
1408+ FileUtils . mkdir_p short_extension_dir
1409+ assert_path_exist short_extension_dir
1410+
1411+ widened_address = digest [ 0 , 12 ]
1412+ widened_filename = File . join ( dir , "a-2-#{ widened_address } .gem" )
1413+ FileUtils . cp a_gem , widened_filename
1414+ installer2 = Gem ::Installer . at widened_filename , install_dir : @gemhome , force : true
1415+ spec2 = installer2 . install
1416+
1417+ assert_path_not_exist short_extension_dir
1418+ assert_equal "a-2-#{ widened_address } " , spec2 . full_name
1419+ assert_path_exist File . join ( @gemhome , "gems" , "a-2-#{ widened_address } " )
1420+ assert_path_exist File . join ( @gemhome , "specifications" , "a-2-#{ widened_address } .gemspec" )
1421+ assert_equal 1 , Dir [ File . join ( @gemhome , "gems" , "a-2*" ) ] . size
1422+ assert_equal 1 , Dir [ File . join ( @gemhome , "specifications" , "a-2*.gemspec" ) ] . size
1423+ end
1424+
1425+ def test_reinstalling_with_a_widened_sha_removes_the_old_specification_from_the_record
1426+ source_spec , a_gem = util_gem ( "a" , 2 ) do |spec |
1427+ spec . required_ruby_version = "~> 3.4.0"
1428+ spec . platform = "x86_64-linux"
1429+ end
1430+ FileUtils . rm_rf source_spec . gem_dir
1431+
1432+ digest = Digest ::SHA256 . file ( a_gem ) . hexdigest
1433+ address = digest [ 0 , 8 ]
1434+ dir = File . dirname ( a_gem )
1435+ filename = File . join ( dir , "a-2-#{ address } .gem" )
1436+ FileUtils . cp a_gem , filename
1437+ short_spec = Gem ::Installer . at ( filename , force : true ) . install
1438+
1439+ assert_includes Gem ::Specification . stubs . map ( &:full_name ) , short_spec . full_name
1440+
1441+ widened_address = digest [ 0 , 12 ]
1442+ widened_filename = File . join ( dir , "a-2-#{ widened_address } .gem" )
1443+ FileUtils . cp a_gem , widened_filename
1444+ widened_spec = Gem ::Installer . at ( widened_filename , force : true ) . install
1445+
1446+ refute_includes Gem ::Specification . stubs . map ( &:full_name ) , short_spec . full_name
1447+ assert_includes Gem ::Specification . stubs . map ( &:full_name ) , widened_spec . full_name
1448+ end
1449+
1450+ def test_installing_widened_gem_does_not_remove_short_gem_when_checksums_differ
1451+ source_spec , a_gem = util_gem ( "a" , 2 ) do |spec |
1452+ spec . required_ruby_version = "~> 3.4.0"
1453+ spec . platform = "x86_64-linux"
1454+ end
1455+ FileUtils . rm_rf source_spec . gem_dir
1456+
1457+ digest = Digest ::SHA256 . file ( a_gem ) . hexdigest
1458+ address = digest [ 0 , 8 ]
1459+ dir = File . dirname ( a_gem )
1460+ filename = File . join ( dir , "a-2-#{ address } .gem" )
1461+ FileUtils . cp a_gem , filename
1462+ installer = Gem ::Installer . at filename , install_dir : @gemhome , force : true
1463+ short_spec = installer . install
1464+ File . binwrite ( short_spec . cache_file , "different gem contents" )
1465+
1466+ widened_address = digest [ 0 , 12 ]
1467+ widened_filename = File . join ( dir , "a-2-#{ widened_address } .gem" )
1468+ FileUtils . cp a_gem , widened_filename
1469+ installer2 = Gem ::Installer . at widened_filename , install_dir : @gemhome , force : true
1470+ spec2 = installer2 . install
1471+
1472+ assert_path_exist File . join ( @gemhome , "gems" , "a-2-#{ address } " )
1473+ assert_path_exist File . join ( @gemhome , "specifications" , "a-2-#{ address } .gemspec" )
1474+ assert_equal "a-2-#{ widened_address } " , spec2 . full_name
1475+ assert_path_exist File . join ( @gemhome , "gems" , "a-2-#{ widened_address } " )
1476+ assert_path_exist File . join ( @gemhome , "specifications" , "a-2-#{ widened_address } .gemspec" )
1477+ assert_equal 2 , Dir [ File . join ( @gemhome , "gems" , "a-2*" ) ] . size
1478+ assert_equal 2 , Dir [ File . join ( @gemhome , "specifications" , "a-2*.gemspec" ) ] . size
1479+ assert_path_exist short_spec . cache_file
1480+ end
1481+
1482+ def test_failed_widened_install_does_not_remove_existing_short_gem
1483+ source_spec , a_gem = util_gem ( "a" , 2 ) do |spec |
1484+ spec . required_ruby_version = "~> 3.4.0"
1485+ spec . platform = "x86_64-linux"
1486+ end
1487+ FileUtils . rm_rf source_spec . gem_dir
1488+
1489+ digest = Digest ::SHA256 . file ( a_gem ) . hexdigest
1490+ address = digest [ 0 , 8 ]
1491+ dir = File . dirname ( a_gem )
1492+ filename = File . join ( dir , "a-2-#{ address } .gem" )
1493+ FileUtils . cp a_gem , filename
1494+ short_spec = Gem ::Installer . at ( filename , install_dir : @gemhome , force : true ) . install
1495+
1496+ widened_address = digest [ 0 , 12 ]
1497+ widened_filename = File . join ( dir , "a-2-#{ widened_address } .gem" )
1498+ FileUtils . cp a_gem , widened_filename
1499+ widened_installer = Gem ::Installer . at widened_filename , install_dir : @gemhome , force : true
1500+
1501+ Gem . pre_install { false }
1502+
1503+ assert_raise Gem ::InstallError do
1504+ widened_installer . install
1505+ end
1506+
1507+ assert_path_exist short_spec . full_gem_path
1508+ assert_path_exist short_spec . spec_file
1509+ assert_path_exist short_spec . cache_file
1510+ end
1511+
13931512 def test_install_assigns_content_address_from_filename_with_full_sha
13941513 _ , a_gem = util_gem ( "a" , 2 ) do |spec |
13951514 spec . required_ruby_version = "~> 3.4.0"
0 commit comments