ext 1.0.4 → 1.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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