|
220 | 220 | end |
221 | 221 | end |
222 | 222 |
|
223 | | - it "returns sibling full and non-full names" do |
| 223 | + let(:f_versioned_full) do |
| 224 | + formula "foo@2.0-full" do |
| 225 | + url "foo-full-2.0" |
| 226 | + end |
| 227 | + end |
| 228 | + |
| 229 | + before do |
| 230 | + [f, f_full, f_versioned].each do |formula| |
| 231 | + allow(formula).to receive(:tap).and_return(nil) |
| 232 | + FileUtils.touch formula.path |
| 233 | + end |
| 234 | + end |
| 235 | + |
| 236 | + it "returns only existing sibling full and non-full names" do |
224 | 237 | expect(f.full_formulae_names).to eq ["foo-full"] |
225 | 238 | expect(f_full.full_formulae_names).to eq ["foo"] |
226 | | - expect(f_versioned.full_formulae_names).to eq ["foo@2.0-full"] |
| 239 | + expect(f_versioned.full_formulae_names).to eq [] |
| 240 | + |
| 241 | + allow(f_versioned_full).to receive(:tap).and_return(nil) |
| 242 | + FileUtils.touch f_versioned_full.path |
| 243 | + f_versioned_with_full = formula "foo@2.0" do |
| 244 | + url "foo-2.0" |
| 245 | + end |
| 246 | + allow(f_versioned_with_full).to receive(:tap).and_return(nil) |
| 247 | + FileUtils.touch f_versioned_with_full.path |
| 248 | + |
| 249 | + expect(f_versioned_with_full.full_formulae_names).to eq ["foo@2.0-full"] |
227 | 250 | end |
228 | 251 | end |
229 | 252 |
|
|
340 | 363 | end |
341 | 364 | end |
342 | 365 |
|
| 366 | + describe "#link_overwrite?" do |
| 367 | + let(:versioned_formula) do |
| 368 | + formula "foo@22" do |
| 369 | + url "foo-22.0" |
| 370 | + end |
| 371 | + end |
| 372 | + |
| 373 | + let(:related_formula) do |
| 374 | + formula "foo" do |
| 375 | + url "foo-1.0" |
| 376 | + end |
| 377 | + end |
| 378 | + |
| 379 | + let(:conflict_file) { HOMEBREW_PREFIX/"lib/formula_spec/node_modules/npm/LICENSE" } |
| 380 | + |
| 381 | + before do |
| 382 | + allow(versioned_formula).to receive(:link_overwrite_formulae).and_return([related_formula]) |
| 383 | + conflict_file.dirname.mkpath |
| 384 | + FileUtils.touch conflict_file |
| 385 | + end |
| 386 | + |
| 387 | + after do |
| 388 | + FileUtils.rm_f conflict_file |
| 389 | + conflict_file.dirname.rmdir_if_possible |
| 390 | + conflict_file.dirname.parent.rmdir_if_possible |
| 391 | + conflict_file.dirname.parent.parent.rmdir_if_possible |
| 392 | + end |
| 393 | + |
| 394 | + it "does not allow untracked conflicts for related formula families" do |
| 395 | + expect(versioned_formula.link_overwrite?(conflict_file)).to be false |
| 396 | + end |
| 397 | + |
| 398 | + it "returns false when the conflict is not Homebrew-managed" do |
| 399 | + allow(versioned_formula).to receive(:link_overwrite_keg_name).and_return(nil) |
| 400 | + |
| 401 | + expect(versioned_formula.link_overwrite?(HOMEBREW_PREFIX/"bin/foo")).to be false |
| 402 | + end |
| 403 | + |
| 404 | + it "returns false for ambiguous keg names" do |
| 405 | + allow(versioned_formula).to receive(:link_overwrite_keg_name).and_return("foo") |
| 406 | + ambiguity_loaders = [ |
| 407 | + instance_double(Formulary::FormulaLoader, tap: instance_double(Tap, to_s: "homebrew/core")), |
| 408 | + instance_double(Formulary::FormulaLoader, tap: instance_double(Tap, to_s: "homebrew/other")), |
| 409 | + ] |
| 410 | + allow(Formulary).to receive(:factory).with("foo") |
| 411 | + .and_raise(TapFormulaAmbiguityError.new("foo", ambiguity_loaders)) |
| 412 | + |
| 413 | + expect(versioned_formula.link_overwrite?(HOMEBREW_PREFIX/"bin/foo")).to be false |
| 414 | + end |
| 415 | + |
| 416 | + it "returns false for unrelated keg names" do |
| 417 | + unrelated_formula = formula "bar" do |
| 418 | + url "bar-1.0" |
| 419 | + end |
| 420 | + allow(versioned_formula).to receive(:link_overwrite_keg_name).and_return("bar") |
| 421 | + allow(Formulary).to receive(:factory).with("bar").and_return(unrelated_formula) |
| 422 | + allow(unrelated_formula).to receive(:possible_names).and_return(["baz"]) |
| 423 | + |
| 424 | + expect(versioned_formula.link_overwrite?(HOMEBREW_PREFIX/"bin/bar")).to be false |
| 425 | + end |
| 426 | + |
| 427 | + it "allows explicit link_overwrite paths" do |
| 428 | + formula_with_explicit_overwrite = formula "baz" do |
| 429 | + url "baz-1.0" |
| 430 | + link_overwrite "bin/baz" |
| 431 | + end |
| 432 | + allow(formula_with_explicit_overwrite).to receive(:link_overwrite_keg_name).and_return("baz") |
| 433 | + allow(Formulary).to receive(:factory).with("baz").and_return(formula_with_explicit_overwrite) |
| 434 | + |
| 435 | + expect(formula_with_explicit_overwrite.link_overwrite?(HOMEBREW_PREFIX/"bin/baz")).to be true |
| 436 | + end |
| 437 | + |
| 438 | + it "allows existing related keg names through implied overwrites" do |
| 439 | + allow(versioned_formula).to receive(:link_overwrite_keg_name).and_return("foo") |
| 440 | + allow(Formulary).to receive(:factory).with("foo").and_return(related_formula) |
| 441 | + |
| 442 | + expect(versioned_formula.link_overwrite?(HOMEBREW_PREFIX/"bin/foo")).to be true |
| 443 | + end |
| 444 | + |
| 445 | + it "allows deleted related keg names through implied overwrites" do |
| 446 | + allow(versioned_formula).to receive(:link_overwrite_keg_name).and_return("foo-old") |
| 447 | + allow(Formulary).to receive(:factory).with("foo-old").and_raise(FormulaUnavailableError.new("foo-old")) |
| 448 | + allow(related_formula).to receive_messages(oldnames: ["foo-old"], aliases: []) |
| 449 | + |
| 450 | + expect(versioned_formula.link_overwrite?(HOMEBREW_PREFIX/"bin/foo")).to be true |
| 451 | + end |
| 452 | + |
| 453 | + it "returns false for missing conflicts without explicit or implied overwrites" do |
| 454 | + formula_without_overwrites = formula "qux" do |
| 455 | + url "qux-1.0" |
| 456 | + end |
| 457 | + allow(formula_without_overwrites).to receive_messages(link_overwrite_keg_name: :missing, |
| 458 | + link_overwrite_formulae: []) |
| 459 | + |
| 460 | + expect(formula_without_overwrites.link_overwrite?(HOMEBREW_PREFIX/"bin/qux")).to be false |
| 461 | + end |
| 462 | + end |
| 463 | + |
| 464 | + describe "#implied_link_overwrite?" do |
| 465 | + let(:versioned_formula) do |
| 466 | + formula "foo@22" do |
| 467 | + url "foo-22.0" |
| 468 | + end |
| 469 | + end |
| 470 | + |
| 471 | + let(:related_formula) do |
| 472 | + formula "foo" do |
| 473 | + url "foo-1.0" |
| 474 | + end |
| 475 | + end |
| 476 | + |
| 477 | + before do |
| 478 | + allow(related_formula).to receive_messages(oldnames: ["foo-old"], aliases: ["foo-alias"]) |
| 479 | + end |
| 480 | + |
| 481 | + it "does not allow missing conflicts without actual related formulae" do |
| 482 | + expect(versioned_formula.implied_link_overwrite?(:missing, [])).to be false |
| 483 | + end |
| 484 | + |
| 485 | + it "does not allow non-Homebrew conflicts" do |
| 486 | + expect(versioned_formula.implied_link_overwrite?(nil, [related_formula])).to be false |
| 487 | + end |
| 488 | + |
| 489 | + it "does not allow missing conflicts even when related formulae exist" do |
| 490 | + expect(versioned_formula.implied_link_overwrite?(:missing, [related_formula])).to be false |
| 491 | + end |
| 492 | + |
| 493 | + it "allows related keg names via oldnames" do |
| 494 | + expect(versioned_formula.implied_link_overwrite?("foo-old", [related_formula])).to be true |
| 495 | + end |
| 496 | + |
| 497 | + it "allows related keg names via aliases" do |
| 498 | + expect(versioned_formula.implied_link_overwrite?("foo-alias", [related_formula])).to be true |
| 499 | + end |
| 500 | + |
| 501 | + it "does not allow unrelated keg names" do |
| 502 | + expect(versioned_formula.implied_link_overwrite?("bar", [related_formula])).to be false |
| 503 | + end |
| 504 | + end |
| 505 | + |
343 | 506 | example "installed alias with core" do |
344 | 507 | f = formula do |
345 | 508 | url "foo-1.0" |
|
0 commit comments