drupid 1.1.4 → 1.1.5

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
  SHA1:
3
- metadata.gz: d36d42d029249123c34d37c52a7240f536ed8642
4
- data.tar.gz: 65a484f094c4f73bce1f3145e452ad0ad007dfd5
3
+ metadata.gz: 1dc45daa92f00ed660abef03c9031212b8433d5b
4
+ data.tar.gz: 972e0442163ec44466742815af5d43840b985e2a
5
5
  SHA512:
6
- metadata.gz: d2f1d949e284b15295d6f8b56b700dff4d55332887adeb752226904d9a583fd09d87e42c77f12e3066c534e4af75e5e86552ba1b4e50efb24c77886fc3bb2be8
7
- data.tar.gz: f93f4558b1dcc52a9f3dabfb5b9199f6bcaa7736f1e615c4da5f8794a46a0d6df07307a93746b9acedc3a749c31858073b9064b821a7094afa950f7d948ef5c5
6
+ metadata.gz: d0f9595fbf2805230ad0ab97dd5faaaf7952913d57501ad31948b39c70cc26558b66b503cb2e7517d7cfff609bac9cbbf5b3ce744dbbc0ca1c1888fffeb8f0fd
7
+ data.tar.gz: 5645d7f1ed88561d9db064d4e241e39dc37cec435b8b5b82d50d67e90d3978c57d88d30378f2ba008afb7c6082aa010a86de94ceaa6fe7f222ca704153271448
data/.gitignore CHANGED
@@ -1,4 +1,5 @@
1
1
  .DS_Store
2
+ .rbenv-version
2
3
  Gemfile.lock
3
4
  /pkg/drupid-*.gem
