conjoiner 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c299bb2f3d58db4461105f5965c0c89a7031aa9e4006c33f9817da87266e6792
4
- data.tar.gz: b1d3e72ec85b62a934e8f0e12cc9badf3108e09bd1add9b2cef4420404b22bb6
3
+ metadata.gz: 81ccd5489780454659c657ca55ad9f48333f4834d87688cff68bd9b90f9aba6b
4
+ data.tar.gz: 17ac85e833af9fa8af956ed715fe0ea64625ec6391191fd623bb221cf1afbc73
5
5
  SHA512:
6
- metadata.gz: 391e4618be7fa6aac2c90fea430e6c1ceb1fb98b7f4f6989e026ea59b99c49a309da96fba515ccb9fd5d53eafd72fa268dbf382ac75e1bae05fcb33b2b0503b1
7
- data.tar.gz: dba77655da367f54f5ab15f5d9164c4ded2ffdf771a3be6a10d71c41f0427dcf7b36609d86935e3afa4fcb08e49405b73c4577b4d09453e783b3829ec768d089
6
+ metadata.gz: 519fa71b2216bce70c7abb0ea34f2276cd8cf08fddbabd69f0922a6baea8fb9df5189cca7df9c4b0270ba4fe1adecfd588cf49956cb746cb23b85843104b6542
7
+ data.tar.gz: e0368e4402685bb78dc5695d8142d1d2df64b8699bf2fc181ca0c31dc63c8cb311ec461192c8a4641c297ea848480a0e7d351d9d2240f9f340306c8ae0dbcafb
data/.rubocop.yml CHANGED
@@ -8,3 +8,7 @@ Layout/HashAlignment:
8
8
 
9
9
  AllCops:
10
10
  NewCops: enable
11
+
12
+ # Account for rspec-tabular examples ###########################################
13
+ RSpec/EmptyExampleGroup:
14
+ Enabled: false
data/CHANGELOG.md CHANGED
@@ -5,3 +5,18 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/)
5
5
  and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html).
6
6
 
7
7
  ## [Unreleased]
8
+
9
+ ## [0.2.0] - 2012-12-24
10
+ ### Added
11
+ - Command to clone an arbitrary repository into the `~/joined` directory
12
+ structure
13
+ - Command to list all the remote origins of the joined repositories
14
+ - Add configuration file for specifying the default aspect
15
+
16
+ ## [0.1.0] - 2012-11-12
17
+ ### Added
18
+ - Initializing dated aspect directories
19
+ - Manual synchronization command
20
+ - Show command to display git status of aspect directories
21
+ - Synchronization mode to watch aspect repositories, committing and pushing
22
+ changes
data/README.md CHANGED
@@ -41,6 +41,14 @@ And show the status of the repositories with:
41
41
  conjoiner show
