monos 0.5.0 → 0.6.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 +1 -0
- data/Rakefile +1 -1
- data/lib/mono.rb +2 -2
- data/lib/mono/base.rb +103 -6
- data/lib/mono/commands/fetch.rb +2 -3
- data/lib/mono/commands/run.rb +2 -2
- data/lib/mono/commands/status.rb +2 -2
- data/lib/mono/commands/sync.rb +3 -3
- data/lib/mono/experimental.rb +104 -0
- data/lib/mono/version.rb +1 -1
- metadata +5 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a2b5768d1c5b1f9862099eb5d67e7c574561f256
|
4
|
+
data.tar.gz: e257ffe48bab62974a02b76443e0d0c4aad563af
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 63f482ee7c5696cff694e57a22efc2a187a20a074e10c651bbd272acedb03104a8646464fe0386cea3bb71f0e532b7f039ebcec9301c185437ca23ac6bfffad0
|
7
|
+
data.tar.gz: 4d6213f4928e6abcb3809101f7b7d299eeaf24c51edeee8424f497bdeed6b3e7406127472e3639eb6efb719d4d98f98663a93b59c77634130074b2053cfc66be
|
data/Manifest.txt
CHANGED
data/Rakefile
CHANGED
data/lib/mono.rb
CHANGED
@@ -18,8 +18,9 @@ end
|
|
18
18
|
|
19
19
|
###
|
20
20
|
# our own code
|
21
|
-
require 'mono/version'
|
21
|
+
require 'mono/version' # let version always go first
|
22
22
|
require 'mono/base'
|
23
|
+
require 'mono/experimental'
|
23
24
|
|
24
25
|
require 'mono/commands/status'
|
25
26
|
require 'mono/commands/fetch'
|
@@ -30,5 +31,4 @@ require 'mono/commands/run'
|
|
30
31
|
require 'mono/tool'
|
31
32
|
|
32
33
|
|
33
|
-
|
34
34
|
puts MonoCore.banner # say hello
|
data/lib/mono/base.rb
CHANGED
@@ -7,8 +7,9 @@ module Mono
|
|
7
7
|
## check if windows - otherwise use /sites
|
8
8
|
## check if root directory exists?
|
9
9
|
if ENV['MOPATH']
|
10
|
-
|
11
|
-
|
10
|
+
## use expand path to make (assure) absolute path - why? why not?
|
11
|
+
::File.expand_path( ENV['MOPATH'] )
|
12
|
+
elsif ::Dir.exist?( 'C:/Sites' )
|
12
13
|
'C:/Sites'
|
13
14
|
else
|
14
15
|
'/sites'
|
@@ -16,12 +17,20 @@ module Mono
|
|
16
17
|
end
|
17
18
|
end
|
18
19
|
|
20
|
+
def self.root=( path )
|
21
|
+
## use expand path to make (assure) absolute path - why? why not?
|
22
|
+
@@root = ::File.expand_path( path )
|
23
|
+
end
|
24
|
+
|
25
|
+
|
26
|
+
|
27
|
+
|
19
28
|
def self.monofile
|
20
|
-
path = if File.exist?( './monorepo.yml' )
|
29
|
+
path = if ::File.exist?( './monorepo.yml' )
|
21
30
|
'./monorepo.yml'
|
22
|
-
elsif File.exist?( './monotree.yml' )
|
31
|
+
elsif ::File.exist?( './monotree.yml' )
|
23
32
|
'./monotree.yml'
|
24
|
-
elsif File.exist?( './repos.yml' )
|
33
|
+
elsif ::File.exist?( './repos.yml' )
|
25
34
|
'./repos.yml'
|
26
35
|
else
|
27
36
|
puts "!! WARN: no mono configuration file (that is, {monorepo,monotree,repos}.yml) found in >#{Dir.getwd}<"
|
@@ -34,7 +43,95 @@ module Mono
|
|
34
43
|
GitRepoSet.new( {} ) ## return empty set -todo/check: return nil - why? why not?
|
35
44
|
end
|
36
45
|
end
|
37
|
-
|
38
46
|
end ## module Mono
|
39
47
|
|
40
48
|
|
49
|
+
|
50
|
+
|
51
|
+
#####################
|
52
|
+
# add file and repo helper
|
53
|
+
|
54
|
+
##
|
55
|
+
## todo/fix: ALWAYS assert name format
|
56
|
+
## (rename to mononame and monopath) - why? why not?
|
57
|
+
|
58
|
+
class MonoGitHub
|
59
|
+
def self.clone( name )
|
60
|
+
path = MonoFile.expand_path( name )
|
61
|
+
|
62
|
+
org_path = File.dirname( path )
|
63
|
+
FileUtils.mkdir_p( org_path ) unless Dir.exist?( org_path ) ## make sure path exists
|
64
|
+
|
65
|
+
### note: use a github clone url (using ssh) like:
|
66
|
+
## git@github.com:rubycoco/gitti.git
|
67
|
+
ssh_clone_url = "git@github.com:#{name}.git"
|
68
|
+
|
69
|
+
Dir.chdir( org_path ) do
|
70
|
+
Gitti::Git.clone( ssh_clone_url )
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
MonoGithub = MonoGitHub ## add convenience (typo?) alias
|
75
|
+
|
76
|
+
|
77
|
+
|
78
|
+
class MonoGitProject
|
79
|
+
def self.open( name, &block )
|
80
|
+
path = MonoFile.expand_path( name )
|
81
|
+
Gitti::GitProject.open( path, &block )
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
|
86
|
+
module Mono
|
87
|
+
## add some short cuts
|
88
|
+
def self.open( name, &block ) MonoGitProject.open( name, &block ); end
|
89
|
+
def self.clone( name ) MonoGitHub.clone( name ); end
|
90
|
+
end
|
91
|
+
|
92
|
+
|
93
|
+
|
94
|
+
class MonoFile
|
95
|
+
## e.g. openfootball/austria etc.
|
96
|
+
## expand to to "real" absolute path
|
97
|
+
##
|
98
|
+
## todo/check: assert name must be {orgname,username}/reponame
|
99
|
+
def self.expand_path( path )
|
100
|
+
"#{Mono.root}/#{path}"
|
101
|
+
end
|
102
|
+
def self.exist?( path )
|
103
|
+
::File.exist?( expand_path( path ))
|
104
|
+
end
|
105
|
+
|
106
|
+
|
107
|
+
## add some aliases - why? why not?
|
108
|
+
class << self
|
109
|
+
alias_method :real_path, :expand_path
|
110
|
+
alias_method :exists?, :exist? ## add deprecated exists? too - why? why not?
|
111
|
+
end
|
112
|
+
|
113
|
+
|
114
|
+
|
115
|
+
## path always relative to Mono.root
|
116
|
+
## todo/fix: use File.expand_path( path, Mono.root ) - why? why not?
|
117
|
+
## or always enfore "absolut" path e.g. do NOT allow ../ or ./ or such
|
118
|
+
def self.open( path, mode='r:utf-8', &block )
|
119
|
+
full_path = "#{Mono.root}/#{path}"
|
120
|
+
## make sure path exists if we open for writing/appending - why? why not?
|
121
|
+
if mode[0] == 'w' || mode[0] == 'a'
|
122
|
+
::FileUtils.mkdir_p( ::File.dirname( full_path ) ) ## make sure path exists
|
123
|
+
end
|
124
|
+
|
125
|
+
::File.open( full_path, mode ) do |file|
|
126
|
+
block.call( file )
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
def self.read_utf8( path )
|
131
|
+
open( path, 'r:utf-8') { |file| file.read }
|
132
|
+
end
|
133
|
+
end ## class MonoFile
|
134
|
+
|
135
|
+
|
136
|
+
|
137
|
+
|
data/lib/mono/commands/fetch.rb
CHANGED
@@ -1,5 +1,4 @@
|
|
1
1
|
module Mono
|
2
|
-
|
3
2
|
## pass along hash of repos (e.g. monorepo.yml or repos.yml )
|
4
3
|
def self.fetch
|
5
4
|
repos = Mono.monofile
|
@@ -19,8 +18,8 @@ module Mono
|
|
19
18
|
|
20
19
|
repo = GitHubRepo.new( org, name ) ## owner, name e.g. rubylibs/webservice
|
21
20
|
|
22
|
-
Dir.chdir( org_path ) do
|
23
|
-
if Dir.exist?( repo.name )
|
21
|
+
::Dir.chdir( org_path ) do
|
22
|
+
if ::Dir.exist?( repo.name )
|
24
23
|
GitProject.open( repo.name ) do |proj|
|
25
24
|
proj.fetch
|
26
25
|
end
|
data/lib/mono/commands/run.rb
CHANGED
@@ -22,8 +22,8 @@ module Mono
|
|
22
22
|
|
23
23
|
repo = GitHubRepo.new( org, name ) ## owner, name e.g. rubylibs/webservice
|
24
24
|
|
25
|
-
Dir.chdir( org_path ) do
|
26
|
-
if Dir.exist?( repo.name )
|
25
|
+
::Dir.chdir( org_path ) do
|
26
|
+
if ::Dir.exist?( repo.name )
|
27
27
|
GitProject.open( repo.name ) do |proj|
|
28
28
|
proj.run( cmd )
|
29
29
|
end
|
data/lib/mono/commands/status.rb
CHANGED
@@ -20,8 +20,8 @@ module Mono
|
|
20
20
|
|
21
21
|
repo = GitHubRepo.new( org, name ) ## owner, name e.g. rubylibs/webservice
|
22
22
|
|
23
|
-
Dir.chdir( org_path ) do
|
24
|
-
if Dir.exist?( repo.name )
|
23
|
+
::Dir.chdir( org_path ) do
|
24
|
+
if ::Dir.exist?( repo.name )
|
25
25
|
GitProject.open( repo.name ) do |proj|
|
26
26
|
output = proj.changes
|
27
27
|
if output.empty?
|
data/lib/mono/commands/sync.rb
CHANGED
@@ -11,15 +11,15 @@ module Mono
|
|
11
11
|
|
12
12
|
repos.each do |org,names|
|
13
13
|
org_path = "#{Mono.root}/#{org}"
|
14
|
-
FileUtils.mkdir_p( org_path ) unless Dir.exist?( org_path ) ## make sure path exists
|
14
|
+
::FileUtils.mkdir_p( org_path ) unless ::Dir.exist?( org_path ) ## make sure path exists
|
15
15
|
|
16
16
|
names.each do |name|
|
17
17
|
puts "[#{count_repos+1}/#{total_repos}] #{org}@#{name}..."
|
18
18
|
|
19
19
|
repo = GitHubRepo.new( org, name ) ## owner, name e.g. rubylibs/webservice
|
20
20
|
|
21
|
-
Dir.chdir( org_path ) do
|
22
|
-
if Dir.exist?( repo.name )
|
21
|
+
::Dir.chdir( org_path ) do
|
22
|
+
if ::Dir.exist?( repo.name )
|
23
23
|
GitProject.open( repo.name ) do |proj|
|
24
24
|
if proj.changes?
|
25
25
|
puts "!! WARN - local changes in workdir; skipping fast forward (remote) sync / merge"
|
@@ -0,0 +1,104 @@
|
|
1
|
+
##############
|
2
|
+
# experimental stuff
|
3
|
+
#
|
4
|
+
|
5
|
+
module Mono
|
6
|
+
|
7
|
+
######################
|
8
|
+
### lint/print mono (source) tree
|
9
|
+
### - check for git repos (via .git/ dir)
|
10
|
+
#
|
11
|
+
# turn into
|
12
|
+
# - tree or
|
13
|
+
# - lint or
|
14
|
+
# - doctor or
|
15
|
+
# - check or such command - why? why not?
|
16
|
+
def self.walk( path=root)
|
17
|
+
repos = walk_dir( path )
|
18
|
+
repos
|
19
|
+
end
|
20
|
+
|
21
|
+
|
22
|
+
###############
|
23
|
+
# private helpers
|
24
|
+
private
|
25
|
+
|
26
|
+
## todo/check - use max_depth or max_level or such - why? why not?
|
27
|
+
def self.walk_dir( path, repos=[], level=1, depth: nil )
|
28
|
+
entries = ::Dir.entries(path)
|
29
|
+
|
30
|
+
## filter dirs
|
31
|
+
dirs = entries.select do |entry|
|
32
|
+
if ['..', '.'].include?( entry ) ## first check for excludes
|
33
|
+
false
|
34
|
+
else
|
35
|
+
full_path = ::File.join( path, entry )
|
36
|
+
::File.directory?( full_path )
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
if dirs.size == 0 ## shortcircuit - no dirs in dir
|
41
|
+
return repos
|
42
|
+
end
|
43
|
+
|
44
|
+
repos_count = 0 ## note: local (only) repos count
|
45
|
+
warns_count = 0
|
46
|
+
sub_dirs = []
|
47
|
+
|
48
|
+
|
49
|
+
|
50
|
+
buf = String.new('') ## use an output buffer (allows optional print)
|
51
|
+
|
52
|
+
|
53
|
+
buf << ">#{path}< - level #{level}:\n"
|
54
|
+
dirs.each do |entry|
|
55
|
+
next if ['..', '.', '.git'].include?( entry )
|
56
|
+
full_path = ::File.join( path, entry )
|
57
|
+
|
58
|
+
if ::Dir.exist?( ::File.join( full_path, '.git' ))
|
59
|
+
repos_count += 1
|
60
|
+
|
61
|
+
if level == 1
|
62
|
+
warns_count += 1
|
63
|
+
buf << "!! WARN - top-level repo (w/o user/org) >#{entry}< @ #{path}\n"
|
64
|
+
end
|
65
|
+
|
66
|
+
if level > 2
|
67
|
+
warns_count += 1
|
68
|
+
buf << "!! WARN - hidden (?) sub-level #{level} repo (nested too deep?) >#{entry}< @ #{path}\n"
|
69
|
+
end
|
70
|
+
|
71
|
+
buf << " repo ##{'%-2d' % repos_count} | "
|
72
|
+
buf << "#{'%-20s' % entry} @ #{::File.basename(path)} (#{path})"
|
73
|
+
buf << "\n"
|
74
|
+
repos << full_path
|
75
|
+
|
76
|
+
## check for bare bone git repos - todo/fix: add .gitconfig or such and more - why? why not?
|
77
|
+
elsif ::Dir.exist?( ::File.join( full_path, 'hooks' )) &&
|
78
|
+
::Dir.exist?( ::File.join( full_path, 'info' )) &&
|
79
|
+
::Dir.exist?( ::File.join( full_path, 'objects' )) &&
|
80
|
+
::Dir.exist?( ::File.join( full_path, 'refs' ))
|
81
|
+
warns_count += 1
|
82
|
+
buf << "!! WARN - skip bare git repo >#{entry}< @ #{path}\n"
|
83
|
+
else
|
84
|
+
buf << " x >#{entry}<\n"
|
85
|
+
sub_dirs << entry
|
86
|
+
end
|
87
|
+
end
|
88
|
+
buf << " #{repos_count} repos(s), #{dirs.size} dir(s), #{warns_count} warn(s)\n"
|
89
|
+
buf << "\n"
|
90
|
+
|
91
|
+
## note: skip output of "plain" diretory listings (no repos, no warnings)
|
92
|
+
puts buf if repos_count > 0 || warns_count > 0
|
93
|
+
|
94
|
+
|
95
|
+
sub_dirs.each do |entry|
|
96
|
+
## continue walking
|
97
|
+
full_path = ::File.join( path, entry )
|
98
|
+
walk_dir( full_path, repos, level+1, depth: depth )
|
99
|
+
end
|
100
|
+
|
101
|
+
repos
|
102
|
+
end
|
103
|
+
|
104
|
+
end # module Mono
|
data/lib/mono/version.rb
CHANGED
@@ -6,7 +6,7 @@ module MonoCore ## todo/check: rename to MonoMeta, MonoModule or such - why? w
|
|
6
6
|
## note: move root to its own namespace to avoid
|
7
7
|
## conflict with Mono.root!!!!
|
8
8
|
MAJOR = 0 ## todo: namespace inside version or something - why? why not??
|
9
|
-
MINOR =
|
9
|
+
MINOR = 6
|
10
10
|
PATCH = 0
|
11
11
|
VERSION = [MAJOR,MINOR,PATCH].join('.')
|
12
12
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: monos
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.6.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-10-
|
11
|
+
date: 2020-10-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: gitti
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 0.6.
|
19
|
+
version: 0.6.1
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: 0.6.
|
26
|
+
version: 0.6.1
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: gitti-backup
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -97,6 +97,7 @@ files:
|
|
97
97
|
- lib/mono/commands/run.rb
|
98
98
|
- lib/mono/commands/status.rb
|
99
99
|
- lib/mono/commands/sync.rb
|
100
|
+
- lib/mono/experimental.rb
|
100
101
|
- lib/mono/tool.rb
|
101
102
|
- lib/mono/version.rb
|
102
103
|
- lib/monos.rb
|