sem_ver_components 0.2.0 → 0.3.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c769d2f50e4b9b47d7244d596c497781797539059ae577b3922221a0b55fdfb4
4
- data.tar.gz: c265fe89c722f6092b0f8061ea556244131f1d3ce13de0ba24c2fb0714e05d04
3
+ metadata.gz: 3bd9072dcf7ef8166885ae3f8cf08c3d50cf5b99e557f9c22b51c9523ddb263a
4
+ data.tar.gz: 66036176a6028833f51c4f5f5118f4d68c934106c8e90dc08f478ae4a57e78d0
5
5
  SHA512:
6
- metadata.gz: fc08045f4e3552af8deefe3e4086b8d9e4e80c39bfe65a2c00a8ab25b7eeccbcf089207adcdcb5832308abaa3a2008343c393a124dba4948f8a49b0e161e82d6
7
- data.tar.gz: 021e88d06a2ce6fc31cb5d146e211c9436db6ec4da7eaafd151ce16df08347f179cd286782d42e4f10cfeb89f668bac14420a91786e449d757c51205f2b70905
6
+ metadata.gz: '049f38d9969d07d80af92c82ec6a70f9e9de84ac1df68e549c72962ce0d63958d182ebb8ae9b966e9371511d2d76fc7539ebb0c62e7f6b0d0d9e2df2a93ee13f'
7
+ data.tar.gz: 355307ad5bee9481fdc7d7b29c0dad165c5d573ae805a77d2241a1826ee6b6ef35bcf4013b652d56f57b761fe67b00a24e1d2945f8c76d7e7b4354cba7a069da
data/bin/sem_ver_git CHANGED
@@ -17,7 +17,7 @@ git_hosting_plugins = SemVerComponents::Plugins.new(:git_hostings)
17
17
  OptionParser.new do |opts|
18
18
  opts.banner = "Usage: #{File.basename($0)} [options]"
19
19
  opts.on('-f', '--from GIT_REF', 'Git reference from which commits are to be analyzed (defaults to first commit)') do |git_ref|
20
- git_from = git_ref
20
+ git_from = git_ref.empty? ? nil : git_ref
21
21
  end
22
22
  opts.on('-g', '--git_hosting GIT_HOSTING', "Specify which kind of git hosting is used. Used to format URLs to commits and comparisons. Possible values are #{git_hosting_plugins.list.sort.join(', ')}. (defaults to #{git_hosting})") do |git_hosting_str|
23
23
  git_hosting = git_hosting_str.to_sym
@@ -10,7 +10,7 @@ module SemVerComponents
10
10
  # * *git_url* (String): The git URL
11
11
  # * *commit_sha* (String): The commit sha
12
12
  def commit_url(git_url, commit_sha)
13
- "#{git_url}/commits/#{commit_sha}"
13
+ "#{public_url(git_url)}/commits/#{commit_sha}"
14
14
  end
15
15
 
16
16
  # Get the URL to compare 2 tags
@@ -20,7 +20,26 @@ module SemVerComponents
20
20
  # * *tag_1* (String): The first tag
21
21
  # * *tag_2* (String): The second tag
22
22
  def compare_url(git_url, tag_1, tag_2)
23
- "#{git_url}/compare/commits?targetBranch=refs%2Ftags%2F#{tag_2}&sourceBranch=refs%2Ftags%2F#{tag_1}"
23
+ "#{public_url(git_url)}/compare/commits?targetBranch=refs%2Ftags%2F#{tag_1}&sourceBranch=refs%2Ftags%2F#{tag_2}"
24
+ end
25
+
26
+ private
27
+
28
+ # Convert the git remote URL to the public URL
29
+ #
30
+ # Parameters::
31
+ # * *git_url* (String): Git remote URL
32
+ # Result::
33
+ # * String: The corresponding public URL
34
+ def public_url(git_url)
35
+ if git_url =~ /^(.+)\/scm\/([^\/]+)\/(.+)$/
36
+ base_url = $1
37
+ project = $2
38
+ repo = $3
39
+ "#{base_url}/projects/#{project}/repos/#{repo}"
40
+ else
41
+ git_url
42
+ end
24
43
  end
25
44
 
26
45
  end
@@ -60,6 +60,14 @@ module SemVerComponents
60
60
  end
61
61
  end
62
62
 
