xmigra 1.6.5 → 1.7.0

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: 1f8a897f40302df5b84071bf9088b787c7be65fa
4
- data.tar.gz: 1445c109f2e4fb2f58aa2f2407660c5b472a45cc
3
+ metadata.gz: 2417b3d567a7eb7401e6506e0f85ed6497545bd0
4
+ data.tar.gz: 8ec49a23120cf0ef8a60b0a47dc672bc755d7231
5
5
  SHA512:
6
- metadata.gz: 8edd159507c099b6d6c16c99a5883cbad161025e6de3076fbe83465f4054e17da85c21b1c25e9b49bdc47e06cef46d9cd8cdb235b4a742ce42974df56fdbd0f5
7
- data.tar.gz: 4b22d1239184bb5a44886db39ef5ccc8b8b569530bc495f8ab509e0a9df9272cd70e87e355210372a2d24b656271a5926005ae08d130392bbfbdbe40f45d26fa
6
+ metadata.gz: 21d5e5655534a89e5a25bbc67dd80dd33ceb3622e140f98075fe2df7a42765f27fb5a29b509bc9afc986b82f3ff45de4f7f893d8525bf0b2bd7b3f908a10f91f
7
+ data.tar.gz: 759c3e5cf893add4b0edefe5509858cb415efc46211c4d14eb5124ec444d8b93e5989ba2ee34ff0ae625fb541470354ddf206e869c3a7a14f617b7caa43791a9
@@ -17,6 +17,7 @@ module XMigra
17
17
  begin
18
18
  verinc_info = YAML.load_file(path)
19
19
  rescue Error => e
20
+ XMigra.log_error(e)
20
21
  warning "Failed to load branch upgrade migration (#{e.class}).\n #{e}"
21
22
  verinc_info = {}
22
23
  end
@@ -87,6 +87,7 @@ module XMigra
87
87
  result = begin
88
88
  yield input_value
89
89
  rescue InvalidInput => e
90
+ XMigra.log_error(e)
90
91
  puts e.message if e.explicit_message?
91
92
  next
92
93
  end
@@ -554,7 +554,7 @@ module XMigra
554
554
  end
555
555
 
556
556
  def migration_application_sql
