git_toolbox 0.6.0 → 0.7.1

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: 15a670824481b1eacf235aeb9fefced3bc5f6febb2674ff11d272013aad665d5
4
- data.tar.gz: 54be78886d9fa0ec1a2650cbcfbcc6028c7cc0b2f54f85398aa8649d2061d22b
3
+ metadata.gz: a9a83558777ee286d804e64a714388d13b4ac16e15e724580f7957ea422ba8a2
4
+ data.tar.gz: 8e76c6784c12e03f9cab918099a219e5e823441b90356c68b4cabc8e0bcf13fe
5
5
  SHA512:
6
- metadata.gz: 3ac823eedff5a76c6808ff2615a2a1f1fce8ed1508a868e0f73fdb66616ac23dc2344412d842c775700850a2290d075a495a304beea99ceccc0e74236102d52b
7
- data.tar.gz: bd690477114dbf9ccf127ebb89531ca8204ccca483a2fe2fa87a97ff841cac9ae99dbd78b6793f46b68a3bd384de5b51e7baec1b3ed7a54d14c7f67fffc4fc90
6
+ metadata.gz: 89d357ca5cf79577e6a05e3d5aff6dccb227c593565d8c5fe7d634d7a76b2cbe568a3c3db6cc49c58d0edfe4418d5da99f39fb1c944dfd14e2267dcb35d3a5bf
7
+ data.tar.gz: d5a06e808f81790b745ddf2ca031d6ca9c318e13c563aa78262488ec32ab8b98fca0b5d089b5f97b1ae321e76ca3825cd4018248b791490f85fb4c78dfaf1080
@@ -23,7 +23,7 @@ require 'get/commons/common'
23
23
  # Utility module
24
24
  module Git
25
25
  # Groups: 1 = type, 2 = scope with (), 3 = scope, 4 = breaking change, 5 = summary
26
- CONVENTIONAL_COMMIT_REGEX = /^(\w+)(\((\w+)\))?(!)?:(.*)/
26
+ CONVENTIONAL_COMMIT_REGEX = /^(\w+)(\(([\w-]+)\))?(!)?:(.*)/
27
27
 
28
28
  # Check if the command is called while in a git repository.
29
29
  # If the command fails, it is assumed to not be in a git repository.
@@ -77,10 +77,10 @@ class Commit < Command
77
77
 
78
78
  def initialize
79
79
  super(@@usage, @@description) do
80
- Common.error 'commit need to be run inside a git repository' unless Git.in_repo?
81
80
  @options = Common.with_subcommand_exception_handling @@option_parser do
82
81
  @@option_parser.parse
83
82
  end
83
+ Common.error 'commit need to be run inside a git repository' unless Git.in_repo?
84
84
 
85
85
  message = full_commit_message
86
86
  puts message
@@ -65,7 +65,7 @@ module PromptHandler
65
65
  extract_types_and_scopes
66
66
  @@cli.choose do |menu|
67
67
  menu.flow = :columns_down
68
- menu.prompt = 'Choose the scope of your commit '
68
+ menu.prompt = 'Choose the scope of your commit: '
69
69
  @@custom_scopes.each do |scope|
70
70
  menu.choice(scope.to_sym)
71
71
  end
@@ -112,10 +112,10 @@ class Describe < Command
112
112
 
113
113
  def initialize
114
114
  super(@@usage, @@description) do
115
- Common.error 'describe need to be run inside a git repository' unless Git.in_repo?
116
115
  @options = Common.with_subcommand_exception_handling @@option_parser do
117
116
  @@option_parser.parse
118
117
  end
118
+ Common.error 'describe need to be run inside a git repository' unless Git.in_repo?
119
119
  set_options
120
120
 
121
121
  if ARGV.length.positive?
