1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
  | 
require "rubocop"
require "rubocop/rspec/support"
require_relative "../../extend/string"
require_relative "../../rubocops/legacy_patches_cop"
describe RuboCop::Cop::FormulaAudit::LegacyPatches do
  subject(:cop) { described_class.new }
  context "When auditing legacy patches" do
    it "When there is no legacy patch" do
      source = <<-EOS.undent
        class Foo < Formula
          url 'http://example.com/foo-1.0.tgz'
        end
      EOS
      inspect_source(cop, source)
      expect(cop.offenses).to eq([])
    end
    it "Formula with `def patches`" do
      source = <<-EOS.undent
        class Foo < Formula
          homepage "ftp://example.com/foo"
          url "http://example.com/foo-1.0.tgz"
          def patches
            DATA
          end
        end
      EOS
      expected_offenses = [{  message: "Use the patch DSL instead of defining a 'patches' method",
                              severity: :convention,
                              line: 4,
                              column: 2,
                              source: source }]
      inspect_source(cop, source)
      expected_offenses.zip(cop.offenses).each do |expected, actual|
        expect_offense(expected, actual)
      end
    end
    it "Patch URLs" do
      patch_urls = [
        "https://raw.github.com/mogaal/sendemail",
        "https://mirrors.ustc.edu.cn/macports/trunk/",
        "http://trac.macports.org/export/102865/trunk/dports/mail/uudeview/files/inews.c.patch",
        "http://bugs.debian.org/cgi-bin/bugreport.cgi?msg=5;filename=patch-libunac1.txt;att=1;bug=623340",
      ]
      patch_urls.each do |patch_url|
        source = <<-EOS.undent
          class Foo < Formula
            homepage "ftp://example.com/foo"
            url "http://example.com/foo-1.0.tgz"
            def patches
              "#{patch_url}"
            end
          end
        EOS
        inspect_source(cop, source)
        if patch_url =~ %r{/raw\.github\.com/}
          expected_offenses = [{  message: "GitHub/Gist patches should specify a revision:\n#{patch_url}",
                                  severity: :convention,
                                  line: 5,
                                  column: 12,
                                  source: source }]
        elsif patch_url =~ %r{macports/trunk}
          expected_offenses = [{  message:  "MacPorts patches should specify a revision instead of trunk:\n#{patch_url}",
                                  severity: :convention,
                                  line: 5,
                                  column: 33,
                                  source: source }]
        elsif patch_url =~ %r{^http://trac\.macports\.org}
          expected_offenses = [{  message:  "Patches from MacPorts Trac should be https://, not http:\n#{patch_url}",
                                  severity: :convention,
                                  line: 5,
                                  column: 5,
                                  source: source }]
        elsif patch_url =~ %r{^http://bugs\.debian\.org}
          expected_offenses = [{  message:  "Patches from Debian should be https://, not http:\n#{patch_url}",
                                  severity: :convention,
                                  line: 5,
                                  column: 5,
                                  source: source }]
        end
        expected_offenses.zip([cop.offenses.last]).each do |expected, actual|
          expect_offense(expected, actual)
        end
      end
    end
    it "Formula with nested `def patches`" do
      source = <<-EOS.undent
        class Foo < Formula
          homepage "ftp://example.com/foo"
          url "http://example.com/foo-1.0.tgz"
          def patches
            files = %w[patch-domain_resolver.c patch-colormask.c patch-trafshow.c patch-trafshow.1 patch-configure]
            {
              :p0 =>
              files.collect{|p| "http://trac.macports.org/export/68507/trunk/dports/net/trafshow/files/\#{p}"}
            }
          end
        end
      EOS
      expected_offenses = [{  message: "Use the patch DSL instead of defining a 'patches' method",
                              severity: :convention,
                              line: 4,
                              column: 2,
                              source: source },
                           {  message: "Patches from MacPorts Trac should be https://, not http:\n"\
                                       "http://trac.macports.org/export/68507/trunk/dports/net/trafshow/files/",
                              severity: :convention,
                              line: 8,
                              column: 26,
                              source: source }]
      inspect_source(cop, source)
      expected_offenses.zip(cop.offenses).each do |expected, actual|
        expect_offense(expected, actual)
      end
    end
  end
end
  |