557
- PgSQLSpecifics.in_plpgsql %Q{
557
+ PgSQLSpecifics.in_plpgsql(%Q{
558
558
  IF EXISTS (
559
559
  SELECT * FROM temp$xmigra_migrations
560
560
  WHERE "MigrationID" = '#{id}'
@@ -562,14 +562,15 @@ module XMigra
562
562
  ) THEN
563
563
  RAISE NOTICE #{PgSQLSpecifics.string_literal %Q{Applying "#{File.basename(file_path)}":}};
564
564
 
565
- EXECUTE #{PgSQLSpecifics.string_literal sql};
565
+ EXECUTE
566
+ %s;
566
567
 
567
568
  INSERT INTO xmigra.applied ("MigrationID", "Description")
568
569
  VALUES ('#{id}', #{PgSQLSpecifics.string_literal description});
569
570
 
570
571
  RAISE NOTICE ' done';
571
572
  END IF;
572
- }
573
+ }) % [PgSQLSpecifics.string_literal(sql)]
573
574
  end
574
575
 
575
576
  def reversion_tracking_sql
@@ -215,7 +215,8 @@ module XMigra
215
215
  end
216
216
  rescue DeclarativeSupport::SpecificationError
217
217
  raise
218
- rescue StandardError
218
+ rescue StandardError => e
219
+ XMigra.log_error(e)
219
220
  raise if strict
220
221
  nil
221
222
  end
@@ -71,7 +71,7 @@ module XMigra
71
71
  # Update the latest implementing migration for any declarative
72
72
  # file that is modified in the working copy
73
73
  each_decohered_implementing_migration(
74
- &method(:fix_decohered_implmeneting_migration!)
74
+ &method(:fix_decohered_implementing_migration!)
75
75
  )
76
76
  end
77
77
 
@@ -80,14 +80,16 @@ module XMigra
80
80
  latest_impls = tool.migrations.latest_declarative_implementations
81
81
  latest_impls.each_pair do |decl_file, migration|
82
82
  next unless tool.vcs_file_modified?(decl_file)
83
+ next if tool.vcs_file_modified?(migration.file_path)
83
84
  yield migration.file_path, tool.vcs_latest_revision(migration.file_path)
84
85
  end
85
86
  end
86
87
 
87
- def fix_decohered_implmeneting_migration!(file_path, last_commit)
88
+ def fix_decohered_implementing_migration!(file_path, last_commit)
88
89
  migration_info = YAML.load_file(file_path)
90
+ last_commit = "nonexistent" if last_commit.nil? || last_commit.empty?
89
91
  migration_info['pre-unbranch'] = last_commit
90
- file_path.open('w') do |f|
92
+ Pathname(file_path).open('w') do |f|
91
93
  $xmigra_yamler.dump(migration_info, f)
92
94
  end
93
95
  end
@@ -15,7 +15,7 @@ module XMigra
15
15
  raise(XMigra::Error, "Index \"#{new_fpath.basename}\" already exists") if new_fpath.exist?
16
16
 
17
17
  index_creation_template = begin
18
- index_template_sql
18
+ index_template_sql.gsub('[{filename}]', name)
19
19
  rescue NameError
20
20
  ''
21
21
  end
@@ -46,7 +46,8 @@ RUNNING THIS SCRIPT ON A PRODUCTION DATABASE WILL FAIL.
46
46
  @file_based_groups << [@branch_upgrade] if @branch_upgrade.found?
47
47
  rescue Error
48
48
  raise
49
- rescue StandardError
49
+ rescue StandardError => e
50
+ XMigra.log_error(e)
50
51
  raise Error, "Error initializing #{self.class} components"
51
52
  end
52
53
 
@@ -90,7 +90,7 @@ module XMigra
90
90
  end
91
91
  return ($?.success? ? output : nil) if options[:get_result] == :on_success
92
92
  return $?.success? if check_exit
93
- raise(VersionControlError, "Git command failed with exit code #{$?.exitstatus}") unless $?.success?
93
+ raise(VersionControlError, "Git command failed with exit code #{$?.exitstatus}\n Command: #{cmd_str}") unless $?.success?
94
94
  return output unless no_result
95
95
  end
96
96
 
@@ -352,6 +352,11 @@ module XMigra
352
352
 
353
353
  return :older
354
354
  elsif a_status == ' '
355
+ # Look for re-introduction of a declarative that was previously destroyed or renounced
356
+ if (b_status == '??' || b_status[0] == 'A') && [:renunciation, :destruction].include?(@object.goal)
357
+ return :unimplemented
358
+ end
359
+
355
360
  return :newer unless b_status == ' '
356
361
 
357
362
  return begin
@@ -422,6 +427,11 @@ module XMigra
422
427
  git(:show, "HEAD:#{file_path}", :quiet=>true)
423
428
  end
424
429
 
430
+ def vcs_file_modified?(file_path)
431
+ gstat = git_retrieve_status(file_path)
432
+ gstat[0] != ' '
433
+ end
434
+
425
435
  def git_status
426
436
  @git_status ||= git_retrieve_status(file_path)
427
437
  end
@@ -456,15 +466,16 @@ module XMigra
456
466
  return nil unless stage_numbers.sort == [1, 2, 3]
457
467
 
458
468
  chain_head = lambda do |stage_number|
469
+ head_file_relative = head_file.relative_path_from(self.path)
459
470
  return YAML.parse(
460
- git(:show, ":#{stage_number}:#{head_file}")
471
+ git(:show, ":#{stage_number}:./#{head_file_relative}")
461
472
  ).transform
462
473
  end
463
474
 
464
475
  # Ours (2) before theirs (3)...
465
476
  heads = [2, 3].collect(&chain_head)
466
- # ... unless merging from upstream
467
- if self.git_merging_from_upstream?
477
+ # ... unless merging from upstream or the master branch
478
+ if self.git_merging_from_upstream? || self.git_merging_from_master?
468
479
  heads.reverse!
469
480
  end
470
481
 
@@ -565,6 +576,13 @@ module XMigra
565
576
  end
566
577
  end
567
578
 
579
+ def git_merging_from_master?
580
+ git_fetch_master_branch
581
+ return !(self.git_commits_in? git_master_local_branch..'MERGE_HEAD')
582
+ rescue VersionControlError
583
+ return false
584
+ end
585
+
568
586
  def git_commits_in?(range, path=nil)
569
587
  git(
570
588
  :log,
@@ -227,6 +227,11 @@ END_OF_MESSAGE
227
227
  status.nil? || status.attributes['item'] == 'unversioned'
228
228
  end
229
229
 
230
+ def vcs_file_modified?(file_path)
231
+ status = subversion_retrieve_status(file_path).elements['entry/wc-status']
232
+ !status.nil? && status.attributes['item'] == 'modified'
233
+ end
234
+
230
235
  class VersionComparator
231
236
  # vcs_object.kind_of?(SubversionSpecifics)
232
237
  def initialize(vcs_object, options={})
@@ -257,6 +262,11 @@ END_OF_MESSAGE
257
262
 
258
263
  return :older
259
264
  elsif a_status.attributes['item'] == 'normal'
265
+ # Look for re-introduction of a declarative that was previously destroyed or renounced
266
+ if (['unversioned', 'added'].include? b_status.attributes['item']) && [:renunciation, :destruction].include?(@object.goal)
267
+ return :unimplemented
268
+ end
269
+
260
270
  return :newer unless b_status.attributes['item'] == 'normal'
261
271
 
262
272
  return begin
@@ -1,3 +1,3 @@
1
1
  module XMigra
2
- VERSION = "1.6.5"
2
+ VERSION = "1.7.0"
3
3
  end
data/lib/xmigra.rb CHANGED
@@ -346,12 +346,31 @@ module XMigra
346
346
  if e.class.const_defined? :COMMAND_LINE_HELP
347
347
  STDERR.puts(XMigra.program_message(e.class::COMMAND_LINE_HELP))
348
348
  end
349
+ log_error(e)
349
350
  exit(2) if e.is_a?(OptionParser::ParseError)
350
351
  exit(2) if e.is_a?(XMigra::Program::ArgumentError)
351
352
  exit(1)
352
353
  end
353
354
  )
354
355
  end
356
+
357
+ def self.log_error(e)
358
+ if log_file = ENV['XMIGRA_LOG_FILE']
359
+ Pathname(log_file).open('a') do |log|
360
+ log.puts "#{Time.now}: #{e} (#{e.class})"
361
+ e.backtrace.each do |frame|
362
+ log.puts " " + frame
363
+ end
364
+
365
+ while e.respond_to?(:cause) && e = e.cause
366
+ log.puts " Caused by: #{e} (#{e.class})"
367
+ e.backtrace.each do |frame|
368
+ log.puts " " + frame
369
+ end
370
+ end
371
+ end
372
+ end
373
+ end
355
374
  end
356
375
 
357
376
  require 'xmigra/vcs_support/svn'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: xmigra
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.6.5
4
+ version: 1.7.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Next IT Corporation
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2016-02-13 00:00:00.000000000 Z
12
+ date: 2017-03-02 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bundler