42
42
  ```
43
43
 
44
+ You can also clone arbitrary repositories into the `joined` directory with:
45
+ ```
46
+ conjoiner clone git@gitlab.com:acant/conjoiner.git
47
+ ```
48
+
49
+ This repository would be cloned to `$HOME/joined/gitlab.com/acant/conjoiner`.
50
+
51
+
44
52
  ### Enable the synchronization deaemon on with systemd on Linux
45
53
 
46
54
  You can enable the automatic synchronization with the following script:
@@ -79,6 +87,11 @@ To install this gem onto your local machine, run `bundle exec rake install`. To
79
87
 
80
88
  Bug reports and merge requests are welcome on Gitlab at https://gitlab.com/acant/conjoiner.
81
89
 
90
+ ## Similar projects
91
+
92
+ * https://myrepos.branchable.com/
93
+ * https://github.com/nesquena/gitdocs
94
+
82
95
  ## License
83
96
 
84
97
  Released under the [AGPLv3 license](https://www.gnu.org/licenses/agpl-3.0.en.html).
data/conjoiner.gemspec CHANGED
@@ -11,9 +11,10 @@ Gem::Specification.new do |spec|
11
11
  spec.description = 'Manager for cloned git reporitories, automatically sync some of those repositories.'
12
12
  spec.homepage = 'https://gitlab.com/acant/conjoiner'
13
13
  spec.metadata = {
14
- 'homepage_uri' => spec.homepage,
15
- 'source_code_uri' => spec.homepage,
16
- 'changelog_uri' => "#{spec.homepage}/CHANGELOG.md"
14
+ 'homepage_uri' => spec.homepage,
15
+ 'source_code_uri' => spec.homepage,
16
+ 'changelog_uri' => "#{spec.homepage}/CHANGELOG.md",
17
+ 'rubygems_mfa_required' => 'true'
17
18
  }
18
19
  spec.license = 'AGPL-3.0-or-later'
19
20
  spec.files =
@@ -28,15 +29,18 @@ Gem::Specification.new do |spec|
28
29
 
29
30
  spec.required_ruby_version = Gem::Requirement.new('>= 2.5.0')
30
31
 
31
- spec.add_dependency 'git', '~> 1.9'
32
- spec.add_dependency 'listen', '~> 3.6'
33
- spec.add_dependency 'table_print', '~> 1.5'
34
- spec.add_dependency 'thor', '~> 1.0'
32
+ spec.add_dependency 'git', '~> 1.9'
33
+ spec.add_dependency 'git_clone_url', '~> 2.0'
34
+ spec.add_dependency 'listen', '~> 3.6'
35
+ spec.add_dependency 'table_print', '~> 1.5'
36
+ spec.add_dependency 'thor', '~> 1.0'
35
37
 
36
- spec.add_development_dependency 'aruba', '~> 1.0'
37
- spec.add_development_dependency 'cucumber', '~> 5.3'
38
- spec.add_development_dependency 'rspec', '~> 3.10'
39
- spec.add_development_dependency 'simplecov', '~> 0.21'
38
+ spec.add_development_dependency 'aruba', '~> 1.0'
39
+ spec.add_development_dependency 'cucumber', '~> 5.3'
40
+ spec.add_development_dependency 'fakefs', '~> 1.4.0'
41
+ spec.add_development_dependency 'rspec', '~> 3.10'
42
+ spec.add_development_dependency 'rspec-tabular', '~> 0.2'
43
+ spec.add_development_dependency 'simplecov', '~> 0.21'
40
44
 
41
45
  spec.add_development_dependency 'bundler-audit'
42
46
  spec.add_development_dependency 'rubocop'
data/lib/conjoiner/cli.rb CHANGED
@@ -2,6 +2,7 @@
2
2
 
3
3
  require 'thor'
4
4
  require 'git'
5
+ require 'git_clone_url'
5
6
  require 'pathname'
6
7
  require 'table_print'
7
8
  require 'ostruct'
@@ -18,7 +19,7 @@ module Conjoiner
18
19
  desc 'init_aspect [ASPECT] [YEAR]', 'initialize aspect for a year'
19
20
  options year: :integer
20
21
  def init_aspect(aspect = nil, year = nil)
21
- aspect ||= 'prime'
22
+ aspect ||= configuration.default_aspect
22
23
  year ||= Time.now.year
23
24
 
24
25
  puts "init aspect #{aspect} #{year}"
@@ -34,20 +35,10 @@ module Conjoiner
34
35
  year.to_s
35
36
  )
36
37
 
37
- repository_names =
38
- if aspect == 'prime'
39
- %w[gpx log misc]
40
- else
41
- %w[log]
42
- end
43
-
44
- repository_names.each do |name|
38
+ configuration.dated_repository_names.each do |name|
45
39
  repo = "gitolite@git.andrewcant.ca:andrew/aspects/#{aspect}/dated/#{year}/#{name}"
46
40
  dir = dated_root.join(name)
47
41
 
48
- puts repo
49
- puts dir
50
-
51
42
  git =
52
43
  if dir.exist?
53
44
  begin
@@ -96,9 +87,34 @@ module Conjoiner
96
87
  end
97
88
  end
98
89
 
90
+ desc 'clone [URL]', 'clone the repository into the joined directory'
91
+ def clone(url)
92
+ home = Pathname.new(Dir.home)
93
+ joined_dir = home.join('joined')
94
+
95
+ # Create repository pathname from the URL.
96
+ git_clone_url = GitCloneUrl.parse(url)
97
+ path_parts = git_clone_url.path.sub(%r{^/}, '').sub(/\.git$/, '').split('/')
98
+ repository_pathname =
99
+ joined_dir
100
+ .join(git_clone_url.host)
101
+ .join(*path_parts)
102
+
103
+ # Clone is repository if it is not already present.
104
+ if repository_pathname.exist?
105
+ puts "Already cloned at #{repository_pathname}"
106
+ else
107
+ puts "Clone #{url} to #{repository_pathname}"
108
+ repository_pathname.mkpath
109
+ Git.clone(url, repository_pathname)
110
+ end
111
+ rescue URI::Error
112
+ puts "Invalid URL <#{url}>"
113
+ end
114
+
99
115
  desc 'sync', 'run the repository synchronization once'
100
116
  def sync(aspect = nil, year = nil)
101
- aspect ||= 'prime'
117
+ aspect ||= configuration.default_aspect
102
118
  year ||= Time.now.year
103
119
 
104
120
  home = Pathname.new(Dir.home)
@@ -150,9 +166,8 @@ module Conjoiner
150
166
  'aspects'
151
167
  )
152
168
 
153
- current_aspects = %w[prime sugar]
154
169
  listen_pathnames =
155
- current_aspects.map do |aspect|
170
+ configuration.aspects.map do |aspect|
156
171
  aspect_dir = aspects_root.join(aspect)
157
172
  [
158
173
  aspect_dir.join('dated', year.to_s),
@@ -170,7 +185,7 @@ module Conjoiner
170
185
  listen_pathnames.map { |x| x.glob('**/.git').map(&:dirname) }.flatten
171
186
 
172
187
  puts 'For these aspects:'
173
- current_aspects.each { |x| puts " * #{x}" }
188
+ configuration.aspects.each { |x| puts " * #{x}" }
174
189
  puts 'Watch the following repositories:'
175
190
  listen_repository_pathnames.each { |x| puts " * #{x}" }
176
191
 
@@ -225,7 +240,7 @@ module Conjoiner
225
240
 
226
241
  desc 'show [PATH]', 'show the status of aspects and other repositories'
227
242
  def show(aspect = nil, year = nil)
228
- aspect ||= 'prime'
243
+ aspect ||= configuration.default_aspect
229
244
  year ||= Time.now.year
230
245
 
231
246
  home = Pathname.new(Dir.home)
@@ -250,7 +265,7 @@ module Conjoiner
250
265
  output =
251
266
  gits.map do |git|
252
267
  additions = git.status.added.count + git.status.changed.count
253
- OpenStruct.new(
268
+ OpenStruct.new( # rubocop:disable Style/OpenStructUse
254
269
  path: Pathname.new(git.dir.to_s).relative_path_from(joined_dir).to_s,
255
270
  status: "+#{additions} -#{git.status.deleted.count} *#{git.status.untracked.count}"
256
271
  )
@@ -259,6 +274,41 @@ module Conjoiner
259
274
  tp.set(:max_width, 256)
260
275
  tp(output, :path, :status)
261
276
  end
277
+
278
+ desc 'ls', 'show all the joined repositories'
279
+ option :origin, type: :boolean, aliases: :o
280
+ option :noorigin, type: :boolean, aliases: :no
281
+ def ls
282
+ home = Pathname.new(Dir.home)
283
+ joined_dir = home.join('joined')
284
+ result = []
285
+ joined_dir.find do |pathname|
286
+ next unless pathname.directory? && pathname.join('.git').directory?
287
+
288
+ if options[:origin]
289
+ origin_url = Git.open(pathname).remote('origin').url
290
+ result.push(origin_url) if origin_url
291
+ elsif options[:noorigin]
292
+ origin_url = Git.open(pathname).remote('origin').url
293
+ result.push(pathname) unless origin_url
294
+ else
295
+ result.push(pathname)
296
+ end
297
+
298
+ Find.prune
299
+ end
300
+
301
+ result.sort.each { |x| puts x }
302
+ end
303
+
304
+ ############################################################################
305
+
306
+ private
307
+
308
+ # @return [Conjoiner::Configuration]
309
+ def configuration
310
+ @configuration ||= Configuration.new
311
+ end
262
312
  end
263
313
  end
264
314
 
@@ -0,0 +1,40 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Conjoiner
4
+ # @private
5
+ # Frontend for determining the configuration of conjoiner. Either using
6
+ # defaults specified in this file, or overridden by configuration located in:
7
+ # ~/.config/conjoiner/
8
+ class Configuration
9
+ # @return [Array<String>]
10
+ def aspects
11
+ %w[prime sugar]
12
+ end
13
+
14
+ # @return [String]
15
+ def default_aspect
16
+ return @default_aspect if @default_aspect
17
+
18
+ default_aspect_pathname =
19
+ Pathname.new(Dir.home).join('.config', 'conjoiner', 'default_aspect')
20
+
21
+ @default_aspect =
22
+ if default_aspect_pathname.readable?
23
+ default_aspect_pathname.read.strip
24
+ else
25
+ 'prime'
26
+ end
27
+ end
28
+
29
+ # @param aspect [String]
30
+ #
31
+ # @return [Array<String>]
32
+ def dated_repository_names(aspect)
33
+ if aspect == 'prime'
34
+ %w[gpx log misc]
35
+ else
36
+ %w[log]
37
+ end
38
+ end
39
+ end
40
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Conjoiner
4
- VERSION = '0.1.0'
4
+ VERSION = '0.2.0'
5
5
  end
data/lib/conjoiner.rb CHANGED
@@ -2,6 +2,7 @@
2
2
 
3
3
  require 'conjoiner/version'
4
4
  require 'conjoiner/cli'
5
+ require 'conjoiner/configuration'
5
6
 
6
7
  module Conjoiner
7
8
  class Error < StandardError; end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: conjoiner
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andrew Sullivan Cant
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-11-12 00:00:00.000000000 Z
11
+ date: 2021-12-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: git
@@ -24,6 +24,20 @@ dependencies:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: '1.9'
27
+ - !ruby/object:Gem::Dependency
28
+ name: git_clone_url
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '2.0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '2.0'
27
41
  - !ruby/object:Gem::Dependency
28
42
  name: listen
29
43
  requirement: !ruby/object:Gem::Requirement
@@ -94,6 +108,20 @@ dependencies:
94
108
  - - "~>"
95
109
  - !ruby/object:Gem::Version
96
110
  version: '5.3'
111
+ - !ruby/object:Gem::Dependency
112
+ name: fakefs
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - "~>"
116
+ - !ruby/object:Gem::Version
117
+ version: 1.4.0
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - "~>"
123
+ - !ruby/object:Gem::Version
124
+ version: 1.4.0
97
125
  - !ruby/object:Gem::Dependency
98
126
  name: rspec
99
127
  requirement: !ruby/object:Gem::Requirement
@@ -108,6 +136,20 @@ dependencies:
108
136
  - - "~>"
109
137
  - !ruby/object:Gem::Version
110
138
  version: '3.10'
139
+ - !ruby/object:Gem::Dependency
140
+ name: rspec-tabular
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - "~>"
144
+ - !ruby/object:Gem::Version
145
+ version: '0.2'
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - "~>"
151
+ - !ruby/object:Gem::Version
152
+ version: '0.2'
111
153
  - !ruby/object:Gem::Dependency
112
154
  name: simplecov
113
155
  requirement: !ruby/object:Gem::Requirement
@@ -233,6 +275,7 @@ files:
233
275
  - exe/conjoiner
234
276
  - lib/conjoiner.rb
235
277
  - lib/conjoiner/cli.rb
278
+ - lib/conjoiner/configuration.rb
236
279
  - lib/conjoiner/version.rb
237
280
  homepage: https://gitlab.com/acant/conjoiner
238
281
  licenses:
@@ -241,6 +284,7 @@ metadata:
241
284
  homepage_uri: https://gitlab.com/acant/conjoiner
242
285
  source_code_uri: https://gitlab.com/acant/conjoiner
243
286
  changelog_uri: https://gitlab.com/acant/conjoiner/CHANGELOG.md
287
+ rubygems_mfa_required: 'true'
244
288
  post_install_message:
245
289
  rdoc_options: []
246
290
  require_paths: