hookup 1.0.3 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (4) hide show
  1. data/README.markdown +22 -8
  2. data/hookup.gemspec +1 -1
  3. data/lib/hookup.rb +52 -18
  4. metadata +4 -12
@@ -7,27 +7,41 @@ Git hooks. It fires after events like
7
7
  * pulling in upstream changes
8
8
  * switching branches
9
9
  * stepping through a bisect
10
+ * conflict in schema
10
11
 
11
12
  Usage
12
13
  -----
13
14
 
14
- $ cd yourproject
15
- $ gem install hookup
16
- $ hookup install
17
- Hooked up!
15
+ gem install hookup
16
+ cd yourproject
17
+ hookup install
18
18
 
19
- Bundling
20
- --------
19
+ ### Bundling
21
20
 
22
21
  Each time your current HEAD changes, hookup checks to see if your
23
22
  `Gemfile`, `Gemfile.lock`, or gem spec has changed. If so, it runs
24
23
  `bundle check`, and if that indicates any dependencies are unsatisfied,
25
24
  it runs `bundle install`.
26
25
 
27
- Migrating
28
- ---------
26
+ ### Migrating
29
27
 
30
28
  Each time your current HEAD changes, hookup checks to see if any
31
29
  migrations have been added, deleted, or modified. Deleted and modified
32
30
  migrations are given the `rake db:migrate:down` treatment, then `rake
33
31
  db:migrate` is invoked to bring everything else up to date.
