reapack-index 1.0beta2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +3 -0
- data/.travis.yml +8 -0
- data/Gemfile +3 -0
- data/README.md +167 -0
- data/Rakefile +7 -0
- data/bin/reapack-index +8 -0
- data/lib/reapack/index.rb +351 -0
- data/lib/reapack/index/cli.rb +437 -0
- data/lib/reapack/index/gem_version.rb +5 -0
- data/lib/reapack/index/metadata.rb +185 -0
- data/lib/reapack/index/named_node.rb +68 -0
- data/lib/reapack/index/package.rb +65 -0
- data/lib/reapack/index/parsers.rb +35 -0
- data/lib/reapack/index/version.rb +178 -0
- data/reapack-index.gemspec +33 -0
- data/setup/.gitignore +1 -0
- data/setup/reapack-index.nsi +148 -0
- data/test/data/index.xml +11 -0
- data/test/data/noindex.lua +1 -0
- data/test/helper.rb +25 -0
- data/test/test_changelog.rb +76 -0
- data/test/test_cli.rb +846 -0
- data/test/test_index.rb +817 -0
- data/test/test_metadata.rb +403 -0
- data/test/test_named_node.rb +100 -0
- data/test/test_package.rb +95 -0
- data/test/test_parsers.rb +35 -0
- data/test/test_version.rb +215 -0
- metadata +238 -0
@@ -0,0 +1,68 @@
|
|
1
|
+
class ReaPack::Index
|
2
|
+
class NamedNode
|
3
|
+
NAME_ATTR = 'name'.freeze
|
4
|
+
|
5
|
+
def self.tag;
|
6
|
+
raise "@tag is unset" unless @tag
|
7
|
+
@tag
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.find_in(parent, name)
|
11
|
+
node = parent.element_children.find {|node|
|
12
|
+
node.name == tag && node[NAME_ATTR] == name
|
13
|
+
}
|
14
|
+
|
15
|
+
self.new node if node
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.find_all(parent)
|
19
|
+
parent.element_children
|
20
|
+
.select {|node| node.name == tag }
|
21
|
+
.map {|node| self.new node }
|
22
|
+
end
|
23
|
+
|
24
|
+
def self.get(name, parent, create)
|
25
|
+
return unless parent
|
26
|
+
|
27
|
+
node = self.find_in parent, name
|
28
|
+
|
29
|
+
if create
|
30
|
+
node ||= self.new name, parent
|
31
|
+
end
|
32
|
+
|
33
|
+
node
|
34
|
+
end
|
35
|
+
|
36
|
+
def initialize(node, parent = nil)
|
37
|
+
return @node = node if parent.nil?
|
38
|
+
|
39
|
+
@is_new = true
|
40
|
+
@dirty = true
|
41
|
+
|
42
|
+
@node = Nokogiri::XML::Node.new self.class.tag, parent.document
|
43
|
+
@node[NAME_ATTR] = node
|
44
|
+
@node.parent = parent
|
45
|
+
end
|
46
|
+
|
47
|
+
attr_reader :node
|
48
|
+
|
49
|
+
def is_new?; !!@is_new; end
|
50
|
+
def modified?; !!@dirty; end
|
51
|
+
|
52
|
+
def name
|
53
|
+
@node[NAME_ATTR]
|
54
|
+
end
|
55
|
+
|
56
|
+
def empty?
|
57
|
+
@node.element_children.empty?
|
58
|
+
end
|
59
|
+
|
60
|
+
def remove
|
61
|
+
@node.remove
|
62
|
+
end
|
63
|
+
|
64
|
+
def children(tag)
|
65
|
+
@node.element_children.select {|node| node.name == tag }
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
class ReaPack::Index
|
2
|
+
class Category < NamedNode
|
3
|
+
@tag = 'category'.freeze
|
4
|
+
end
|
5
|
+
|
6
|
+
class Package < NamedNode
|
7
|
+
@tag = 'reapack'.freeze
|
8
|
+
|
9
|
+
TYPE = 'type'.freeze
|
10
|
+
|
11
|
+
def initialize(node, parent = nil)
|
12
|
+
super
|
13
|
+
|
14
|
+
@versions = {}
|
15
|
+
|
16
|
+
read_versions
|
17
|
+
end
|
18
|
+
|
19
|
+
def modified?
|
20
|
+
super || @versions.values.any? {|ver| ver.modified? }
|
21
|
+
end
|
22
|
+
|
23
|
+
def type
|
24
|
+
@node[TYPE].to_s
|
25
|
+
end
|
26
|
+
|
27
|
+
def type=(new_type)
|
28
|
+
new_type ||= String.new
|
29
|
+
|
30
|
+
return if type == new_type
|
31
|
+
|
32
|
+
@node[TYPE] = new_type
|
33
|
+
@dirty = true
|
34
|
+
end
|
35
|
+
|
36
|
+
def has_version?(name)
|
37
|
+
@versions.has_key? name
|
38
|
+
end
|
39
|
+
|
40
|
+
def versions
|
41
|
+
@versions.values
|
42
|
+
end
|
43
|
+
|
44
|
+
def version(name)
|
45
|
+
if has_version? name
|
46
|
+
ver = @versions[name]
|
47
|
+
else
|
48
|
+
ver = @versions[name] = Version.new name, @node
|
49
|
+
end
|
50
|
+
|
51
|
+
if block_given?
|
52
|
+
yield ver
|
53
|
+
else
|
54
|
+
ver
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
private
|
59
|
+
def read_versions
|
60
|
+
Version.find_all(@node).each {|ver|
|
61
|
+
@versions[ver.name] = ver
|
62
|
+
}
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
class WordpressChangelog < MetaHeader::Parser
|
2
|
+
CHANGELOG = /
|
3
|
+
Changelog\s*:\n
|
4
|
+
(.+?)\n\s*
|
5
|
+
((?:--)?\]\]|\*\/)
|
6
|
+
/xm.freeze
|
7
|
+
|
8
|
+
VERSION = /\A[\s\*]+v([\d\.]+)(?:\s+(.+))?\Z/.freeze
|
9
|
+
|
10
|
+
def parse(input)
|
11
|
+
input.encode! Encoding::UTF_8, invalid: :replace
|
12
|
+
|
13
|
+
ver, changes = header[:version], header[:changelog]
|
14
|
+
return if ver.nil? || changes || CHANGELOG.match(input).nil?
|
15
|
+
|
16
|
+
$1.lines {|line| read line.lstrip }
|
17
|
+
end
|
18
|
+
|
19
|
+
def read(line)
|
20
|
+
if line =~ VERSION
|
21
|
+
@current = $1 == header[:version]
|
22
|
+
line = $2.to_s
|
23
|
+
end
|
24
|
+
|
25
|
+
return unless @current
|
26
|
+
|
27
|
+
if header[:changelog]
|
28
|
+
header[:changelog] += "\n"
|
29
|
+
else
|
30
|
+
header[:changelog] = String.new
|
31
|
+
end
|
32
|
+
|
33
|
+
header[:changelog] += line.chomp
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,178 @@
|
|
1
|
+
class ReaPack::Index
|
2
|
+
class Version < NamedNode
|
3
|
+
@tag = 'version'.freeze
|
4
|
+
|
5
|
+
AUTHOR = 'author'.freeze
|
6
|
+
TIME = 'time'.freeze
|
7
|
+
|
8
|
+
def initialize(node, parent = nil)
|
9
|
+
super
|
10
|
+
|
11
|
+
@changelog = Changelog.new @node
|
12
|
+
end
|
13
|
+
|
14
|
+
def modified?
|
15
|
+
super || @changelog.modified?
|
16
|
+
end
|
17
|
+
|
18
|
+
def changelog=(new_text)
|
19
|
+
@changelog.text = new_text
|
20
|
+
end
|
21
|
+
|
22
|
+
def author
|
23
|
+
@node[AUTHOR].to_s
|
24
|
+
end
|
25
|
+
|
26
|
+
def author=(new_author)
|
27
|
+
new_author ||= String.new
|
28
|
+
|
29
|
+
return if author == new_author
|
30
|
+
|
31
|
+
if new_author.empty?
|
32
|
+
@node.remove_attribute AUTHOR
|
33
|
+
else
|
34
|
+
@node[AUTHOR] = new_author
|
35
|
+
end
|
36
|
+
|
37
|
+
@dirty = true
|
38
|
+
end
|
39
|
+
|
40
|
+
def time
|
41
|
+
Time.parse @node[TIME] if @node.has_attribute? TIME
|
42
|
+
end
|
43
|
+
|
44
|
+
def time=(new_time)
|
45
|
+
return if new_time == time
|
46
|
+
|
47
|
+
if new_time.nil?
|
48
|
+
@node.remove_attribute TIME
|
49
|
+
else
|
50
|
+
@node[TIME] = new_time.utc.iso8601
|
51
|
+
end
|
52
|
+
|
53
|
+
@dirty = true
|
54
|
+
end
|
55
|
+
|
56
|
+
def replace_sources
|
57
|
+
was_dirty = @dirty
|
58
|
+
|
59
|
+
old_sources = hash_sources children(Source::TAG)
|
60
|
+
.each {|node| node.remove }
|
61
|
+
|
62
|
+
yield
|
63
|
+
|
64
|
+
new_sources = hash_sources children(Source::TAG)
|
65
|
+
@dirty = was_dirty || old_sources != new_sources
|
66
|
+
|
67
|
+
if new_sources.empty?
|
68
|
+
raise Error, 'no sources found. @provides tag missing?'
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
def add_source(src, file = nil, url = nil)
|
73
|
+
src = Source.new src, file, url unless src.is_a? Source
|
74
|
+
src.make_node @node
|
75
|
+
|
76
|
+
@dirty = true
|
77
|
+
end
|
78
|
+
|
79
|
+
private
|
80
|
+
def hash_sources(nodes)
|
81
|
+
nodes.map {|src|
|
82
|
+
[src[Source::PLATFORM], src[Source::FILE], src.content]
|
83
|
+
}
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
class Source
|
88
|
+
TAG = 'source'.freeze
|
89
|
+
PLATFORM = 'platform'.freeze
|
90
|
+
FILE = 'file'.freeze
|
91
|
+
|
92
|
+
PLATFORMS = [
|
93
|
+
:all,
|
94
|
+
:windows, :win32, :win64,
|
95
|
+
:darwin, :darwin32, :darwin64,
|
96
|
+
].freeze
|
97
|
+
|
98
|
+
def self.validate_platform(platform)
|
99
|
+
return unless platform # nil platform will be replaced by the default
|
100
|
+
|
101
|
+
unless PLATFORMS.include? platform.to_sym
|
102
|
+
raise Error, 'invalid platform %s' % platform
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
def initialize(platform = nil, file = nil, url = nil)
|
107
|
+
self.platform = platform
|
108
|
+
self.file = file
|
109
|
+
self.url = url
|
110
|
+
end
|
111
|
+
|
112
|
+
def platform=(new_platform)
|
113
|
+
new_platform = :all if new_platform.nil?
|
114
|
+
|
115
|
+
self.class.validate_platform new_platform
|
116
|
+
|
117
|
+
@platform = new_platform
|
118
|
+
end
|
119
|
+
|
120
|
+
attr_reader :platform
|
121
|
+
attr_accessor :file, :url
|
122
|
+
|
123
|
+
def make_node(parent)
|
124
|
+
@node = Nokogiri::XML::Node.new TAG, parent.document
|
125
|
+
@node.parent = parent
|
126
|
+
@node[PLATFORM] = @platform
|
127
|
+
@node[FILE] = @file if @file
|
128
|
+
@node.content = URI.escape @url
|
129
|
+
end
|
130
|
+
end
|
131
|
+
|
132
|
+
class Changelog
|
133
|
+
TAG = 'changelog'.freeze
|
134
|
+
|
135
|
+
def initialize(parent)
|
136
|
+
@parent = parent
|
137
|
+
|
138
|
+
@node = parent.element_children.find {|node| node.name == TAG }
|
139
|
+
|
140
|
+
if @node
|
141
|
+
cdata = @node.children.first
|
142
|
+
@text = cdata.content
|
143
|
+
else
|
144
|
+
@text = String.new
|
145
|
+
end
|
146
|
+
end
|
147
|
+
|
148
|
+
def modified?
|
149
|
+
!!@dirty
|
150
|
+
end
|
151
|
+
|
152
|
+
attr_reader :text
|
153
|
+
|
154
|
+
def text=(new_text)
|
155
|
+
new_text ||= String.new
|
156
|
+
|
157
|
+
if text == new_text
|
158
|
+
return
|
159
|
+
else
|
160
|
+
@dirty = true
|
161
|
+
end
|
162
|
+
|
163
|
+
return @node.remove if new_text.empty?
|
164
|
+
|
165
|
+
if @node
|
166
|
+
@node.children.each {|n| n.remove }
|
167
|
+
else
|
168
|
+
@node = Nokogiri::XML::Node.new TAG, @parent.document
|
169
|
+
@node.parent = @parent
|
170
|
+
end
|
171
|
+
|
172
|
+
cdata = Nokogiri::XML::CDATA.new @node.document, new_text
|
173
|
+
cdata.parent = @node
|
174
|
+
|
175
|
+
@text = new_text
|
176
|
+
end
|
177
|
+
end
|
178
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path '../lib', __FILE__
|
3
|
+
$LOAD_PATH.unshift lib unless $LOAD_PATH.include? lib
|
4
|
+
|
5
|
+
require 'reapack/index/gem_version'
|
6
|
+
|
7
|
+
Gem::Specification.new do |spec|
|
8
|
+
spec.name = "reapack-index"
|
9
|
+
spec.version = ReaPack::Index::VERSION
|
10
|
+
spec.authors = ["cfillion"]
|
11
|
+
spec.email = ["reapack-index@cfillion.tk"]
|
12
|
+
spec.summary = %q{Package indexer for ReaPack-based repositories}
|
13
|
+
spec.homepage = "https://github.com/cfillion/reapack-indexer"
|
14
|
+
spec.license = "LGPL-3.0+"
|
15
|
+
|
16
|
+
spec.files = `git ls-files -z`.split("\x0")
|
17
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
18
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
|
+
spec.require_paths = ["lib"]
|
20
|
+
|
21
|
+
spec.add_development_dependency 'bundler', '~> 1.10'
|
22
|
+
spec.add_development_dependency 'coveralls', '~> 0.8'
|
23
|
+
spec.add_development_dependency 'git', '~> 1.2'
|
24
|
+
spec.add_development_dependency 'minitest', '~> 5.8'
|
25
|
+
spec.add_development_dependency 'rake'
|
26
|
+
spec.add_development_dependency 'simplecov', '~> 0.11'
|
27
|
+
|
28
|
+
spec.add_runtime_dependency 'colorize', '~> 0.7'
|
29
|
+
spec.add_runtime_dependency 'metaheader', '~> 1.0'
|
30
|
+
spec.add_runtime_dependency 'nokogiri', '~> 1.6'
|
31
|
+
spec.add_runtime_dependency 'pandoc-ruby', '~> 1.0'
|
32
|
+
spec.add_runtime_dependency 'rugged', '~> 0.24.0b12'
|
33
|
+
end
|
data/setup/.gitignore
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
*.exe
|
@@ -0,0 +1,148 @@
|
|
1
|
+
!include MUI2.nsh
|
2
|
+
!include Sections.nsh
|
3
|
+
|
4
|
+
!define VERSION "1.0beta2"
|
5
|
+
!define NAME "ReaPack Index ${VERSION}"
|
6
|
+
!define LONG_VERSION "0.1.0.0"
|
7
|
+
|
8
|
+
!define RUBY_VERSION "2.2.4"
|
9
|
+
!define RUBYINSTALLER_FILE "rubyinstaller-${RUBY_VERSION}.exe"
|
10
|
+
!define RUBYINSTALLER_URL \
|
11
|
+
"http://dl.bintray.com/oneclick/rubyinstaller/${RUBYINSTALLER_FILE}"
|
12
|
+
|
13
|
+
!define PANDOC_FILE "pandoc-1.16.0.2-windows.msi"
|
14
|
+
!define PANDOC_URL \
|
15
|
+
"https://github.com/jgm/pandoc/releases/download/1.16.0.2/${PANDOC_FILE}"
|
16
|
+
|
17
|
+
!define RUGGED_FILE "rugged-0.24.0b12-x86-mingw32.gem"
|
18
|
+
!define RUGGED_URL \
|
19
|
+
"https://github.com/cfillion/reapack-index/releases/download/v${VERSION}/${RUGGED_FILE}"
|
20
|
+
|
21
|
+
Name "${NAME}"
|
22
|
+
OutFile "reapack-index-${VERSION}.exe"
|
23
|
+
ShowInstDetails show
|
24
|
+
XPStyle on
|
25
|
+
RequestExecutionLevel user
|
26
|
+
SpaceTexts none
|
27
|
+
|
28
|
+
VIProductVersion "${LONG_VERSION}"
|
29
|
+
VIAddVersionKey "ProductName" "${NAME}"
|
30
|
+
VIAddVersionKey "ProductVersion" "${LONG_VERSION}"
|
31
|
+
VIAddVersionKey "FileDescription" "${NAME} Setup"
|
32
|
+
VIAddVersionKey "FileVersion" "${LONG_VERSION}"
|
33
|
+
VIAddVersionKey "LegalCopyright" "Copyright (C) 2015-2016 Christian Fillion"
|
34
|
+
|
35
|
+
!define ABORT_MSG "Installation aborted."
|
36
|
+
|
37
|
+
!insertmacro MUI_PAGE_WELCOME
|
38
|
+
!insertmacro MUI_PAGE_COMPONENTS
|
39
|
+
!insertmacro MUI_PAGE_INSTFILES
|
40
|
+
!insertmacro MUI_PAGE_FINISH
|
41
|
+
|
42
|
+
!insertmacro MUI_LANGUAGE "English"
|
43
|
+
|
44
|
+
!macro DOWNLOAD url file
|
45
|
+
NSISdl::download /TIMEOUT=30000 "${url}" "${file}"
|
46
|
+
Pop $R0
|
47
|
+
StrCmp $R0 "success" +4
|
48
|
+
DetailPrint "Error while downloading ${url}:"
|
49
|
+
DetailPrint " $R0"
|
50
|
+
Abort "${ABORT_MSG}"
|
51
|
+
!macroend
|
52
|
+
|
53
|
+
!macro EXEC_GUI cmd basename
|
54
|
+
ExecWait '${cmd}' $0
|
55
|
+
StrCmp $0 "0" +3
|
56
|
+
DetailPrint "${basename} failed with exit code $0"
|
57
|
+
Abort "${ABORT_MSG}"
|
58
|
+
!macroend
|
59
|
+
|
60
|
+
!macro EXEC_CLI cmd basename
|
61
|
+
DetailPrint 'Execute: ${basename}'
|
62
|
+
nsExec::ExecToStack '${cmd}'
|
63
|
+
Pop $0
|
64
|
+
StrCmp $0 "0" +5
|
65
|
+
Pop $1
|
66
|
+
DetailPrint $1
|
67
|
+
DetailPrint "`${basename}` failed with exit code $0"
|
68
|
+
Abort "${ABORT_MSG}"
|
69
|
+
!macroend
|
70
|
+
|
71
|
+
Section /o "Ruby for Windows" InstallRuby
|
72
|
+
InitPluginsDir
|
73
|
+
StrCpy $0 "$PLUGINSDIR\${RUBYINSTALLER_FILE}"
|
74
|
+
!insertmacro DOWNLOAD "${RUBYINSTALLER_URL}" $0
|
75
|
+
|
76
|
+
DetailPrint "Installing Ruby ${RUBY_VERSION}..."
|
77
|
+
!insertmacro EXEC_GUI '"$0" /VERYSILENT /TASKS=MODPATH' ${RUBYINSTALLER_FILE}
|
78
|
+
|
79
|
+
; reload the path to use the one freshly set by the ruby installer
|
80
|
+
ReadRegStr $R0 HKCU "Environment" "Path"
|
81
|
+
System::Call 'Kernel32::SetEnvironmentVariableA(t, t) i("Path", R0).r2'
|
82
|
+
SectionEnd
|
83
|
+
|
84
|
+
Section /o "Rugged (libgit2)" InstallRugged
|
85
|
+
InitPluginsDir
|
86
|
+
StrCpy $0 "$PLUGINSDIR\${RUGGED_FILE}"
|
87
|
+
!insertmacro DOWNLOAD "${RUGGED_URL}" $0
|
88
|
+
|
89
|
+
DetailPrint "Installing rugged/libgit2 with pre-built C extensions..."
|
90
|
+
!insertmacro EXEC_CLI '"cmd" /C gem install $0' "gem install ${RUGGED_FILE}"
|
91
|
+
SectionEnd
|
92
|
+
|
93
|
+
Section /o "Pandoc" InstallPandoc
|
94
|
+
InitPluginsDir
|
95
|
+
StrCpy $0 "$PLUGINSDIR\${PANDOC_FILE}"
|
96
|
+
!insertmacro DOWNLOAD "${PANDOC_URL}" $0
|
97
|
+
|
98
|
+
DetailPrint "Installing Pandoc..."
|
99
|
+
!insertmacro EXEC_GUI '"msiexec" /i $0 /passive' ${PANDOC_FILE}
|
100
|
+
SectionEnd
|
101
|
+
|
102
|
+
Section "ReaPack-Index" InstallMain
|
103
|
+
SectionIn RO
|
104
|
+
|
105
|
+
DetailPrint "Installing reapack-index... (this can take a while)"
|
106
|
+
|
107
|
+
!insertmacro EXEC_CLI \
|
108
|
+
'"cmd" /C gem install reapack-index --version=${VERSION}' \
|
109
|
+
"gem install reapack-index"
|
110
|
+
SectionEnd
|
111
|
+
|
112
|
+
Function .onInit
|
113
|
+
nsExec::ExecToStack '"ruby" -e "require \"rugged\"'
|
114
|
+
Pop $0
|
115
|
+
|
116
|
+
StrCmp $0 "error" 0 +5 ; failed to launch ruby
|
117
|
+
SectionGetFlags ${InstallRuby} $1
|
118
|
+
IntOp $1 $1 | ${SF_SELECTED}
|
119
|
+
SectionSetFlags ${InstallRuby} $1
|
120
|
+
Goto +2 ; also install rugged
|
121
|
+
|
122
|
+
StrCmp $0 "1" 0 +4 ; rugged is not installed
|
123
|
+
SectionGetFlags ${InstallRugged} $1
|
124
|
+
IntOp $1 $1 | ${SF_SELECTED}
|
125
|
+
SectionSetFlags ${InstallRugged} $1
|
126
|
+
|
127
|
+
nsExec::ExecToStack '"pandoc" --version'
|
128
|
+
Pop $0
|
129
|
+
|
130
|
+
StrCmp $0 "error" 0 +4 ; failed to launch pandoc
|
131
|
+
SectionGetFlags ${InstallPandoc} $1
|
132
|
+
IntOp $1 $1 | ${SF_SELECTED}
|
133
|
+
SectionSetFlags ${InstallPandoc} $1
|
134
|
+
FunctionEnd
|
135
|
+
|
136
|
+
!insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN
|
137
|
+
!insertmacro MUI_DESCRIPTION_TEXT ${InstallRuby} \
|
138
|
+
"Download and install Ruby v${RUBY_VERSION} for Windows on your computer."
|
139
|
+
|
140
|
+
!insertmacro MUI_DESCRIPTION_TEXT ${InstallRugged} \
|
141
|
+
"Install a pre-built version of rugged, a Ruby bindings to the libgit2 C library."
|
142
|
+
|
143
|
+
!insertmacro MUI_DESCRIPTION_TEXT ${InstallPandoc} \
|
144
|
+
"Install Pandoc to enable automatic conversion from various document formats into RTF."
|
145
|
+
|
146
|
+
!insertmacro MUI_DESCRIPTION_TEXT ${InstallMain} \
|
147
|
+
"Install ReaPack's Package Indexer v${VERSION} on your computer."
|
148
|
+
!insertmacro MUI_FUNCTION_DESCRIPTION_END
|