dreamcat4-braid 0.50 → 0.52

Sign up to get free protection for your applications and to get access to all the features.
data/bin/braid CHANGED
@@ -51,11 +51,11 @@ Main {
51
51
  . braid add svn://remote/path --branch notmaster
52
52
  TXT
53
53
 
54
- mixin :argument_url, :option_type, :optional_path, :option_branch, :option_rails_plugin, :option_revision, :option_full, :option_verbose
54
+ mixin :argument_url, :option_type, :optional_path, :option_branch, :option_rails_plugin, :option_rails_gem, :option_revision, :option_full, :option_verbose
55
55
 
56
56
  run {
57
57
  Braid.verbose = verbose
58
- Braid::Command.run(:add, url, { "type" => type, "path" => path, "branch" => branch, "rails_plugin" => rails_plugin, "revision" => revision, "full" => full })
58
+ Braid::Command.run(:add, url, { "type" => type, "path" => path, "branch" => branch, "rails_plugin" => rails_plugin, "rails_gem" => rails_gem, "revision" => revision, "full" => full })
59
59
  }
60
60
  }
61
61
 
@@ -196,6 +196,14 @@ Main {
196
196
  }
197
197
  }
198
198
 
199
+ mixin(:option_rails_gem) {
200
+ option(:rails_gem, :p) {
201
+ optional
202
+ desc 'added mirror is a Rails gem'
203
+ attr
204
+ }
205
+ }
206
+
199
207
  mixin(:option_revision) {
200
208
  option(:revision, :r) {
201
209
  optional
data/braid.gemspec CHANGED
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = %q{braid}
3
- s.version = "0.50"
3
+ s.version = "0.52"
4
4
 
5
5
  s.specification_version = 2 if s.respond_to? :specification_version=
6
6
 
@@ -17,7 +17,7 @@ Gem::Specification.new do |s|
17
17
  s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "braid", "--main"]
18
18
  s.require_paths = ["lib"]
19
19
  s.rubyforge_project = %q{braid}
20
- s.rubygems_version = %q{1.1.0}
20
+ s.rubygems_version = %q{1.3.1}
21
21
  s.summary = %q{A simple tool for tracking vendor branches in git.}
22
22
 
23
23
  s.add_dependency(%q<main>, [">= 2.8.0"])
@@ -15,18 +15,24 @@ module Braid
15
15
  # http://www.kernel.org/pub/software/scm/git/docs/howto/using-merge-subtree.html
16
16
 
17
17
  setup_remote(mirror)
18
- mirror.fetch
19
-
20
- new_revision = validate_new_revision(mirror, options["revision"])
21
- target_revision = determine_target_revision(mirror, new_revision)
22
-
23
- unless mirror.squashed?
24
- git.merge_ours(target_revision)
18
+
19
+ if mirror.type == "git-clone"
20
+ gitclone.add_gitignore(mirror.path)
21
+ mirror.rspec_git.update
22
+ else
23
+ mirror.fetch
24
+
25
+ new_revision = validate_new_revision(mirror, options["revision"])
26
+ target_revision = determine_target_revision(mirror, new_revision)
27
+
28
+ unless mirror.squashed?
29
+ git.merge_ours(target_revision)
30
+ end
31
+ git.read_tree_prefix(target_revision, mirror.path)
32
+
33
+ mirror.revision = new_revision
34
+ mirror.lock = new_revision if options["revision"]
25
35
  end
26
- git.read_tree_prefix(target_revision, mirror.path)
27
-
28
- mirror.revision = new_revision
29
- mirror.lock = new_revision if options["revision"]
30
36
  config.update(mirror)
31
37
  add_config_file
32
38
 
@@ -3,10 +3,17 @@ module Braid
3
3
  class Diff < Command
4
4
  def run(path)
5
5
  mirror = config.get!(path)
6
- setup_remote(mirror)
6
+ if mirror.type == "git-clone"
7
+ unless system("cd #{mirror.path} && git diff")
8
+ msg "Error diffing \"#{path}\" in \"#{mirror.path}\""
9
+ exit 1
10
+ end
11
+ else
12
+ setup_remote(mirror)
7
13
 
8
- diff = mirror.diff
9
- puts diff unless diff.empty?
14
+ diff = mirror.diff
15
+ puts diff unless diff.empty?
16
+ end
10
17
  end
11
18
  end
12
19
  end
@@ -9,18 +9,25 @@ module Braid
9
9
  with_reset_on_error do
10
10
  msg "Removing mirror from '#{mirror.path}'."
11
11
 
12
- git.rm_r(mirror.path)
12
+ if mirror.type == "git-clone"
13
+ gitclone.remove_gitignore(mirror.path)
14
+ FileUtils.rm_rf(mirror.path)
15
+ config.remove(mirror)
16
+ add_config_file
17
+ else
18
+ git.rm_r(mirror.path)
13
19
 
14
- config.remove(mirror)
15
- add_config_file
20
+ config.remove(mirror)
21
+ add_config_file
16
22
 
17
- if options[:keep]
18
- msg "Not removing remote '#{mirror.remote}'" if verbose?
19
- elsif git.remote_url(mirror.remote)
20
- msg "Removed remote '#{mirror.path}'" if verbose?
21
- git.remote_rm mirror.remote
22
- else
23
- msg "Remote '#{mirror.remote}' not found, nothing to cleanup" if verbose?
23
+ if options[:keep]
24
+ msg "Not removing remote '#{mirror.remote}'" if verbose?
25
+ elsif git.remote_url(mirror.remote)
26
+ msg "Removed remote '#{mirror.path}'" if verbose?
27
+ git.remote_rm mirror.remote
28
+ else
29
+ msg "Remote '#{mirror.remote}' not found, nothing to cleanup" if verbose?
30
+ end
24
31
  end
25
32
 
26
33
  commit_message = "Removed mirror '#{mirror.path}'"
@@ -16,6 +16,10 @@ module Braid
16
16
  def setup_one(path)
17
17
  mirror = config.get!(path)
18
18
 
19
+ if mirror.type == "git-clone"
20
+ return
21
+ end
22
+
19
23
  if git.remote_url(mirror.remote)
20
24
  msg "Setup: Mirror '#{mirror.path}' already has a remote. Reusing it." if verbose?
21
25
  return
@@ -20,73 +20,78 @@ module Braid
20
20
 
21
21
  def update_one(path, options = {})
22
22
  mirror = config.get!(path)
23
-
23
+
24
24
  revision_message = options["revision"] ? " to #{display_revision(mirror, options["revision"])}" : ""
25
25
  msg "Updating mirror '#{mirror.path}'#{revision_message}."
26
26
 
27
- # check options for lock modification
28
- if mirror.locked?
29
- if options["head"]
30
- msg "Unlocking mirror '#{mirror.path}'." if verbose?
31
- mirror.lock = nil
32
- elsif !options["revision"]
33
- msg "Mirror '#{mirror.path}' is locked to #{display_revision(mirror, mirror.lock)}. Use --head to force."
34
- return
27
+ if mirror.type == "git-clone"
28
+ mirror.rspec_git.update options["revision"]
29
+ else
30
+
31
+ # check options for lock modification
32
+ if mirror.locked?
33
+ if options["head"]
34
+ msg "Unlocking mirror '#{mirror.path}'." if verbose?
35
+ mirror.lock = nil
36
+ elsif !options["revision"]
37
+ msg "Mirror '#{mirror.path}' is locked to #{display_revision(mirror, mirror.lock)}. Use --head to force."
38
+ return
39
+ end
35
40
  end
36
- end
37
41
 
38
- setup_remote(mirror)
39
- msg "Fetching new commits for '#{mirror.path}'." if verbose?
40
- mirror.fetch
42
+ setup_remote(mirror)
43
+ msg "Fetching new commits for '#{mirror.path}'." if verbose?
44
+ mirror.fetch
41
45
 
42
- new_revision = validate_new_revision(mirror, options["revision"])
43
- target_revision = determine_target_revision(mirror, new_revision)
46
+ new_revision = validate_new_revision(mirror, options["revision"])
47
+ target_revision = determine_target_revision(mirror, new_revision)
44
48
 
45
- if mirror.merged?(target_revision)
46
- msg "Mirror '#{mirror.path}' is already up to date."
47
- return
48
- end
49
-
50
- if mirror.squashed?
51
- diff = mirror.diff
52
- base_revision = mirror.base_revision
53
- end
54
-
55
- mirror.revision = new_revision
56
- mirror.lock = new_revision if options["revision"]
49
+ if mirror.merged?(target_revision)
50
+ msg "Mirror '#{mirror.path}' is already up to date."
51
+ return
52
+ end
57
53
 
58
- msg "Merging in mirror '#{mirror.path}'." if verbose?
59
- begin
60
54
  if mirror.squashed?
61
- local_hash = git.rev_parse("HEAD")
62
- if diff
63
- base_hash = generate_tree_hash(mirror, base_revision)
55
+ diff = mirror.diff
56
+ base_revision = mirror.base_revision
57
+ end
58
+
59
+ mirror.revision = new_revision
60
+ mirror.lock = new_revision if options["revision"]
61
+
62
+ msg "Merging in mirror '#{mirror.path}'." if verbose?
63
+ begin
64
+ if mirror.squashed?
65
+ local_hash = git.rev_parse("HEAD")
66
+ if diff
67
+ base_hash = generate_tree_hash(mirror, base_revision)
68
+ else
69
+ base_hash = local_hash
70
+ end
71
+ remote_hash = generate_tree_hash(mirror, target_revision)
72
+ ENV["GITHEAD_#{local_hash}"] = "HEAD"
73
+ ENV["GITHEAD_#{remote_hash}"] = target_revision
74
+ git.merge_recursive(base_hash, local_hash, remote_hash)
64
75
  else
65
- base_hash = local_hash
76
+ git.merge_subtree(target_revision)
66
77
  end
67
- remote_hash = generate_tree_hash(mirror, target_revision)
68
- ENV["GITHEAD_#{local_hash}"] = "HEAD"
69
- ENV["GITHEAD_#{remote_hash}"] = target_revision
70
- git.merge_recursive(base_hash, local_hash, remote_hash)
71
- else
72
- git.merge_subtree(target_revision)
78
+ rescue Operations::MergeError => error
79
+ msg "Caught merge error. Breaking."
73
80
  end
74
- rescue Operations::MergeError => error
75
- msg "Caught merge error. Breaking."
76
- end
77
81
 
78
- config.update(mirror)
79
- add_config_file
82
+ config.update(mirror)
83
+ add_config_file
80
84
 
81
- commit_message = "Updated mirror '#{mirror.path}' to #{display_revision(mirror)}"
85
+ commit_message = "Updated mirror '#{mirror.path}' to #{display_revision(mirror)}"
82
86
 
83
- if error
84
- File.open(".git/MERGE_MSG", 'w') { |f| f.puts(commit_message) }
85
- return
86
- end
87
+ if error
88
+ File.open(".git/MERGE_MSG", 'w') { |f| f.puts(commit_message) }
89
+ return
90
+ end
87
91
 
88
- git.commit(commit_message)
89
- msg commit_message
92
+ git.commit(commit_message)
93
+ msg commit_message
94
+ end
90
95
  end
91
96
 
92
97
  def generate_tree_hash(mirror, revision)
data/lib/braid/mirror.rb CHANGED
@@ -1,6 +1,8 @@
1
+ require 'rspec_git.rb'
2
+
1
3
  module Braid
2
4
  class Mirror
3
- TYPES = %w(git svn)
5
+ TYPES = %w(git svn git-clone)
4
6
  ATTRIBUTES = %w(url remote type branch squashed revision lock)
5
7
 
6
8
  class UnknownType < BraidError
@@ -21,11 +23,12 @@ module Braid
21
23
 
22
24
  include Operations::VersionControl
23
25
 
24
- attr_reader :path, :attributes
26
+ attr_reader :path, :attributes, :rspec_git
25
27
 
26
28
  def initialize(path, attributes = {})
27
29
  @path = path.sub(/\/$/, '')
28
30
  @attributes = attributes
31
+ @rspec_git = RSpec::Git.new File.basename(@path) @path attributes["url"]
29
32
  end
30
33
 
31
34
  def self.new_from_options(url, options = {})
@@ -43,10 +46,14 @@ module Braid
43
46
  raise PathRequired
44
47
  end
45
48
 
46
- if options["rails_plugin"]
49
+ if options["rails_plugin"] && ! path =~ /vendor\/plugins.*/
47
50
  path = "vendor/plugins/#{path}"
48
51
  end
49
52
 
53
+ if options["rails_gem"] && ! path =~ /vendor\/gems.*/
54
+ path = "vendor/gems/#{path}"
55
+ end
56
+
50
57
  remote = "braid/#{path}".gsub("_", '-') # stupid git svn changes all _ to ., weird
51
58
  squashed = !options["full"]
52
59
  branch = nil if type == "svn"
@@ -152,7 +159,7 @@ module Braid
152
159
  return url_scheme if TYPES.include?(url_scheme)
153
160
 
154
161
  return "svn" if url[-6..-1] == "/trunk"
155
- return "git" if url[-4..-1] == ".git"
162
+ return "git-clone" if url[-4..-1] == ".git"
156
163
  end
157
164
 
158
165
  def self.extract_path_from_url(url)
@@ -137,6 +137,72 @@ module Braid
137
137
  end
138
138
  end
139
139
 
140
+ class GitClone < Proxy
141
+ def in_rep_root_check
142
+ if ! File.exists?(".git")
143
+ raise("Not in root repository.")
144
+ end
145
+ end
146
+
147
+ def add_gitignore(path)
148
+ # add mirror to .gitignore file
149
+ in_rep_root_check
150
+ if ! File.exists?(".gitignore")
151
+ f = File.new(".gitignore", "w+")
152
+ else
153
+ f = File.open( 'index', 'w+')
154
+ end
155
+
156
+ f.each { |line|
157
+ if line == path
158
+ path_ignored = line
159
+ end
160
+ }
161
+ if ! ignored
162
+ f.puts path
163
+ git.add(".gitignore")
164
+ end
165
+ f.close
166
+ end
167
+
168
+ def remove_gitignore(path)
169
+ # remove mirror from .gitignore file
170
+ in_rep_root_check
171
+ if File.exists?(".gitignore")
172
+ f = File.open( 'index', 'w+')
173
+
174
+ f.each { |line|
175
+ if line == path
176
+ path_ignored = line
177
+ end
178
+ }
179
+ f.rewind
180
+
181
+ if path_ignored
182
+ date_str= Date.new.to_s
183
+ n = File.new(".gitignore-#{date_str}", "w+")
184
+ f.each { |line|
185
+ n.puts line unless line == path_ignored
186
+ }
187
+ n.close
188
+ end
189
+ f.close
190
+ File.rename( ".gitignore-#{date_str}", ".gitignore" )
191
+ git.add(".gitignore")
192
+ end
193
+
194
+ end
195
+
196
+ private
197
+ def command(name)
198
+ "#{self.class.command} #{name}"
199
+ end
200
+
201
+ def git
202
+ GitClone.instance
203
+ end
204
+ end
205
+
140
206
  class Git < Proxy
141
207
  def commit(message, *args)
142
208
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dreamcat4-braid
3
3
  version: !ruby/object:Gem::Version
4
- version: "0.50"
4
+ version: "0.52"
5
5
  platform: ruby
6
6
  authors:
7
7
  - Cristi Balan