revision 1.4.0 → 1.5.3

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: adcdc2d0e9d54552cb574a4abcf0f4c305ee1b4679de002a0a6b237ece5b2844
4
- data.tar.gz: f316d48ab9d95456707bd10264d99a082b4d3ebbf0c9b2056723af0df3b6e363
3
+ metadata.gz: 0aeac36b67440a0670c7b89fc3602ae9bfda2bc43add4f6ac3dbb44c0d2d7a45
4
+ data.tar.gz: 4fa17d34cd367afafb0afb75343405a793ad2f732364ce36680059907d4b8f92
5
5
  SHA512:
6
- metadata.gz: 236bea8efec06c900852eef6d30bbe544dc50cc9d5a3e27e68de45847f32cfeada7f1c22ddbcdff3245cc1dda2716ac20b827cf83d67d3fb914c65d339bf6187
7
- data.tar.gz: 5a18f6d7d2668214c7b1c71fe4d3d25bfbfa78de9c66c3d722bc2cb85cf5097a85adb168a20e4a59b94ae60943dcbb3625417402d51107bf9d52a14397e60cf8
6
+ metadata.gz: 231c4a899d91b78bc32e160b382b160df9a3e09f0953b81f16101b981bcb350d0252140e9cf075c5daeba75b91b968e54e2b7d382d3e3c949eb2d0fbcc1d01cd
7
+ data.tar.gz: 6f63c22ed930a5a3830c89fe2902ff9ec6a9ebb01e79810bfa3690e28f25c3ae6e2f85a16d63c4c9a90a8ff6b681f1c937fd1082830381b4c9166de2f0368522
data/.gitignore CHANGED
@@ -12,3 +12,4 @@
12
12
  Gemfile.lock
13
13
 
14
14
  README.html
15
+ *.zip
data/Gemfile CHANGED
@@ -1,6 +1,6 @@
1
1
  source "https://rubygems.org"
2
2
 
3
- #git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }
3
+ # git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }
4
4
 
5
5
  # Specify your gem's dependencies in revision.gemspec
6
6
  gemspec
data/README.org CHANGED
@@ -1,6 +1,5 @@
1
1
  #+TITLE: Revision management gem
2
2
  #+AUTHOR: Cormac Cannon
3
- #+EMAIL: cormac.cannon@neuromoddevices.com
4
3
  #+LANGUAGE: en
5
4
 
6
5
  # Generic properties
@@ -24,250 +23,270 @@
24
23
  # or alternatively #+SETUPFILE: theme-readtheorg.setup
25
24
 
26
25
  * Overview
