sem_ver_components 0.2.0 → 0.3.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: 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: