ext 1.0.4 → 1.0.5

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG CHANGED
@@ -1,3 +1,7 @@
1
+ October 19, 2011 Version 1.0.5 released
2
+ - Fixed a small bug preventing subprojects managed under git to update if they
3
+ have a branch set in .externals.
4
+
1
5
  October 9, 2011 Version 1.0.4 released
2
6
  - Dependency on programs such as rm, rmdir, cp, etc, removed. Now only
3
7
  dependent on the actual SCM executables (and gzip to run the tests.)
data/bin/ext CHANGED
File without changes
@@ -9,7 +9,7 @@ Dir.entries(File.join(File.dirname(__FILE__), 'extensions')).each do |extension|
9
9
  end
10
10
 
11
11
  module Externals
12
- VERSION = '1.0.4'
12
+ VERSION = '1.0.5'
13
13
  PROJECT_TYPES_DIRECTORY = File.join(File.dirname(__FILE__), '..', 'externals','project_types')
14
14
 
15
15
  # Full commands operate on the main project as well as the externals
@@ -24,16 +24,31 @@ FileUtils.class_eval do
24
24
  alias rm_rf_old rm_rf
25
25
  #going to try to give a delay after calling rm if necessary...
26
26
  def rm_rf *args
27
- rm_rf_old *args
28
27
  tries = 0
29
- while File.exists?(args[0]) && tries < 10
30
- sleep 1
31
- tries += 1
28
+
29
+ rm = proc do
30
+ rm_rf_old *args
31
+
32
+ while File.exists?(args[0]) && tries < 10
33
+ sleep 1
34
+ tries += 1
35
+ end
36
+ end
37
+
38
+ rm.call
39
+ if tries >= 10
40
+ puts "WARNING: deleted #{args[0]} didn't work, trying again"
41
+ tries = 0
42
+ rm.call
43
+
44
+ if tries >= 10
45
+ raise "Could not delete #{args[0]}"
46
+ end
32
47
  end
33
48
  end
34
49
 
35
50
  def dir_empty? path
36
- File.directory?(path) &&
51
+ File.directory?(path) &&
37
52
  File.exists?(path) &&
38
53
  !Dir.entries(path).detect{|entry| !["..","."].include?(entry)}
39
54
  end
@@ -7,7 +7,7 @@ module Externals
7
7
  end
8
8
 
9
9
  private
10
- def co_or_up command
10
+ def do_clone command, extra_opts = ""
11
11
  opts = resolve_opts(command)
12
12
 
13
13
  puts "path is #{path} repository is #{repository}"
@@ -19,18 +19,16 @@ module Externals
19
19
  dest = '' if dest == '.'
20
20
  dest = "\"#{dest}\"" if dest && !dest.empty?
21
21
 
22
- puts(gitclonecmd = "git #{opts} clone \"#{repository}\" #{dest}")
22
+ puts(gitclonecmd = "git #{opts} clone #{extra_opts} \"#{repository}\" #{dest}")
23
23
  puts `#{gitclonecmd}`
24
24
  unless $? == 0
25
25
  raise "git clone of #{repository} failed."
26
26
  end
27
-
28
- change_to_branch_revision(command)
29
27
  end
30
28
 
31
29
  public
32
30
  def co *args
33
- co_or_up "co"
31
+ do_up "co"
34
32
  end
35
33
 
36
34
  private
@@ -40,27 +38,37 @@ module Externals
40
38
  `git #{opts} branch -a` =~ /^\s*#{branch_name}\s*$/
41
39
  end
42
40
 
41
+ # make sure you have already entered Dir.chdir(path) in your calling code!
42
+
43
43
  public
44
+ # this method fetches/pulls/changes branches/changes revisions/changes the oil in your geo metro/brings world peace
44
45
  def change_to_branch_revision command = ""
45
46
  opts = resolve_opts(command)
46
47
 
48
+ pulled = false
49
+
50
+ project_path = if path == "."
51
+ name || "."
52
+ else
53
+ path
54
+ end
55
+
56
+ Dir.chdir project_path do
57
+ do_fetch command
58
+ end
59
+
60
+
47
61
  if branch