26
+ This gem automates revision management for source projects. The tool is language agnostic (used for C, ruby and matlab projects, to date -- though you're probably better off using bundler for ruby projects). It supports per-project configuration using a yaml-format file called =releasables.yaml= located at the project root.
27
27
 
28
- This gem automates revision management for source projects. The tool is language agnostic (used for C, ruby and matlab projects, to date -- though you're
29
- probably better off using bundler for ruby projects). It supports per-project configuration using a yaml-format file called =releasables.yaml= located at
30
- the project root.
28
+ It currently supports the following functionality
29
+ - Manage 3-component revision IDs embedded natively in source file
30
+ - Embeds/updates/extracts changelog in source file header/footer comments
31
+ - Automatically prompts for a changelog entry each time a revision identifier is incremented
32
+ - Optionally commits and tags changes to a git repo after an update to the revision ID
33
+ - Builds and archives projects in zip format (including release notes and arbitrary release artefacts defined
34
+ - Deploys
31
35
 
32
- It currently supports the following functionality
33
- - Manage 3-component revision IDs embedded natively in source file
34
- - Embeds/updates/extracts changelog in source file header/footer comments
35
- - Automatically prompts for a changelog entry each time a revision identifier is incremented
36
- - Optionally commits and tags changes to a git repo after an update to the revision ID
37
- - Builds and archives projects in zip format (including release notes and arbitrary release artefacts defined
38
- - Deploys
36
+ Worked on sporadically to allow me to tag, archive and deploy projects in multiple languages in a consistent fashion.
39
37
 
40
38
  * Installation
41
39
  ** Dependencies
42
- Ruby / Rubygems installed
40
+ Ruby / Rubygems installed
43
41
 
44
42
  ** From rubygems.org
45
43
 
46
- #+BEGIN_SRC sh
47
- gem install revision
48
- #+END_SRC
44
+ #+BEGIN_SRC sh
45
+ gem install revision
46
+ #+END_SRC
49
47
 
50
48
  ** From source
51
49
 
52
- #+BEGIN_SRC sh
53
- git clone git@git.nmd.ie/lib/
54
- #+END_SRC
50
+ #+BEGIN_SRC sh
51
+ git clone git@github.com:cormacc/revision
52
+ #+END_SRC
55
53
 
56
54
 
57
55
  *** Checkout
58
56
 
59
- #+BEGIN_SRC sh
60
- gem install bundler
61
- git clone git@git.nmd.ie:gem/revision
62
- cd revision
63
- #+END_SRC
57
+ #+BEGIN_SRC sh
58
+ gem install bundler
59
+ git clone git@github.com:cormacc/revision
60
+ cd revision
61
+ #+END_SRC
64
62
 
65
63
  *** Install
66
64
 
67
- #+BEGIN_SRC sh
68
- bundle install
69
- bundle exec rake install
70
- #+END_SRC
71
-
72
- #+RESULTS:
73
- #+begin_example
74
- Using rake 10.5.0
75
- Using bundler 1.16.0
76
- Using coderay 1.1.2
77
- Using diff-lcs 1.3
78
- Using git 1.3.0
79
- Using method_source 0.9.0
80
- Using pry 0.11.3
81
- Using rubyzip 1.2.1
82
- Using thor 0.19.4
83
- Using revision 1.0.0 from source at `.`
84
- Using rspec-support 3.7.0
85
- Using rspec-core 3.7.0
86
- Using rspec-expectations 3.7.0
87
- Using rspec-mocks 3.7.0
88
- Using rspec 3.7.0
89
- Bundle complete! 5 Gemfile dependencies, 15 gems now installed.
90
- Use `bundle info [gemname]` to see where a bundled gem is installed.
91
- revision 1.0.0 built to pkg/revision-1.0.0.gem.
92
- revision (1.0.0) installed.
93
- #+end_example
65
+ #+BEGIN_SRC sh
66
+ bundle install
67
+ bundle exec rake install
68
+ #+END_SRC
69
+
70
+ #+RESULTS:
71
+ #+begin_example
72
+ Using rake 10.5.0
73
+ Using bundler 1.16.0
74
+ Using coderay 1.1.2
75
+ Using diff-lcs 1.3
76
+ Using git 1.3.0
77
+ Using method_source 0.9.0
78
+ Using pry 0.11.3
79
+ Using rubyzip 1.2.1
80
+ Using thor 0.19.4
81
+ Using revision 1.0.0 from source at `.`
82
+ Using rspec-support 3.7.0
83
+ Using rspec-core 3.7.0
84
+ Using rspec-expectations 3.7.0
85
+ Using rspec-mocks 3.7.0
86
+ Using rspec 3.7.0
87
+ Bundle complete! 5 Gemfile dependencies, 15 gems now installed.
88
+ Use `bundle info [gemname]` to see where a bundled gem is installed.
89
+ revision 1.0.0 built to pkg/revision-1.0.0.gem.
90
+ revision (1.0.0) installed.
91
+ #+end_example
94
92
 
95
93
  * Usage
96
94
 
97
95
  ** Supported Commands
98
- Run the executable with no arguments to get usage instructions in your console window...
99
-
100
- #+BEGIN_SRC sh
101
- revision
102
- #+END_SRC
103
-
104
- #+RESULTS:
105
- #+begin_example
106
- Loading releasable definitions from /home/cormacc/nextcloud/nmd/gem/revision/releasables.yaml ...
107
- Commands:
108
- revision archive # Archive releasables
109
- revision changelog # Display change log on stdout
110
- revision help [COMMAND] # Describe available commands or one specific command
111
- revision info # Display info for all defined releasables
112
- revision major # Increment major revision index
113
- revision minor # Increment minor revision index
114
- revision patch # Increment patch revision index
115
- revision tag # Commit the current revision to a local git repo ...
116
-
117
- Options:
118
- [--dryrun], [--no-dryrun]
119
- [--id=ID]
120
-
121
- #+end_example
122
-
123
- #+BEGIN_NOTE
124
- The tool can be run from any subfolder of a project root -- it will traverse the tree until it finds
125
- an ancestor containing =releasables.yaml= OR can go no further (in which case it throws an error).
126
- #+END_NOTE
96
+ Run the executable with no arguments to get usage instructions in your console window...
97
+
98
+ #+BEGIN_SRC sh
99
+ revision
100
+ #+END_SRC
101
+
102
+ #+RESULTS:
103
+ #+begin_example
104
+ Loading releasable definitions from /home/cormacc/dev/gem/revision/releasables.yaml ...
105
+ Commands:
106
+ revision --version, -v # print the version
107
+ revision archive # Archive releasable(s)
108
+ revision build # Build releasable(s)
109
+ revision changelog # Display change log on stdout
110
+ revision deploy # Deploy releasable(s)
111
+ revision help [COMMAND] # Describe available commands or one specific command
112
+ revision info # Display info for all defined releasables
113
+ revision major # Increment major revision index
114
+ revision minor # Increment minor revision index
115
+ revision package # Build and archive releasables
116
+ revision patch # Increment patch revision index
117
+ revision tag # Commit the current revision to a local git repo ...
118
+
119
+ Options:
120
+ [--dryrun], [--no-dryrun]
121
+ [--id=ID]
122
+
123
+ #+end_example
124
+
125
+ #+BEGIN_NOTE
126
+ The tool can be run from any subfolder of a project root -- it will traverse the tree until it finds
127
+ an ancestor containing =releasables.yaml= OR can go no further (in which case it throws an error).
128
+ #+END_NOTE
127
129
 
128
130
  *** Operating on multiple releasables
129
131
 
130
- A single =releasables.yaml= file can define multiple releasables, either implicitly (via inclusion) or explicitly
131
- (see [[Configuration]] section below for examples). In this context, the ~info~ and ~archive~ commands
132
- will operate on all defined releasables, whereas the remaining commands will require the releasable
133
- to be specified using the ~--id=~ option, e.g.
132
+ A single =releasables.yaml= file can define multiple releasables, either implicitly (via inclusion) or explicitly
133
+ (see [[Configuration]] section below for examples). In this context, the ~info~ and ~archive~ commands
134
+ will operate on all defined releasables, whereas the remaining commands will require the releasable
135
+ to be specified using the ~--id=~ option, e.g.
134
136
 
135
- #+BEGIN_SRC sh
136
- revision minor --id=firmware
137
- #+END_SRC
137
+ #+BEGIN_SRC sh
138
+ revision minor --id=firmware
139
+ #+END_SRC
138
140
 
139
141
  ** Configuration
140
142
 
141
- YAML syntax is used for the configuration file. The [[Syntax]] and [[Examples]] sections below should provide sufficient
142
- introduction to the limit subset of language features required to use this tool, however further info
143
- may be found at the following links:
143
+ YAML syntax is used for the configuration file. The [[Syntax]] and [[Examples]] sections below should provide sufficient
144
+ introduction to the limit subset of language features required to use this tool, however further info
145
+ may be found at the following links:
144
146
 
145
- - http://docs.ansible.com/ansible/latest/YAMLSyntax.html
146
- - http://www.yaml.org/start.html
147
+ - http://docs.ansible.com/ansible/latest/YAMLSyntax.html
148
+ - http://www.yaml.org/start.html
147
149
 
148
150
  *** Syntax
149
151
 
150
- The =releasables.yaml= file should contain a top level ~:releasables~ node.
151
- Under this, you can create a list (or YAML /sequence/) of releasable definitions.
152
+ The =releasables.yaml= file should contain a top level ~:releasables~ node.
153
+ Under this, you can create a list (or YAML /sequence/) of releasable definitions.
152
154
 
153
- Each sequence item begins with a ~-~ and contains either a link to a folder containing its own =releasables.yaml=
154
- defining one or more releasables ...
155
+ Each sequence item begins with a ~-~ and contains either a link to a folder containing its own =releasables.yaml=
156
+ defining one or more releasables ...
155
157
 
156
- #+BEGIN_SRC yaml
157
- - :folder: relative/path/to/a/releasable/folder
158
- #+END_SRC
158
+ #+BEGIN_SRC yaml
159
+ - :folder: relative/path/to/a/releasable/folder
160
+ #+END_SRC
159
161
 
160
- ... or a single inline releasable definition.
162
+ ... or a single inline releasable definition.
161
163
 
162
- #+BEGIN_NOTE
163
- The lines beginning with '#' are explanatory comments
164
- #+END_NOTE
164
+ #+BEGIN_NOTE
165
+ The lines beginning with '#' are explanatory comments
166
+ #+END_NOTE
165
167
 
166
- #+BEGIN_SRC yaml
167
- - :id: my_releasable
168
- :revision:
169
- # Source file containing the revision identifier
170
- # This will also include changelog entries, embedded as comments
171
- :src: lib/revision/version.rb
172
- # Regex matching the source revision identifier. Must contain the following named capture groups
173
- # - major, minor, patch :: Numeric (uint) sequences representing the three revision ID components
174
- # - sep1, sep2 :: the characters separating the revision components
175
- # - prefix, postfix :: sufficient syntactic context to match the revision ID uniquely
176
- # N.B. this regex matches the version ID from the standard bundler gem skeleton,
177
- # e.g. VERSION = "1.1.0"
178
- :regex: (?<prefix>VERSION = ")(?<major>\d+)(?<sep1>\.)(?<minor>\d+)(?<sep2>\.)(?<patch>\d+)(?<postfix>")
179
- # Comment char for the project language -- prefixed to each line of changelog entries
180
- # Quotes only necessary here to prevent # being interpreted as the beginning of a YAML comment
181
- :comment_prefix: "#"
168
+ #+BEGIN_SRC yaml
169
+ - :id: my_releasable
170
+ :revision:
171
+ # Source file containing the revision identifier
172
+ # This will also include changelog entries, embedded as comments
173
+ :src: lib/revision/version.rb
174
+ # Regex matching the source revision identifier. Must contain the following named capture groups
175
+ # - major, minor, patch :: Numeric (uint) sequences representing the three revision ID components
176
+ # - sep1, sep2 :: the characters separating the revision components
177
+ # - prefix, postfix :: sufficient syntactic context to match the revision ID uniquely
178
+ # N.B. this regex matches the version ID from the standard bundler gem skeleton,
179
+ # e.g. VERSION = "1.1.0"
180
+ :regex: (?<prefix>VERSION = ")(?<major>\d+)(?<sep1>\.)(?<minor>\d+)(?<sep2>\.)(?<patch>\d+)(?<postfix>")
181
+ # Comment char for the project language -- prefixed to each line of changelog entries
182
+ # Quotes only necessary here to prevent # being interpreted as the beginning of a YAML comment
183
+ :comment_prefix: "#"
182
184
  # Sequence of build steps -- each item should be a valid shell command, prefixed with the YAML sequence item token, '- '
183
185
  :build_steps:
184
186
  - bundle exec rake install
185
- # Sequence defining the files (build artefacts) to package in the release archive.
186
- # Each artefact definition must include a :src: key/value pair.
187
- # An optional :dest: value may be provided to rename the file during packaging, or just (as in the first entry below)
188
- # to flatten the folder structure.
189
- # Any <VER> (or <REV>) in the :src: or :dest: placeholders wil be replaced with the current revision ID
190
- # The revision archive will also include the revision history extracted as a text file
191
- :artefacts:
192
- # A binary artefact -- the
193
- - :src: pkg/revision-<VER>.gem
194
- :dest: revision-<VER>.gem
195
- # This document -- the :dest: value defaults to duplicating :src: if not specified
196
- - :src: README.org
197
- #+END_SRC
187
+ # Sequence defining the files (build artefacts) to package in the release archive.
188
+ # Each artefact definition must include a :src: key/value pair.
189
+ # An optional :dest: value may be provided to rename the file during packaging, or just (as in the first entry below)
190
+ # to flatten the folder structure.
191
+ # Any <VER> (or <REV>) in the :src: or :dest: placeholders wil be replaced with the current revision ID
192
+ # The revision archive will also include the revision history extracted as a text file
193
+ :artefacts:
194
+ # A binary artefact -- the
195
+ - :src: pkg/revision-<VER>.gem
196
+ :dest: revision-<VER>.gem
197
+ # This document -- the :dest: value defaults to duplicating :src: if not specified
198
+ - :src: README.org
199
+ #+END_SRC
198
200
 
199
201
  **** TODO (or at least consider) add support for overridable defaults
200
- e.g. via a =.releasables= configuration file in the user home dir.
201
- Though this would be bad for collaborative development as the config file would live outside source control.
202
- Possibly useful to support inclusion of a controlled configuration file instead? Primarily to define
203
- a revision regex and comment prefix for a group of related releasables....
202
+ e.g. via a =.releasables= configuration file in the user home dir.
203
+ Though this would be bad for collaborative development as the config file would live outside source control.
204
+ Possibly useful to support inclusion of a controlled configuration file instead? Primarily to define
205
+ a revision regex and comment prefix for a group of related releasables....
204
206
 
205
207
  *** Examples
206
208
  **** C project
207
209
 
208
- #+BEGIN_NOTE
209
- The ~:regex:~ and ~:comment_prefix:~ keys are absent in the C example below. This project started life as
210
- managing some embedded C projects, and the default values reflect this.
211
- #+END_NOTE
212
-
213
- #+BEGIN_SRC yaml
214
- :releasables:
215
- - :id: mbt_cd_firmware
216
- :revision:
217
- :src: src/FirmwareRevision.c
218
- :build_steps:
219
- - make --jobs=8 -f Makefile CONF=bootloadable
210
+ #+BEGIN_NOTE
211
+ The ~:regex:~ and ~:comment_prefix:~ keys are absent in the C example below. This project started life as
212
+ managing some embedded C projects, and the default values reflect this.
213
+ #+END_NOTE
214
+
215
+ #+BEGIN_SRC yaml
216
+ :releasables:
217
+ - :id: mbt_cd_firmware
218
+ :revision:
219
+ :src: src/FirmwareRevision.c
220
+ :build_steps:
221
+ - make --jobs=8 -f Makefile CONF=bootloadable
220
222
  :artefacts:
221
223
  - :src: dist/bootloadable/production/firmware.production.hex
222
224
  :dest: mbt_cd_firmware_v<REV>.bootloadable.hex
223
- - :src: dist/default/production/firmware.production.hex
224
- :dest: mbt_cd_firmware_v<REV>.standalone.hex
225
- #+END_SRC
225
+ - :src: dist/default/production/firmware.production.hex
226
+ :dest: mbt_cd_firmware_v<REV>.standalone.hex
227
+ #+END_SRC
226
228
 
227
229
  **** Ruby project
228
230
 
229
- #+BEGIN_SRC yaml
230
- :releasables:
231
- - :id: revision
232
- :revision:
233
- :src: lib/revision/version.rb
234
- :regex: (?<prefix>VERSION = ")(?<major>\d+)(?<sep1>\.)(?<minor>\d+)(?<sep2>\.)(?<patch>\d+)(?<postfix>")
235
- :comment_prefix: "#"
236
- :build_steps:
237
- - bundle exec rake install
231
+ #+BEGIN_SRC yaml
232
+ :releasables:
233
+ - :id: revision
234
+ :revision:
235
+ :src: lib/revision/version.rb
236
+ :regex: (?<prefix>VERSION = ")(?<major>\d+)(?<sep1>\.)(?<minor>\d+)(?<sep2>\.)(?<patch>\d+)(?<postfix>")
237
+ :comment_prefix: "#"
238
+ :build_steps:
239
+ - bundle exec rake install
238
240
  :artefacts:
239
241
  - :src: pkg/revision-<VER>.gem
240
- #+END_SRC
242
+ #+END_SRC
241
243
 
242
244
  *** Heirarchical project
243
- Rather than defining the releasable parameters inline, a =releasables.yaml= list entry can contain a (relative or absolute) link to another folder containing it's own =releasables.yaml=.
245
+ Rather than defining the releasable parameters inline, a =releasables.yaml= list entry can contain a (relative or absolute) link to another folder containing it's own =releasables.yaml=.
244
246
 
245
- i.e assuming the earlier examples were in folders =examples/c= and =examples/ruby= relative to a common root, a separate =releasables.yaml=
246
- at that root could include them as follows...
247
+ i.e assuming the earlier examples were in folders =examples/c= and =examples/ruby= relative to a common root, a separate =releasables.yaml=
248
+ at that root could include them as follows...
247
249
 
248
- #+BEGIN_SRC yaml
249
- :releasables:
250
- - :folder: examples/c
251
- - :folder: examples/ruby
252
- #+END_SRC
250
+ #+BEGIN_SRC yaml
251
+ :releasables:
252
+ - :folder: examples/c
253
+ - :folder: examples/ruby
254
+ #+END_SRC
253
255
 
254
256
  **** TODO consider supporting a higher-level aggregate revision ID
255
257
 
256
- #+BEGIN_SRC yaml
257
- :revision:
258
- :src: release_log.txt
258
+ #+BEGIN_SRC yaml
259
+ :revision:
260
+ :src: release_log.txt
259
261
  :releasables:
260
262
  - :folder: examples/c
261
- - :folder: examples/ruby
262
- #+END_SRC
263
+ - :folder: examples/ruby
264
+ #+END_SRC
263
265
 
264
266
  * Development
265
267
 
266
- After checking out the repo, run =bin/setup= to install dependencies. Then, run =rake spec= to run the tests. You can also run =bin/console= for an interactive prompt that will allow you to experiment.
268
+ ** Environment
269
+ After checking out the repo, run =bin/setup= to install dependencies. Then, run =rake spec= to run the tests. You can also run =bin/console= for an interactive prompt that will allow you to experiment.
270
+
271
+ ** Installation from source
272
+ To install this gem from source on your local machine, run =bundle exec rake install= from the repository root.
273
+
274
+ ** Incrementing release versions
275
+ You can do this using the gem, by entering one of the following commands at the repository root
276
+
277
+ | Command | Effect |
278
+ |------------------+----------------------------------------------|
279
+ | =revision patch= | Patch version increment, e.g. 1.1.0 -> 1.1.1 |
280
+ | =revision minor= | Patch version increment, e.g. 1.1.1 -> 1.2.0 |
281
+ | =revision major= | Major version increment, e.g. 1.2.0 -> 2.0.0 |
282
+
283
+ You'll be prompted to rebuild the gem, commit changes to the git repo and add a revision tag to the commit.
267
284
 
268
- To install this gem onto your local machine, run =bundle exec rake install=. To release a new version, update the version number in =version.rb=, and then run =bundle exec rake release=, which will create a git tag for the version, push git commits and tags, and push the =.gem= file to [rubygems.org](https://rubygems.org).
285
+ Alternatively, manually update the version number in =version.rb= and rebuild/install locally using =bundle exec rake install=
269
286
 
287
+ ** Deploying to rubygems
288
+ =bundle exec rake release=, will create a git tag for the version (if not, push git commits and tags, and push the =.gem= file to [rubygems.org](https://rubygems.org).
270
289
 
271
290
  * Contributing
272
291
 
273
- Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/revision.
292
+ Bug reports and pull requests are welcome on GitHub at https://github.com/cormacc/revision.
data/lib/revision/info.rb CHANGED
@@ -121,7 +121,7 @@ class Revision::Info
121
121
  # Prefixes the entry with an empty line, then prefixes each line with comment chars
122
122
  # and converts the line entries to a single string
123
123
  def format_changelog_entry(entry_lines)
124
- entry_lines.unshift('').map { |line| "#{@comment_prefix} #{line}"}.join("\n")
124
+ entry_lines.unshift('').map { |line| "#{@comment_prefix} #{line}".rstrip()}.join("\n")
125
125
  end
126
126
 
127
127
  def get_changelog_entry
@@ -95,7 +95,7 @@ module Revision
95
95
 
96
96
  def exec_pipeline(type, steps, skip_steps=0)
97
97
  exec_steps = steps[skip_steps..-1]
98
- puts "{type} :: Executing steps #{skip_steps+1} to #{steps.length}..."
98
+ puts "#{type} :: Executing steps #{skip_steps+1} to #{steps.length}..."
99
99
  Dir.chdir(@root) do
100
100
  exec_steps.each_with_index do |step, index|
101
101
  step_index = index+1+skip_steps
@@ -141,8 +141,12 @@ module Revision
141
141
  "#{@git_tag_prefix}#{revision}"
142
142
  end
143
143
 
144
+ def escape(a_string)
145
+ a_string.gsub('"',"\\\"")
146
+ end
147
+
144
148
  def tag_annotation
145
- @revision.last_changelog_entry.join("\n")
149
+ escape(@revision.last_changelog_entry.join("\n"))
146
150
  end
147
151
 
148
152
  def commit_message
@@ -153,7 +157,7 @@ module Revision
153
157
  commit_lines << "Also..."
154
158
  commit_lines += changelog_entry[2..-1]
155
159
  end
156
- commit_lines.join("\n")
160
+ escape(commit_lines.join("\n"))
157
161
  end
158
162
 
159
163
  def tag
@@ -196,22 +200,23 @@ module Revision
196
200
  src = File.join(@root,src)
197
201
  dest = dest_prefix.empty? ? dest : File.join(dest_prefix, dest)
198
202
  amap[src] = dest
199
- puts "... (#{index+1}/#{@artefacts.length}) #{src} => #{dest}"
200
203
  end
201
204
  amap
202
205
  end
203
206
 
204
207
  def archive
205
208
  puts "Archiving #{@artefacts.length} build artefacts as #{archive_name}..."
206
- puts artefact_map
209
+ amap = artefact_map
207
210
  if File.exist?(archive_name)
208
211
  puts "... deleting existing archive"
209
212
  File.delete(archive_name)
210
213
  end
211
214
  Zip::File.open(archive_name, Zip::File::CREATE) do |zipfile|
212
- artefact_map.each do |src, dest|
215
+ amap.each.with_index(1) do |entry, idx|
216
+ src, dest = entry
213
217
  #TODO: Add directory processing....
214
- zipfile.add(dest,src)
218
+ puts "... (#{idx}/#{amap.length}) #{src} => #{dest}"
219
+ zipfile.add(dest, src)
215
220
  end
216
221
  puts "... embedding revision history as #{changelog_name} "
217
222
  zipfile.get_output_stream(changelog_name) { |os| output_changelog(os)}
@@ -226,29 +231,58 @@ module Revision
226
231
  end
227
232
 
228
233
  def deploy(destination='')
229
- if destination=='' and @config.dig(:deploy, :dest)
230
- destination = @config[:deploy][:dest]
234
+ destinations = []
235
+ if not destination.empty?
236
+ destinations.append({dest: destination})
237
+ elsif @config.dig(:deploy)
238
+ if @config[:deploy].kind_of?(Array)
239
+ destinations.append(*@config[:deploy])
240
+ else
241
+ destinations.append(@config[:deploy])
242
+ end
231
243
  end
232
244
 
233
- raise Errors::NotSpecified.new(':deploy/:dest') if destination==''
234
- destination = File.expand_path(destination)
245
+ raise Errors::NotSpecified.new(':deploy') if destinations.empty?
235
246
 
236
- if @config.dig(:deploy, :pre)
237
- exec_pipeline('deploy (pre)', @config[:deploy][:pre])
238
- end
247
+ #... Eliminated global deployment pre/post functions.
248
+ #... if applicable to all dests, the logic should probably be a build step...
249
+ # if @config.dig(:deploy, :pre)
250
+ # exec_pipeline('deploy (pre)', @config[:deploy][:pre])
251
+ # end
239
252
 
240
- puts "Deploying #{@artefacts.length} build artefacts to #{destination}..."
241
- artefact_map(destination).each do |src, dest|
242
- if File.exist?(dest)
243
- puts "... deleting existing '#{dest}'"
244
- FileUtils.rm_rf(dest)
253
+ destinations.each do |d|
254
+ destination = File.expand_path(d[:dest])
255
+
256
+ if d.dig(:pre)
257
+ exec_pipeline('deploy (pre / #{d[:dest]})', d[:pre])
258
+ end
259
+
260
+ puts "Deploying #{@artefacts.length} build artefacts to #{destination}..."
261
+ if not File.exist?(destination)
262
+ puts "... folder not found -> creating ... '#{destination}'"
263
+ FileUtils.mkdir_p(destination)
264
+ end
265
+ amap = artefact_map(destination)
266
+ amap.each.with_index(1) do |entry, idx|
267
+ src, dest = entry
268
+ puts "... (#{idx}/#{amap.length}) #{src} => #{dest}"
269
+ if File.exist?(dest)
270
+ puts "... deleting existing '#{dest}' ..."
271
+ FileUtils.rm_rf(dest)
272
+ end
273
+ puts "... deploying '#{src}' -> '#{dest}"
274
+ FileUtils.cp_r(src,dest)
275
+ end
276
+ File.open(File.join(destination,changelog_name),'w') { |f| output_changelog(f)}
277
+
278
+ if d.dig(:post)
279
+ exec_pipeline('deploy (post / #{d[:dest]})', d[:post])
245
280
  end
246
- FileUtils.cp_r(src,dest)
247
- end
248
- File.open(File.join(destination,changelog_name),'w') { |f| output_changelog(f)}
249
- if @config.dig(:deploy, :post)
250
- exec_pipeline('deploy (post)', @config[:deploy][:post])
251
281
  end
282
+
283
+ # if @config.dig(:deploy, :post)
284
+ # exec_pipeline('deploy (post)', @config[:deploy][:post])
285
+ # end
252
286
  end
253
287
 
254
288
  def package
@@ -1,107 +1,122 @@
1
1
  # Defines the revision ID for the revision gem
2
2
  module Revision
3
- VERSION = "1.4.0"
3
+ VERSION = "1.5.3".freeze
4
4
  end
5
5
 
6
6
  # <BEGIN CHANGELOG>
7
- #
7
+ #
8
+ # Version 1.5.3 (26 Oct 2021)
9
+ # - Multiple deployment destinations bugfix -- only last destination was being used.
10
+ #
11
+ # Version 1.5.2 (10 Jun 2020)
12
+ # - Uprevving around undeletable git tag
13
+ #
14
+ ## Version 1.5.1 (10 Jun 2020)
15
+ # - Escape " and ' in commit message when constructing git command line (' still problematic in some shells)
16
+ #
17
+ # Version 1.5.0 (13 Feb 2020)
18
+ # - Now handles multiple deployment destinations in releasables.yaml
19
+ #
20
+ # Version 1.4.1 (18 Nov 2019)
21
+ # - Updated to strip trailing whitespace after comment char for empty line
22
+ #
8
23
  # Version 1.4.0 (10 Jun 2019)
9
24
  # - Now allow the definition of one or more 'secondary_revisions', where a revision ID can be updated with or without an embedded changelog
10
- #
25
+ #
11
26
  # Version 1.3.1 (20 May 2019)
12
27
  # - Corrected bug when deploying changelog:w
13
- #
28
+ #
14
29
  # Version 1.3.0 (20 May 2019)
15
30
  # - Added :archive: (archive root definition)
16
31
  # - Added optional :pre: and :post: steps to :deploy: definition
17
- #
32
+ #
18
33
  # Version 1.2.8 (20 May 2019)
19
34
  # - Updated Git tag/commit behaviour -- now commit/tag/push by default
20
35
  # - Updated deploy to remove existing targets and copy entire directory trees
21
- #
36
+ #
22
37
  # Version 1.2.7 (17 May 2019)
23
38
  # - 'deploy' now expands '~' in paths
24
- #
39
+ #
25
40
  # Version 1.2.6 (17 May 2019)
26
41
  # - Updated deploy to use default dest from yaml (if specified)
27
- #
42
+ #
28
43
  # Version 1.2.5 (07 Nov 2018)
29
44
  # - Added 'deploy' command
30
- #
45
+ #
31
46
  # Version 1.2.4 (05 Sep 2018)
32
47
  # - Added commit message and tag details to `revision info`
33
48
  # - Minor refactoring
34
- #
49
+ #
35
50
  # Version 1.2.3 (03 Sep 2018)
36
51
  # - Tidied up `revision info` output formatting
37
- #
52
+ #
38
53
  # Version 1.2.2 (03 Sep 2018)
39
54
  # - Updated CLI to provide version info
40
- #
55
+ #
41
56
  # Version 1.2.1 (03 Sep 2018)
42
57
  # - Update to allow releasable without any artefacts
43
- #
58
+ #
44
59
  # Version 1.2.0 (06 Mar 2018)
45
60
  # - Build definition improvements (and new yaml structure)
46
61
  # - Added platform-agnostic environment variable definition (handles '~' replacement and :/; path separators)
47
62
  # - Added platform-agnostic packaging of binaries (i.e. appending .exe for windows when archiving)
48
- #
63
+ #
49
64
  # Version 1.1.10 (16 Feb 2018)
50
65
  # - Modified 'archive' command to just archive existing artefact -- i.e. skip build phase
51
66
  # - Added 'package' command that builds AND archives
52
- #
67
+ #
53
68
  # Version 1.1.9 (16 Feb 2018)
54
69
  # - Fixed bug when adding first changelog entry to file without existing placeholders
55
70
  # - Added standalone build command
56
- #
71
+ #
57
72
  # Version 1.1.8 (15 Dec 2017)
58
73
  # - Added .yardopts to build documentation
59
- #
74
+ #
60
75
  # Version 1.1.7 (15 Dec 2017)
61
76
  # - Corrected push -- was pushing tags without commit
62
- #
77
+ #
63
78
  # Version 1.1.6 (15 Dec 2017)
64
79
  # - Added full changelog entry as tag message
65
80
  # - Removed ruby-git dependency from gemspec
66
- #
81
+ #
67
82
  # Version 1.1.5 (15 Dec 2017)
68
83
  # - Replaced ruby-git library with shell calls, as wasn't handling submodules correctly
69
- #
84
+ #
70
85
  # Version 1.1.4 (14 Dec 2017)
71
86
  # - Minor message body reformatting
72
- #
87
+ #
73
88
  # Version 1.1.3 (14 Dec 2017)
74
89
  # - Eliminated duplication of version ID in commit message body
75
- #
90
+ #
76
91
  # Version 1.1.2 (14 Dec 2017)
77
92
  # - Removed redundant ':: ' from commit message headline
78
- #
93
+ #
79
94
  # Version 1.1.1 (14 Dec 2017)
80
95
  # - Added git connection failure handling
81
96
  # - Revision commit message now includes first line of changelog entry
82
97
  # - Updated configuration syntax for consistency (:revision: :file: -> :revision: :src:)
83
- #
98
+ #
84
99
  # Version 1.1.0 (13 Dec 2017)
85
100
  # - Updated to optionally push tags to the repo
86
- #
101
+ #
87
102
  # Version 1.0.1 (13 Dec 2017)
88
103
  # - Corrected revision placeholder handling when archiving build artefacts
89
104
  # - Added proper high-level usage documentation
90
- #
105
+ #
91
106
  # Version 1.0.0 (12 Dec 2017)
92
107
  # - First fully functional release with new config file
93
- #
108
+ #
94
109
  # Version 0.1.4 (12 Dec 2017)
95
110
  # - boo
96
111
  # - hoo
97
112
  # - hoo
98
- #
113
+ #
99
114
  # Version 0.1.3 (12 Dec 2017)
100
115
  # - boo
101
- #
116
+ #
102
117
  # Version 0.1.2 (12 Dec 2017)
103
118
  # - wahoo!
104
- #
119
+ #
105
120
  # Version 0.1.1 (12 Dec 2017)
106
121
  # - Wahey!
107
- # <END CHANGELOG>
122
+ # <END CHANGELOG>
data/releasables.yaml CHANGED
@@ -2,7 +2,7 @@
2
2
  - :id: revision
3
3
  :revision:
4
4
  :src: lib/revision/version.rb
5
- :regex: (?<prefix>VERSION = ")(?<major>\d+)(?<sep1>\.)(?<minor>\d+)(?<sep2>\.)(?<patch>\d+)(?<postfix>")
5
+ :regex: (?<prefix>VERSION = ")(?<major>\d+)(?<sep1>\.)(?<minor>\d+)(?<sep2>\.)(?<patch>\d+)(?<postfix>".freeze)
6
6
  :comment_prefix: "#"
7
7
  :build_steps:
8
8
  - bundle exec rake install
data/revision.gemspec CHANGED
@@ -6,20 +6,12 @@ Gem::Specification.new do |spec|
6
6
  spec.name = "revision"
7
7
  spec.version = Revision::VERSION
8
8
  spec.authors = ["Cormac Cannon"]
9
- spec.email = ["cormac.cannon@neuromoddevices.com"]
9
+ spec.licenses = ['MIT']
10
10
 
11
11
  spec.summary = %q{Language-agnostic revision management tool}
12
12
  spec.description = %q{Updates project revision identifiers in software source files and associated change log. Can also build and package project archives as a zip and optionally commit, tag and push to a Git repo.}
13
- # spec.homepage = "TBC"
14
-
15
- # Prevent pushing this gem to RubyGems.org. To allow pushes either set the 'allowed_push_host'
16
- # to allow pushing to a single host or delete this section to allow pushing to any host.
17
- # if spec.respond_to?(:metadata)
18
- # spec.metadata["allowed_push_host"] = "http://gems.nmd.ie"
19
- # else
20
- # raise "RubyGems 2.0 or newer is required to protect against " \
21
- # "public gem pushes."
22
- # end
13
+ spec.homepage = 'https://rubygems.org/gems/revision'
14
+ spec.metadata = { "source_code_uri" => "https://github.com/cormacc/revision" }
23
15
 
24
16
  spec.files = `git ls-files -z`.split("\x0").reject do |f|
25
17
  f.match(%r{^(test|spec|features)/})
@@ -29,11 +21,22 @@ Gem::Specification.new do |spec|
29
21
 
30
22
  spec.require_paths = ["lib"]
31
23
 
32
- spec.add_runtime_dependency 'thor', '~> 0.19.1'
33
- spec.add_runtime_dependency 'rubyzip'
24
+ spec.add_runtime_dependency 'thor', '~> 1.0'
25
+ spec.add_runtime_dependency 'rubyzip', '~> 2.0'
34
26
 
35
27
  spec.add_development_dependency "bundler", "~> 2.0"
36
- spec.add_development_dependency "rake", "~> 10.0"
28
+ spec.add_development_dependency "rake", "~> 13.0"
37
29
  spec.add_development_dependency "rspec", "~> 3.0"
38
30
  spec.add_development_dependency "pry"
31
+ #emacs ruby layer deps...
32
+ #...lsp backend
33
+ spec.add_development_dependency "steep"
34
+ spec.add_development_dependency "solargraph"
35
+ #...robe backend
36
+ #....watch this space
37
+ #...generic
38
+ spec.add_development_dependency "ruby_parser"
39
+ spec.add_development_dependency "rubocop"
40
+ spec.add_development_dependency "prettier"
41
+ spec.add_development_dependency "seeing_is_believing"
39
42
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: revision
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.4.0
4
+ version: 1.5.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Cormac Cannon
8
- autorequire:
8
+ autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2019-06-10 00:00:00.000000000 Z
11
+ date: 2021-10-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: thor
@@ -16,28 +16,28 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: 0.19.1
19
+ version: '1.0'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: 0.19.1
26
+ version: '1.0'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rubyzip
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - ">="
31
+ - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '0'
33
+ version: '2.0'
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - ">="
38
+ - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: '0'
40
+ version: '2.0'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: bundler
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -58,14 +58,14 @@ dependencies:
58
58
  requirements:
59
59
  - - "~>"
60
60
  - !ruby/object:Gem::Version
61
- version: '10.0'
61
+ version: '13.0'
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
66
  - - "~>"
67
67
  - !ruby/object:Gem::Version
68
- version: '10.0'
68
+ version: '13.0'
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: rspec
71
71
  requirement: !ruby/object:Gem::Requirement
@@ -94,11 +94,94 @@ dependencies:
94
94
  - - ">="
95
95
  - !ruby/object:Gem::Version
96
96
  version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: steep
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: solargraph
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'
125
+ - !ruby/object:Gem::Dependency
126
+ name: ruby_parser
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
139
+ - !ruby/object:Gem::Dependency
140
+ name: rubocop
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - ">="
144
+ - !ruby/object:Gem::Version
145
+ version: '0'
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - ">="
151
+ - !ruby/object:Gem::Version
152
+ version: '0'
153
+ - !ruby/object:Gem::Dependency
154
+ name: prettier
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - ">="
158
+ - !ruby/object:Gem::Version
159
+ version: '0'
160
+ type: :development
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - ">="
165
+ - !ruby/object:Gem::Version
166
+ version: '0'
167
+ - !ruby/object:Gem::Dependency
168
+ name: seeing_is_believing
169
+ requirement: !ruby/object:Gem::Requirement
170
+ requirements:
171
+ - - ">="
172
+ - !ruby/object:Gem::Version
173
+ version: '0'
174
+ type: :development
175
+ prerelease: false
176
+ version_requirements: !ruby/object:Gem::Requirement
177
+ requirements:
178
+ - - ">="
179
+ - !ruby/object:Gem::Version
180
+ version: '0'
97
181
  description: Updates project revision identifiers in software source files and associated
98
182
  change log. Can also build and package project archives as a zip and optionally
99
183
  commit, tag and push to a Git repo.
100
184
  email:
101
- - cormac.cannon@neuromoddevices.com
102
185
  executables:
103
186
  - revision
104
187
  extensions: []
@@ -123,10 +206,12 @@ files:
123
206
  - lib/revision/version.rb
124
207
  - releasables.yaml
125
208
  - revision.gemspec
126
- homepage:
127
- licenses: []
128
- metadata: {}
129
- post_install_message:
209
+ homepage: https://rubygems.org/gems/revision
210
+ licenses:
211
+ - MIT
212
+ metadata:
213
+ source_code_uri: https://github.com/cormacc/revision
214
+ post_install_message:
130
215
  rdoc_options: []
131
216
  require_paths:
132
217
  - lib
@@ -141,8 +226,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
141
226
  - !ruby/object:Gem::Version
142
227
  version: '0'
143
228
  requirements: []
144
- rubygems_version: 3.0.3
145
- signing_key:
229
+ rubygems_version: 3.2.13
230
+ signing_key:
146
231
  specification_version: 4
147
232
  summary: Language-agnostic revision management tool
148
233
  test_files: []