monos 0.1.0 → 0.3.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 576b842ecee3e88c176654fdf0851b26c85b6e46
4
- data.tar.gz: a6d79f70f3deb662cbb60e2d38a558a44a7e9716
3
+ metadata.gz: 5cafc90639b5bb02b8be04d5f993dd518a53db83
4
+ data.tar.gz: b3aba3dbae6d86e86d78eb53add58def4faa3844
5
5
  SHA512:
6
- metadata.gz: 0bb43687058126a85c6fdbf3e8755c9c28f186686b2132a7a029522af5e65d3d671351cd1ea593fde3f2fe10df86f19893f01a6510d88eb5ecf2ccb531e9bf3b
7
- data.tar.gz: 0dc9a08488c235d9df1d269b12a34243df3a7dec2ec6385b22268c692080824b03ea1c32dc9b44b0bd5caa68b63e3f07526cdbb35291127c2c9eb7ec1ee51be2
6
+ metadata.gz: 9192d91ab18d06d5b167be39171f86d71daf40629c5cf5aeeff8de9e8cb9c5b681e33de16ef08e02ee2986c97b46e9c4bc2292e364d6dab94ee6f28ce98e93e0
7
+ data.tar.gz: a48bacb9f54bf48e6264c9ece66e030cdd3c8c900373d141cc4d430b913851b802b4cb8b8c6d4d3c7b9f458584dcc372fe4e7e0ea45585d6cfcc20ca6f5a6414
@@ -3,16 +3,17 @@ Manifest.txt
3
3
  README.md
4
4
  Rakefile
5
5
  bin/mo
6
- bin/moget
7
6
  bin/mono
8
7
  lib/mono.rb
9
8
  lib/mono/base.rb
10
- lib/mono/git/base.rb
11
- lib/mono/git/status.rb
12
- lib/mono/git/sync.rb
13
- lib/mono/git/tool.rb
14
- lib/mono/sportdb.rb
9
+ lib/mono/commands/env.rb
10
+ lib/mono/commands/fetch.rb
11
+ lib/mono/commands/run.rb
12
+ lib/mono/commands/status.rb
13
+ lib/mono/commands/sync.rb
14
+ lib/mono/tool.rb
15
15
  lib/mono/version.rb
16
16
  lib/monos.rb
17
+ lib/sportdb/setup.rb
17
18
  test/helper.rb
18
19
  test/test_base.rb
data/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # monos - tools and (startup) scripts for mono source trees / monorepos
1
+ # monos - monorepo / mono source tree tools and (startup) scripts
2
2
 
3
3
 
4
4
  * home :: [github.com/sportdb/sport.db](https://github.com/sportdb/sport.db)
@@ -9,9 +9,148 @@
9
9
 
10
10
 
11
11
 
12
+
12
13
  ## Usage
13
14
 
14
- To be done
15
+ The `mono` (or short `mo`) command line tool lets you run
16
+ git commands on multiple repo(sitories) with a single command.
17
+
18
+
19
+
20
+ ### Setup
21
+
22
+ #### 1) The monorepo (single source tree) root - `MOPATH`
23
+
24
+ Use the `MOPATH` environment variable to set the monorepo (single source tree) root
25
+ path. The builtin default for now is `/sites`.
26
+
27
+ #### 2) The configuration / manifest file to list all repos - `monorepo.yml`
28
+
29
+
30
+ Add all repo(sitories) to the `monorepo.yml` that you want
31
+ to be part of the "virtual" all-in-one / single mono source tree
32
+ in your project. Example:
33
+
34
+ ``` yaml
35
+ sportdb:
36
+ - sport.db
37
+ - sport.db.sources
38
+ - football.db
39
+
40
+ yorobot:
41
+ - cache.csv
42
+ - sport.db.more
43
+ - football.db
44
+ - football.csv
45
+
46
+ openfootball:
47
+ - leagues
48
+ - clubs
49
+ ```
50
+
51
+
52
+
53
+ ### Commands
54
+
55
+ `status` • `fetch` • `sync` • `run` •`env`
56
+
57
+ ### `status` Command
58
+
59
+ Use the `status` command to check for changes (will use `git status --short`) on all repos. Example:
60
+
61
+ ```
62
+ $ mono status
63
+ $ mono # status is the default command
64
+ $ mo status # mo is a "shortcut" convenience alias for mono
65
+ $ mo stat
66
+ $ mo
67
+ ```
68
+
69
+ resulting in something like:
70
+
71
+ ```
72
+ 2 change(s) in 9 repo(s) @ 3 org(s)
73
+
74
+ -- sportdb@sport.db - CHANGES:
75
+ M monos/Manifest.txt
76
+ M monos/README.md
77
+ M monos/Rakefile
78
+ M monos/lib/mono/git/status.rb
79
+ M monos/lib/mono/git/sync.rb
80
+ M monos/lib/mono/version.rb
81
+ RM monos/lib/monoscript.rb -> monos/lib/monos.rb
82
+ M monos/test/test_base.rb
83
+ ?? monos/bin/
84
+
85
+ -- yorobot@football.csv - CHANGES:
86
+ ?? footballdata/
87
+ ```
88
+
89
+
90
+ ### `fetch` Command
91
+
92
+ Use the `fetch` command to fetch all (remote) changes (will use `git fetch`) on all existing repos and warn about not-yet-cloned repos. Example:
93
+
94
+ ```
95
+ $ mono fetch
96
+ $ mo fetch # mo is a "shortcut" convenience alias for mono
97
+ ```
98
+
99
+
100
+
101
+ ### `sync` Command
102
+
103
+
104
+ Use the `sync` command to sync up (pull) changes (will use `git pull --ff-only`) on all existing repos and `git clone` for new not-yet-cloned repos. Example:
105
+
106
+ ```
107
+ $ mono sync
108
+ $ mono install # install is an alias for sync
109
+ $ mono get # get is another alias for sync
110
+ $ mo sync # mo is a "shortcut" convenience alias for mono
111
+ $ mo get
112
+ ```
113
+
114
+ Note: `install` or `get` or `up` are all aliases that you can use for `sync`.
115
+
116
+
117
+ ### `run` Command
118
+
119
+ Use the `run` command to run any command in all repos. Example:
120
+
121
+ ```
122
+ $ mono run git ls-files
123
+ $ mono exec git ls-files # exec is an alias for run
124
+ $ mo run git ls-files # mo is a "shortcut" convenience alias for mono
125
+ $ mo exec git ls-files
126
+
127
+ # -or-
128
+
129
+ $ mono run tree
130
+ $ mono exec tree
131
+ $ mo run tree
132
+ $ mo exec tree
133
+ ```
134
+
135
+ Note: `exec` is an alias that you can use for `run`.
136
+
137
+
138
+
139
+ ### `env` Command
140
+
141
+ Use the `env` command to check your `mono` environment setup.
142
+
143
+
144
+ That's all for now.
145
+
146
+
147
+
148
+ ## Installation
149
+
150
+ Use
151
+
152
+ gem install monos
153
+
15
154
 
16
155
  ## License
17
156
 
data/Rakefile CHANGED
@@ -3,15 +3,15 @@ require './lib/mono/version.rb'
3
3
 
4
4
  Hoe.spec 'monos' do
5
5
 
6
- self.version = Mono::Module::VERSION
6
+ self.version = MonoCore::VERSION
7
7
 
8
- self.summary = "monos - tools and (startup) scripts for mono source trees / monorepos"
8
+ self.summary = "monos - monorepo / mono source tree tools and (startup) scripts"
9
9
  self.description = summary
10
10
 
11
- self.urls = ['https://github.com/sportdb/sport.db']
11
+ self.urls = { home: 'https://github.com/sportdb/sport.db' }
12
12
 
13
13
  self.author = 'Gerald Bauer'
14
- self.email = 'opensport@googlegroups.com'
14
+ self.email = 'opensport@googlegroups.com'
15
15
 
16
16
  # switch extension to .markdown for gihub formatting
17
17
  self.readme_file = 'README.md'
@@ -19,7 +19,9 @@ Hoe.spec 'monos' do
19
19
 
20
20
  self.licenses = ['Public Domain']
21
21
 
22
- self.extra_deps = []
22
+ self.extra_deps = [
23
+ ['gitti', '>= 0.4.0' ],
24
+ ]
23
25
 
24
26
  self.spec_extras = {
25
27
  required_ruby_version: '>= 2.2.2'
@@ -1,20 +1,31 @@
1
- require 'pp'
2
- require 'time'
3
- require 'date'
4
- require 'yaml'
5
- require 'open3'
6
- require 'fileutils'
7
- require 'optparse'
1
+ ## first add git support
2
+ ## note: use the "modular" version WITHOUT auto-include gitti,
3
+ ## thus, require 'gitti/base' (and NOT 'gitti')
4
+ require 'gitti/base'
5
+
6
+ module Mono
7
+ ## note: make Git, GitProject, GitRepoSet, etc. available without Gitti::
8
+ include Gitti
9
+ end
10
+
11
+
12
+ ## some more stdlibs
13
+ # require 'optparse'
14
+
8
15
 
9
16
 
10
17
  ###
11
18
  # our own code
12
19
  require 'mono/version' # let version always go first
13
20
  require 'mono/base'
14
- require 'mono/git/base'
15
- require 'mono/git/sync'
16
- require 'mono/git/status'
17
- require 'mono/git/tool'
21
+
22
+ require 'mono/commands/status'
23
+ require 'mono/commands/fetch'
24
+ require 'mono/commands/sync'
25
+ require 'mono/commands/env'
26
+ require 'mono/commands/run'
27
+ require 'mono/tool'
28
+
18
29
 
19
30
 
20
- puts Mono::Module.banner # say hello
31
+ puts MonoCore.banner # say hello
@@ -6,7 +6,32 @@ module Mono
6
6
  ## todo/fix:
7
7
  ## check if windows - otherwise use /sites
8
8
  ## check if root directory exists?
9
- 'C:/Sites'
9
+ if ENV['MOPATH']
10
+ ENV['MOPATH']
11
+ elsif Dir.exist?( 'C:/Sites' )
12
+ 'C:/Sites'
13
+ else
14
+ '/sites'
15
+ end
16
+ end
17
+ end
18
+
19
+ def self.monofile
20
+ path = if File.exist?( './monorepo.yml' )
21
+ './monorepo.yml'
22
+ elsif File.exist?( './monotree.yml' )
23
+ './monotree.yml'
24
+ elsif File.exist?( './repos.yml' )
25
+ './repos.yml'
26
+ else
27
+ puts "!! WARN: no mono configuration file (that is, {monorepo,monotree,repos}.yml) found in >#{Dir.getwd}<"
28
+ nil
29
+ end
30
+
31
+ if path
32
+ GitRepoSet.read( path )
33
+ else
34
+ GitRepoSet.new( {} ) ## return empty set -todo/check: return nil - why? why not?
10
35
  end
11
36
  end
12
37
 
@@ -0,0 +1,26 @@
1
+ module Mono
2
+
3
+ def self.env ## check environment setup
4
+ puts "Mono.root (MOPATH): >#{Mono.root}<"
5
+ puts "MonoCore.root: >#{MonoCore.root}<"
6
+ puts
7
+
8
+ ## add ruby version and path - why? why not? e.g.
9
+ ## ruby:
10
+ ## bin: C:/ri330/Ruby2.0.0/bin/ruby.exe
11
+ ## version: ruby 2.3.3p222 (2016-11-21 revision 56859) [i386-mingw32]
12
+
13
+ puts "git version:"
14
+ Git.version
15
+ ## Git.config( 'user.name' )
16
+ ## Git.config( 'user.email', show_origin: true )
17
+
18
+ ## dump/print all user.* settings e.g. user.name, user.email
19
+ Git.config( /user/, show_origin: true )
20
+
21
+ puts
22
+ puts "monorepo.yml:"
23
+ pp Mono.monofile
24
+ end
25
+
26
+ end # module Mono
@@ -0,0 +1,44 @@
1
+ module Mono
2
+
3
+ ## pass along hash of repos (e.g. monorepo.yml or repos.yml )
4
+ def self.fetch
5
+ repos = Mono.monofile
6
+
7
+ count_orgs = 0
8
+ count_repos = 0
9
+
10
+ total_repos = repos.size
11
+
12
+
13
+ repos.each do |org,names|
14
+
15
+ org_path = "#{Mono.root}/#{org}"
16
+
17
+ names.each do |name|
18
+ puts "[#{count_repos+1}/#{total_repos}] #{org}@#{name}..."
19
+
20
+ repo = GitHubRepo.new( org, name ) ## owner, name e.g. rubylibs/webservice
21
+
22
+ Dir.chdir( org_path ) do
23
+ if Dir.exist?( repo.name )
24
+ GitProject.open( repo.name ) do |proj|
25
+ proj.fetch
26
+ end
27
+ else
28
+ puts "!! repo not found / missing"
29
+ end
30
+ end
31
+
32
+ count_repos += 1
33
+ end
34
+ count_orgs += 1
35
+ end
36
+
37
+
38
+ ## print stats & changes summary
39
+ puts
40
+ print "#{count_repos} repo(s) @ #{count_orgs} org(s)"
41
+ print "\n"
42
+ end # method fetch
43
+
44
+ end # module Mono
@@ -0,0 +1,47 @@
1
+ module Mono
2
+
3
+ def self.run( *args )
4
+ ## todo/fix: use a "standard" argument to pass along hash of repos
5
+ ## (e.g. monorepo.yml or repos.yml ) how? - why? why not?
6
+ repos = Mono.monofile
7
+
8
+
9
+ cmd = args.join( ' ' )
10
+
11
+ count_orgs = 0
12
+ count_repos = 0
13
+
14
+ total_repos = repos.size
15
+
16
+ repos.each do |org,names|
17
+
18
+ org_path = "#{Mono.root}/#{org}"
19
+
20
+ names.each do |name|
21
+ puts "[#{count_repos+1}/#{total_repos}] #{org}@#{name}..."
22
+
23
+ repo = GitHubRepo.new( org, name ) ## owner, name e.g. rubylibs/webservice
24
+
25
+ Dir.chdir( org_path ) do
26
+ if Dir.exist?( repo.name )
27
+ GitProject.open( repo.name ) do |proj|
28
+ proj.run( cmd )
29
+ end
30
+ else
31
+ puts "!! repo not found / missing"
32
+ end
33
+ end
34
+
35
+ count_repos += 1
36
+ end
37
+ count_orgs += 1
38
+ end
39
+
40
+
41
+ ## print stats & changes summary
42
+ puts
43
+ print "#{count_repos} repo(s) @ #{count_orgs} org(s)"
44
+ print "\n"
45
+ end # method run
46
+
47
+ end # module Mono
@@ -1,25 +1,17 @@
1
-
2
-
3
1
  module Mono
4
2
 
5
3
  ## pass along hash of repos (e.g. monorepo.yml or repos.yml )
6
- def self.status( h=Mono.monofile )
4
+ def self.status
5
+ repos = Mono.monofile
6
+
7
7
  changes = [] ## track changes
8
8
 
9
9
  count_orgs = 0
10
10
  count_repos = 0
11
11
 
12
- ## sum up total number of repos
13
- total_repos = h.reduce(0) {|sum,(_,names)| sum+= names.size; sum }
14
-
15
-
16
- h.each do |org_with_counter,names|
12
+ total_repos = repos.size
17
13
 
18
- ## remove optional number from key e.g.
19
- ## mrhydescripts (3) => mrhydescripts
20
- ## footballjs (4) => footballjs
21
- ## etc.
22
- org = org_with_counter.sub( /\([0-9]+\)/, '' ).strip
14
+ repos.each do |org,names|
23
15
 
24
16
  org_path = "#{Mono.root}/#{org}"
25
17
 
@@ -30,8 +22,8 @@ module Mono
30
22
 
31
23
  Dir.chdir( org_path ) do
32
24
  if Dir.exist?( repo.name )
33
- GitRepo.open( repo.name ) do |git|
34
- output = git.changes
25
+ GitProject.open( repo.name ) do |proj|
26
+ output = proj.changes
35
27
  if output.empty?
36
28
  puts " - no changes -"
37
29
  else
@@ -0,0 +1,53 @@
1
+ module Mono
2
+
3
+ ## pass along hash of repos (e.g. monorepo.yml or repos.yml )
4
+ def self.sync
5
+ repos = Mono.monofile
6
+
7
+ count_orgs = 0
8
+ count_repos = 0
9
+
10
+ total_repos = repos.size
11
+
12
+ repos.each do |org,names|
13
+ org_path = "#{Mono.root}/#{org}"
14
+ FileUtils.mkdir_p( org_path ) unless Dir.exist?( org_path ) ## make sure path exists
15
+
16
+ names.each do |name|
17
+ puts "[#{count_repos+1}/#{total_repos}] #{org}@#{name}..."
18
+
19
+ repo = GitHubRepo.new( org, name ) ## owner, name e.g. rubylibs/webservice
20
+
21
+ Dir.chdir( org_path ) do
22
+ if Dir.exist?( repo.name )
23
+ GitProject.open( repo.name ) do |proj|
24
+ if proj.changes?
25
+ puts "!! WARN - local changes in workdir; skipping fast forward (remote) sync / merge"
26
+ else
27
+ proj.fast_forward ## note: use git pull --ff-only (fast forward only - do NOT merge)
28
+ end
29
+ end
30
+ else
31
+ Git.clone( repo.ssh_clone_url )
32
+ end
33
+ end
34
+
35
+ #
36
+ # todo/fix: add (back) error log !!!!!!!!!!!!
37
+ # rescue GitError => ex
38
+ # puts "!! ERROR: #{ex.message}"
39
+ #
40
+ # File.open( './errors.log', 'a' ) do |f|
41
+ # f.write "#{Time.now} -- repo #{org}/#{name} - #{ex.message}\n"
42
+ # end
43
+
44
+ count_repos += 1
45
+ end
46
+ count_orgs += 1
47
+ end
48
+
49
+ ## print stats
50
+ puts "#{count_repos} repo(s) @ #{count_orgs} org(s)"
51
+ end # method sync
52
+
53
+ end # module Mono
@@ -15,13 +15,19 @@ class Tool
15
15
 
16
16
  ## note: allow shortcut for commands
17
17
  case cmd.downcase
18
- when 'status', 'stati', 'stat', 's'
18
+ when 'status', 'stati', 'stat', 'st', 's'
19
19
  Mono.status
20
20
  when 'sync', 'syn', 'sy', ## note: allow aliases such as install, get & up too
21
21
  'get', 'g',
22
22
  'install', 'insta', 'inst', 'ins', 'i',
23
23
  'up', 'u'
24
24
  Mono.sync
25
+ when 'fetch', 'f'
26
+ Mono.fetch
27
+ when 'env', 'e'
28
+ Mono.env
29
+ when 'run', 'r', 'exec'
30
+ Mono.run( args )
25
31
  else
26
32
  puts "!! ERROR: unknown command >#{cmd}<"
27
33
  exit 1
@@ -1,25 +1,33 @@
1
1
  ## note: use a different module/namespace
2
- ## for the gem version info e.g. Mono::Module vs Mono
2
+ ## for the gem version info e.g. MonoCore vs Mono
3
3
 
4
- module Mono
5
- module Module
4
+ module MonoCore ## todo/check: rename to MonoMeta, MonoModule or such - why? why not?
5
+
6
+ ## note: move root to its own namespace to avoid
7
+ ## conflict with Mono.root!!!!
8
+ MAJOR = 0 ## todo: namespace inside version or something - why? why not??
9
+ MINOR = 3
10
+ PATCH = 0
11
+ VERSION = [MAJOR,MINOR,PATCH].join('.')
12
+
13
+ def self.version
14
+ VERSION
15
+ end
6
16
 
7
- MAJOR = 0 ## todo: namespace inside version or something - why? why not??
8
- MINOR = 1
9
- PATCH = 0
10
- VERSION = [MAJOR,MINOR,PATCH].join('.')
17
+ def self.banner
18
+ "monos/#{VERSION} on Ruby #{RUBY_VERSION} (#{RUBY_RELEASE_DATE}) [#{RUBY_PLATFORM}]"
19
+ end
11
20
 
12
- def self.version
13
- VERSION
14
- end
21
+ def self.root
22
+ File.expand_path( File.dirname(File.dirname(__FILE__) ))
23
+ end
15
24
 
16
- def self.banner
17
- "monos/#{VERSION} on Ruby #{RUBY_VERSION} (#{RUBY_RELEASE_DATE}) [#{RUBY_PLATFORM}]"
18
- end
25
+ end # module MonoCore
19
26
 
20
- def self.root
21
- File.expand_path( File.dirname(File.dirname(__FILE__) ))
22
- end
23
27
 
24
- end # module Module
25
- end # module Mono
28
+ ##################################
29
+ # add a convenience shortcut for now - why? why not?
30
+ module Mono
31
+ VERSION = MonoCore::VERSION
32
+ end
33
+
@@ -0,0 +1,106 @@
1
+ ########
2
+ ##
3
+ # fix:
4
+ # move to sportdb/setup or sportdb/boot ?
5
+ # use module SportDb::Boot
6
+
7
+
8
+
9
+ ##########
10
+ # setup load path
11
+ # lets you use environments
12
+ # e.g. dev/development or production
13
+
14
+
15
+ ## todo/fix: move later app/gem-family/-specific configs
16
+ ## to its own gem e.g. mono-sportdb or sportdb-boot/starter/startup or such - why? why not?
17
+
18
+
19
+
20
+
21
+
22
+ $RUBYLIBS_DEBUG = true
23
+ $RUBYCOCO_DEBUG = true ## always include (NOT just in sportdb?)
24
+
25
+
26
+ ### include / check for ruby debug flag too - why? why not?
27
+ def debug? ## always include (NOT just insportdb?)
28
+ value = ENV['DEBUG']
29
+ if value && ['true', 't',
30
+ 'yes', 'y',
31
+ 'on'].include?( value.downcase )
32
+ true
33
+ else
34
+ false
35
+ end
36
+ end
37
+
38
+
39
+ require_relative '../mono'
40
+
41
+
42
+
43
+ ## convenience pre-configured/pre-built shortcut - lets you use
44
+ ## require 'sportdb/setup'
45
+ ## SportDb::Boot.setup
46
+
47
+
48
+ module SportDb
49
+ module Boot
50
+ def self.root() Mono.root; end
51
+
52
+ def self.setup ## setup load path
53
+ ### note: for now always assume dev/development
54
+ ### add ENV check later or pass in as args or such
55
+
56
+ puts "SportDb::Boot.root: >#{root}<"
57
+
58
+ ### todo/fix: use an inline Gemfile and bundler's setup? why? why not?
59
+ $LOAD_PATH.unshift( "#{root}/yorobot/sport.db.more/sportdb-exporters/lib" )
60
+ $LOAD_PATH.unshift( "#{root}/yorobot/sport.db.more/sportdb-writers/lib" )
61
+ $LOAD_PATH.unshift( "#{root}/yorobot/sport.db.more/sportdb-linters/lib" )
62
+
63
+ $LOAD_PATH.unshift( "#{root}/sportdb/sport.db/sports/lib" )
64
+
65
+ $LOAD_PATH.unshift( "#{root}/sportdb/sport.db/sportdb-importers/lib" )
66
+ $LOAD_PATH.unshift( "#{root}/sportdb/sport.db/sportdb-readers/lib" )
67
+ $LOAD_PATH.unshift( "#{root}/sportdb/sport.db/sportdb-sync/lib" )
68
+ $LOAD_PATH.unshift( "#{root}/sportdb/sport.db/sportdb-models/lib" )
69
+ $LOAD_PATH.unshift( "#{root}/sportdb/sport.db/sportdb-catalogs/lib" )
70
+
71
+ ## todo/check:
72
+ ## add fifa, footballdb-leagues, footballdb-clubs too ???
73
+ $LOAD_PATH.unshift( "#{root}/sportdb/football.db/footballdb-clubs/lib" ))
74
+ $LOAD_PATH.unshift( "#{root}/sportdb/football.db/footballdb-leagues/lib" ))
75
+ $LOAD_PATH.unshift( "#{root}/sportdb/football.db/fifa/lib" ))
76
+
77
+ $LOAD_PATH.unshift( "#{root}/sportdb/sport.db/sportdb-formats/lib" )
78
+ $LOAD_PATH.unshift( "#{root}/sportdb/sport.db/sportdb-structs/lib" )
79
+ $LOAD_PATH.unshift( "#{root}/sportdb/sport.db/sportdb-langs/lib" )
80
+ $LOAD_PATH.unshift( "#{root}/sportdb/sport.db/score-formats/lib" )
81
+ $LOAD_PATH.unshift( "#{root}/sportdb/sport.db/date-formats/lib" )
82
+ $LOAD_PATH.unshift( "#{root}/sportdb/sport.db/alphabets/lib" )
83
+
84
+ pp $: # print load path
85
+ end # method setup
86
+ end # module Boot
87
+ end # module Sportdb
88
+
89
+
90
+ ### use something like SportDb::Path[:sportdb]
91
+ ## SportDb.path( :sportdb )
92
+ ## SportDb::Boot.sportdb_path or sportdb_dir or such???
93
+ ## SportDb::Env.path( 'sportdb' ) ???
94
+ ## SportDb::Env::SPORTDB_DIR ???
95
+ ## or such - why? why not?
96
+ ##
97
+ ## check rails path setup / style ???
98
+
99
+ SPORTDB_DIR = "#{SportDb::Boot.root}/sportdb" # path to libs
100
+ OPENFOOTBALL_DIR = "#{SportDb::Boot.root}/openfootball"
101
+ ## add more "standard" dirs - why? why not? - why? why not?
102
+ ## use
103
+ ## module SportDb::Source / Code / Boot or such????
104
+ ##
105
+ ## use module SportDb::Boot - yes, yes, yes - why? why not?
106
+
@@ -6,14 +6,45 @@ require 'helper'
6
6
 
7
7
  class TestBase < MiniTest::Test
8
8
 
9
+ Git = Mono::Git
10
+
9
11
  def test_version
10
- puts Mono::Module::VERSION
11
- puts Mono::Module.banner
12
- puts Mono::Module.root
12
+ puts MonoCore::VERSION
13
+ puts MonoCore.banner
14
+ puts MonoCore.root
15
+
16
+ puts Mono::VERSION
13
17
  end
14
18
 
15
19
  def test_root
16
- puts Mono.root
20
+ puts Mono.root
21
+ end
22
+
23
+ def test_env
24
+ puts Mono.env
25
+ end
26
+
27
+
28
+ def test_git_config
29
+ puts "---"
30
+ Git.config( 'user.name' )
31
+ Git.config( 'user.name', show_origin: true )
32
+ # Git.config( 'user.name', show_scope: true )
33
+
34
+ puts "---"
35
+ Git.config( /user/ ) ## note: pass in regex for regex match/search
36
+ Git.config( /user/, show_origin: true )
37
+ # Git.config( /user/, show_scope: true )
38
+
39
+ puts "---"
40
+ Git.config( /user\./ ) ## note: pass in regex for regex match/search
41
+
42
+ puts "---"
43
+ ## note: if NOT found Mono::Git.config will exit(1) !!!
44
+ ## Mono::Git.config( /proxy/, show_origin: true )
45
+ ## Mono::Git.config( /http/, show_origin: true )
46
+
47
+ puts "---"
17
48
  end
18
49
 
19
50
  end # class TestBase
metadata CHANGED
@@ -1,15 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: monos
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Gerald Bauer
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-09-01 00:00:00.000000000 Z
11
+ date: 2020-09-06 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: gitti
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: 0.4.0
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: 0.4.0
13
27
  - !ruby/object:Gem::Dependency
14
28
  name: rdoc
15
29
  requirement: !ruby/object:Gem::Requirement
@@ -38,11 +52,10 @@ dependencies:
38
52
  - - "~>"
39
53
  - !ruby/object:Gem::Version
40
54
  version: '3.16'
41
- description: monos - tools and (startup) scripts for mono source trees / monorepos
55
+ description: monos - monorepo / mono source tree tools and (startup) scripts
42
56
  email: opensport@googlegroups.com
43
57
  executables:
44
58
  - mo
45
- - moget
46
59
  - mono
47
60
  extensions: []
48
61
  extra_rdoc_files:
@@ -55,17 +68,18 @@ files:
55
68
  - README.md
56
69
  - Rakefile
57
70
  - bin/mo
58
- - bin/moget
59
71
  - bin/mono
60
72
  - lib/mono.rb
61
73
  - lib/mono/base.rb
62
- - lib/mono/git/base.rb
63
- - lib/mono/git/status.rb
64
- - lib/mono/git/sync.rb
65
- - lib/mono/git/tool.rb
66
- - lib/mono/sportdb.rb
74
+ - lib/mono/commands/env.rb
75
+ - lib/mono/commands/fetch.rb
76
+ - lib/mono/commands/run.rb
77
+ - lib/mono/commands/status.rb
78
+ - lib/mono/commands/sync.rb
79
+ - lib/mono/tool.rb
67
80
  - lib/mono/version.rb