48
62
  cb = current_branch
49
63
 
50
64
  # This allows the main project to be checked out to a directory
51
65
  # that doesn't match it's name.
52
- project_path = if path == "."
53
- name
54
- else
55
- path
56
- end
57
-
58
66
  Dir.chdir project_path do
59
67
  if cb != branch
60
68
  # let's see if the branch exists in the remote repository
61
69
  # and if not, fetch it.
62
70
  if !branch_exists("origin/#{branch}")
63
- puts `git #{opts} fetch`
71
+ do_fetch command
64
72
  end
65
73
 
66
74
  # if the local branch doens't exist, add --track -b
@@ -74,17 +82,29 @@ module Externals
74
82
  end
75
83
  end
76
84
  end
85
+
86
+ # on the right branch, let's pull
87
+ Dir.chdir project_path do
88
+ `git #{opts} pull`
89
+ raise unless $? == 0
90
+ pulled = true
91
+ end
77
92
  end
78
93
 
79
94
  if revision
80
- Dir.chdir path do
81
- puts `git #{opts} fetch`
82
- puts `git #{opts} pull`
95
+ Dir.chdir project_path do
83
96
  puts `git #{opts} checkout #{revision}`
84
97
  unless $? == 0
85
98
  raise "Could not checkout #{revision}"
86
99
  end
87
100
  end
101
+ else
102
+ unless pulled
103
+ Dir.chdir project_path do
104
+ `git #{opts} pull`
105
+ raise unless $? == 0
106
+ end
107
+ end
88
108
  end
89
109
  end
90
110
 
@@ -116,38 +136,43 @@ module Externals
116
136
  end
117
137
 
118
138
  def ex *args
119
- if path != '.'
120
- rmdir_ie path
121
- end
122
-
123
- dest = path
124
-
125
- dest = '' if dest == '.'
126
-
127
- dest = "\"#{dest}\"" if dest && !dest.empty?
128
-
129
- puts(gitclonecmd = "git #{scm_opts_ex} clone --depth 1 \"#{repository}\" #{dest}")
130
-
131
- puts `#{gitclonecmd}`
139
+ do_clone "ex", "--depth 1"
132
140
 
133
141
  change_to_branch_revision "ex"
134
142
  end
135
143
 
136
144
  def up *args
137
- if File.exists? path
138
- puts "updating #{path}:"
139
- if revision || branch
140
- change_to_branch_revision "up"
141
- else
142
- Dir.chdir path do
143
- puts `git #{scm_opts_up} pull`
144
- end
145
- end
145
+ do_up "up"
146
+ end
147
+
148
+ private
149
+ def do_fetch command
150
+ opts = resolve_opts(command)
151
+ `git #{opts} fetch`
152
+ raise unless $? == 0
153
+ end
154
+
155
+ def do_up command
156
+ opts = resolve_opts(command)
157
+
158
+ project_path = if path == "."
159
+ name || "." # if no name is specified then we are expected to already be in the right path.
160
+ # this is a little confusing and should be cleaned up.
161
+ # When we are doing a checkout, the name is set manually in Ext.checkout.
162
+ # we are then in the parent directory.
163
+ # When we are doing an update, the main project has no name.
164
+ # we are then in the correct directory.
146
165
  else
147
- co_or_up "up"
166
+ path
148
167
  end
168
+
169
+ if !File.exists? project_path
170
+ do_clone command
171
+ end
172
+ change_to_branch_revision command
149
173
  end
150
174
 
175
+ public
151
176
  def st *args
152
177
  puts "\nstatus for #{path}:"
153
178
  Dir.chdir path do
@@ -17,7 +17,7 @@ module Externals
17
17
  Dir.chdir 'workdir' do
18
18
  rm_rf name
19
19
 
20
- cmd = "svn checkout \'#{clean_url}\'"
20
+ cmd = "svn checkout \"#{clean_url}\""
21
21
  puts "about to run #{cmd}"
22
22
  puts `#{cmd}`
23
23
  unless $? == 0