@@ -0,0 +1,118 @@
1
+ # Get is a toolbox based on git which simplifies the adoption of conventions and some git commands.
2
+ # Copyright (C) 2023 Alex Speranza
3
+
4
+ # This program is free software: you can redistribute it and/or modify
5
+ # it under the terms of the GNU Lesser General Public License as published by
6
+ # the Free Software Foundation, either version 3 of the License, or
7
+ # (at your option) any later version.
8
+
9
+ # This program is distributed in the hope that it will be useful,
10
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
+ # GNU General Public License for more details.
13
+
14
+ # You should have received a copy of the GNU General Public License
15
+ # along with this program and the additional permissions granted by
16
+ # the Lesser GPL. If not, see <https://www.gnu.org/licenses/>.
17
+
18
+ # frozen_string_literal: true
19
+
20
+ require 'English'
21
+ require 'get/commons/common'
22
+ require 'get/commons/git'
23
+ require 'get/subcommand/command'
24
+
25
+ # Class length is disabled as most of its length is given by formatting.
26
+ # rubocop:disable Metrics/ClassLength
27
+ # Subcommand, it allow to create a new repository and add an initial, empty commit to it.
28
+ class Tree < Command
29
+ def self.command
30
+ @@command ||= new
31
+ @@command
32
+ end
33
+
34
+ private_class_method :new
35
+
36
+ private
37
+
38
+ @@command = nil
39
+
40
+ @@usage = 'tree -h|(<subcommand> [<subcommand-options])'
41
+ @@description = 'Print the tree of commits.'
42
+ @@subcommands = {}
43
+ # This block is Optimist configuration. It is as long as the number of options of the command.
44
+ # rubocop:disable Metrics/BlockLength
45
+ @@option_parser = Optimist::Parser.new do
46
+ subcommand_max_length = @@subcommands.keys.map { |k| k.to_s.length }.max
47
+ subcommand_section = <<~SUBCOMMANDS unless @@subcommands.empty?
48
+ Subcommands:
49
+ #{@@subcommands.keys.map { |k| " #{k.to_s.ljust(subcommand_max_length)} => #{@@subcommands[k].description}" }.join("\n")}
50
+ SUBCOMMANDS
51
+ usage @@usage
52
+ synopsis @@description + (subcommand_section.nil? ? '' : "\n") + subcommand_section.to_s
53
+ educate_on_error
54
+ stop_on @@subcommands.keys.map(&:to_s)
55
+ end
56
+ # rubocop:enable Metrics/BlockLength
57
+
58
+ def initialize
59
+ super(@@usage, @@description) do
60
+ @options = Common.with_subcommand_exception_handling @@option_parser do
61
+ @@option_parser.parse
62
+ end
63
+ Common.error 'tree need to be run inside a git repository' unless Git.in_repo?
64
+
65
+ view_tree
66
+ end
67
+ end
68
+
69
+ def view_tree
70
+ page_log(transform_log(log))
71
+ end
72
+
73
+ TREE_FORMAT = '%C(bold blue)%h%C(reset)§%C(dim normal)(%cr)%C(reset)§%C(auto)%d%C(reset)§§%n' \
74
+ '§§§ %C(normal)%an%C(reset)%C(dim normal): %s%C(reset)'
75
+
76
+ def log
77
+ `git log --all --graph --decorate=short --date-order --color --pretty=format:"#{TREE_FORMAT}"`
78
+ end
79
+
80
+ TIME_REGEX = /(\([a-z0-9 ,]+\))/
81
+ TIME_MINIMUM_PADDING = 2
82
+
83
+ def transform_log(text)
84
+ split_lines = text.split("\n").map { |element| element.split('§') }
85
+ # The first line is always a commit line, so it always have a time reference
86
+ first_line_time = split_lines.first[1]
87
+ # calc color escape codes length
88
+ time_color_length = first_line_time.length - first_line_time.match(TIME_REGEX)[1].length
89
+
90
+ # calc max length of time references
91
+ time_padding = 0
92
+ split_lines.each { |element| time_padding = [time_padding, element[1].length - time_color_length].max }
93
+
94
+ # format strings
95
+ split_lines
96
+ .map do |element|
97
+ # Only lines with the date reference have the color escape codes,
98
+ # the other lines do not need the additional padding
99
+ left_padding = TIME_MINIMUM_PADDING + time_padding +
100
+ (element[1].match?(TIME_REGEX) ? time_color_length : 0)
101
+ format(
102
+ '%<date>s %<tree_mark>s %<pointers>s %<commit_text>s',
103
+ {
104
+ date: element[1].rjust(left_padding),
105
+ tree_mark: element[0],
106
+ pointers: element[2],
107
+ commit_text: element[3]
108
+ }
109
+ )
110
+ end
111
+ .join("\n")
112
+ end
113
+
114
+ def page_log(text)
115
+ system("less -RfS <(echo -e '#{text}')")
116
+ end
117
+ end
118
+ # rubocop:enable Metrics/ClassLength
data/lib/get/version.rb CHANGED
@@ -18,5 +18,5 @@
18
18
  # frozen_string_literal: true
19
19
 
20
20
  module Get
21
- VERSION = '0.6.0'
21
+ VERSION = '0.7.1'
22
22
  end
data/lib/get.rb CHANGED
@@ -25,6 +25,7 @@ require 'get/subcommand/init/init'
25
25
  require 'get/subcommand/license/license'
26
26
  require 'get/subcommand/complete/complete'
27
27
  require 'get/subcommand/changelog/changelog'
28
+ require 'get/subcommand/tree/tree'
28
29
  require 'get/version'
29
30
  require 'get/commons/common'
30
31
 
@@ -39,6 +40,7 @@ module Get
39
40
  license: License.command,
40
41
  complete: Complete.command,
41
42
  changelog: Changelog.command,
43
+ tree: Tree.command,
42
44
  }
43
45
  @@option_parser = Optimist::Parser.new do
44
46
  subcommand_max_length = @@subcommands.keys.map { |k| k.to_s.length }.max
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: git_toolbox
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.0
4
+ version: 0.7.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Alex Speranza
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-03-20 00:00:00.000000000 Z
11
+ date: 2023-05-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: optimist
@@ -76,6 +76,7 @@ files:
76
76
  - lib/get/subcommand/license/offline_licenses/GNU General Public License v3.0/LICENSE
77
77
  - lib/get/subcommand/license/offline_licenses/MIT License/LICENSE
78
78
  - lib/get/subcommand/license/offline_licenses/Mozilla Public License 2.0/LICENSE
79
+ - lib/get/subcommand/tree/tree.rb
79
80
  - lib/get/version.rb
80
81
  homepage: https://github.com/asperan/get
81
82
  licenses: