ext 1.0.3 → 1.0.4
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 +7 -0
- data/README +2 -0
- data/Rakefile +1 -74
- data/bin/ext +0 -0
- data/lib/externals/ext.rb +25 -9
- data/lib/externals/extensions/file_utils.rb +40 -0
- data/lib/externals/extensions/string.rb +1 -1
- data/lib/externals/project.rb +3 -0
- data/lib/externals/scms/git_project.rb +3 -4
- data/lib/externals/scms/svn_project.rb +10 -12
- data/lib/externals/test/basic_git_repository.rb +41 -0
- data/lib/externals/test/engines.rb +11 -0
- data/lib/externals/test/engines_with_branch1.rb +36 -0
- data/lib/externals/test/fake_rails_repository.rb +112 -0
- data/lib/externals/test/git_repository_from_internet.rb +19 -0
- data/lib/externals/test/modules_svn_branches_repository.rb +72 -0
- data/lib/externals/test/modules_svn_repository.rb +41 -0
- data/lib/externals/test/rails_app_git_branches.rb +100 -0
- data/lib/externals/test/rails_app_git_repository.rb +55 -0
- data/lib/externals/test/rails_app_svn_branches.rb +132 -0
- data/lib/externals/test/rails_app_svn_repository.rb +106 -0
- data/lib/externals/test/rails_app_unmanaged.rb +25 -0
- data/lib/externals/test/repository.rb +188 -0
- data/lib/externals/test/svn_repository_from_dump.rb +27 -0
- data/lib/externals/test/svn_repository_helper.rb +10 -0
- data/lib/externals/test_case.rb +16 -307
- data/test/setup/empty_plugin.svn.gz +0 -0
- data/test/setup/foreign_key_migrations.svn.gz +0 -0
- data/test/setup/redhillonrails_core.svn.gz +0 -0
- data/test/test_checkout_git.rb +16 -25
- data/test/test_checkout_with_subprojects_git.rb +109 -193
- data/test/test_checkout_with_subprojects_svn.rb +239 -294
- data/test/test_file_utils_extensions.rb +29 -0
- data/test/test_freeze_to_revision.rb +46 -85
- data/test/test_git_project_extract_name.rb +10 -8
- data/test/test_init_git.rb +19 -29
- data/test/test_projects.rb +87 -93
- data/test/test_rails_detection.rb +12 -17
- data/test/test_string_extensions.rb +32 -30
- data/test/test_svn_branches.rb +227 -383
- data/test/test_touch_emptydirs.rb +39 -34
- data/test/test_version.rb +18 -16
- metadata +47 -23
data/CHANGELOG
CHANGED
@@ -1,3 +1,10 @@
|
|
1
|
+
October 9, 2011 Version 1.0.4 released
|
2
|
+
- Dependency on programs such as rm, rmdir, cp, etc, removed. Now only
|
3
|
+
dependent on the actual SCM executables (and gzip to run the tests.)
|
4
|
+
- Tests have been restructured and now take significantly much less time to run.
|
5
|
+
- Fixed a bug caused by a file failing to be packaged with the rest of the
|
6
|
+
1.0.3 gem.
|
7
|
+
|
1
8
|
September 28, 2011 Version 1.0.3 released
|
2
9
|
- "up" now changes branches of subprojects
|
3
10
|
- Subversion branch support added
|
data/README
CHANGED
@@ -33,6 +33,8 @@ ext [OPTIONS] <command> [repository] [-b <branch>] [path]
|
|
33
33
|
'--scm svn'.
|
34
34
|
-b, --branch BRANCH The branch you want the subproject to checkout when
|
35
35
|
doing 'ext install'
|
36
|
+
-r, --revision REVISION The revision you want the subproject to checkout when
|
37
|
+
doing 'ext install'
|
36
38
|
-f, --force_removal When doing an uninstall of a subproject, remove it's
|
37
39
|
files and subfolders, too.
|
38
40
|
-w, --workdir DIR The working directory to execute commands from. Use
|
data/Rakefile
CHANGED
@@ -10,79 +10,6 @@ $LOAD_PATH << File.join(root_dir, 'lib')
|
|
10
10
|
|
11
11
|
require File.join(root_dir, 'lib', 'externals', 'ext')
|
12
12
|
|
13
|
-
desc "Creates the starting repositories needed to run the tests.
|
14
|
-
If you plan on running the tests, you only need
|
15
|
-
to run this once."
|
16
|
-
task :prep_test do
|
17
|
-
Dir.chdir File.join(root_dir, 'test') do
|
18
|
-
|
19
|
-
puts `rm -rf cleanreps`
|
20
|
-
Dir.mkdir('cleanreps')
|
21
|
-
Dir.chdir('cleanreps') do
|
22
|
-
%w(redhillonrails_core foreign_key_migrations empty_plugin).each do |p|
|
23
|
-
puts `cp ../setup/#{p}.svn.gz .`
|
24
|
-
puts `gzip -d #{p}.svn.gz`
|
25
|
-
puts `svnadmin create #{p}`
|
26
|
-
puts `svnadmin load #{p} < #{p}.svn`
|
27
|
-
end
|
28
|
-
|
29
|
-
puts `git clone --bare git://github.com/azimux/engines.git engines.git`
|
30
|
-
|
31
|
-
%w(acts_as_list ssl_requirement).each do |p|
|
32
|
-
puts `git clone --bare git://github.com/rails/#{p}.git #{p}.git`
|
33
|
-
end
|
34
|
-
|
35
|
-
if File.exists? 'C:\\tmp\\rails'
|
36
|
-
puts `cp -a C:\\tmp\\rails full_rails`
|
37
|
-
elsif File.exists? '/tmp/rails'
|
38
|
-
puts `cp -a /tmp/rails full_rails`
|
39
|
-
else
|
40
|
-
puts `git clone git://github.com/rails/rails.git full_rails`
|
41
|
-
end
|
42
|
-
puts `cp -a full_rails fake_rails`
|
43
|
-
|
44
|
-
#let's make the repo smaller by removing all but 1 file from each
|
45
|
-
#directory to save time
|
46
|
-
Dir.chdir 'fake_rails' do
|
47
|
-
puts `rm -rf .git`
|
48
|
-
raise "something wrong with rm" if File.exists? '.git'
|
49
|
-
end
|
50
|
-
|
51
|
-
dirs = []
|
52
|
-
Find.find('fake_rails') do |f|
|
53
|
-
dirs << f if File.directory?(f)
|
54
|
-
end
|
55
|
-
|
56
|
-
dirs.each do |dir|
|
57
|
-
files = Dir.entries(dir)
|
58
|
-
|
59
|
-
Dir.chdir(dir) do
|
60
|
-
files = files.select {|e|e != ".gitignore" && File.file?(e)}.sort
|
61
|
-
files.shift #let's keep the first file in the list.
|
62
|
-
files.each do |file|
|
63
|
-
File.delete(file)
|
64
|
-
end
|
65
|
-
end
|
66
|
-
end
|
67
|
-
|
68
|
-
raise "why is rails already here?" if File.exists? 'rails.git'
|
69
|
-
|
70
|
-
Dir.mkdir('rails.git')
|
71
|
-
|
72
|
-
Dir.chdir('rails.git') do
|
73
|
-
puts `git init --bare`
|
74
|
-
end
|
75
|
-
|
76
|
-
Dir.chdir 'fake_rails' do
|
77
|
-
puts `git init`
|
78
|
-
puts `git add .`
|
79
|
-
puts `git commit -m "rails with all but 1 file per directory deleted"`
|
80
|
-
puts `git push ../rails.git master`
|
81
|
-
end
|
82
|
-
end
|
83
|
-
end
|
84
|
-
end
|
85
|
-
|
86
13
|
Rake::TestTask.new('test') do |task|
|
87
14
|
task.libs = [File.expand_path('lib'),File.expand_path('test')]
|
88
15
|
task.pattern = './test/test_*.rb'
|
@@ -132,7 +59,7 @@ the main project.}
|
|
132
59
|
specification.email = "azimux@gmail.com"
|
133
60
|
specification.homepage = "http://nopugs.com/ext-tutorial"
|
134
61
|
|
135
|
-
specification.test_files = FileList['test/test_*.rb']
|
62
|
+
specification.test_files = FileList['test/test_*.rb', 'test/setup/*.gz']
|
136
63
|
|
137
64
|
specification.bindir = "bin"
|
138
65
|
specification.executables = ['ext']
|
data/bin/ext
CHANGED
File without changes
|
data/lib/externals/ext.rb
CHANGED
@@ -2,10 +2,14 @@ require 'externals/project'
|
|
2
2
|
require 'externals/configuration/configuration'
|
3
3
|
require 'optparse'
|
4
4
|
require 'externals/command'
|
5
|
-
require '
|
5
|
+
require 'fileutils'
|
6
|
+
|
7
|
+
Dir.entries(File.join(File.dirname(__FILE__), 'extensions')).each do |extension|
|
8
|
+
require "externals/extensions/#{extension}" if extension =~ /.rb$/
|
9
|
+
end
|
6
10
|
|
7
11
|
module Externals
|
8
|
-
VERSION = '1.0.
|
12
|
+
VERSION = '1.0.4'
|
9
13
|
PROJECT_TYPES_DIRECTORY = File.join(File.dirname(__FILE__), '..', 'externals','project_types')
|
10
14
|
|
11
15
|
# Full commands operate on the main project as well as the externals
|
@@ -79,9 +83,8 @@ module Externals
|
|
79
83
|
|
80
84
|
COMMANDS = FULL_COMMANDS + SHORT_COMMANDS + MAIN_COMMANDS
|
81
85
|
|
82
|
-
|
83
|
-
|
84
|
-
end
|
86
|
+
COULD_NOT_DETERMINE_SCM = 1
|
87
|
+
NO_EXTERNALS_FILE = 2
|
85
88
|
|
86
89
|
Dir.entries(File.join(File.dirname(__FILE__), '..', 'externals','scms')).each do |project|
|
87
90
|
require "externals/scms/#{project}" if project =~ /_project.rb$/
|
@@ -92,6 +95,9 @@ module Externals
|
|
92
95
|
end
|
93
96
|
|
94
97
|
class Ext
|
98
|
+
include FileUtils
|
99
|
+
extend FileUtils
|
100
|
+
|
95
101
|
attr_accessor :path_calculator
|
96
102
|
|
97
103
|
def self.project_types
|
@@ -143,6 +149,11 @@ module Externals
|
|
143
149
|
*"The branch you want the
|
144
150
|
subproject to checkout when doing 'ext install'".lines_by_width(summary_width)
|
145
151
|
) {|branch| sub_options[:branch] = main_options[:branch] = branch}
|
152
|
+
opts.on("--revision REVISION", "-r REVISION",
|
153
|
+
String,
|
154
|
+
*"The revision you want the
|
155
|
+
subproject to checkout when doing 'ext install'".lines_by_width(summary_width)
|
156
|
+
) {|revision| sub_options[:revision] = main_options[:revision] = revision}
|
146
157
|
opts.on("--force_removal", "-f",
|
147
158
|
String,
|
148
159
|
*"When doing an uninstall of a subproject,
|
@@ -401,7 +412,10 @@ Please use
|
|
401
412
|
end
|
402
413
|
|
403
414
|
def install args, options
|
404
|
-
|
415
|
+
if !File.exists? '.externals'
|
416
|
+
STDERR.puts "This project does not appear to be managed by externals. Try 'ext init' first"
|
417
|
+
exit NO_EXTERNALS_FILE
|
418
|
+
end
|
405
419
|
repository = args[0]
|
406
420
|
path = args[1]
|
407
421
|
|
@@ -412,10 +426,11 @@ Please use
|
|
412
426
|
scm ||= infer_scm(repository)
|
413
427
|
|
414
428
|
unless scm
|
415
|
-
|
429
|
+
STDERR.puts "Unable to determine SCM from the repository name.
|
416
430
|
You need to either specify the scm used to manage the subproject
|
417
431
|
that you are installing. Use an option to specify it
|
418
432
|
(such as --git or --svn)"
|
433
|
+
exit COULD_NOT_DETERMINE_SCM
|
419
434
|
end
|
420
435
|
|
421
436
|
project = self.class.project_class(scm).new(:repository => repository,
|
@@ -427,6 +442,7 @@ that you are installing. Use an option to specify it
|
|
427
442
|
raise "already exists" if configuration[path]
|
428
443
|
|
429
444
|
project.branch = options[:branch] if options[:branch]
|
445
|
+
project.revision = options[:revision] if options[:revision]
|
430
446
|
|
431
447
|
attributes = project.attributes.dup
|
432
448
|
attributes.delete(:path)
|
@@ -456,7 +472,7 @@ that you are installing. Use an option to specify it
|
|
456
472
|
|
457
473
|
if options[:force_removal]
|
458
474
|
Dir.chdir File.dirname(project.path) do
|
459
|
-
|
475
|
+
rm_rf File.basename(project.path)
|
460
476
|
end
|
461
477
|
end
|
462
478
|
end
|
@@ -670,7 +686,7 @@ commands below if you actually wish to delete them."
|
|
670
686
|
repository = args[0]
|
671
687
|
path = args[1] || "."
|
672
688
|
|
673
|
-
main_project = do_checkout_or_export repository, path, options, :
|
689
|
+
main_project = do_checkout_or_export repository, path, options, :export
|
674
690
|
|
675
691
|
if path == "."
|
676
692
|
path = main_project.name
|
@@ -0,0 +1,40 @@
|
|
1
|
+
require 'fileutils'
|
2
|
+
|
3
|
+
FileUtils.class_eval do
|
4
|
+
# simulates cp -a
|
5
|
+
def cp_a source, dest, options = {}
|
6
|
+
cp_r source, dest, options.merge(:preserve => true)
|
7
|
+
end
|
8
|
+
|
9
|
+
# calls rm_rf if the file exists
|
10
|
+
def rm_rf_ie file, options = {}
|
11
|
+
rm_rf file, options if File.exists? file
|
12
|
+
end
|
13
|
+
|
14
|
+
# calls rmdir if the file exists and is empty
|
15
|
+
def rmdir_if_empty_ie path
|
16
|
+
rmdir path if File.exists?(path) && dir_empty?(path)
|
17
|
+
end
|
18
|
+
|
19
|
+
# calls rmdir if the file exists
|
20
|
+
def rmdir_ie path
|
21
|
+
rmdir path if File.exists?(path)
|
22
|
+
end
|
23
|
+
|
24
|
+
alias rm_rf_old rm_rf
|
25
|
+
#going to try to give a delay after calling rm if necessary...
|
26
|
+
def rm_rf *args
|
27
|
+
rm_rf_old *args
|
28
|
+
tries = 0
|
29
|
+
while File.exists?(args[0]) && tries < 10
|
30
|
+
sleep 1
|
31
|
+
tries += 1
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def dir_empty? path
|
36
|
+
File.directory?(path) &&
|
37
|
+
File.exists?(path) &&
|
38
|
+
!Dir.entries(path).detect{|entry| !["..","."].include?(entry)}
|
39
|
+
end
|
40
|
+
end
|
@@ -8,7 +8,6 @@ String.class_eval do
|
|
8
8
|
end
|
9
9
|
|
10
10
|
#avoid collision
|
11
|
-
raise unless instance_methods.include?("lines")
|
12
11
|
raise if instance_methods.include?("lines_by_width")
|
13
12
|
def lines_by_width(width = 32)
|
14
13
|
width ||= 32
|
@@ -36,4 +35,5 @@ String.class_eval do
|
|
36
35
|
|
37
36
|
lines
|
38
37
|
end
|
38
|
+
|
39
39
|
end
|
data/lib/externals/project.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'externals/extensions/symbol'
|
2
|
+
require 'fileutils'
|
2
3
|
|
3
4
|
module Externals
|
4
5
|
OPTS_SUFFIXES = ["co", "up", "st", "ex"] unless const_defined?('OPTS_SUFFIXES')
|
@@ -9,6 +10,8 @@ module Externals
|
|
9
10
|
|
10
11
|
class Project
|
11
12
|
attr_accessor :parent
|
13
|
+
include FileUtils
|
14
|
+
extend FileUtils
|
12
15
|
|
13
16
|
def self.attr_attr_accessor *names
|
14
17
|
names = [names].flatten
|
@@ -12,8 +12,7 @@ module Externals
|
|
12
12
|
|
13
13
|
puts "path is #{path} repository is #{repository}"
|
14
14
|
if path != '.'
|
15
|
-
|
16
|
-
`#{rmdircmd}` if File.exists?(path)
|
15
|
+
rmdir_ie path
|
17
16
|
end
|
18
17
|
|
19
18
|
dest = path
|
@@ -118,8 +117,7 @@ module Externals
|
|
118
117
|
|
119
118
|
def ex *args
|
120
119
|
if path != '.'
|
121
|
-
|
122
|
-
`#{rmdircmd}` if File.exists? path
|
120
|
+
rmdir_ie path
|
123
121
|
end
|
124
122
|
|
125
123
|
dest = path
|
@@ -176,6 +174,7 @@ module Externals
|
|
176
174
|
#this is a test helper method
|
177
175
|
def self.add_all
|
178
176
|
puts `git add .`
|
177
|
+
raise unless $? == 0
|
179
178
|
end
|
180
179
|
|
181
180
|
def ignore_contains? path
|
@@ -9,8 +9,7 @@ module Externals
|
|
9
9
|
public
|
10
10
|
def co *args
|
11
11
|
# delete path if not empty
|
12
|
-
|
13
|
-
`#{rmdircmd}` if File.exists? path
|
12
|
+
rmdir_ie path
|
14
13
|
|
15
14
|
if File.exists? path
|
16
15
|
up
|
@@ -26,7 +25,9 @@ module Externals
|
|
26
25
|
|
27
26
|
puts(svncocmd = "svn #{opts} co #{url} #{path}")
|
28
27
|
puts `#{svncocmd}`
|
29
|
-
|
28
|
+
unless $? == 0
|
29
|
+
raise
|
30
|
+
end
|
30
31
|
|
31
32
|
change_to_revision "co"
|
32
33
|
end
|
@@ -44,8 +45,7 @@ module Externals
|
|
44
45
|
|
45
46
|
def ex *args
|
46
47
|
# delete path if not empty
|
47
|
-
|
48
|
-
`#{rmdircmd}`
|
48
|
+
rmdir_ie path
|
49
49
|
|
50
50
|
url = repository
|
51
51
|
|
@@ -58,8 +58,7 @@ module Externals
|
|
58
58
|
url += "@#{revision}"
|
59
59
|
end
|
60
60
|
|
61
|
-
|
62
|
-
puts(svncocmd = "svn #{scm_opts_ex} export #{repository} #{path}")
|
61
|
+
puts(svncocmd = "svn #{scm_opts_ex} export #{url} #{path}")
|
63
62
|
puts `#{svncocmd}`
|
64
63
|
end
|
65
64
|
|
@@ -77,10 +76,8 @@ module Externals
|
|
77
76
|
end
|
78
77
|
|
79
78
|
def up *args
|
80
|
-
# delete path if
|
81
|
-
|
82
|
-
`#{rmdircmd}` if File.exists? path
|
83
|
-
|
79
|
+
# delete path if empty
|
80
|
+
rmdir_if_empty_ie path
|
84
81
|
|
85
82
|
if File.exists? path
|
86
83
|
puts "updating #{path}:"
|
@@ -142,6 +139,7 @@ module Externals
|
|
142
139
|
|
143
140
|
status.split("\n").grep(/^\?/).each do |to_add|
|
144
141
|
puts `svn add #{to_add.gsub(/^\?\s*/,"")}`
|
142
|
+
raise unless $? == 0
|
145
143
|
end
|
146
144
|
end
|
147
145
|
|
@@ -151,7 +149,7 @@ module Externals
|
|
151
149
|
|
152
150
|
def current_branch
|
153
151
|
require_repository
|
154
|
-
branch = info_url.gsub(repository, "")
|
152
|
+
branch = info_url.gsub(/\/+/, "/").gsub(repository.gsub(/\/+/, "/"), "")
|
155
153
|
if branch == repository
|
156
154
|
raise "Could not determine branch from URL #{info_url}.
|
157
155
|
Does not appear have a substring of #{repository}"
|
@@ -0,0 +1,41 @@
|
|
1
|
+
require 'externals/test/repository'
|
2
|
+
|
3
|
+
module Externals
|
4
|
+
module Test
|
5
|
+
class BasicGitRepository < Repository
|
6
|
+
def initialize
|
7
|
+
super "basic", "git"
|
8
|
+
end
|
9
|
+
|
10
|
+
def build_here
|
11
|
+
mkdir name
|
12
|
+
|
13
|
+
Dir.chdir("#{name}") do
|
14
|
+
`git init`
|
15
|
+
raise unless $? == 0
|
16
|
+
|
17
|
+
open 'readme.txt', 'w' do |f|
|
18
|
+
f.write "readme.txt Line 1
|
19
|
+
Line 2
|
20
|
+
Line 3"
|
21
|
+
end
|
22
|
+
|
23
|
+
`git add .`
|
24
|
+
raise unless $? == 0
|
25
|
+
`git commit -m "added readme.txt"`
|
26
|
+
raise unless $? == 0
|
27
|
+
|
28
|
+
open 'readme.txt', 'a' do |f|
|
29
|
+
f.write "line 4"
|
30
|
+
end
|
31
|
+
|
32
|
+
`git add .`
|
33
|
+
raise unless $? == 0
|
34
|
+
`git commit -m "added a line to readme.txt"`
|
35
|
+
raise unless $? == 0
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
require 'externals/test/repository'
|
2
|
+
require 'externals/test/engines'
|
3
|
+
|
4
|
+
module Externals
|
5
|
+
module Test
|
6
|
+
class EnginesWithBranch1 < Repository
|
7
|
+
def initialize
|
8
|
+
super "engines.git", File.join("git", "with_branch1")
|
9
|
+
dependents.merge!(
|
10
|
+
:other_engines => Engines.new
|
11
|
+
)
|
12
|
+
end
|
13
|
+
|
14
|
+
#builds the test repository in the current directory
|
15
|
+
def build_here
|
16
|
+
rm_rf_ie name
|
17
|
+
|
18
|
+
puts `git clone --bare #{dependents[:other_engines].clean_dir} #{name}`
|
19
|
+
raise unless $? == 0
|
20
|
+
|
21
|
+
rm_rf_ie "workdir"
|
22
|
+
mkdir "workdir"
|
23
|
+
Dir.chdir 'workdir' do
|
24
|
+
`git clone #{clean_dir}`
|
25
|
+
raise unless $? == 0
|
26
|
+
Dir.chdir name.gsub(".git", "") do
|
27
|
+
`git push origin master:branch1`
|
28
|
+
raise unless $? == 0
|
29
|
+
end
|
30
|
+
end
|
31
|
+
rm_rf_ie "workdir"
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|