@@ -0,0 +1,62 @@
1
+ require 'externals/test/repository'
2
+ require 'externals/test/basic_git_repository'
3
+
4
+ module Externals
5
+ module Test
6
+ class SimpleGitWithSub < Repository
7
+ def initialize
8
+ super "simple_wth_sub", File.join("git", "5")
9
+ dependents.merge!(
10
+ :basic => BasicGitRepository.new
11
+ )
12
+ end
13
+
14
+ def build_here
15
+ mkdir name
16
+
17
+ Dir.chdir("#{name}") do
18
+ `git init`
19
+ raise unless $? == 0
20
+
21
+ open 'simple_readme.txt', 'w' do |f|
22
+ f.write "simple_readme.txt Line 1
23
+ Line 2
24
+ Line 3
25
+ "
26
+ end
27
+
28
+ `git add .`
29
+ raise unless $? == 0
30
+ `git commit -m "added simple_readme.txt"`
31
+ raise unless $? == 0
32
+
33
+ open 'simple_readme.txt', 'a' do |f|
34
+ f.write "line 4"
35
+ end
36
+
37
+ `git add .`
38
+ raise unless $? == 0
39
+ `git commit -m "added a line to simple_readme.txt"`
40
+ raise unless $? == 0
41
+
42
+ # initialize externals
43
+ Ext.run "init"
44
+
45
+ mkdir "subs"
46
+
47
+ Ext.run "touch_emptydirs"
48
+
49
+ # adding a branch here exposes a bug
50
+ Ext.run "install", "-g", "-b", "master",
51
+ dependents[:basic].clean_dir, "subs/#{dependents[:basic].name}"
52
+
53
+ `git add .`
54
+ raise unless $? == 0
55
+ `git commit -m "added basic subproject under subs"`
56
+ raise unless $? == 0
57
+ end
58
+ end
59
+
60
+ end
61
+ end
62
+ end
@@ -2,8 +2,8 @@ module Externals
2
2
  module Test
3
3
  module SvnRepositoryHelper
4
4
  def clean_url
5
- url = File.join 'file://', clean_dir
6
- url.gsub(/^\s*file:(\/[^\/])/, "file://\\1")
5
+ url = File.join 'file:///', clean_dir
6
+ url.gsub(/^\s*file:(\/*)/, "file:///")
7
7
  end
8
8
  end
9
9
  end
@@ -107,7 +107,9 @@ module Externals
107
107
 
108
108
  #now let's check it out again to test "ext checkout -b new_branch"
109
109
  rm_rf "rails_app"
110
- raise if File.exists?("rails_app")
110
+ if File.exists?("rails_app")
111
+ raise
112
+ end
111
113
 
112
114
  Ext.run "checkout", "--git", "-b", "new_branch", source
113
115
 
@@ -0,0 +1,83 @@
1
+ $:.unshift File.join(File.dirname(__FILE__), '..', 'lib') if $0 == __FILE__
2
+ require 'externals/test_case'
3
+ require 'externals/ext'
4
+ require 'externals/test/simple_git_with_sub'
5
+
6
+ module Externals
7
+ module Test
8
+ class TestOutOfDateGitSubproject < TestCase
9
+ include ExtTestCase
10
+
11
+ def test_out_of_date_sub
12
+ repository = SimpleGitWithSub.new
13
+ repository.prepare
14
+
15
+ assert File.exists?(File.join(repository.clean_dir, ".git"))
16
+
17
+ workdir = File.join(root_dir, 'test', "tmp", "workdir")
18
+ mkdir_p workdir
19
+
20
+ Dir.chdir workdir do
21
+ if File.exists?(repository.name)
22
+ rm_r repository.name
23
+ end
24
+
25
+ Ext.run "checkout", "--git", repository.clean_dir
26
+
27
+ assert !File.exists?(File.join(repository.name, "readme.txt"))
28
+ assert File.exists?(File.join(repository.name, "simple_readme.txt"))
29
+ assert !File.exists?(File.join(
30
+ repository.name, "subs", repository.dependents[:basic].name, "simple_readme.txt")
31
+ )
32
+ assert File.exists?(File.join(
33
+ repository.name, "subs", repository.dependents[:basic].name, "readme.txt")
34
+ )
35
+
36
+ readme = File.read(File.join(
37
+ repository.name, "subs", repository.dependents[:basic].name, "readme.txt"))
38
+
39
+ assert readme =~ /Line 4/i
40
+ assert readme !~ /Line 5/i
41
+
42
+ # let's update the subproject and make sure that ext update works.
43
+
44
+ tmp = "tmp_update_sub"
45
+ rm_rf tmp
46
+ mkdir tmp
47
+ Dir.chdir tmp do
48
+ `git clone #{repository.dependents[:basic].clean_dir}`
49
+ raise unless $? == 0
50
+
51
+ repository.dependents[:basic].mark_dirty
52
+
53
+ Dir.chdir repository.dependents[:basic].name do
54
+ open 'readme.txt', 'a' do |f|
55
+ f.write "line 5"
56
+ end
57
+
58
+ `git add .`
59
+ raise unless $? == 0
60
+ `git commit -m "added line 5 to readme.txt"`
61
+ raise unless $? == 0
62
+ `git push`
63
+ raise unless $? == 0
64
+ end
65
+ end
66
+
67
+ rm_rf tmp
68
+
69
+ Dir.chdir repository.name do
70
+ Ext.run "update"
71
+
72
+ readme = File.read(File.join(
73
+ "subs", repository.dependents[:basic].name, "readme.txt"))
74
+
75
+ assert readme =~ /Line 4/i
76
+ assert readme =~ /Line 5/i
77
+ assert readme !~ /Line 6/i
78
+ end
79
+ end
80
+ end
81
+ end
82
+ end
83
+ end
@@ -68,7 +68,7 @@ module Externals
68
68
 
69
69
  assert_equal "current", modules.current_branch
70
70
  assert_equal "current", ext.configuration["modules"]["branch"]
71
- gi
71
+
72
72
  assert !File.exists?(File.join(%w(vendor plugins ssl_requirement)))
73
73
  assert !File.exists?(File.join(%w(vendor plugins empty_plugin)))
74
74
 
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ext
3
3
  version: !ruby/object:Gem::Version
4
- hash: 31
4
+ hash: 29
5
5
  prerelease: false
6
6
  segments:
7
7
  - 1
8
8
  - 0
9
- - 4
10
- version: 1.0.4
9
+ - 5
10
+ version: 1.0.5
11
11
  platform: ruby
12
12
  authors:
13
13
  - Miles Georgi
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-10-10 00:00:00 -07:00
18
+ date: 2011-10-19 00:00:00 -07:00
19
19
  default_executable: ext
20
20
  dependencies: []
21
21
 
@@ -59,47 +59,49 @@ files:
59
59
  - README
60
60
  - MIT_LICENSE.txt
61
61
  - CHANGELOG
62
- - lib/externals/ext.rb
62
+ - lib/externals/command.rb
63
63
  - lib/externals/configuration/configuration.rb
64
- - lib/externals/test_case.rb
65
- - lib/externals/test/rails_app_svn_branches.rb
64
+ - lib/externals/ext.rb
65
+ - lib/externals/extensions/file_utils.rb
66
+ - lib/externals/extensions/string.rb
67
+ - lib/externals/extensions/symbol.rb
68
+ - lib/externals/project.rb
69
+ - lib/externals/project_types/rails.rb
70
+ - lib/externals/scms/git_project.rb
71
+ - lib/externals/scms/svn_project.rb
66
72
  - lib/externals/test/basic_git_repository.rb
67
- - lib/externals/test/modules_svn_repository.rb
68
73
  - lib/externals/test/engines.rb
69
- - lib/externals/test/rails_app_svn_repository.rb
70
74
  - lib/externals/test/engines_with_branch1.rb
71
- - lib/externals/test/rails_app_unmanaged.rb
72
- - lib/externals/test/repository.rb
73
- - lib/externals/test/rails_app_git_branches.rb
74
- - lib/externals/test/modules_svn_branches_repository.rb
75
75
  - lib/externals/test/fake_rails_repository.rb
76
- - lib/externals/test/svn_repository_helper.rb
77
- - lib/externals/test/svn_repository_from_dump.rb
78
76
  - lib/externals/test/git_repository_from_internet.rb
77
+ - lib/externals/test/modules_svn_branches_repository.rb
78
+ - lib/externals/test/modules_svn_repository.rb
79
+ - lib/externals/test/rails_app_git_branches.rb
79
80
  - lib/externals/test/rails_app_git_repository.rb
80
- - lib/externals/project_types/rails.rb
81
- - lib/externals/extensions/file_utils.rb
82
- - lib/externals/extensions/string.rb
83
- - lib/externals/extensions/symbol.rb
84
- - lib/externals/project.rb
85
- - lib/externals/scms/svn_project.rb
86
- - lib/externals/scms/git_project.rb
87
- - lib/externals/command.rb
88
- - test/test_svn_branches.rb
81
+ - lib/externals/test/rails_app_svn_branches.rb
82
+ - lib/externals/test/rails_app_svn_repository.rb
83
+ - lib/externals/test/rails_app_unmanaged.rb
84
+ - lib/externals/test/repository.rb
85
+ - lib/externals/test/simple_git_with_sub.rb
86
+ - lib/externals/test/svn_repository_from_dump.rb
87
+ - lib/externals/test/svn_repository_helper.rb
88
+ - lib/externals/test_case.rb
89
+ - test/test_checkout_git.rb
89
90
  - test/test_checkout_with_subprojects_git.rb
90
- - test/test_touch_emptydirs.rb
91
- - test/test_version.rb
92
- - test/test_git_project_extract_name.rb
93
- - test/test_freeze_to_revision.rb
94
91
  - test/test_checkout_with_subprojects_svn.rb
95
- - test/test_checkout_git.rb
96
- - test/test_rails_detection.rb
97
- - test/test_init_git.rb
98
92
  - test/test_file_utils_extensions.rb
93
+ - test/test_freeze_to_revision.rb
94
+ - test/test_git_project_extract_name.rb
95
+ - test/test_init_git.rb
96
+ - test/test_out_of_date_git_subproject.rb
99
97
  - test/test_projects.rb
98
+ - test/test_rails_detection.rb
100
99
  - test/test_string_extensions.rb
101
- - test/setup/foreign_key_migrations.svn.gz
100
+ - test/test_svn_branches.rb
101
+ - test/test_touch_emptydirs.rb
102
+ - test/test_version.rb
102
103
  - test/setup/empty_plugin.svn.gz
104
+ - test/setup/foreign_key_migrations.svn.gz
103
105
  - test/setup/redhillonrails_core.svn.gz
104
106
  - bin/ext
105
107
  has_rdoc: true
@@ -137,19 +139,20 @@ signing_key:
137
139
  specification_version: 3
138
140
  summary: Provides an SCM agnostic way to manage subprojects with a workflow similar to the svn:externals feature of subversion. It's particularly useful for rails projects that have some plugins managed by svn and some managed by git.
139
141
  test_files:
140
- - test/test_svn_branches.rb
142
+ - test/test_checkout_git.rb
141
143
  - test/test_checkout_with_subprojects_git.rb
142
- - test/test_touch_emptydirs.rb
143
- - test/test_version.rb
144
- - test/test_git_project_extract_name.rb
145
- - test/test_freeze_to_revision.rb
146
144
  - test/test_checkout_with_subprojects_svn.rb
147
- - test/test_checkout_git.rb
148
- - test/test_rails_detection.rb
149
- - test/test_init_git.rb
150
145
  - test/test_file_utils_extensions.rb
146
+ - test/test_freeze_to_revision.rb
147
+ - test/test_git_project_extract_name.rb
148
+ - test/test_init_git.rb
149
+ - test/test_out_of_date_git_subproject.rb
151
150
  - test/test_projects.rb
151
+ - test/test_rails_detection.rb
152
152
  - test/test_string_extensions.rb
153
- - test/setup/foreign_key_migrations.svn.gz
153
+ - test/test_svn_branches.rb
154
+ - test/test_touch_emptydirs.rb
155
+ - test/test_version.rb
154
156
  - test/setup/empty_plugin.svn.gz
157
+ - test/setup/foreign_key_migrations.svn.gz
155
158
  - test/setup/redhillonrails_core.svn.gz