gistory 0.1.5 → 0.2.1
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 +5 -5
- data/.codeclimate.yml +1 -1
- data/.gitignore +3 -0
- data/.rspec +3 -0
- data/.rubocop.yml +79 -10
- data/.travis.yml +6 -5
- data/Gemfile +7 -8
- data/README.md +11 -4
- data/Rakefile +4 -8
- data/bin/console +4 -4
- data/exe/gistory +2 -2
- data/gistory.gemspec +20 -17
- data/lib/gistory.rb +11 -10
- data/lib/gistory/change_log.rb +22 -16
- data/lib/gistory/cli/arg_parser.rb +27 -25
- data/lib/gistory/cli/io.rb +1 -1
- data/lib/gistory/cli/main.rb +28 -10
- data/lib/gistory/commit.rb +5 -1
- data/lib/gistory/configuration.rb +8 -2
- data/lib/gistory/git_repo.rb +18 -8
- data/lib/gistory/lockfile_parser.rb +26 -0
- data/lib/gistory/version.rb +1 -1
- data/lib/gistory/version_change.rb +5 -1
- metadata +70 -13
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 3e8eab6d518dee70d3c57035306062a1d3d466fe9fdd468076bece37ea8f21d3
|
4
|
+
data.tar.gz: 384accb7f97bc56ca2adaaae3963520a1d60f9f96e1b8c9f418077f0a14f5055
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2320727fc749c876387b075bf3a26e5e45a74fc688f06fc1d91acf132307f7a3cac6a94bac3b913073f3a61be25a7ee31ed6ad1e275f7890309f9b3cf64dd6f9
|
7
|
+
data.tar.gz: 2877f804af2ef087f87a6900b6b4cdc834e574015853022d8332896fabbf4a9f9f63c8cf61c38016c463b5c3127234dce41c423890da16b9e99892227de67d9b
|
data/.codeclimate.yml
CHANGED
data/.gitignore
CHANGED
data/.rspec
ADDED
data/.rubocop.yml
CHANGED
@@ -1,18 +1,87 @@
|
|
1
|
-
|
2
|
-
Max: 120
|
3
|
-
|
4
|
-
Documentation:
|
5
|
-
Enabled: false
|
1
|
+
require: rubocop-rspec
|
6
2
|
|
7
3
|
Metrics/AbcSize:
|
8
|
-
|
9
|
-
|
10
|
-
|
4
|
+
Max: 25
|
5
|
+
Exclude:
|
6
|
+
- 'spec/**/*_spec.rb'
|
7
|
+
|
8
|
+
Metrics/BlockLength:
|
11
9
|
Exclude:
|
12
|
-
- '
|
10
|
+
- 'spec/**/*_spec.rb'
|
13
11
|
|
14
12
|
Metrics/MethodLength:
|
15
|
-
Max:
|
13
|
+
Max: 20
|
14
|
+
|
15
|
+
Layout/EmptyLineAfterGuardClause:
|
16
|
+
Enabled: false
|
17
|
+
|
18
|
+
Layout/LineLength:
|
19
|
+
Max: 120
|
20
|
+
|
21
|
+
Style/BlockDelimiters:
|
22
|
+
Exclude:
|
23
|
+
- 'spec/**/*_spec.rb'
|
24
|
+
|
25
|
+
Style/Documentation:
|
26
|
+
Enabled: false
|
27
|
+
|
28
|
+
Style/IfUnlessModifier:
|
29
|
+
Enabled: false
|
16
30
|
|
17
31
|
Style/FrozenStringLiteralComment:
|
18
32
|
EnforcedStyle: always
|
33
|
+
|
34
|
+
Style/StringLiterals:
|
35
|
+
EnforcedStyle: double_quotes
|
36
|
+
|
37
|
+
# rubocop-rspec
|
38
|
+
|
39
|
+
RSpec/MultipleExpectations:
|
40
|
+
Max: 15
|
41
|
+
|
42
|
+
RSpec/ExampleLength:
|
43
|
+
Max: 15
|
44
|
+
|
45
|
+
# starting rubocop 0.80 newly added cops need to be explicitly enabled:
|
46
|
+
|
47
|
+
Lint/DeprecatedOpenSSLConstant:
|
48
|
+
Enabled: true
|
49
|
+
|
50
|
+
Layout/EmptyLinesAroundAttributeAccessor:
|
51
|
+
Enabled: true
|
52
|
+
|
53
|
+
Lint/MixedRegexpCaptureTypes:
|
54
|
+
Enabled: true
|
55
|
+
|
56
|
+
Lint/RaiseException:
|
57
|
+
Enabled: true
|
58
|
+
|
59
|
+
Layout/SpaceAroundMethodCallOperator:
|
60
|
+
Enabled: true
|
61
|
+
|
62
|
+
Lint/StructNewOverride:
|
63
|
+
Enabled: true
|
64
|
+
|
65
|
+
Style/ExponentialNotation:
|
66
|
+
Enabled: true
|
67
|
+
|
68
|
+
Style/HashEachMethods:
|
69
|
+
Enabled: true
|
70
|
+
|
71
|
+
Style/HashTransformKeys:
|
72
|
+
Enabled: true
|
73
|
+
|
74
|
+
Style/HashTransformValues:
|
75
|
+
Enabled: true
|
76
|
+
|
77
|
+
Style/RedundantFetchBlock:
|
78
|
+
Enabled: true
|
79
|
+
|
80
|
+
Style/RedundantRegexpCharacterClass:
|
81
|
+
Enabled: true
|
82
|
+
|
83
|
+
Style/RedundantRegexpEscape:
|
84
|
+
Enabled: true
|
85
|
+
|
86
|
+
Style/SlicingWithRange:
|
87
|
+
Enabled: true
|
data/.travis.yml
CHANGED
data/Gemfile
CHANGED
@@ -1,20 +1,19 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
source
|
3
|
+
source "https://rubygems.org"
|
4
4
|
|
5
5
|
gemspec
|
6
6
|
|
7
7
|
group :development, :test do
|
8
|
-
gem
|
9
|
-
gem
|
10
|
-
gem
|
8
|
+
gem "byebug" # debugger
|
9
|
+
gem "pry" # better console
|
10
|
+
gem "pry-byebug" # pry integration for byebug
|
11
11
|
end
|
12
12
|
|
13
13
|
group :test do
|
14
|
-
gem
|
15
|
-
gem
|
16
|
-
gem 'simplecov', require: false # code coverage
|
14
|
+
gem "coveralls", require: false
|
15
|
+
gem "simplecov", require: false # code coverage
|
17
16
|
end
|
18
17
|
|
19
|
-
local_gemfile =
|
18
|
+
local_gemfile = "Gemfile.local"
|
20
19
|
eval_gemfile(local_gemfile) if File.exist?(local_gemfile)
|
data/README.md
CHANGED
@@ -5,7 +5,7 @@
|
|
5
5
|
[](https://travis-ci.org/serch/gistory)
|
6
6
|
[](https://coveralls.io/github/serch/gistory?branch=master)
|
7
7
|
|
8
|
-
If you use bundler and git
|
8
|
+
If you use bundler and git and you want to know when a gem was updated, `gistory` comes to the rescue, simply:
|
9
9
|
|
10
10
|
```shell
|
11
11
|
gem install gistory
|
@@ -14,6 +14,7 @@ gistory sidekiq
|
|
14
14
|
```
|
15
15
|
|
16
16
|
and you'll see something like:
|
17
|
+
|
17
18
|
```
|
18
19
|
Gem: sidekiq
|
19
20
|
Current version: 4.2.7
|
@@ -25,11 +26,17 @@ Change history:
|
|
25
26
|
4.1.4 on Wed, 9 Nov 2016 14:31 +01:00 (commit 05a3c549)
|
26
27
|
```
|
27
28
|
|
28
|
-
By default `gistory` only looks at the last 100
|
29
|
-
|
29
|
+
By default `gistory` only looks at the last 100 commits made to the current branch.
|
30
|
+
If you want to see farther back in the past run:
|
31
|
+
|
32
|
+
```shell
|
33
|
+
gistory sidekiq -m1000
|
34
|
+
```
|
35
|
+
|
36
|
+
If you want to look at all changes to Gemfile.lock in all branches, use the `-a` switch:
|
30
37
|
|
31
38
|
```shell
|
32
|
-
gistory sidekiq -
|
39
|
+
gistory sidekiq -a
|
33
40
|
```
|
34
41
|
|
35
42
|
Note that if the gem was added, then removed, and then added again, `gistory` will
|
data/Rakefile
CHANGED
@@ -1,12 +1,8 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
4
|
-
require
|
3
|
+
require "bundler/gem_tasks"
|
4
|
+
require "rspec/core/rake_task"
|
5
5
|
|
6
|
-
|
7
|
-
t.libs << 'test'
|
8
|
-
t.libs << 'lib'
|
9
|
-
t.test_files = FileList['test/**/*_test.rb']
|
10
|
-
end
|
6
|
+
RSpec::Core::RakeTask.new(:spec)
|
11
7
|
|
12
|
-
task default: :
|
8
|
+
task default: :spec
|
data/bin/console
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
# frozen_string_literal: true
|
3
3
|
|
4
|
-
require
|
5
|
-
require
|
6
|
-
require
|
4
|
+
require "bundler/setup"
|
5
|
+
require "gistory"
|
6
|
+
require "pry"
|
7
7
|
|
8
8
|
root_path = "#{File.dirname(__FILE__)}/.."
|
9
9
|
|
10
10
|
# require all files in lib for quick access to them in the console
|
11
|
-
Dir["#{root_path}/lib/**/*.rb"].each { |file| require file }
|
11
|
+
Dir["#{root_path}/lib/**/*.rb"].sort.each { |file| require file }
|
12
12
|
|
13
13
|
def reload!
|
14
14
|
verbosity = $VERBOSE
|
data/exe/gistory
CHANGED
@@ -1,9 +1,9 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
# frozen_string_literal: true
|
3
3
|
|
4
|
-
lib = File.expand_path(
|
4
|
+
lib = File.expand_path("../lib", __dir__)
|
5
5
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
6
6
|
|
7
|
-
require
|
7
|
+
require "gistory"
|
8
8
|
|
9
9
|
Gistory::Cli::Main.new(repo_path: Dir.getwd, args: ARGV).run
|
data/gistory.gemspec
CHANGED
@@ -1,33 +1,36 @@
|
|
1
|
-
# coding: utf-8
|
2
1
|
# frozen_string_literal: true
|
3
2
|
|
4
|
-
lib = File.expand_path(
|
3
|
+
lib = File.expand_path("lib", __dir__)
|
5
4
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
6
|
-
require
|
5
|
+
require "gistory/version"
|
7
6
|
|
8
7
|
Gem::Specification.new do |spec|
|
9
|
-
spec.name =
|
8
|
+
spec.name = "gistory"
|
10
9
|
spec.version = Gistory::VERSION
|
11
10
|
spec.platform = Gem::Platform::RUBY
|
12
|
-
spec.required_ruby_version =
|
13
|
-
spec.authors = [
|
14
|
-
spec.email = [
|
11
|
+
spec.required_ruby_version = ">= 2.4"
|
12
|
+
spec.authors = ["Sergio Medina"]
|
13
|
+
spec.email = ["medinasergio@gmail.com"]
|
15
14
|
|
16
|
-
spec.summary =
|
17
|
-
spec.description =
|
18
|
-
spec.homepage =
|
19
|
-
spec.licenses = [
|
15
|
+
spec.summary = "Gistory: Know exactly when a gem was updated in your Gemfile.lock"
|
16
|
+
spec.description = "Gistory: Know exactly when a gem was updated in your Gemfile.lock"
|
17
|
+
spec.homepage = "https://www.github.com/serch/gistory"
|
18
|
+
spec.licenses = ["MIT"]
|
20
19
|
|
21
20
|
spec.files = `git ls-files -z`.split("\x0").reject do |f|
|
22
21
|
f.match(%r{^(test|spec|features)/})
|
23
22
|
end
|
24
|
-
spec.bindir =
|
23
|
+
spec.bindir = "exe"
|
25
24
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
26
|
-
spec.require_paths = [
|
25
|
+
spec.require_paths = ["lib"]
|
27
26
|
|
28
|
-
spec.add_dependency
|
29
|
-
spec.add_dependency
|
27
|
+
spec.add_dependency "bundler", "~> 1.0"
|
28
|
+
spec.add_dependency "colorize"
|
30
29
|
|
31
|
-
spec.add_development_dependency
|
32
|
-
spec.add_development_dependency
|
30
|
+
spec.add_development_dependency "pry"
|
31
|
+
spec.add_development_dependency "pry-byebug"
|
32
|
+
spec.add_development_dependency "rake", "~> 13.0"
|
33
|
+
spec.add_development_dependency "rspec", "~> 3.9"
|
34
|
+
spec.add_development_dependency "rubocop"
|
35
|
+
spec.add_development_dependency "rubocop-rspec"
|
33
36
|
end
|
data/lib/gistory.rb
CHANGED
@@ -1,17 +1,18 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
3
|
+
require "gistory/version"
|
4
4
|
|
5
|
-
require
|
6
|
-
require
|
7
|
-
require
|
8
|
-
require
|
5
|
+
require "gistory/cli/main"
|
6
|
+
require "gistory/cli/arg_parser"
|
7
|
+
require "gistory/cli/io"
|
8
|
+
require "gistory/configuration"
|
9
9
|
|
10
|
-
require
|
11
|
-
require
|
12
|
-
require
|
13
|
-
require
|
14
|
-
require
|
10
|
+
require "gistory/errors"
|
11
|
+
require "gistory/commit"
|
12
|
+
require "gistory/version_change"
|
13
|
+
require "gistory/git_repo"
|
14
|
+
require "gistory/lockfile_parser"
|
15
|
+
require "gistory/change_log"
|
15
16
|
|
16
17
|
module Gistory
|
17
18
|
class << self
|
data/lib/gistory/change_log.rb
CHANGED
@@ -1,10 +1,8 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require 'bundler'
|
4
|
-
|
5
3
|
module Gistory
|
6
4
|
class ChangeLog
|
7
|
-
LOCKFILE =
|
5
|
+
LOCKFILE = "Gemfile.lock"
|
8
6
|
|
9
7
|
def initialize(repo:)
|
10
8
|
@repo = repo
|
@@ -12,33 +10,41 @@ module Gistory
|
|
12
10
|
|
13
11
|
def changelog_for_gem(gem_name)
|
14
12
|
version_changes = []
|
15
|
-
|
16
|
-
|
13
|
+
commits_with_changes = @repo.changes_to_file(LOCKFILE)
|
14
|
+
|
15
|
+
# no lockfile found or no changes to the lockfile found
|
16
|
+
return [] if commits_with_changes.empty?
|
17
|
+
|
18
|
+
previous_commit = commits_with_changes.shift
|
19
|
+
previous_gem_spec = gem_version_at_commit_hash(previous_commit.short_hash, gem_name)
|
20
|
+
# only one change to the lockfile was found and the gem was not there
|
21
|
+
return [] if previous_gem_spec.nil?
|
17
22
|
|
18
|
-
|
19
|
-
|
23
|
+
commits_with_changes.each do |current_commit|
|
24
|
+
current_gem_spec = gem_version_at_commit_hash(current_commit.short_hash, gem_name)
|
20
25
|
|
21
26
|
# we reached the end, the gem didn't exist back then
|
22
27
|
# TODO: what if it was added then removed and then added again?
|
23
|
-
break if
|
28
|
+
break if current_gem_spec.nil?
|
24
29
|
|
25
|
-
|
26
|
-
|
27
|
-
version_changes << VersionChange.new(commit: commit, version: gem_spec.version)
|
28
|
-
previous_version = gem_spec.version.to_s
|
30
|
+
if current_gem_spec != previous_gem_spec
|
31
|
+
version_changes << VersionChange.new(commit: previous_commit, version: previous_gem_spec)
|
29
32
|
end
|
33
|
+
|
34
|
+
previous_gem_spec = current_gem_spec
|
35
|
+
previous_commit = current_commit
|
30
36
|
end
|
31
37
|
|
38
|
+
version_changes << VersionChange.new(commit: previous_commit, version: previous_gem_spec)
|
39
|
+
|
32
40
|
version_changes
|
33
41
|
end
|
34
42
|
|
35
43
|
private
|
36
44
|
|
37
|
-
def
|
45
|
+
def gem_version_at_commit_hash(commit_hash, gem_name)
|
38
46
|
lockfile_content = @repo.file_content_at_commit(commit_hash, LOCKFILE)
|
39
|
-
|
40
|
-
gem_spec = lockfile.specs.find { |spec| spec.name == gem_name }
|
41
|
-
gem_spec
|
47
|
+
LockfileParser.new(lockfile_content: lockfile_content).gem_version(gem_name)
|
42
48
|
end
|
43
49
|
end
|
44
50
|
end
|
@@ -1,6 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
3
|
+
require "optparse"
|
4
4
|
|
5
5
|
module Gistory
|
6
6
|
module Cli
|
@@ -18,8 +18,8 @@ module Gistory
|
|
18
18
|
parse_gem_name
|
19
19
|
@io.error("extra parameters ignored: #{@args}") unless @args.count.zero?
|
20
20
|
@config
|
21
|
-
rescue OptionParser::InvalidOption =>
|
22
|
-
raise(Gistory::ParserError,
|
21
|
+
rescue OptionParser::InvalidOption => e
|
22
|
+
raise(Gistory::ParserError, e.message)
|
23
23
|
end
|
24
24
|
|
25
25
|
def to_s
|
@@ -30,53 +30,55 @@ module Gistory
|
|
30
30
|
|
31
31
|
def parse_gem_name
|
32
32
|
gem_name = @args.shift
|
33
|
-
raise(Gistory::ParserError,
|
33
|
+
raise(Gistory::ParserError, "No gem specified") unless gem_name
|
34
34
|
@config.gem_name = gem_name
|
35
35
|
end
|
36
36
|
|
37
37
|
def create_parser(config)
|
38
38
|
parser = OptionParser.new
|
39
|
-
parser.banner =
|
39
|
+
parser.banner = "Usage: gistory <gem_name> [options]"
|
40
40
|
|
41
|
-
|
42
|
-
add_common_options(parser)
|
41
|
+
add_options(parser, config)
|
43
42
|
|
44
43
|
parser
|
45
44
|
end
|
46
45
|
|
47
|
-
def
|
48
|
-
parser.separator
|
49
|
-
parser.separator
|
50
|
-
|
51
|
-
add_max_lockfile_changes(parser, config)
|
52
|
-
end
|
53
|
-
|
54
|
-
def add_common_options(parser)
|
55
|
-
parser.separator ''
|
56
|
-
parser.separator 'Common options:'
|
46
|
+
def add_options(parser, config)
|
47
|
+
parser.separator ""
|
48
|
+
parser.separator "Options:"
|
57
49
|
|
50
|
+
add_max_fetched_commits(parser, config)
|
51
|
+
add_use_commits_from_all_branches(parser, config)
|
58
52
|
add_help(parser)
|
59
53
|
add_version(parser)
|
60
54
|
end
|
61
55
|
|
62
|
-
def
|
63
|
-
default = config.
|
64
|
-
description = "max number of
|
65
|
-
parser.on(
|
66
|
-
raise(Gistory::ParserError,
|
67
|
-
config.
|
56
|
+
def add_max_fetched_commits(parser, config)
|
57
|
+
default = config.max_fetched_commits
|
58
|
+
description = "max number of commits to be fetched (default #{default})"
|
59
|
+
parser.on("-m", "--max-fetched-commits [Integer]", Integer, description) do |m|
|
60
|
+
raise(Gistory::ParserError, "argument --max-fetched-commits must be an integer") if m.nil?
|
61
|
+
config.max_fetched_commits = m
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
def add_use_commits_from_all_branches(parser, config)
|
66
|
+
description = "use commits from all branches " \
|
67
|
+
"(by default it uses only commits made to the current branch)"
|
68
|
+
parser.on("-a", "--all-branches", description) do |a|
|
69
|
+
config.all_branches = a
|
68
70
|
end
|
69
71
|
end
|
70
72
|
|
71
73
|
def add_help(parser)
|
72
|
-
parser.on_tail(
|
74
|
+
parser.on_tail("-h", "--help", "Show this message") do
|
73
75
|
@io.puts parser
|
74
76
|
exit
|
75
77
|
end
|
76
78
|
end
|
77
79
|
|
78
80
|
def add_version(parser)
|
79
|
-
parser.on_tail(
|
81
|
+
parser.on_tail("--version", "Show version") do
|
80
82
|
@io.puts "gistory version #{Gistory::VERSION}"
|
81
83
|
exit
|
82
84
|
end
|
data/lib/gistory/cli/io.rb
CHANGED
data/lib/gistory/cli/main.rb
CHANGED
@@ -14,11 +14,11 @@ module Gistory
|
|
14
14
|
parser = Cli::ArgParser.new(args: @args, io: @io)
|
15
15
|
config = parser.parse
|
16
16
|
history(repo, config.gem_name)
|
17
|
-
rescue Gistory::ParserError =>
|
18
|
-
@io.error
|
17
|
+
rescue Gistory::ParserError => e
|
18
|
+
@io.error e.message
|
19
19
|
@io.puts parser
|
20
|
-
rescue Gistory::Error =>
|
21
|
-
@io.error
|
20
|
+
rescue Gistory::Error => e
|
21
|
+
@io.error e.message
|
22
22
|
end
|
23
23
|
|
24
24
|
private
|
@@ -32,16 +32,34 @@ module Gistory
|
|
32
32
|
|
33
33
|
@io.puts "Gem: #{gem_name}"
|
34
34
|
@io.puts "Current version: #{changes.first.version}"
|
35
|
-
@io.puts
|
35
|
+
@io.puts ""
|
36
|
+
|
37
|
+
print_change_history(changes)
|
38
|
+
|
39
|
+
@io.puts ""
|
40
|
+
|
41
|
+
print_configuration_info
|
42
|
+
end
|
43
|
+
|
44
|
+
def print_change_history(changes)
|
45
|
+
@io.puts "Change history:"
|
46
|
+
max_length = changes.map { |c| c.version.length }.max
|
36
47
|
|
37
|
-
@io.puts 'Change history:'
|
38
48
|
changes.each do |change|
|
39
|
-
@io.puts "#{change.version} on #{change.date.strftime('%a, %e %b %Y %H:%M %Z')}
|
49
|
+
@io.puts "#{change.version.ljust(max_length)} on #{change.date.strftime('%a, %e %b %Y %H:%M %Z')} " \
|
50
|
+
"(commit #{change.short_hash})"
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
def print_configuration_info
|
55
|
+
max = Gistory.config.max_fetched_commits
|
56
|
+
if Gistory.config.all_branches?
|
57
|
+
@io.puts "The last #{max} changes to the lock file were fetched."
|
58
|
+
else
|
59
|
+
@io.puts "The last #{max} commits made to the current branch were fetched."
|
40
60
|
end
|
41
61
|
|
42
|
-
@io.puts
|
43
|
-
max = Gistory.config.max_lockfile_changes
|
44
|
-
@io.puts "The last #{max} changes to the lock file were taken into account, to see farther in the past use the -m switch" # rubocop:disable Metrics/LineLength
|
62
|
+
@io.puts "To see farther in the past use the -m switch"
|
45
63
|
end
|
46
64
|
end
|
47
65
|
end
|
data/lib/gistory/commit.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
3
|
+
require "date"
|
4
4
|
|
5
5
|
module Gistory
|
6
6
|
class Commit
|
@@ -11,5 +11,9 @@ module Gistory
|
|
11
11
|
@date = DateTime.parse(date.to_s)
|
12
12
|
freeze
|
13
13
|
end
|
14
|
+
|
15
|
+
def to_s
|
16
|
+
"Commit #{short_hash} on #{date}"
|
17
|
+
end
|
14
18
|
end
|
15
19
|
end
|
@@ -2,10 +2,16 @@
|
|
2
2
|
|
3
3
|
module Gistory
|
4
4
|
class Configuration
|
5
|
-
attr_accessor :gem_name, :
|
5
|
+
attr_accessor :gem_name, :max_fetched_commits
|
6
|
+
attr_writer :all_branches
|
6
7
|
|
7
8
|
def initialize
|
8
|
-
@
|
9
|
+
@max_fetched_commits = 100
|
10
|
+
@all_branches = false
|
11
|
+
end
|
12
|
+
|
13
|
+
def all_branches?
|
14
|
+
@all_branches
|
9
15
|
end
|
10
16
|
end
|
11
17
|
end
|
data/lib/gistory/git_repo.rb
CHANGED
@@ -1,17 +1,18 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
3
|
+
require "English"
|
4
4
|
|
5
5
|
module Gistory
|
6
6
|
class GitRepo
|
7
7
|
def initialize(path:)
|
8
|
-
raise(Gistory::Error,
|
9
|
-
raise(Gistory::Error,
|
8
|
+
raise(Gistory::Error, "This is not a valid git repository") unless Dir.exist?(File.join(path, ".git"))
|
9
|
+
raise(Gistory::Error, "git is not available, please install it") unless git_cli_available?
|
10
10
|
end
|
11
11
|
|
12
12
|
def changes_to_file(filename)
|
13
|
-
max_count = Gistory.config.
|
14
|
-
|
13
|
+
max_count = Gistory.config.max_fetched_commits
|
14
|
+
strategy = git_log_strategy(filename)
|
15
|
+
hashes_and_dates = git("log --pretty=format:'%h|%cD' --max-count=#{max_count} #{strategy}")
|
15
16
|
to_commits(hashes_and_dates.split("\n"))
|
16
17
|
end
|
17
18
|
|
@@ -21,20 +22,29 @@ module Gistory
|
|
21
22
|
|
22
23
|
private
|
23
24
|
|
25
|
+
def git_log_strategy(filename)
|
26
|
+
if Gistory.config.all_branches?
|
27
|
+
"--follow #{filename}"
|
28
|
+
else
|
29
|
+
# TODO: filter out commits that did not introduce changes to the lock file
|
30
|
+
"--first-parent"
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
24
34
|
def git_cli_available?
|
25
|
-
system(
|
35
|
+
system("which git > /dev/null 2>&1")
|
26
36
|
end
|
27
37
|
|
28
38
|
def to_commits(hashes_and_dates)
|
29
39
|
hashes_and_dates.map do |hash_and_date|
|
30
|
-
commit_hash, date = hash_and_date.split(
|
40
|
+
commit_hash, date = hash_and_date.split("|")
|
31
41
|
Commit.new(short_hash: commit_hash, date: date)
|
32
42
|
end
|
33
43
|
end
|
34
44
|
|
35
45
|
def git(command)
|
36
46
|
out = `git #{command}`
|
37
|
-
raise
|
47
|
+
raise "Git CLI command failed" unless $CHILD_STATUS.success?
|
38
48
|
out
|
39
49
|
end
|
40
50
|
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "bundler"
|
4
|
+
|
5
|
+
module Gistory
|
6
|
+
class LockfileParser
|
7
|
+
def initialize(lockfile_content:)
|
8
|
+
@lockfile_content = lockfile_content
|
9
|
+
end
|
10
|
+
|
11
|
+
def gem_version(gem_name)
|
12
|
+
lockfile = Bundler::LockfileParser.new(@lockfile_content)
|
13
|
+
gem_spec = lockfile.specs.find { |spec| spec.name == gem_name }
|
14
|
+
gem_spec ? gem_spec.version.to_s : nil
|
15
|
+
rescue Bundler::LockfileError => _e
|
16
|
+
# bundler could not parse the lockfile
|
17
|
+
# f.i. it could have been committed with merge conflicts
|
18
|
+
# try to parse it with a regex
|
19
|
+
# gem version looks like " byebug (9.0.6)"
|
20
|
+
# TODO: what if the gem was in the merge conflict?
|
21
|
+
regexp = /\n\s{4}#{gem_name} \((?<version>.+)\)\n/
|
22
|
+
matches = @lockfile_content.match(regexp)
|
23
|
+
matches ? matches[:version] : nil
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
data/lib/gistory/version.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
3
|
+
require "forwardable"
|
4
4
|
|
5
5
|
module Gistory
|
6
6
|
class VersionChange
|
@@ -14,5 +14,9 @@ module Gistory
|
|
14
14
|
@version = version
|
15
15
|
freeze
|
16
16
|
end
|
17
|
+
|
18
|
+
def to_s
|
19
|
+
"Version #{version} (on #{date} by #{short_hash})"
|
20
|
+
end
|
17
21
|
end
|
18
22
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: gistory
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1
|
4
|
+
version: 0.2.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sergio Medina
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2020-06-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -38,34 +38,90 @@ dependencies:
|
|
38
38
|
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: pry
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: pry-byebug
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
41
69
|
- !ruby/object:Gem::Dependency
|
42
70
|
name: rake
|
43
71
|
requirement: !ruby/object:Gem::Requirement
|
44
72
|
requirements:
|
45
73
|
- - "~>"
|
46
74
|
- !ruby/object:Gem::Version
|
47
|
-
version: '
|
75
|
+
version: '13.0'
|
48
76
|
type: :development
|
49
77
|
prerelease: false
|
50
78
|
version_requirements: !ruby/object:Gem::Requirement
|
51
79
|
requirements:
|
52
80
|
- - "~>"
|
53
81
|
- !ruby/object:Gem::Version
|
54
|
-
version: '
|
82
|
+
version: '13.0'
|
55
83
|
- !ruby/object:Gem::Dependency
|
56
|
-
name:
|
84
|
+
name: rspec
|
57
85
|
requirement: !ruby/object:Gem::Requirement
|
58
86
|
requirements:
|
59
87
|
- - "~>"
|
60
88
|
- !ruby/object:Gem::Version
|
61
|
-
version: '
|
89
|
+
version: '3.9'
|
62
90
|
type: :development
|
63
91
|
prerelease: false
|
64
92
|
version_requirements: !ruby/object:Gem::Requirement
|
65
93
|
requirements:
|
66
94
|
- - "~>"
|
67
95
|
- !ruby/object:Gem::Version
|
68
|
-
version: '
|
96
|
+
version: '3.9'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: rubocop
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - ">="
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - ">="
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: rubocop-rspec
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - ">="
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '0'
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - ">="
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '0'
|
69
125
|
description: 'Gistory: Know exactly when a gem was updated in your Gemfile.lock'
|
70
126
|
email:
|
71
127
|
- medinasergio@gmail.com
|
@@ -77,6 +133,7 @@ files:
|
|
77
133
|
- ".codeclimate.yml"
|
78
134
|
- ".coveralls.yml"
|
79
135
|
- ".gitignore"
|
136
|
+
- ".rspec"
|
80
137
|
- ".rubocop.yml"
|
81
138
|
- ".travis.yml"
|
82
139
|
- Gemfile
|
@@ -96,13 +153,14 @@ files:
|
|
96
153
|
- lib/gistory/configuration.rb
|
97
154
|
- lib/gistory/errors.rb
|
98
155
|
- lib/gistory/git_repo.rb
|
156
|
+
- lib/gistory/lockfile_parser.rb
|
99
157
|
- lib/gistory/version.rb
|
100
158
|
- lib/gistory/version_change.rb
|
101
159
|
homepage: https://www.github.com/serch/gistory
|
102
160
|
licenses:
|
103
161
|
- MIT
|
104
162
|
metadata: {}
|
105
|
-
post_install_message:
|
163
|
+
post_install_message:
|
106
164
|
rdoc_options: []
|
107
165
|
require_paths:
|
108
166
|
- lib
|
@@ -110,16 +168,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
110
168
|
requirements:
|
111
169
|
- - ">="
|
112
170
|
- !ruby/object:Gem::Version
|
113
|
-
version: '2.
|
171
|
+
version: '2.4'
|
114
172
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
115
173
|
requirements:
|
116
174
|
- - ">="
|
117
175
|
- !ruby/object:Gem::Version
|
118
176
|
version: '0'
|
119
177
|
requirements: []
|
120
|
-
|
121
|
-
|
122
|
-
signing_key:
|
178
|
+
rubygems_version: 3.0.3
|
179
|
+
signing_key:
|
123
180
|
specification_version: 4
|
124
181
|
summary: 'Gistory: Know exactly when a gem was updated in your Gemfile.lock'
|
125
182
|
test_files: []
|