68
81
  - lib/monos.rb
82
+ - lib/sportdb/setup.rb
69
83
  - test/helper.rb
70
84
  - test/test_base.rb
71
85
  homepage: https://github.com/sportdb/sport.db
@@ -93,5 +107,5 @@ rubyforge_project:
93
107
  rubygems_version: 2.5.2
94
108
  signing_key:
95
109
  specification_version: 4
96
- summary: monos - tools and (startup) scripts for mono source trees / monorepos
110
+ summary: monos - monorepo / mono source tree tools and (startup) scripts
97
111
  test_files: []
data/bin/moget DELETED
@@ -1,17 +0,0 @@
1
- #!/usr/bin/env ruby
2
-
3
- ###################
4
- # DEV TIPS:
5
- #
6
- # For local testing run like:
7
- #
8
- # ruby -Ilib bin/moget
9
- #
10
- # Set the executable bit in Linux. Example:
11
- #
12
- # % chmod a+x bin/moget
13
- #
14
-
15
- require 'mono'
16
-
17
- Mono::Tool.main( ['sync'] )
@@ -1,174 +0,0 @@
1
-
2
- class GitError < StandardError
3
- end
4
-
5
- class Git ## make Git a module - why? why not?
6
-
7
- ###
8
- ## todo/fix: change opts=nil to *args or such - why? why not?
9
-
10
-
11
- ###############
12
- ## "setup" starter git commands
13
-
14
- def self.clone( repo, name=nil )
15
- cmd = "git clone #{repo}"
16
- cmd << " #{name}" unless name.nil? || name.empty?
17
- Shell.run( cmd )
18
- end
19
-
20
- def self.mirror( repo )
21
- cmd = "git clone --mirror #{repo}"
22
- Shell.run( cmd )
23
- end
24
-
25
-
26
- #################
27
- ## standard git commands
28
-
29
- def self.version
30
- cmd = 'git --version'
31
- Shell.run( cmd )
32
- end
33
-
34
- def self.status( short: false )
35
- cmd = 'git status'
36
- cmd << " --short" if short
37
- Shell.run( cmd )
38
- end
39
-
40
- def self.changes ## same as git status --short - keep shortcut / alias - why? why not?
41
- ## returns changed files - one per line or empty if no changes
42
- cmd = 'git status --short'
43
- Shell.run( cmd )
44
- end
45
-
46
- #####################
47
- ## status helpers
48
-
49
- ## git status --short returns empty stdout/list
50
- def self.clean?() changes.empty?; end
51
-
52
- def self.changes?() clean? == false; end ## reverse of clean?
53
- class << self
54
- alias_method :dirty?, :changes? ## add alias
55
- end
56
-
57
-
58
- #######
59
- ## more (major) git commands
60
-
61
- def self.pull
62
- cmd = 'git pull'
63
- Shell.run( cmd )
64
- end
65
-
66
- def self.fast_forward
67
- cmd = 'git pull --ff-only'
68
- Shell.run( cmd )
69
- end
70
- class << self
71
- alias_method :ff, :fast_forward ## add alias
72
- end
73
-
74
-
75
- def self.push
76
- cmd = 'git push'
77
- Shell.run( cmd )
78
- end
79
-
80
- def self.add( pathspec=nil ) ## e.g. git add . or git add *.rb or such
81
- cmd = 'git add'
82
- cmd << " #{pathspec}" unless pathspec.nil? || pathspec.empty?
83
- Shell.run( cmd )
84
- end
85
-
86
- def self.add_all
87
- cmd = 'git add --all'
88
- Shell.run( cmd )
89
- end
90
-
91
- def self.commit( message: )
92
- cmd = 'git commit'
93
- cmd << %Q{ -m "#{message}"} unless message.nil? || message.empty?
94
- Shell.run( cmd )
95
- end
96
-
97
-
98
- ###
99
- # use nested class for "base" for running commands - why? why not?
100
- class Shell
101
- def self.run( cmd )
102
- print "cmd exec >#{cmd}<..."
103
- stdout, stderr, status = Open3.capture3( cmd )
104
-
105
- if status.success?
106
- print " OK"
107
- print "\n"
108
- else
109
- print " FAIL (#{status.exitstatus})"
110
- print "\n"
111
- end
112
-
113
- unless stdout.empty?
114
- puts stdout
115
- end
116
-
117
- unless stderr.empty?
118
- ## todo/check: or use >2: or &2: or such
119
- ## stderr output not always an error (that is, exit status might be 0)
120
- puts "STDERR:"
121
- puts stderr
122
- end
123
-
124
- if status.success?
125
- stdout # return stdout string
126
- else
127
- puts "!! ERROR: cmd exec >#{cmd}< failed with exit status #{status.exitstatus}:"
128
- puts stderr
129
- raise GitError, "git cmd exec >#{cmd}< failed with exit status #{status.exitstatus}<: #{stderr}"
130
- end
131
- end
132
- end # class Shell
133
-
134
- end # class Git
135
-
136
-
137
-
138
- class GitRepo
139
- def self.open( path, &blk )
140
- new( path ).open( &blk )
141
- end
142
-
143
- def initialize( path )
144
- raise ArgumentError, "dir >#{path}< not found; dir MUST already exist for GitRepo class - sorry" unless Dir.exist?( path )
145
- @path = path
146
- end
147
-
148
- def open( &blk )
149
- ## puts "Dir.getwd: #{Dir.getwd}"
150
- Dir.chdir( @path ) do
151
- blk.call( self )
152
- end
153
- ## puts "Dir.getwd: #{Dir.getwd}"
154
- end
155
-
156
-
157
- def status( short: false ) Git.status( short: short ); end
158
- def changes() Git.changes; end
159
- def clean?() Git.clean?; end
160
- def changes?() Git.changes?; end
161
- alias_method :dirty?, :changes?
162
-
163
- def pull() Git.pull; end
164
- def fast_forward() Git.fast_forward; end
165
- alias_method :ff, :fast_forward
166
-
167
- def push() Git.push; end
168
-
169
- def add( pathspec ) Git.add( pathspec ); end
170
- def add_all() Git.add_all; end
171
- def commit( message: ) Git.commit( message: message ); end
172
-
173
-
174
- end # class GitRepo
@@ -1,98 +0,0 @@
1
-
2
-
3
- class GitHubRepo ## todo: change to GitHubRepoRef or such - why? why not?
4
- attr_reader :owner, :name
5
-
6
- def initialize( owner, name )
7
- @owner = owner ## use/rename to login or something - why? why not??
8
- @name = name # e.g. "rubylibs/webservice"
9
- end
10
-
11
- def ssh_clone_url
12
- ## check: use https: as default? for github - http:// still supported? or redirected?
13
- ## "http://github.com/#{@owner}/#{@name}"
14
- "git@github.com:#{@owner}/#{@name}.git"
15
- end
16
- end ## class GitHubRepo
17
-
18
-
19
-
20
- module Mono
21
-
22
- def self.monofile
23
- path = if File.exist?( './monorepo.yml' )
24
- './monorepo.yml'
25
- elsif File.exist?( './monotree.yml' )
26
- './monotree.yml'
27
- elsif File.exist?( './repos.yml' )
28
- './repos.yml'
29
- else
30
- puts "!! WARN: no mo|moget|mono configuration file (that is, monorepo|monotree|repos.yml) found in >#{Dir.getwd}<"
31
- nil
32
- end
33
-
34
- if path
35
- YAML.load_file( path )
36
- else
37
- {}
38
- end
39
- end
40
-
41
-
42
- ## pass along hash of repos (e.g. monorepo.yml or repos.yml )
43
- def self.sync( h=Mono.monofile )
44
- count_orgs = 0
45
- count_repos = 0
46
-
47
- ## sum up total number of repos
48
- total_repos = h.reduce(0) {|sum,(_,names)| sum+= names.size; sum }
49
-
50
- h.each do |org_with_counter,names|
51
-
52
- ## remove optional number from key e.g.
53
- ## mrhydescripts (3) => mrhydescripts
54
- ## footballjs (4) => footballjs
55
- ## etc.
56
- org = org_with_counter.sub( /\([0-9]+\)/, '' ).strip
57
-
58
- org_path = "#{Mono.root}/#{org}"
59
- FileUtils.mkdir_p( org_path ) unless Dir.exist?( org_path ) ## make sure path exists
60
-
61
- names.each do |name|
62
- puts "[#{count_repos+1}/#{total_repos}] #{org}@#{name}..."
63
-
64
- repo = GitHubRepo.new( org, name ) ## owner, name e.g. rubylibs/webservice
65
-
66
- Dir.chdir( org_path ) do
67
- if Dir.exist?( repo.name )
68
- GitRepo.open( repo.name ) do |git|
69
- if git.changes?
70
- puts "!! WARN - local changes in workdir; skipping fast forward (remote) sync / merge"
71
- else
72
- git.fast_forward ## note: use git pull --ff-only (fast forward only - do NOT merge)
73
- end
74
- end
75
- else
76
- Git.clone( repo.ssh_clone_url )
77
- end
78
- end
79
-
80
- #
81
- # todo/fix: add (back) error log !!!!!!!!!!!!
82
- # rescue GitError => ex
83
- # puts "!! ERROR: #{ex.message}"
84
- #
85
- # File.open( './errors.log', 'a' ) do |f|
86
- # f.write "#{Time.now} -- repo #{org}/#{name} - #{ex.message}\n"
87
- # end
88
-
89
- count_repos += 1
90
- end
91
- count_orgs += 1
92
- end
93
-
94
- ## print stats
95
- puts "#{count_repos} repo(s) @ #{count_orgs} org(s)"
96
- end # method sync
97
-
98
- end # module Mono
@@ -1,61 +0,0 @@
1
- ##########
2
- # setup load path
3
- # lets you use environments
4
- # e.g. dev/development or production
5
-
6
-
7
- ## todo/fix: move later app/gem-family/-specific configs
8
- ## to its own gem e.g. mono-sportdb or such - why? why not?
9
-
10
-
11
-
12
- require_relative '../mono'
13
-
14
-
15
- ## convenience pre-configured/pre-built shortcut - lets you use
16
- ## require 'mono/sportdb'
17
- ## Mono.setup
18
-
19
-
20
- module Mono
21
- def self.setup ## setup load path
22
- ### note: for now always assume dev/development
23
- ### add ENV check later or pass in as args or such
24
-
25
- puts "Mono.root: >#{root}<"
26
-
27
- $LOAD_PATH.unshift( "#{root}/yorobot/sport.db.more/sportdb-exporters/lib" )
28
- $LOAD_PATH.unshift( "#{root}/yorobot/sport.db.more/sportdb-writers/lib" )
29
- $LOAD_PATH.unshift( "#{root}/yorobot/sport.db.more/sportdb-linters/lib" )
30
-
31
- $LOAD_PATH.unshift( "#{root}/sportdb/sport.db/sports/lib" )
32
-
33
- $LOAD_PATH.unshift( "#{root}/sportdb/sport.db/sportdb-importers/lib" )
34
- ## todo - add readers, models, sync, etc.
35
-
36
- $LOAD_PATH.unshift( "#{root}/sportdb/sport.db/sportdb-catalogs/lib" )
37
- $LOAD_PATH.unshift( "#{root}/sportdb/sport.db/sportdb-formats/lib" )
38
- $LOAD_PATH.unshift( "#{root}/sportdb/sport.db/sportdb-structs/lib" )
39
- $LOAD_PATH.unshift( "#{root}/sportdb/sport.db/sportdb-langs/lib" )
40
- $LOAD_PATH.unshift( "#{root}/sportdb/sport.db/score-formats/lib" )
41
- $LOAD_PATH.unshift( "#{root}/sportdb/sport.db/date-formats/lib" )
42
-
43
-
44
- pp $: # print load path
45
- end
46
- end # module Mono
47
-
48
-
49
- ## todo/fix:
50
- ## use
51
- ## module Starter
52
- ## module SportDb
53
- ## def setup ...
54
- ## end
55
- ## end
56
- ##
57
- ## or such? and use Mono.extend - why? why not?
58
- ## module Mono
59
- ## extend Starter::SportDb
60
- ## end
61
-