32
+
33
+ ### Schema Resolving
34
+
35
+ Each time there's a conflict in `db/schema.rb` on the
36
+ `Rails::Schema.define` line, hookup resolves it in favor of the newer of
37
+ the two versions.
38
+
39
+ ChangeLog
40
+ ---------
41
+
42
+ [See it on the wiki](https://github.com/tpope/hookup/wiki/ChangeLog)
43
+
44
+ License
45
+ -------
46
+
47
+ Copyright (c) Tim Pope. MIT License.
@@ -2,7 +2,7 @@
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = "hookup"
5
- s.version = "1.0.3"
5
+ s.version = "1.1.0"
6
6
  s.platform = Gem::Platform::RUBY
7
7
  s.authors = ["Tim Pope"]
8
8
  s.email = ["code@tp"+'ope.net']
@@ -3,10 +3,16 @@ class Hookup
3
3
  class Error < RuntimeError
4
4
  end
5
5
 
6
+ class Failure < Error
7
+ end
8
+
6
9
  EMPTY_DIR = '4b825dc642cb6eb9a060e54bf8d69288fbee4904'
7
10
 
8
11
  def self.run(*argv)
9
12
  new.run(*argv)
13
+ rescue Failure => e
14
+ puts e
15
+ exit 1
10
16
  rescue Error => e
11
17
  puts e
12
18
  exit
@@ -27,24 +33,38 @@ class Hookup
27
33
  end
28
34
  end
29
35
 
36
+ def git_dir
37
+ unless @git_dir
38
+ @git_dir = %x{git rev-parse --git-dir}.chomp
39
+ raise Error, dir unless $?.success?
40
+ end
41
+ @git_dir
42
+ end
43
+
30
44
  def install
31
- dir = %x{git rev-parse --git-dir}.chomp
32
- raise Error, dir unless $?.success?
33
- hook = File.join(dir, 'hooks', 'post-checkout')
34
- unless File.exist?(hook)
35
- File.open(hook, 'w', 0777) do |f|
36
- f.puts "#!/bin/bash"
37
- end
45
+ append(File.join(git_dir, 'hooks', 'post-checkout'), 0777) do |body, f|
46
+ f.puts "#!/bin/bash" unless body
47
+ f.puts %(hookup post-checkout "$@") if body !~ /hookup/
38
48
  end
39
- if File.read(hook) =~ /^[^#]*\bhookup\b/
40
- puts "Already hooked up!"
41
- else
42
- File.open(hook, "a") do |f|
43
- f.puts %(hookup post-checkout "$@")
44
- end
45
- puts "Hooked up!"
49
+
50
+ append(File.join(git_dir, 'info', 'attributes')) do |body, f|
51
+ map = 'db/schema.rb merge=railsschema'
52
+ f.puts map unless body.to_s.include?(map)
53
+ end
54
+
55
+ system 'git', 'config', 'merge.railsschema.driver', 'hookup resolve-schema %A %O %B %L'
56
+
57
+ puts "Hooked up!"
58
+ end
59
+
60
+ def append(file, *args)
61
+ Dir.mkdir(File.dirname(file)) unless File.directory?(File.dirname(file))
62
+ body = File.read(file) if File.exist?(file)
63
+ File.open(file, 'a', *args) do |f|
64
+ yield body, f
46
65
  end
47
66
  end
67
+ protected :append
48
68
 
49
69
  def post_checkout(*args)
50
70
  old, new = args.shift, args.shift || 'HEAD'
@@ -79,9 +99,10 @@ class Hookup
79
99
  def migrate(old, new, *args)
80
100
  return if args.first == '0'
81
101
 
82
- schema = %x{git diff --name-status #{old} #{new} -- db/schema.rb}
83
- if schema =~ /^A/
84
- system 'rake', 'db:create'
102
+ schemas = %w(db/schema.rb db/development_structure.sql).select do |schema|
103
+ status = %x{git diff --name-status #{old} #{new} -- #{schema}}.chomp
104
+ system 'rake', 'db:create' if status =~ /^A/
105
+ status !~ /^D/ && !status.empty?
85
106
  end
86
107
 
87
108
  migrations = %x{git diff --name-status #{old} #{new} -- db/migrate}.scan(/.+/).map {|l| l.split(/\t/) }
@@ -106,7 +127,20 @@ class Hookup
106
127
  end
107
128
 
108
129
  ensure
109
- system 'git', 'checkout', '--', 'db/schema.rb' if migrations.any?
130
+ system 'git', 'checkout', '--', *schemas if schemas.any?
131
+ end
132
+ end
133
+
134
+ def resolve_schema(a, o, b, marker_size = 7)
135
+ system 'git', 'merge-file', "--marker-size=#{marker_size}", a, o, b
136
+ body = File.read(a)
137
+ asd = "ActiveRecord::Schema.define"
138
+ x = body.sub!(/^<+ .*\n#{asd}\(:version => (\d+)\) do\n=+\n#{asd}\(:version => (\d+)\) do\n>+ .*/) do
139
+ "#{asd}(:version => #{[$1, $2].max}) do"
140
+ end
141
+ File.open(a, 'w') { |f| f.write(body) }
142
+ if body.include?('<' * marker_size.to_i)
143
+ raise Failure, 'Failed to automatically resolve schema conflict'
110
144
  end
111
145
  end
112
146
 
metadata CHANGED
@@ -1,12 +1,8 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hookup
3
3
  version: !ruby/object:Gem::Version
4
- prerelease: false
5
- segments:
6
- - 1
7
- - 0
8
- - 3
9
- version: 1.0.3
4
+ prerelease:
5
+ version: 1.1.0
10
6
  platform: ruby
11
7
  authors:
12
8
  - Tim Pope
@@ -14,7 +10,7 @@ autorequire:
14
10
  bindir: bin
15
11
  cert_chain: []
16
12
 
17
- date: 2011-05-11 00:00:00 -04:00
13
+ date: 2011-08-24 00:00:00 -04:00
18
14
  default_executable:
19
15
  dependencies: []
20
16
 
@@ -50,21 +46,17 @@ required_ruby_version: !ruby/object:Gem::Requirement
50
46
  requirements:
51
47
  - - ">="
52
48
  - !ruby/object:Gem::Version
53
- segments:
54
- - 0
55
49
  version: "0"
56
50
  required_rubygems_version: !ruby/object:Gem::Requirement
57
51
  none: false
58
52
  requirements:
59
53
  - - ">="
60
54
  - !ruby/object:Gem::Version
61
- segments:
62
- - 0
63
55
  version: "0"
64
56
  requirements: []
65
57
 
66
58
  rubyforge_project: hookup
67
- rubygems_version: 1.3.7
59
+ rubygems_version: 1.6.2
68
60
  signing_key:
69
61
  specification_version: 3
70
62
  summary: Automate the bundle/migration tedium of Rails with Git hooks