63
+ # Is the git to ref part of a release branch?
64
+ #
65
+ # Result::
66
+ # * Boolean: Is the git to ref part of a release branch?
67
+ def on_release_branch?
68
+ @git_to == 'master'
69
+ end
70
+
63
71
  end
64
72
 
65
73
  end
@@ -1,3 +1,5 @@
1
+ require 'sem_ver_components/semver'
2
+
1
3
  module SemVerComponents
2
4
 
3
5
  module Outputs
@@ -12,11 +14,12 @@ module SemVerComponents
12
14
  # * *commit* (Git::Object::Commit): Corresponding git commit
13
15
  def process(commits_info)
14
16
  # Display bump levels per component
15
- commits_info.inject({}) do |components_bump_levels, commit_info|
17
+ bumps_per_component = commits_info.inject({}) do |components_bump_levels, commit_info|
16
18
  components_bump_levels.merge(commit_info[:components_bump_levels]) do |_component, bump_level_1, bump_level_2|
17
19
  [bump_level_1, bump_level_2].max
18
20
  end
19
- end.each do |component, bump_level|
21
+ end
22
+ bumps_per_component.each do |component, bump_level|
20
23
  puts "#{component.nil? ? 'Global' : component}: Bump #{
21
24
  case bump_level
22
25
  when 0
@@ -30,6 +33,15 @@ module SemVerComponents
30
33
  end
31
34
  } version"
32
35
  end
36
+ # Compute new version
37
+ global_bump_level = bumps_per_component.values.max
38
+ if global_bump_level.nil?
39
+ puts 'No next version'
40
+ else
41
+ puts "Next global version#{@local_git.on_release_branch? ? '' : ' (not on release branch)'}: #{
42
+ Semver.next_version_from(Semver.version_from_git_ref(@local_git.git_from), global_bump_level, pre_release: !@local_git.on_release_branch?)
43
+ }"
44
+ end
33
45
  end
34
46
 
35
47
  end
@@ -1,4 +1,5 @@
1
1
  require 'time'
2
+ require 'sem_ver_components/semver'
2
3
 
3
4
  module SemVerComponents
4
5
 
@@ -14,31 +15,10 @@ module SemVerComponents
14
15
  # * *commit* (Git::Object::Commit): Corresponding git commit
15
16
  def process(commits_info)
16
17
  # Compute new version
17
- new_version =
18
- if @local_git.git_from.nil?
19
- '0.0.1'
20
- elsif @local_git.git_from =~ /^v(\d+)\.(\d+)\.(\d+)$/
21
- major = Integer($1)
22
- minor = Integer($2)
23
- patch = Integer($3)
24
- bump_level = commits_info.map { |commit_info| commit_info[:components_bump_levels].values }.flatten(1).max
25
- case bump_level
26
- when 0
27
- patch += 1
28
- when 1
29
- minor += 1
30
- patch = 0
31
- when 2
32
- major += 1
33
- minor = 0
34
- patch = 0
35
- else
36
- raise "Invalid bump level: #{bump_level}"
37
- end
38
- "#{major}.#{minor}.#{patch}"
39
- else
40
- raise "Can't generate release notes from a git ref that is not a semantic release (#{@local_git.git_from})"
41
- end
18
+ new_version = Semver.next_version_from(
19
+ Semver.version_from_git_ref(@local_git.git_from),
20
+ commits_info.map { |commit_info| commit_info[:components_bump_levels].values }.flatten(1).max
21
+ )
42
22
  git_url = @local_git.git.remote('origin').url
43
23
  git_url = git_url[0..-5] if git_url.end_with?('.git')
44
24
  # Reference merge commits: merged commits will not be part of the changelog, but their bump level will be taken into account when reporting the merge commit.
@@ -67,10 +47,14 @@ module SemVerComponents
67
47
  # If we are dealing with a merge commit, consider the components' bump levels of the merged commits
68
48
  if merge_commits.key?(git_commit_sha)
69
49
  merge_commits[git_commit_sha].each do |merged_commit_sha|
70
- components_bump_levels = components_bump_levels.merge(
71
- commits_info.find { |search_commit_info| search_commit_info[:commit].sha == merged_commit_sha }[:components_bump_levels]
72
- ) do |component, bump_level_1, bump_level_2|
73
- [bump_level_1, bump_level_2].max
50
+ merged_commit_info = commits_info.find { |search_commit_info| search_commit_info[:commit].sha == merged_commit_sha }
51
+ # If the merged commit is not part of the list of commits, it means that the merge commit was not rebased on the previous release tag.
52
+ # In this case we can have some merged commits that are already part of the previous release.
53
+ # So we can ignore them.
54
+ unless merged_commit_info.nil?
55
+ components_bump_levels = components_bump_levels.merge(merged_commit_info[:components_bump_levels]) do |component, bump_level_1, bump_level_2|
56
+ [bump_level_1, bump_level_2].max
57
+ end
74
58
  end
