monofile 0.0.1 → 0.1.0
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.
- checksums.yaml +4 -4
- data/Manifest.txt +2 -0
- data/Rakefile +3 -1
- data/bin/monofile +17 -0
- data/lib/monofile.rb +335 -1
- data/lib/monofile/version.rb +28 -0
- metadata +5 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 460899daff3c93d15ae49ed3163f2c56bb7e15e9
|
4
|
+
data.tar.gz: 7b3e215fe00027e3f4b85e107f30029e048b6e35
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6aa5bf5125f770f42d2063d62991779cf7cde8ed06c5752dcd8cd1a3f84556e438b638246884e826951e56219125fafda1e2f00bcb7525fa405f8cc4608996ab
|
7
|
+
data.tar.gz: 4b1452d92bd1e7104fe8f918596978661bdbf3997ab9121327e7ed4527269bdc1ac04d3db4007408582710fdaf74a50691cebda387c645127ac3d9f5f983321c
|
data/Manifest.txt
CHANGED
data/Rakefile
CHANGED
@@ -1,8 +1,10 @@
|
|
1
1
|
require 'hoe'
|
2
|
+
require './lib/monofile/version.rb'
|
3
|
+
|
2
4
|
|
3
5
|
Hoe.spec 'monofile' do
|
4
6
|
|
5
|
-
self.version =
|
7
|
+
self.version = Mono::Module::Monofile::VERSION
|
6
8
|
|
7
9
|
self.summary = "monofile - read in/ parse mono (source) tree defintions with git (and github) projects, and more"
|
8
10
|
self.description = summary
|
data/bin/monofile
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
###################
|
4
|
+
# DEV TIPS:
|
5
|
+
#
|
6
|
+
# For local testing run like:
|
7
|
+
#
|
8
|
+
# ruby -Ilib bin/monofile
|
9
|
+
#
|
10
|
+
# Set the executable bit in Linux. Example:
|
11
|
+
#
|
12
|
+
# % chmod a+x bin/monofile
|
13
|
+
#
|
14
|
+
|
15
|
+
require 'monofile'
|
16
|
+
|
17
|
+
Monofile::Tool.main
|
data/lib/monofile.rb
CHANGED
@@ -1,2 +1,336 @@
|
|
1
|
-
|
1
|
+
##
|
2
|
+
## "prelude / prolog " add some common used stdlibs
|
3
|
+
## add more - why? why not?
|
4
|
+
require 'pp'
|
5
|
+
require 'time'
|
6
|
+
require 'date'
|
7
|
+
require 'json'
|
8
|
+
require 'yaml'
|
9
|
+
require 'fileutils'
|
10
|
+
|
11
|
+
require 'uri'
|
12
|
+
require 'net/http'
|
13
|
+
require 'net/https'
|
14
|
+
|
15
|
+
|
16
|
+
require 'optparse'
|
17
|
+
|
18
|
+
|
19
|
+
|
20
|
+
#####################
|
21
|
+
# our own code
|
22
|
+
require 'monofile/version' # note: let version always go first
|
23
|
+
|
24
|
+
|
25
|
+
|
26
|
+
|
27
|
+
module Mono
|
28
|
+
|
29
|
+
def self.root ## root of single (monorepo) source tree
|
30
|
+
@@root ||= begin
|
31
|
+
## todo/fix:
|
32
|
+
## check if windows - otherwise use /sites
|
33
|
+
## check if root directory exists?
|
34
|
+
if ENV['MOPATH']
|
35
|
+
## use expand path to make (assure) absolute path - why? why not?
|
36
|
+
File.expand_path( ENV['MOPATH'] )
|
37
|
+
elsif Dir.exist?( 'C:/Sites' )
|
38
|
+
'C:/Sites'
|
39
|
+
else
|
40
|
+
'/sites'
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def self.root=( path )
|
46
|
+
## use expand path to make (assure) absolute path - why? why not?
|
47
|
+
@@root = File.expand_path( path )
|
48
|
+
end
|
49
|
+
|
50
|
+
|
51
|
+
|
52
|
+
def self.monofile
|
53
|
+
path = Monofile.find
|
54
|
+
Monofile.read( path )
|
55
|
+
|
56
|
+
# if path
|
57
|
+
# GitRepoSet.read( path )
|
58
|
+
# else
|
59
|
+
# puts "!! WARN: no mono configuration file found; looking for #{MONOFILES.join(', ')} in (#{Dir.getwd})"
|
60
|
+
# GitRepoSet.new( {} ) ## return empty set -todo/check: return nil - why? why not?
|
61
|
+
# end
|
62
|
+
end
|
63
|
+
end ## module Mono
|
64
|
+
|
65
|
+
|
66
|
+
|
67
|
+
|
68
|
+
|
69
|
+
class Monofile
|
70
|
+
## holds a list of projects
|
71
|
+
|
72
|
+
## nested class
|
73
|
+
class Project
|
74
|
+
|
75
|
+
## use some different names / attributes ??
|
76
|
+
attr_reader :org, ## todo/check: find a different name (or add alias e.g. login/user/etc.)
|
77
|
+
:name
|
78
|
+
|
79
|
+
## todo/fix:
|
80
|
+
## - use *args and than split if args==2 or args==1 etc.
|
81
|
+
def initialize( *args )
|
82
|
+
if args.size == 2 && args[0].is_a?(String) && args[1].is_a?(String)
|
83
|
+
## assume [org, name]
|
84
|
+
@org = args[0]
|
85
|
+
@name = args[1]
|
86
|
+
elsif args.size == 1 && args[0].is_a?( String )
|
87
|
+
## todo/fix: use norm_name parser or such!!!!
|
88
|
+
parts = args[0].split( '/' )
|
89
|
+
@org = parts[0][1..-1] ## cut-off leading @ (always assume for now!!)
|
90
|
+
@name = parts[1]
|
91
|
+
else
|
92
|
+
raise ArgumentError, "[Monorepo::Project] one or two string args expected; got: #{args.pretty_inspect}"
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
def to_s() "@#{org}/#{name}"; end
|
97
|
+
def to_path() "#{org}/#{name}"; end
|
98
|
+
|
99
|
+
## add clone_ssh_url or such too!!!!
|
100
|
+
end ## (nested) class Project
|
101
|
+
|
102
|
+
|
103
|
+
|
104
|
+
class Builder ## "clean room" pattern/spell - keep accessible methods to a minimum (by eval in "cleanroom")
|
105
|
+
def initialize( monofile )
|
106
|
+
@monofile = monofile
|
107
|
+
end
|
108
|
+
|
109
|
+
def project( *args )
|
110
|
+
project = Project.new( *args )
|
111
|
+
@monofile.projects << project
|
112
|
+
end
|
113
|
+
end # (nested) class Builder
|
114
|
+
|
115
|
+
|
116
|
+
|
117
|
+
RUBY_NAMES = ['monofile',
|
118
|
+
'Monofile',
|
119
|
+
'monofile.rb',
|
120
|
+
'Monofile.rb',
|
121
|
+
]
|
122
|
+
|
123
|
+
TXT_NAMES = ['monofile.txt',
|
124
|
+
'monotree.txt', ## keep monotree - why? why not?
|
125
|
+
'monorepo.txt',
|
126
|
+
'repos.txt']
|
127
|
+
|
128
|
+
## note: yaml always requires an extension
|
129
|
+
YML_NAMES = ['monofile.yml', 'monofile.yaml',
|
130
|
+
'monotree.yml', 'monotree.yaml', ## keep monotree - why? why not?
|
131
|
+
'monorepo.yml', 'monorepo.yaml',
|
132
|
+
'repos.yml', 'repos.yaml',
|
133
|
+
] ## todo/check: add mono.yml too - why? why not?
|
134
|
+
|
135
|
+
NAMES = RUBY_NAMES + TXT_NAMES + YML_NAMES
|
136
|
+
|
137
|
+
|
138
|
+
def self.find
|
139
|
+
RUBY_NAMES.each do |name|
|
140
|
+
return "./#{name}" if File.exist?( "./#{name}")
|
141
|
+
end
|
142
|
+
|
143
|
+
TXT_NAMES.each do |name|
|
144
|
+
return "./#{name}" if File.exist?( "./#{name}")
|
145
|
+
end
|
146
|
+
|
147
|
+
YML_NAMES.each do |name|
|
148
|
+
return "./#{name}" if File.exist?( "./#{name}")
|
149
|
+
end
|
150
|
+
|
151
|
+
nil ## no monofile found; return nil
|
152
|
+
end
|
153
|
+
|
154
|
+
|
155
|
+
def self.read( path )
|
156
|
+
txt = File.open( path, 'r:utf-8') { |f| f.read }
|
157
|
+
|
158
|
+
## check for yml or yaml extension;
|
159
|
+
## or for txt extension; otherwise assume ruby
|
160
|
+
extname = File.extname( path ).downcase
|
161
|
+
if ['.yml', '.yaml'].include?( extname )
|
162
|
+
hash = YAML.load( txt )
|
163
|
+
new( hash )
|
164
|
+
elsif ['.txt'].include?( extname )
|
165
|
+
new( txt )
|
166
|
+
else ## assume ruby code (as text in string)
|
167
|
+
new().load( txt )
|
168
|
+
end
|
169
|
+
end
|
170
|
+
|
171
|
+
|
172
|
+
|
173
|
+
def self.load( code )
|
174
|
+
monofile = new
|
175
|
+
monofile.load( code )
|
176
|
+
monofile
|
177
|
+
end
|
178
|
+
|
179
|
+
def self.load_file( path ) ## keep (or add load_yaml to or such) - why? why not?
|
180
|
+
code = File.open( path, 'r:utf-8') { |f| f.read }
|
181
|
+
load( code )
|
182
|
+
end
|
183
|
+
|
184
|
+
|
185
|
+
### attr readers
|
186
|
+
def projects() @projects; end
|
187
|
+
def size() @projects.size; end
|
188
|
+
|
189
|
+
|
190
|
+
def initialize( obj={} ) ## todo/fix: change default to obj=[]
|
191
|
+
@projects = []
|
192
|
+
|
193
|
+
## puts "[debug] obj.class=#{obj.class.name}"
|
194
|
+
add( obj )
|
195
|
+
end
|
196
|
+
|
197
|
+
def load( code ) ## note: code is text as a string
|
198
|
+
builder = Builder.new( self )
|
199
|
+
builder.instance_eval( code )
|
200
|
+
self ## note: for chaining always return self
|
201
|
+
end
|
202
|
+
|
203
|
+
|
204
|
+
def add( obj )
|
205
|
+
## todo/check: check for proc too! and use load( proc/block ) - possible?
|
206
|
+
if obj.is_a?( String )
|
207
|
+
puts "sorry add String - to be done!!!"
|
208
|
+
exit 1
|
209
|
+
elsif obj.is_a?( Array )
|
210
|
+
puts "sorry add Array- to be done!!!"
|
211
|
+
exit 1
|
212
|
+
elsif obj.is_a?( Hash )
|
213
|
+
add_hash( obj )
|
214
|
+
else ## assume text (evaluate/parse)
|
215
|
+
puts "sorry add Text - to be done!!!"
|
216
|
+
exit 1
|
217
|
+
end
|
218
|
+
self ## note: return self for chaining
|
219
|
+
end
|
220
|
+
|
221
|
+
|
222
|
+
def add_hash( hash )
|
223
|
+
hash.each do |org_with_counter, names|
|
224
|
+
|
225
|
+
## remove optional number from key e.g.
|
226
|
+
## mrhydescripts (3) => mrhydescripts
|
227
|
+
## footballjs (4) => footballjs
|
228
|
+
## etc.
|
229
|
+
|
230
|
+
## todo/check: warn about duplicates or such - why? why not?
|
231
|
+
|
232
|
+
org = org_with_counter.sub( /\([0-9]+\)/, '' ).strip.to_s
|
233
|
+
|
234
|
+
names.each do |name|
|
235
|
+
@projects << Project.new( org, name )
|
236
|
+
end
|
237
|
+
end
|
238
|
+
|
239
|
+
self ## note: return self for chaining
|
240
|
+
end
|
241
|
+
|
242
|
+
|
243
|
+
|
244
|
+
def each( &block )
|
245
|
+
## puts "[debug] arity: #{block.arity}"
|
246
|
+
|
247
|
+
## for backwards compatibility support "old" each with/by org & names
|
248
|
+
## add deprecated warnings and use to_h or such - why? why not?
|
249
|
+
if block.arity == 2
|
250
|
+
puts "!! DEPRECATED - please, use Monofile#to_h or Monofile.each {|proj| ...}"
|
251
|
+
to_h.each do |org, names|
|
252
|
+
block.call( org, names )
|
253
|
+
end
|
254
|
+
else
|
255
|
+
## assume just regular
|
256
|
+
@projects.each do |project|
|
257
|
+
block.call( project )
|
258
|
+
end
|
259
|
+
end
|
260
|
+
end # method each
|
261
|
+
|
262
|
+
def each_with_index( &block )
|
263
|
+
@projects.each_with_index do |project,i|
|
264
|
+
block.call( project, i )
|
265
|
+
end
|
266
|
+
end
|
267
|
+
|
268
|
+
|
269
|
+
|
270
|
+
### for backward compat(ibility) add a hash in the form e.g:
|
271
|
+
##
|
272
|
+
## geraldb:
|
273
|
+
## - austria
|
274
|
+
## - catalog
|
275
|
+
## - geraldb.github.io
|
276
|
+
## - logos
|
277
|
+
## yorobot:
|
278
|
+
## - auto
|
279
|
+
## - backup
|
280
|
+
## - football.json
|
281
|
+
## - logs
|
282
|
+
##
|
283
|
+
def to_h
|
284
|
+
h = {}
|
285
|
+
@projects.each do |project|
|
286
|
+
h[ project.org ] ||= []
|
287
|
+
h[ project.org ] << project.name
|
288
|
+
end
|
289
|
+
h
|
290
|
+
end
|
291
|
+
|
292
|
+
def to_a
|
293
|
+
## todo/check:
|
294
|
+
## - sort all entries a-z - why? why not?
|
295
|
+
## - always start name with @ marker - why? why not?
|
296
|
+
@projects.map {|project| project.to_s }
|
297
|
+
end
|
298
|
+
end # class Monofile
|
299
|
+
|
300
|
+
|
301
|
+
|
302
|
+
|
303
|
+
|
304
|
+
class Monofile
|
305
|
+
class Tool
|
306
|
+
def self.main( args=ARGV )
|
307
|
+
|
308
|
+
path = Monofile.find
|
309
|
+
if path.nil?
|
310
|
+
puts "!! ERROR: no mono configuration file found; looking for #{Monofile::NAMES.join(', ')} in (#{Dir.getwd})"
|
311
|
+
exit 1
|
312
|
+
end
|
313
|
+
|
314
|
+
## add check for auto-require (e.g. ./config.rb)
|
315
|
+
config_path = "./config.rb"
|
316
|
+
if File.exist?( config )
|
317
|
+
puts "[monofile] auto-require >#{config_path}<..."
|
318
|
+
require( config_path )
|
319
|
+
end
|
320
|
+
|
321
|
+
puts "[monofile] reading >#{path}<..."
|
322
|
+
monofile=Monofile.read( path )
|
323
|
+
pp monofile
|
324
|
+
|
325
|
+
## print one project per line
|
326
|
+
puts "---"
|
327
|
+
monofile.each do |proj|
|
328
|
+
puts proj.to_s
|
329
|
+
end
|
330
|
+
end
|
331
|
+
end # (nested) class Tool
|
332
|
+
end # class Monofile
|
333
|
+
|
334
|
+
|
335
|
+
Mono::Module::Monofile.banner
|
2
336
|
|
@@ -0,0 +1,28 @@
|
|
1
|
+
|
2
|
+
module Mono
|
3
|
+
module Module
|
4
|
+
module Monofile
|
5
|
+
|
6
|
+
MAJOR = 0 ## todo: namespace inside version or something - why? why not??
|
7
|
+
MINOR = 1
|
8
|
+
PATCH = 0
|
9
|
+
VERSION = [MAJOR,MINOR,PATCH].join('.')
|
10
|
+
|
11
|
+
def self.version
|
12
|
+
VERSION
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.banner
|
16
|
+
"monofile/#{VERSION} on Ruby #{RUBY_VERSION} (#{RUBY_RELEASE_DATE}) [#{RUBY_PLATFORM}]"
|
17
|
+
end
|
18
|
+
|
19
|
+
## note: move root to its own namespace to avoid
|
20
|
+
## conflict with Mono.root!!!!
|
21
|
+
def self.root
|
22
|
+
File.expand_path( File.dirname(File.dirname(__FILE__) ))
|
23
|
+
end
|
24
|
+
|
25
|
+
end # module Monofile
|
26
|
+
end # module Module
|
27
|
+
end # module Mono
|
28
|
+
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: monofile
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Gerald Bauer
|
@@ -47,7 +47,8 @@ dependencies:
|
|
47
47
|
description: monofile - read in/ parse mono (source) tree defintions with git (and
|
48
48
|
github) projects, and more
|
49
49
|
email: opensport@googlegroups.com
|
50
|
-
executables:
|
50
|
+
executables:
|
51
|
+
- monofile
|
51
52
|
extensions: []
|
52
53
|
extra_rdoc_files:
|
53
54
|
- CHANGELOG.md
|
@@ -58,7 +59,9 @@ files:
|
|
58
59
|
- Manifest.txt
|
59
60
|
- README.md
|
60
61
|
- Rakefile
|
62
|
+
- bin/monofile
|
61
63
|
- lib/monofile.rb
|
64
|
+
- lib/monofile/version.rb
|
62
65
|
homepage: https://github.com/rubycoco/git
|
63
66
|
licenses:
|
64
67
|
- Public Domain
|