xezat 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (80) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +14 -0
  3. data/.gitmodules +3 -0
  4. data/Gemfile +4 -0
  5. data/LICENSE.txt +22 -0
  6. data/README.md +207 -0
  7. data/Rakefile +2 -0
  8. data/bin/xezat +14 -0
  9. data/lib/xezat.rb +6 -0
  10. data/lib/xezat/command/bump.rb +174 -0
  11. data/lib/xezat/command/create.rb +105 -0
  12. data/lib/xezat/command/debug.rb +30 -0
  13. data/lib/xezat/command/doctor.rb +45 -0
  14. data/lib/xezat/command/generate.rb +50 -0
  15. data/lib/xezat/command/validate.rb +43 -0
  16. data/lib/xezat/commands.rb +32 -0
  17. data/lib/xezat/cygchangelog.rb +53 -0
  18. data/lib/xezat/cygclasses.rb +33 -0
  19. data/lib/xezat/detector/autoconf.rb +16 -0
  20. data/lib/xezat/detector/automake.rb +16 -0
  21. data/lib/xezat/detector/boost.m4.rb +20 -0
  22. data/lib/xezat/detector/cmake.rb +16 -0
  23. data/lib/xezat/detector/gengetopt.rb +16 -0
  24. data/lib/xezat/detector/libtool.rb +16 -0
  25. data/lib/xezat/detector/make.rb +19 -0
  26. data/lib/xezat/detectors.rb +36 -0
  27. data/lib/xezat/main.rb +13 -0
  28. data/lib/xezat/packages.rb +21 -0
  29. data/lib/xezat/refine/linguist/file_blob.rb +14 -0
  30. data/lib/xezat/validator/m4.rb +30 -0
  31. data/lib/xezat/validator/pkgconfig.rb +23 -0
  32. data/lib/xezat/validators.rb +38 -0
  33. data/lib/xezat/variables.rb +48 -0
  34. data/lib/xezat/version.rb +3 -0
  35. data/share/xezat/compilers.json +39 -0
  36. data/share/xezat/invoke_cygport_dep.sh +5 -0
  37. data/share/xezat/repository/bitbucket.json +5 -0
  38. data/share/xezat/repository/github.json +5 -0
  39. data/share/xezat/repository/google.json +7 -0
  40. data/share/xezat/repository/sourceforge.json +6 -0
  41. data/share/xezat/show_cygport_description.sh +8 -0
  42. data/share/xezat/show_cygport_variable.sh +30 -0
  43. data/share/xezat/template/README.erb +60 -0
  44. data/share/xezat/template/cygport.erb +19 -0
  45. data/share/xezat/template/pkgconfig.erb +10 -0
  46. data/share/xezat/template/setup.erb +17 -0
  47. data/test/test.rb +18 -0
  48. data/test/xezat/command/fixture/doctor/a.lst.gz +0 -0
  49. data/test/xezat/command/fixture/doctor/b1.lst.gz +0 -0
  50. data/test/xezat/command/fixture/doctor/b2.lst.gz +0 -0
  51. data/test/xezat/command/test_create.rb +47 -0
  52. data/test/xezat/command/test_doctor.rb +16 -0
  53. data/test/xezat/detector/fixture/autoconf/no/configure.scan +1 -0
  54. data/test/xezat/detector/fixture/autoconf/yes_root/configure.ac +1 -0
  55. data/test/xezat/detector/fixture/autoconf/yes_subdir/subdir/configure.ac +1 -0
  56. data/test/xezat/detector/fixture/automake/no/Makefile.in +1 -0
  57. data/test/xezat/detector/fixture/automake/yes_root/Makefile.am +1 -0
  58. data/test/xezat/detector/fixture/automake/yes_subdir/subdir/Makefile.am +1 -0
  59. data/test/xezat/detector/fixture/boost.m4/no/configure.ac +1 -0
  60. data/test/xezat/detector/fixture/boost.m4/yes/configure.ac +1 -0
  61. data/test/xezat/detector/fixture/cmake/no/CMakeList.txt +1 -0
  62. data/test/xezat/detector/fixture/cmake/yes_root/CMakeLists.txt +1 -0
  63. data/test/xezat/detector/fixture/cmake/yes_subdir/subdir/CMakeLists.txt +1 -0
  64. data/test/xezat/detector/fixture/gengetopt/no/xezat.log +1 -0
  65. data/test/xezat/detector/fixture/gengetopt/yes_root/xezat.ggo +1 -0
  66. data/test/xezat/detector/fixture/gengetopt/yes_subdir/subdir/xezat.ggo +1 -0
  67. data/test/xezat/detector/test_autoconf.rb +23 -0
  68. data/test/xezat/detector/test_automake.rb +23 -0
  69. data/test/xezat/detector/test_boost.m4.rb +19 -0
  70. data/test/xezat/detector/test_cmake.rb +23 -0
  71. data/test/xezat/detector/test_gengetopt.rb +23 -0
  72. data/test/xezat/test_cygchangelog.rb +25 -0
  73. data/test/xezat/test_cygclasses.rb +31 -0
  74. data/test/xezat/test_variables.rb +15 -0
  75. data/test/xezat/validator/fixture/m4/no/usr/share/aclocal/.gitkeep +0 -0
  76. data/test/xezat/validator/fixture/m4/skip/usr/share/aclocal/.gitkeep +0 -0
  77. data/test/xezat/validator/fixture/m4/yes/usr/share/aclocal/test.m4 +1 -0
  78. data/test/xezat/validator/test_m4.rb +23 -0
  79. data/xezat.gemspec +28 -0
  80. metadata +239 -0
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 434544489f11dad9eb18797864e6c479b23cb880
4
+ data.tar.gz: 091d9668f15f5fe5081f5198d939a4504b4d97f1
5
+ SHA512:
6
+ metadata.gz: 0e64e0ac2fec95c6aa030c854eb943efef16ed8327318dcbfffaafdfa3eadfa807ddcffd1383d59a9148a76c306e3cc874c71faf21feb54e9c7701e05200c17f
7
+ data.tar.gz: 1d79d6d8c4be0ff6c265678c3bce99f3250bb05b14411adc8307f1e25a7e3d9a7831bacf3bbb01bce5c9919e234808a68315fff7c4df4f99995996805ad27184
@@ -0,0 +1,14 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
10
+ *.bundle
11
+ *.so
12
+ *.o
13
+ *.a
14
+ mkmf.log
@@ -0,0 +1,3 @@
1
+ [submodule "test/cygport"]
2
+ path = test/cygport
3
+ url = git://git.code.sf.net/p/cygwin-ports/cygport
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in xezat.gemspec
4
+ gemspec
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2015 fd0
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,207 @@
1
+ # Xezat
2
+
3
+ Complement of cygport
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ ```ruby
10
+ gem 'xezat'
11
+ ```
12
+
13
+ And then execute:
14
+
15
+ $ bundle
16
+
17
+ Or install it yourself as:
18
+
19
+ $ gem install xezat
20
+
21
+ ## Usage
22
+
23
+ xezat 0.0.1 -- Xezat is the complement of cygport
24
+
25
+ Usage:
26
+
27
+ xezat <subcommand> [options]
28
+
29
+ Options:
30
+ -h, --help Show this message
31
+ -v, --version Print the name and version
32
+ -t, --trace Show the full backtrace when an error occurs
33
+
34
+ Subcommands:
35
+ bump update CYGWIN-PATCHES/README
36
+ create create new cygport
37
+ debug show cygport variables
38
+ doctor diagnose installed packages
39
+ generate generate additional files
40
+ validate validate package contents
41
+
42
+ ### create
43
+
44
+ xezat create -- create new cygport
45
+
46
+ Usage:
47
+
48
+ xezat create [options] cygport
49
+
50
+ Options:
51
+ -a, --app-only application only
52
+ -c, --category category specify category
53
+ --description description specify description
54
+ -i, --inherit cygclass inherit cygclasses
55
+ -o, --overwrite overwrite cygport
56
+ --repository repository specify repository (github, google, sourceforge)
57
+ -s, --summary summary specify summary
58
+ -h, --help Show this message
59
+ -v, --version Print the name and version
60
+ -t, --trace Show the full backtrace when an error occurs
61
+
62
+ Example.1
63
+
64
+ % xezat create xezat-0.0.1-1bl1.cygport
65
+ % cat xezat-0.0.1-1bl1.cygport
66
+
67
+ ```bash
68
+ HOMEPAGE=""
69
+ SRC_URI=""
70
+
71
+ CATEGORY=""
72
+ SUMMARY=""
73
+ DESCRIPTION=""
74
+
75
+ PKG_NAMES="
76
+ ${PN}
77
+ lib${PN}0
78
+ lib${PN}-devel
79
+ "
80
+ ```
81
+
82
+ Example.2
83
+
84
+ % xezat create -a -c Libs -i git --repository=github -s 'Complement of Cygport' -o xezat-0.0.1-1bl1.cygport
85
+ % cat xezat-0.0.1-1bl1.cygport
86
+
87
+ ```bash
88
+ HOMEPAGE="https://github.com/fd00/${PN}"
89
+ GIT_URI="https://github.com/fd00/${PN}.git"
90
+
91
+ CATEGORY="Libs"
92
+ SUMMARY="Complement of Cygport"
93
+ DESCRIPTION=""
94
+
95
+ inherit git
96
+
97
+ PKG_NAMES="
98
+ ${PN}
99
+ "
100
+ ```
101
+
102
+ ### debug
103
+
104
+ xezat debug -- show cygport variables
105
+
106
+ Usage:
107
+
108
+ xezat debug cygport
109
+
110
+ Options:
111
+ -h, --help Show this message
112
+ -v, --version Print the name and version
113
+ -t, --trace Show the full backtrace when an error occurs
114
+
115
+ Example.1
116
+
117
+ % xezat debug xezat-0.0.1-1bl1.cygport
118
+ #<Xezat::VariableManager:0x000006011ba808
119
+ @variables=
120
+ {:AR=>"ar",
121
+ :ARCH=>"x86_64",
122
+ :ARCH_x86_64=>"1",
123
+ :B=>"/usr/src/xezat-0.0.1-1bl1.x86_64/build",
124
+ :BASH=>"/usr/bin/bash",
125
+ (snip)
126
+ :mirror_apache=>"http://www.apache.org/dist",
127
+ :mirror_berlios=>"http://download.berlios.de http://download2.berlios.de",
128
+ :mirror_cpan=>"http://search.cpan.org/CPAN",
129
+ :mirror_cran=>"http://cran.r-project.org",
130
+ :mirror_ctan=>"http://mirror.ctan.org/",
131
+ (snip)
132
+ :src_patchfile=>"xezat-0.0.1-1bl1.src.patch",
133
+ :srcdir=>"/usr/src/xezat-0.0.1-1bl1.x86_64/src",
134
+ :top=>"/usr/src",
135
+ :workdir=>"/usr/src/xezat-0.0.1-1bl1.x86_64"}>
136
+ %
137
+
138
+ ### doctor
139
+
140
+ xezat doctor -- diagnose installed packages
141
+
142
+ Usage:
143
+
144
+ xezat doctor
145
+
146
+ Options:
147
+ -h, --help Show this message
148
+ -v, --version Print the name and version
149
+ -t, --trace Show the full backtrace when an error occurs
150
+
151
+ Example.1
152
+
153
+ % xezat doctor
154
+ xezat doctor | Warn: usr/include/attr/xattr.h is in multiple packages: [:"cygwin-devel", :"libattr-devel"]
155
+ xezat doctor | Warn: usr/share/man/man1/sha.1.gz is in multiple packages: [:openssl, :sha]
156
+ xezat doctor | Warn: usr/share/man/man3/Socket.3pm.gz is in multiple packages: [:"perl-Socket", :perl]
157
+ xezat doctor | Warn: usr/share/man/man3/Unicode.Collate.3pm.gz is in multiple packages: [:"perl-Unicode-Collate", :perl]
158
+ xezat doctor | Warn: usr/share/man/man3/Unicode.Collate.CJK.Big5.3pm.gz is in multiple packages: [:"perl-Unicode-Collate", :perl]
159
+ xezat doctor | Warn: usr/share/man/man3/Unicode.Collate.CJK.GB2312.3pm.gz is in multiple packages: [:"perl-Unicode-Collate", :perl]
160
+ xezat doctor | Warn: usr/share/man/man3/Unicode.Collate.CJK.JISX0208.3pm.gz is in multiple packages: [:"perl-Unicode-Collate", :perl]
161
+ xezat doctor | Warn: usr/share/man/man3/Unicode.Collate.CJK.Korean.3pm.gz is in multiple packages: [:"perl-Unicode-Collate", :perl]
162
+ xezat doctor | Warn: usr/share/man/man3/Unicode.Collate.CJK.Pinyin.3pm.gz is in multiple packages: [:"perl-Unicode-Collate", :perl]
163
+ xezat doctor | Warn: usr/share/man/man3/Unicode.Collate.CJK.Stroke.3pm.gz is in multiple packages: [:"perl-Unicode-Collate", :perl]
164
+ xezat doctor | Warn: usr/share/man/man3/Unicode.Collate.Locale.3pm.gz is in multiple packages: [:"perl-Unicode-Collate", :perl]
165
+ %
166
+
167
+ ### generate
168
+
169
+ xezat generate -- generate additional files
170
+
171
+ Usage:
172
+
173
+ xezat generate [options] cygport
174
+
175
+ Options:
176
+ -c, --cmake generate *.cmake
177
+ -o, --overwrite overwrite file
178
+ -p, --pkg-config generate *.pc
179
+ -h, --help Show this message
180
+ -v, --version Print the name and version
181
+ -t, --trace Show the full backtrace when an error occurs
182
+
183
+ ### validate
184
+
185
+ xezat validate -- validate package contents
186
+
187
+ Usage:
188
+
189
+ xezat validate [options] cygport
190
+
191
+ Options:
192
+ -h, --help Show this message
193
+ -v, --version Print the name and version
194
+ -t, --trace Show the full backtrace when an error occurs
195
+
196
+ ### bump
197
+
198
+ xezat bump -- update CYGWIN-PATCHES/README
199
+
200
+ Usage:
201
+
202
+ xezat bump cygport
203
+
204
+ Options:
205
+ -h, --help Show this message
206
+ -v, --version Print the name and version
207
+ -t, --trace Show the full backtrace when an error occurs
@@ -0,0 +1,2 @@
1
+ require "bundler/gem_tasks"
2
+
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ Encoding::default_external = 'UTF-8'
4
+
5
+ self_file =
6
+ if File.symlink?(__FILE__)
7
+ require 'pathname'
8
+ Pathname.new(__FILE__).realpath
9
+ else
10
+ __FILE__
11
+ end
12
+ $:.unshift File.expand_path(File.join(File.dirname(self_file), '..', 'lib'))
13
+
14
+ require 'xezat/main'
@@ -0,0 +1,6 @@
1
+ module Xezat
2
+ ROOT_DIR = File::expand_path(File::join(File::dirname(__FILE__), '..'))
3
+ DATA_DIR = File::expand_path(File::join(ROOT_DIR, 'share', 'xezat'))
4
+ REPOSITORY_DIR = File::expand_path(File::join(DATA_DIR, 'repository'))
5
+ TEMPLATE_DIR = File::expand_path(File::join(DATA_DIR, 'template'))
6
+ end
@@ -0,0 +1,174 @@
1
+ require 'erb'
2
+ require 'facets/file/atomic_write'
3
+ require 'find'
4
+ require 'fileutils'
5
+ require 'xezat'
6
+ require 'xezat/commands'
7
+ require 'xezat/cygchangelog'
8
+ require 'xezat/cygclasses'
9
+ require 'xezat/detectors'
10
+ require 'xezat/refine/linguist/file_blob'
11
+ require 'xezat/packages'
12
+ require 'xezat/variables'
13
+
14
+ module Xezat
15
+ # ファイルのパーミッションが適切でない場合に投げられる例外
16
+ class FilePermissionError < StandardError
17
+ end
18
+
19
+ # cygport の他のコマンドが終わっておらずに呼び出すべき状態ではない場合に投げられる例外
20
+ class IllegalStateError < StandardError
21
+ end
22
+
23
+ module Command
24
+ # README を生成または更新する
25
+ class Bump
26
+ def initialize(program)
27
+ program.command(:bump) do |c|
28
+ c.syntax 'bump cygport'
29
+ c.description 'update CYGWIN-PATCHES/README'
30
+ c.action do |args, options|
31
+ execute(c, args, options)
32
+ end
33
+ end
34
+ end
35
+
36
+ CommandManager::register(:bump, self)
37
+
38
+ def execute(c, args, options)
39
+ cygport = args.shift
40
+ raise ArgumentError, 'wrong number of arguments (0 for 1)' unless cygport
41
+ c.logger.info "ignore extra arguments: #{args.to_s}" unless args.empty?
42
+
43
+ variables = VariableManager::get_default_variables(cygport)
44
+ packages = PackageManager::get_installed_packages()
45
+ readme_file = File::expand_path(File::join(variables[:C], 'README'))
46
+
47
+ info = {}
48
+ info[:src_uri] = get_src_uri(variables)
49
+ info[:runtimes] = get_runtime_packages(cygport)
50
+ info[:developments] = get_development_packages(variables, packages)
51
+ info[:files] = get_files(variables)
52
+ info[:changelog] = get_changelog(variables, options, readme_file)
53
+
54
+ File::atomic_write(readme_file) do |f|
55
+ f.write(get_embedded_contents(variables, info))
56
+ end
57
+ end
58
+
59
+ # changelog を取得する
60
+ def get_changelog(variables, options, readme_file)
61
+ current_version = variables[:PVR].intern
62
+ if FileTest::exist?(readme_file)
63
+ raise FilePermissionError, "Cannot read #{readme_file}" unless FileTest::readable?(readme_file)
64
+ raise FilePermissionError, "Cannot write #{readme_file}" unless FileTest::writable?(readme_file)
65
+ changelog = Cygchangelog.new(File::read(readme_file))
66
+ options['message'] ||= 'Version bump.'
67
+ changelog[current_version] = options['message'] unless changelog.key?(current_version)
68
+ else
69
+ changelog = Cygchangelog.new
70
+ changelog[current_version] = 'Initial release by fd0 <https://github.com/fd00/>'
71
+ end
72
+ changelog
73
+ end
74
+
75
+ # vcs に対応した SRC_URI を取得する
76
+ def get_src_uri(variables, cygclass_manager = CygclassManager.new)
77
+ cygclass_manager.vcs.each do |vcs|
78
+ src_uri_key = "#{vcs.to_s.upcase}_URI".intern
79
+ return variables[src_uri_key] if variables.key?(src_uri_key)
80
+ end
81
+ variables[:SRC_URI]
82
+ end
83
+
84
+ # package が依存している runtime のリストを取得する
85
+ def get_runtime_packages(cygport)
86
+ command = ['bash', File.expand_path(File.join(DATA_DIR, 'invoke_cygport_dep.sh')), cygport]
87
+ result, error, status = Open3.capture3(command.join(' '))
88
+ raise CygportProcessError, error unless status.success?
89
+ result.split($/).map! do |runtime|
90
+ runtime.lstrip
91
+ end
92
+ end
93
+
94
+ # package を build するために必要な development package のリストを取得する
95
+ def get_development_packages(variables, packages)
96
+ compilers = get_compilers(variables)
97
+ tools = get_tools(variables)
98
+ development_packages = (compilers + tools + [:cygport]).uniq.sort
99
+ development_packages.map! do |package|
100
+ packages[package] || ''
101
+ end
102
+ end
103
+
104
+ # package を build するために必要な compiler package のリストを取得する
105
+ def get_compilers(variables)
106
+
107
+ # ファイルの内容からプログラミング言語を特定する
108
+ languages = []
109
+ Find::find(variables[:S]) do |path|
110
+ unless FileTest::directory?(path)
111
+ language = Xezat::Refine::Linguist::FileBlob.new(path).language
112
+ unless language.nil?
113
+ if language.name == 'Objective-C' # Objective-C は誤検知があるため suffix で再確認
114
+ next unless path.end_with?('.m')
115
+ end
116
+ languages << language.name
117
+ end
118
+ end
119
+ end
120
+
121
+ # 言語から対応する compiler package を取得する
122
+ compiler_file = File.expand_path(File.join(DATA_DIR, 'compilers.json'))
123
+ compiler_candidates = JSON.parse(File::read(compiler_file))
124
+ compilers = []
125
+ languages.uniq.each do |language|
126
+ if compiler_candidates.key?(language)
127
+ compiler_candidate = compiler_candidates[language]
128
+ compilers << compiler_candidate['package'].intern
129
+ if compiler_candidate.key?('dependencies')
130
+ compiler_candidate['dependencies'].each do |dependency|
131
+ compilers << dependency.intern
132
+ end
133
+ end
134
+ end
135
+ end
136
+ compilers.uniq
137
+ end
138
+
139
+ # packages を build するために必要な tool package のリストを取得する
140
+ def get_tools(variables)
141
+ DetectorManager::load_default_detectors
142
+ DetectorManager::detect(variables)
143
+ end
144
+
145
+ # package で生成されるチェック用の *.lst から README に埋め込むファイルのリストを取得する
146
+ def get_files(variables)
147
+ pkg2files = {}
148
+ variables[:pkg_name].each do |pkg_name|
149
+ lst_file = File::expand_path(File::join(variables[:T], ".#{pkg_name}.lst"))
150
+ raise IllegalStateError, "No such file: #{lst_file}" unless FileTest::readable?(lst_file)
151
+ lines = File::readlines(lst_file)
152
+ lines.delete_if do |path|
153
+ path.strip!
154
+ path[-1] == File::SEPARATOR
155
+ end.map! do |path|
156
+ File::SEPARATOR + path
157
+ end
158
+ if variables[:PN] == pkg_name
159
+ readme = File::SEPARATOR + File.join('usr', 'share', 'doc', 'Cygwin', "#{pkg_name}.README")
160
+ lines << readme.strip unless lines.include?(readme)
161
+ end
162
+ pkg2files[pkg_name.intern] = lines.sort
163
+ end
164
+ pkg2files
165
+ end
166
+
167
+ # テンプレートにデータを埋め込んだ結果の文字列を取得する
168
+ def get_embedded_contents(variables, info)
169
+ erb = File::expand_path(File::join(TEMPLATE_DIR, 'README.erb'))
170
+ ERB.new(File::readlines(erb).join(nil), nil, '%-').result(binding)
171
+ end
172
+ end
173
+ end
174
+ end