vershunt 2.0.4

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.
@@ -0,0 +1,168 @@
1
+ #
2
+ # This kind of project stores the version in the debian changelog
3
+ #
4
+ module MSPRelease
5
+ module Project::Debian
6
+
7
+ class BuildResult
8
+ def initialize(dir, project)
9
+ @dir = dir
10
+ @project = project
11
+
12
+ looking_for = project.changelog.version.to_s
13
+ changes_file = find_changes_file(looking_for)
14
+ if changes_file && File.exists?(changes_file)
15
+ @changes_file = changes_file
16
+ else
17
+ raise NoChangesFileError, looking_for
18
+ end
19
+ end
20
+
21
+ attr_reader :changes_file
22
+
23
+ alias :package :changes_file
24
+
25
+ def files
26
+ dir = File.dirname(changes_file)
27
+ changes = File.read(changes_file).split("\n")
28
+ files_start = changes.index {|l| /^Files: $/.match(l) } + 1
29
+ changes[files_start..-1].map {|l| File.join(dir, l.split(" ").last) } +
30
+ [changes_file]
31
+ end
32
+
33
+ def available_changes_files
34
+ Dir["#{@dir}/*.changes"]
35
+ end
36
+
37
+ def changes_pattern
38
+ /#{@project.source_package_name}_([^_]+)_([^\.]+)\.changes/
39
+ end
40
+
41
+ def find_changes_file(version_string)
42
+ available_changes_files.find { |fname|
43
+ (m = changes_pattern.match(File.basename(fname))) && m && (m[1] == version_string)
44
+ }
45
+ end
46
+ end
47
+
48
+ DEFAULT_PATH = "debian/msp/changelog"
49
+
50
+ def write_version(new_version)
51
+ debian_version = Debian::Versions::Unreleased.new_from_version(new_version)
52
+ changelog.add(debian_version, "New version")
53
+
54
+ defined?(super) ?
55
+ Array(super).push(changelog.fname) :
56
+ [changelog.fname]
57
+ end
58
+
59
+ def version
60
+ changelog.version.to_version
61
+ end
62
+
63
+ def changelog_path
64
+ @changelog_path || 'debian/changelog'
65
+ end
66
+
67
+ def source_package_name
68
+ debian_dir = File.dirname(File.join(@dir, changelog_path))
69
+ control_file = File.join(debian_dir + '/control')
70
+ source_line = MSPRelease::Exec.exec("grep Source: #{control_file}")
71
+ match = /^Source: (.+)$/.match(source_line)
72
+ match && match[1]
73
+ end
74
+
75
+ def name
76
+ source_package_name
77
+ end
78
+
79
+ def changelog
80
+ Debian.new(@dir, changelog_path)
81
+ end
82
+
83
+ def next_version_for_release(options = {})
84
+ deb_version = changelog.version
85
+ distribution = options[:distribution] || changelog.distribution
86
+
87
+ new_version =
88
+ if deb_version.to_version != version
89
+ LOG.warn "Warning: project version (#{version.to_s}) " +
90
+ "did not match changelog version (#{deb_version.to_s}), project " +
91
+ "version wins"
92
+ changelog.reset_at(version)
93
+ else
94
+ deb_version.bump
95
+ end
96
+
97
+ LOG.debug "Adding new entry to changelog..."
98
+ changelog.add(new_version, "New release", distribution)
99
+
100
+ LOG.debug "Changelog now at #{new_version}"
101
+ puts_changelog_info
102
+
103
+ new_version
104
+ end
105
+
106
+ def puts_changelog_info
107
+ LOG.debug "OK, please update the change log, then run 'vershunt push' to"\
108
+ " push your changes for building"
109
+ end
110
+
111
+ def project_specific_push(release_name)
112
+ # Create a release commit.
113
+ commit_message = release_commit_message(release_name)
114
+ exec "git add #{changelog.fname}"
115
+ exec "git commit -m\"#{commit_message}\""
116
+ end
117
+
118
+ def prepare_for_build(branch_name, options={})
119
+ branch_is_release_branch = !! /^release-.+$/.match(branch_name)
120
+ distribution = options[:distribution] || changelog.distribution
121
+
122
+ rename_dir_for_build(branch_name, distribution)
123
+
124
+ super if defined?(super)
125
+ end
126
+
127
+ def rename_dir_for_build(branch_name, distribution)
128
+ branch_is_release_branch = !! /^release-.+$/.match(branch_name)
129
+ new_dir = Dir.chdir(@dir) do
130
+ if branch_is_release_branch
131
+ first_commit_hash, commit_message =
132
+ find_first_release_commit
133
+
134
+ if first_commit_hash.nil?
135
+ raise CLI::Exit, "Could not find a release commit on #{pathspec}"
136
+ end
137
+
138
+ clean_checkout
139
+ else
140
+ dev_version = Debian::Versions::Development.
141
+ new_from_working_directory(branch_name, latest_commit_hash)
142
+
143
+ changelog.amend(dev_version, distribution)
144
+ end
145
+ name + "-" + changelog.version.to_s
146
+ end
147
+ FileUtils.mv(@dir, new_dir)
148
+ @dir = new_dir
149
+ end
150
+
151
+ def build_opts(options={})
152
+ @sign = options[:sign]
153
+ end
154
+
155
+ def build_command(options={})
156
+ if cmd = config[:deb_build_command]
157
+ cmd
158
+ else
159
+ "dpkg-buildpackage" + (@sign ? '' : ' -us -uc')
160
+ end
161
+ end
162
+
163
+ def build_result(dir)
164
+ BuildResult.new(dir, self)
165
+ end
166
+
167
+ end
168
+ end
@@ -0,0 +1,74 @@
1
+
2
+ module MSPRelease
3
+ module Project::Gem
4
+ include MSPRelease::Exec::Helpers
5
+
6
+ class BuildResult
7
+ def initialize(dir, project)
8
+ @dir = dir
9
+ @project = project
10
+ end
11
+
12
+ def package
13
+ "#{@dir}/#{@project.gemspec_name}-#{@project.version}.gem"
14
+ end
15
+
16
+ def files
17
+ [package]
18
+ end
19
+ end
20
+
21
+ def gemspec_file
22
+ files = Dir.glob("#{@dir}/*.gemspec")
23
+
24
+ LOG.warn "Warning: more than one gemspec found" if files.count > 1
25
+ raise "Can't find gemspec" if files.count < 0
26
+
27
+ files.first
28
+ end
29
+
30
+ def gemspec_name
31
+ @gemspec_name ||= Dir.chdir(@dir) do
32
+ File.new(gemspec_file, 'r').readlines.find { |l|
33
+ l =~ /\w+\.name\s*=\s*(['"])([\w-]+)\1/
34
+ }
35
+ $2
36
+ end
37
+ end
38
+
39
+ def name
40
+ gemspec_name
41
+ end
42
+
43
+ def next_version_for_release(options={})
44
+ tag = "release-#{version}"
45
+ check_tag = exec("git show-ref --tags #{tag}", :status => [0,1])
46
+ unless check_tag == ""
47
+ LOG.error "Tag #{tag} already exists, you must bump the version before"\
48
+ " the next release"
49
+ exit(1)
50
+ end
51
+ version
52
+ end
53
+
54
+ def prepare_for_build(branch_name, options={})
55
+ # new_dir = "#{gemspec_name}"
56
+
57
+ # FileUtils.mv(@dir, new_dir)
58
+ # @dir = new_dir
59
+
60
+ clean_checkout
61
+
62
+ super if defined?(super)
63
+ end
64
+
65
+ def build_command
66
+ "gem build #{gemspec_file}"
67
+ end
68
+
69
+ def build_result(output_directory)
70
+ BuildResult.new(@dir, self)
71
+ end
72
+
73
+ end
74
+ end
@@ -0,0 +1,76 @@
1
+ # Mixin module for git projects.
2
+ module MSPRelease
3
+ module Project::Git
4
+
5
+ def prepare_for_build(branch_name, options={})
6
+ branch_is_release_branch = !! /^release-.+$/.match(branch_name)
7
+ shallow_output = options[:shallow_output]
8
+
9
+ if branch_name && branch_is_release_branch
10
+ LOG.debug("Checking out latest release commit from origin/#{branch_name}#{shallow_output}")
11
+ else
12
+ LOG.debug("Checking out latest commit from origin/#{branch_name}#{shallow_output}")
13
+ end
14
+
15
+ pathspec = "origin/#{branch_name}"
16
+ if pathspec != "origin/master"
17
+ move_to(pathspec)
18
+ end
19
+ super if defined?(super)
20
+ end
21
+
22
+ def move_to(pathspec)
23
+ Dir.chdir(@dir) do
24
+ begin
25
+ exec("git show #{pathspec} --")
26
+ rescue MSPRelease::Exec::UnexpectedExitStatus => e
27
+ if /^fatal: bad revision/.match(e.stderr)
28
+ raise MSPRelease::CLI::Exit, "Git pathspec '#{pathspec}' does not exist"
29
+ else
30
+ raise
31
+ end
32
+ end
33
+
34
+ exec("git checkout #{pathspec}")
35
+ end
36
+ end
37
+
38
+ def log_command
39
+ Dir.chdir(@dir) do
40
+ "git --no-pager log --no-color --full-index"
41
+ end
42
+ end
43
+
44
+ def oneline_pattern
45
+ /^([a-z0-9]+) (.+)$/i
46
+ end
47
+
48
+ def find_first_release_commit
49
+ all_commits = exec(log_command + " --pretty=oneline").
50
+ split("\n")
51
+
52
+ all_commits.map { |commit_line|
53
+ match = oneline_pattern.match(commit_line)
54
+ [match[1], match[2]]
55
+ }.find {|hash, message|
56
+ release_name_from_message(message)
57
+ }
58
+ end
59
+
60
+ def latest_commit_hash
61
+ output = exec(log_command + " --pretty=oneline -1").split("\n").first
62
+ oneline_pattern.match(output)[1]
63
+ end
64
+
65
+
66
+ def clean_checkout
67
+ Dir.chdir(@dir) do
68
+ first_commit_hash, commit_message = find_first_release_commit
69
+
70
+ exec "git reset --hard #{first_commit_hash}"
71
+ end
72
+ end
73
+
74
+ end
75
+ end
76
+
@@ -0,0 +1,40 @@
1
+ #
2
+ # This kind of project uses a ruby file with a VERSION constant to be the
3
+ # authorative source for the version
4
+ #
5
+ module MSPRelease::Project::Ruby
6
+
7
+ attr_reader :ruby_version_file
8
+
9
+ def version_pattern
10
+ /VERSION *= *(['"])([0-9]+)\.([0-9]+)\.([0-9]+)\1/
11
+ end
12
+
13
+ def write_version(new_version)
14
+ lines = File.open(ruby_version_file, 'r') { |f| f.readlines }
15
+ lines = lines.map do |line|
16
+ if match = version_pattern.match(line)
17
+ line.gsub(/( *VERSION *= *)(['"]).+\2$/, "\\1\\2#{new_version.to_s}\\2")
18
+ else
19
+ line
20
+ end
21
+ end
22
+
23
+ File.open(ruby_version_file, 'w') { |f| f.write(lines) }
24
+
25
+ defined?(super) ?
26
+ Array(super).push(ruby_version_file) :
27
+ [ruby_version_file]
28
+ end
29
+
30
+ def version
31
+ Dir.chdir(@dir) do
32
+ File.open(ruby_version_file, 'r') do |f|
33
+ v_line = f.readlines.map {|l|version_pattern.match(l)}.compact.first
34
+ raise "Couldn't parse version from #{ruby_version_file}" unless v_line
35
+ MSPRelease::Version.new(* (2..4).map {|i|v_line[i]} )
36
+ end
37
+ end
38
+ end
39
+
40
+ end
@@ -0,0 +1,3 @@
1
+ module MSPRelease
2
+ VERSION = '2.0.4'
3
+ end
metadata ADDED
@@ -0,0 +1,116 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: vershunt
3
+ version: !ruby/object:Gem::Version
4
+ version: 2.0.4
5
+ platform: ruby
6
+ authors:
7
+ - nick@playlouder.com
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2015-04-29 00:00:00 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: POpen4
16
+ prerelease: false
17
+ requirement: &id001 !ruby/object:Gem::Requirement
18
+ requirements:
19
+ - - ~>
20
+ - !ruby/object:Gem::Version
21
+ version: 0.1.0
22
+ type: :runtime
23
+ version_requirements: *id001
24
+ - !ruby/object:Gem::Dependency
25
+ name: climate
26
+ prerelease: false
27
+ requirement: &id002 !ruby/object:Gem::Requirement
28
+ requirements:
29
+ - - ~>
30
+ - !ruby/object:Gem::Version
31
+ version: 0.5.0
32
+ type: :runtime
33
+ version_requirements: *id002
34
+ - !ruby/object:Gem::Dependency
35
+ name: rspec
36
+ prerelease: false
37
+ requirement: &id003 !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - ~>
40
+ - !ruby/object:Gem::Version
41
+ version: 2.8.0
42
+ type: :development
43
+ version_requirements: *id003
44
+ - !ruby/object:Gem::Dependency
45
+ name: rake
46
+ prerelease: false
47
+ requirement: &id004 !ruby/object:Gem::Requirement
48
+ requirements:
49
+ - &id005
50
+ - ">="
51
+ - !ruby/object:Gem::Version
52
+ version: "0"
53
+ type: :development
54
+ version_requirements: *id004
55
+ description: Maintain versioning information in a consistent way, then build debian packages consistently.
56
+ email:
57
+ - nick@playlouder.com
58
+ executables:
59
+ - vershunt
60
+ extensions: []
61
+
62
+ extra_rdoc_files: []
63
+
64
+ files:
65
+ - bin/vershunt
66
+ - lib/msp_release.rb
67
+ - lib/msp_release/build.rb
68
+ - lib/msp_release/cli.rb
69
+ - lib/msp_release/cli/branch.rb
70
+ - lib/msp_release/cli/build.rb
71
+ - lib/msp_release/cli/bump.rb
72
+ - lib/msp_release/cli/checkout.rb
73
+ - lib/msp_release/cli/distrib.rb
74
+ - lib/msp_release/cli/help.rb
75
+ - lib/msp_release/cli/new.rb
76
+ - lib/msp_release/cli/push.rb
77
+ - lib/msp_release/cli/reset.rb
78
+ - lib/msp_release/cli/status.rb
79
+ - lib/msp_release/debian.rb
80
+ - lib/msp_release/exec.rb
81
+ - lib/msp_release/git.rb
82
+ - lib/msp_release/log.rb
83
+ - lib/msp_release/make_branch.rb
84
+ - lib/msp_release/options.rb
85
+ - lib/msp_release/project.rb
86
+ - lib/msp_release/project/base.rb
87
+ - lib/msp_release/project/debian.rb
88
+ - lib/msp_release/project/gem.rb
89
+ - lib/msp_release/project/git.rb
90
+ - lib/msp_release/project/ruby.rb
91
+ - lib/msp_release/version.rb
92
+ homepage:
93
+ licenses: []
94
+
95
+ metadata: {}
96
+
97
+ post_install_message:
98
+ rdoc_options: []
99
+
100
+ require_paths:
101
+ - lib
102
+ required_ruby_version: !ruby/object:Gem::Requirement
103
+ requirements:
104
+ - *id005
105
+ required_rubygems_version: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - *id005
108
+ requirements: []
109
+
110
+ rubyforge_project:
111
+ rubygems_version: 2.4.6
112
+ signing_key:
113
+ specification_version: 4
114
+ summary: Repeatable build system tool
115
+ test_files: []
116
+