4
5
  /.bundle/*
data/README.md CHANGED
@@ -9,6 +9,12 @@ Drupid is a better replacement for [Drush](https://github.com/drush-ops/drush) `
9
9
 
10
10
  ### Release Notes ###
11
11
 
12
+ #### Version 1.1.5 (2013/9/3) ####
13
+
14
+ - Fixed a regression that caused `--edit` to accept only URLs. Now it is possible to use project names again (e.g., `drupid -e drupal-8.x` now works).
15
+ - Various optimizations for `drupid --edit`: in particular, Drupal projects are now cached and temporary folders are not unnecessarily cleaned up. This results in better performance, especially for patching big projects like Drupal itself.
16
+ - Other bug fixes.
17
+
12
18
  #### Version 1.1.4 (2013/9/2) ####
13
19
 
14
20
  - Fixed a regression which, in some circumstances, caused an uncaught exception upon checking whether a project is installed.
@@ -61,4 +67,4 @@ or
61
67
 
62
68
  To run a single test:
63
69
 
64
- ruby -Itest -Ilib test/test_NAME.rb --name '<test method name>'
70
+ bundle exec ruby -Itest -Ilib test/test_NAME.rb --name '<test method name>'
data/bin/drupid CHANGED
@@ -62,9 +62,9 @@ module Drupid
62
62
  " with a Drupal platform, and more!\n" +
63
63
  "Usage:\n" +
64
64
  "drupid -s <MAKEFILE> -p <DIRECTORY> [-cdDflnSuv]\n" +
65
- "drupid --clear-cache [-nv]\n" +
66
- "drupid --edit [<URL>] [-v] [-o <FILE>]\n" +
67
- "drupid --graph -p <DIRECTORY> [-Sv]\n" +
65
+ "drupid --clear-cache [-Dnv]\n" +
66
+ "drupid --edit [<URL>] [-Dv] [-o <FILE>]\n" +
67
+ "drupid --graph -p <DIRECTORY> [-DSv]\n" +
68
68
  "drupid --help\n" +
69
69
  "drupid --version"
70
70
  o.on('-s', '--spec MAKEFILE', 'Path to a drush .make file.') do |p|
@@ -197,19 +197,40 @@ module Drupid
197
197
 
198
198
  def patch_interactive
199
199
  patch = ''
200
+ wd = nil
201
+ cleanup = false
200
202
  if @options[:edit]
201
- begin
202
- tmp = Pathname.new `mktemp -d /tmp/temp_item-XXXXXX`.strip
203
+ tmp = Pathname.new `mktemp -d /tmp/temp_item-XXXXXX`.strip
204
+ if @options[:edit] !~ /:\/\// # not a URL
205
+ begin
206
+ proj = Project.from_s(@options[:edit])
207
+ rescue NotDrupalVersionError
208
+ odie "#{@options[:edit]} is not a valid project name (core version required)."
209
+ end
210
+ ohai "Fetching #{proj.extended_name}"
211
+ begin
212
+ proj.fetch
213
+ rescue Exception => ex
214
+ debug ex.message
215
+ odie "#{proj.extended_name} could not be fetched."
216
+ end
217
+ debug "Copying from #{proj.cached_location} to #{tmp}"
218
+ dont_debug { wd = proj.cached_location.ditto tmp }
219
+ else
203
220
  dl = Drupid.makeDownloader @options[:edit], tmp, File.basename(@options[:edit])
204
221
  ohai "Fetching #{@options[:edit]}"
205
- dl.fetch
222
+ begin
223
+ dl.fetch
224
+ rescue Exception => ex
225
+ debug ex.message
226
+ odie "Could not fetch #{@options[:edit]}."
227
+ end
206
228
  dl.stage
207
229
  wd = dl.staged_path
208
- rescue => ex
209
- odie "Error retrieving #{@options[:edit]}: #{ex}"
210
230
  end
211
- else
231
+ else # Patching in current directory
212
232
  wd = Pathname.pwd
233
+ cleanup = true
213
234
  end
214
235
  git_repo = (wd + '.git').exist?
215
236
  Dir.chdir wd.to_s do
@@ -220,6 +241,7 @@ module Drupid
220
241
  end
221
242
  else
222
243
  begin
244
+ ohai "Creating Git repo"
223
245
  blah "Initializing temporary git repo inside #{wd}"
224
246
  git 'init'
225
247
  git 'add', '-A'
@@ -234,8 +256,14 @@ module Drupid
234
256
  git 'add', '-A'
235
257
  patch = git 'diff', '--binary', 'HEAD'
236
258
  ensure
237
- git 'reset', '--hard'
238
- FileUtils.rmtree '.git' unless git_repo
259
+ if cleanup
260
+ ohai "Cleaning up"
261
+ if git_repo
262
+ git 'reset', '--hard'
263
+ else
264
+ FileUtils.rmtree '.git'
265
+ end
266
+ end
239
267
  end
240
268
  end
241
269
  # Show/write patch
@@ -190,8 +190,13 @@ module Drupid
190
190
  @projects.values.select { |p| p.core_project? }.each { |p| yield p }
191
191
  end
192
192
 
193
- # Creates a PNG image depicting the relationships
193
+ # Creates an SVG image depicting the relationships
194
194
  # among the projects in this platform.
195
+ #
196
+ # *Requires*: the <tt>dot</tt> program. Without <tt>dot</tt>,
197
+ # only a <tt>.dot</tt> file is created, but no SVG image.
198
+ #
199
+ # Returns the name of the created file.
195
200
  def dependency_graph
196
201
  silence_warnings do
197
202
  begin
@@ -201,10 +206,6 @@ module Drupid
201
206
  odie "Please install the RGL gem with 'gem install rgl'"
202
207
  end
203
208
  end
204
- if `which dot 2>/dev/null`.chomp.empty?
205
- owarn "The 'dot' program is required to get an SVG image."
206
- owarn "Without it you will only get a .dot file."
207
- end
208
209
  analyze
209
210
  # We use this instead of a dag, because there may be circular dependencies...
210
211
  graph = ::RGL::DirectedAdjacencyGraph.new
@@ -223,7 +224,13 @@ module Drupid
223
224
  graph.add_edge(p.name, depname)
224
225
  end
225
226
  end
226
- graph.write_to_graphic_file('svg')
227
+ outfile = graph.write_to_graphic_file('svg')
228
+ if which('dot').nil?
229
+ owarn "The 'dot' program is required to get an SVG image."
230
+ return outfile.sub('.svg','.dot')
231
+ else
232
+ return outfile
233
+ end
227
234
  end
228
235
 
229
236
  private
@@ -271,12 +271,39 @@ module Drupid
271
271
  super(name)
272
272
  @core = VersionCore.new(core_num)
273
273
  @core_project = ('drupal' == @name) ? true : nil
274
- @version = vers ? Version.from_s(@core.to_s + '-' + vers) : nil
274
+ @version = (vers.nil? or vers.empty?) ? nil : Version.from_s(@core.to_s + '-' + vers)
275
275
  @proj_type = ('drupal' == @name) ? 'drupal' : nil
276
276
  @info_file = nil
277
277
  @release_xml = nil
278
278
  end
279
279
 
280
+ # Creates a new Project instance from the specified string.
281
+ # Note that the string must at least contain the core version of the project.
282
+ #
283
+ # Raises a Drupid::NotDrupalVersionError if the string cannot be parsed.
284
+ #
285
+ # Examples:
286
+ # proj = Drupid::Project.from_s 'drupal-7.23'
287
+ # proj = Drupid::Project.from_s 'drupal-8.x'
288
+ # proj = Drupid::Project.from_s 'media-7.x'
289
+ # proj = Drupid::Project.from_s 'tao-7.x-3.0-beta4'
290
+ def self.from_s p
291
+ matchdata = p.match(/^([^-\/]+)[-\/](\d+.*)$/)
292
+ raise NotDrupalVersionError if matchdata.nil?
293
+ name = matchdata[1]
294
+ vers = nil
295
+ if ('drupal' == name) and (matchdata[2] =~ /^(\d+)\.(\d+)/) # e.g., drupal-8.0-dev
296
+ core = $1.to_i
297
+ vers = matchdata[2]
298
+ else
299
+ matchversion = matchdata[2].match(/^(\d+)\.x-?(.*)/)
300
+ raise NotDrupalVersionError if matchversion.nil?
301
+ core = matchversion[1].to_i
302
+ vers = matchversion[2]
303
+ end
304
+ Project.new(name, core, vers)
305
+ end
306
+
280
307
  # Returns true if a version is specified for this project, false otherwise.
281
308
  def has_version?
282
309
  nil != @version
@@ -332,6 +359,7 @@ module Drupid
332
359
  #
333
360
  # Retrieves the release information for this project from http://updates.drupal.org.
334
361
  def update_download_url
362
+ return unless self.has_version?
335
363
  self.fetch_release_history if @release_xml.nil?
336
364
  return if @release_xml.nil?
337
365
  if @release_xml.at_xpath('/project/releases/release/files/file/variant').nil?
@@ -355,9 +383,14 @@ module Drupid
355
383
  dont_debug do
356
384
  @release_xml = Nokogiri::XML(open("http://updates.drupal.org/release-history/#{self.name}/#{self.core}"))
357
385
  end
358
- debug "Release history retrieved"
386
+ if @release_xml.at_xpath('/error')
387
+ debug "No release history for the given project"
388
+ @relese_xml = nil
389
+ else
390
+ debug "Release history retrieved"
391
+ end
359
392
  rescue => ex
360
- owarn "Could not get release history for #{self.extended_name}"
393
+ owarn "Could not fetch release history for #{self.extended_name}"
361
394
  debug "fetch_release_history: #{ex}"
362
395
  @release_xml = nil
363
396
  end
@@ -99,6 +99,7 @@ module Drupid
99
99
  RC = 16
100
100
  EMPTY = 32
101
101
 
102
+ # Initializes a Version object from a core number and a short version.
102
103
  def initialize(core_num, v)
103
104
  raise 'Drupal version is not a string.' unless v.is_a?(String)
104
105
  @core = Drupid::VersionCore.new(core_num)
@@ -597,10 +597,11 @@ module Drupid
597
597
  end
598
598
 
599
599
  def msg
600
+ spc = ' ' * [0, 8 - @label.length].max
600
601
  if old_project = platform.get_project(component.name)
601
- "#{Tty.blue}[#{@label}]#{Tty.white} #{component.name}: #{old_project.version.long} => #{component.version.long}#{Tty.reset} (#{platform.dest_path(component)})"
602
+ "#{Tty.blue}[#{@label}]#{Tty.white}#{spc}#{component.name}: #{old_project.version.long} => #{component.version.long}#{Tty.reset} (#{platform.dest_path(component)})"
602
603
  else
603
- "#{Tty.blue}[#{@label}]#{Tty.white} #{component.name}: => #{component.version.long}#{Tty.reset} (#{platform.dest_path(component)})"
604
+ "#{Tty.blue}[#{@label}]#{Tty.white}#{spc}#{component.name}: => #{component.version.long}#{Tty.reset} (#{platform.dest_path(component)})"
604
605
  end
605
606
  end
606
607
 
@@ -1,4 +1,4 @@
1
1
  module Drupid
2
- VERSION = '1.1.4'
2
+ VERSION = '1.1.5'
3
3
  USER_AGENT = "Drupid #{VERSION} (Ruby #{RUBY_VERSION}-#{RUBY_PATCHLEVEL}; #{RUBY_PLATFORM})"
4
4
  end
@@ -233,6 +233,63 @@ class TestDrupidProject < Minitest::Test
233
233
  refute p.has_version?
234
234
  end
235
235
 
236
+ def test_project_from_s_1
237
+ p = Drupid::Project.from_s 'drupal-8.x'
238
+ assert_instance_of Drupid::Project, p
239
+ assert_equal 'drupal', p.name
240
+ assert_equal 8, p.core.to_i
241
+ refute p.has_version?
242
+ assert_equal 'drupal', p.proj_type
243
+ end
244
+
245
+ def test_project_from_s_2
246
+ p = Drupid::Project.from_s 'drupal-7.23'
247
+ assert_instance_of Drupid::Project, p
248
+ assert_equal 'drupal', p.name
249
+ assert_equal 7, p.core.to_i
250
+ assert p.has_version?
251
+ assert_equal '7.23', p.version.short
252
+ assert_equal '7.x-7.23', p.version.long
253
+ assert_equal 'drupal', p.proj_type
254
+ end
255
+
256
+ def test_project_from_s_3
257
+ p = Drupid::Project.from_s 'drupal-7.24-dev'
258
+ assert_instance_of Drupid::Project, p
259
+ assert_equal 'drupal', p.name
260
+ assert_equal 7, p.core.to_i
261
+ assert p.has_version?
262
+ assert_equal '7.24-dev', p.version.short
263
+ assert_equal '7.x-7.24-dev', p.version.long
264
+ assert_equal 'drupal', p.proj_type
265
+ end
266
+
267
+ def test_project_from_s_4
268
+ p = Drupid::Project.from_s 'media-7.x'
269
+ assert_instance_of Drupid::Project, p
270
+ assert_equal 'media', p.name
271
+ assert_equal 7, p.core.to_i
272
+ refute p.has_version?
273
+ assert_nil p.proj_type
274
+ end
275
+
276
+ def test_project_from_s_5
277
+ p = Drupid::Project.from_s 'tao-7.x-3.0-beta4'
278
+ assert_instance_of Drupid::Project, p
279
+ assert_equal 'tao', p.name
280
+ assert_equal 7, p.core.to_i
281
+ assert p.has_version?
282
+ assert_equal '3.0-beta4', p.version.short
283
+ assert_equal '7.x-3.0-beta4', p.version.long
284
+ assert_nil p.proj_type
285
+ end
286
+
287
+ def test_project_from_wrong_string
288
+ assert_raises Drupid::NotDrupalVersionError do
289
+ Drupid::Project.from_s 'media-2.0-unstable7' # no core version
290
+ end
291
+ end
292
+
236
293
  def test_project_version
237
294
  p = Drupid::Project.new('foo', 8)
238
295
  p.version = '8.x-1.0'
@@ -210,6 +210,9 @@ class TestDrupidVersion < Minitest::Test
210
210
  assert_raises Drupid::NotDrupalVersionError do
211
211
  Drupid::Version.from_s '1.0' # missing core number (e.g., '7.x-1.0')
212
212
  end
213
+ assert_raises Drupid::NotDrupalVersionError do
214
+ Drupid::Version.from_s '7.x'
215
+ end
213
216
  assert_raises RuntimeError do
214
217
  Drupid::Version.new(7, 1.0)
215
218
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: drupid
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.4
4
+ version: 1.1.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Lifepillar
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-09-02 00:00:00.000000000 Z
11
+ date: 2013-09-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rgl
@@ -75,7 +75,6 @@ extra_rdoc_files: []
75
75
  files:
76
76
  - .bundle/config
77
77
  - .gitignore
78
- - .rbenv-version
79
78
  - Gemfile
80
79
  - README.md
81
80
  - Rakefile
@@ -1 +0,0 @@
1
- 2.0.0-p247