75
59
  end
76
60
  end
@@ -80,7 +64,7 @@ module SemVerComponents
80
64
  commits_per_component[component][bump_level] << git_commit
81
65
  end
82
66
  end
83
- puts "# [v#{new_version}](#{@git_hosting.compare_url(git_url, @local_git.git_from, new_version)}) (#{Time.now.utc.strftime('%F %T')})"
67
+ puts "# [v#{new_version}](#{@git_hosting.compare_url(git_url, @local_git.git_from, "v#{new_version}")}) (#{Time.now.utc.strftime('%F %T')})"
84
68
  puts
85
69
  commits_per_component.sort_by { |component, _component_info| component || '' }.each do |(component, component_info)|
86
70
  puts "## #{component.nil? ? 'Global changes' : "Changes for #{component}"}\n" if commits_per_component.size > 1 || !component.nil?
@@ -0,0 +1,66 @@
1
+ module SemVerComponents
2
+
3
+ # Helpers giving ways to adapt to semantic versioning conventions
4
+ module Semver
5
+
6
+ # Compute next version from an existing one and a bump level
7
+ #
8
+ # Parameters::
9
+ # * *version* (String): Existing version
10
+ # * *bump_level* (Integer): The bump level (0: patch, 1: minor, 2: major)
11
+ # * *pre_release* (Boolean): Should we get a pre-release version (adding a unique metadata)? [default: false]
12
+ # Result::
13
+ # * String: The next version
14
+ def self.next_version_from(version, bump_level, pre_release: false)
15
+ if version =~ /^(\d+)\.(\d+)\.(\d+)$/
16
+ major = Integer($1)
17
+ minor = Integer($2)
18
+ patch = Integer($3)
19
+ case bump_level
20
+ when 0
21
+ patch += 1
22
+ when 1
23
+ minor += 1
24
+ patch = 0
25
+ when 2
26
+ major += 1
27
+ minor = 0
28
+ patch = 0
29
+ else
30
+ raise "Invalid bump level: #{bump_level}"
31
+ end
32
+ "#{major}.#{minor}.#{patch}#{pre_release ? "-#{pre_release_metadata}" : ''}"
33
+ else
34
+ raise "Invalid version: #{version}"
35
+ end
36
+ end
37
+
38
+ # Get a version from a git ref
39
+ #
40
+ # Parameters::
41
+ # * *git_ref* (String): The git ref
42
+ # Result::
43
+ # * String: Corresponding version
44
+ def self.version_from_git_ref(git_ref)
45
+ if git_ref.nil?
46
+ '0.0.0'
47
+ elsif git_ref =~ /^v(\d+\.\d+\.\d+)$/
48
+ $1
49
+ else
50
+ raise "Can't assume version from git ref: #{git_ref}"
51
+ end
52
+ end
53
+
54
+ private
55
+
56
+ # Get a pre-release metadata to be appended to a version
57
+ #
58
+ # Result::
59
+ # * String: The pre-release metadata
60
+ def self.pre_release_metadata
61
+ "#{`whoami`.strip}-#{Time.now.utc.strftime('%Y%m%d%H%M%S')}-SNAPSHOT"
62
+ end
63
+
64
+ end
65
+
66
+ end
@@ -1,5 +1,5 @@
1
1
  module SemVerComponents
2
2
 
3
- VERSION = '0.2.0'
3
+ VERSION = '0.3.1'
4
4
 
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sem_ver_components
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.3.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Muriel Salvan
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-01-18 00:00:00.000000000 Z
11
+ date: 2021-02-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: git
@@ -71,6 +71,7 @@ files:
71
71
  - lib/sem_ver_components/outputs/semantic_release_analyze.rb
72
72
  - lib/sem_ver_components/outputs/semantic_release_generate_notes.rb
73
73
  - lib/sem_ver_components/plugins.rb
74
+ - lib/sem_ver_components/semver.rb
74
75
  - lib/sem_ver_components/version.rb
75
76
  homepage: https://github.com/Muriel-Salvan/sem_ver_components
76
77
  licenses: