ext 1.0.0 → 1.0.1

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,4 +1,8 @@
1
- March 29, 20011 Version 1.0.0 released
1
+ July 19, 2011 Version 1.0.1 released
2
+ - Fixed a small bug preventing subprojects with a revision associated with them
3
+ from having their name displayed when updating.
4
+
5
+ March 29, 2011 Version 1.0.0 released
2
6
  - Added scm_opts and <scm_name>_opts .externals file options with
3
7
  (_co|_ex|_st|_up) suffixed versions for passing options to the underlying
4
8
  SCM executable.
data/README CHANGED
@@ -82,9 +82,6 @@ update_ignore Adds all paths to subprojects that are
82
82
  and so you probably only will run this if you are manually
83
83
  maintaining .externals
84
84
 
85
- upgrade_externals_fileConverts the old format that stored
86
- as [main][svn][git] to [<path1>][<path2>]...
87
-
88
85
  version Displays the version number of externals and exits.
89
86
 
90
87
 
data/bin/ext CHANGED
File without changes
@@ -1,7 +1,5 @@
1
1
  require 'externals/project'
2
- require 'externals/old_project'
3
2
  require 'externals/configuration/configuration'
4
- require 'externals/configuration/old_configuration'
5
3
  require 'optparse'
6
4
  require 'externals/command'
7
5
  require 'externals/extensions/symbol'
@@ -10,7 +8,7 @@ module Externals
10
8
  #exit status
11
9
  OBSOLETE_EXTERNALS_FILE = 15
12
10
 
13
- VERSION = '1.0.0'
11
+ VERSION = '1.0.1'
14
12
  PROJECT_TYPES_DIRECTORY = File.join(File.dirname(__FILE__), '..', 'externals','project_types')
15
13
 
16
14
  # Full commands operate on the main project as well as the externals
@@ -70,8 +68,6 @@ module Externals
70
68
  main project. This is automatically performed by install,
71
69
  and so you probably only will run this if you are manually
72
70
  maintaining .externals"],
73
- [:upgrade_externals_file, "Converts the old format that stored
74
- as [main][svn][git] to [<path1>][<path2>]..."],
75
71
  [:version, "Displays the version number of externals and exits."],
76
72
  ]
77
73
 
@@ -92,10 +88,6 @@ module Externals
92
88
  require "externals/scms/#{project}" if project =~ /_project.rb$/
93
89
  end
94
90
 
95
- Dir.entries(File.join(File.dirname(__FILE__), '..', 'externals','old_scms')).each do |project|
96
- require "externals/old_scms/#{project}" if project =~ /_project.rb$/
97
- end
98
-
99
91
  Dir.entries(PROJECT_TYPES_DIRECTORY).each do |type|
100
92
  require File.join(PROJECT_TYPES_DIRECTORY, type) if type =~ /\.rb$/
101
93
  end
@@ -188,28 +180,10 @@ module Externals
188
180
 
189
181
 
190
182
  Dir.chdir(main_options[:workdir] || ".") do
191
- if command == :upgrade_externals_file
192
- main_options[:upgrade_externals_file] = true
193
- elsif command != :help && command != :version
194
- if externals_file_obsolete?
195
- puts "your .externals file Appears to be in an obsolete format"
196
- puts "Please run 'ext upgrade_externals_file' to migrate it to the new format"
197
- exit OBSOLETE_EXTERNALS_FILE
198
- end
199
- end
200
-
201
183
  self.new(main_options).send(command, args, sub_options)
202
184
  end
203
185
  end
204
186
 
205
- def self.externals_file_obsolete?
206
- return false if !File.exists?('.externals')
207
-
208
- open('.externals', 'r') do |f|
209
- f.read =~ /^\s*\[git\]\s*$|^\s*\[main\]\s*$|^\s*\[svn\]\s*$/
210
- end
211
- end
212
-
213
187
  def print_commands(commands)
214
188
  commands.each do |command|
215
189
  puts Command.new(*command)
@@ -306,31 +280,6 @@ module Externals
306
280
  def initialize options = {}
307
281
  super()
308
282
 
309
- if options[:upgrade_externals_file]
310
- type ||= options[:type]
311
-
312
-
313
- if type
314
- install_project_type type
315
- else
316
-
317
- possible_project_types = self.class.project_types.select do |project_type|
318
- self.class.project_type_detector(project_type).detected?
319
- end
320
-
321
- if possible_project_types.size > 1
322
- raise "We found multiple project types that this could be: #{possible_project_types.join(',')}
323
- Please use
324
- the --type option to tell ext which to use."
325
- elsif possible_project_types.empty?
326
- install_project_type OldConfiguration::Configuration.new[:main][:type]
327
- else
328
- install_project_type possible_project_types.first
329
- end
330
- end
331
- return
332
- end
333
-
334
283
  scm = configuration['.']
335
284
  scm = scm['scm'] if scm
336
285
  scm ||= options[:scm]
@@ -376,10 +325,6 @@ Please use
376
325
  Externals.module_eval("#{scm.to_s.cap_first}Project", __FILE__, __LINE__)
377
326
  end
378
327
 
379
- def self.old_project_class(scm)
380
- Externals.module_eval("Old#{scm.to_s.cap_first}Project", __FILE__, __LINE__)
381
- end
382
-
383
328
  def self.project_classes
384
329
  retval = []
385
330
  registered_scms.each do |scm|
@@ -704,29 +649,6 @@ Please use the --type option to tell ext which to use."
704
649
  reload_configuration
705
650
  end
706
651
 
707
- def upgrade_externals_file args, options = {}
708
- old = OldConfiguration::Configuration.new
709
-
710
- config = Configuration::Configuration.new_empty
711
-
712
- main = old['main']
713
- config.add_empty_section '.'
714
-
715
- config['.'][:scm] = main[:scm]
716
- config['.'][:type] = main[:type]
717
-
718
- old.subprojects.each do |subproject|
719
- path = subproject.path
720
- config.add_empty_section path
721
- config[path][:repository] = subproject.repository
722
- config[path][:scm] = subproject.scm
723
- config[path][:branch] = subproject.branch if subproject.branch
724
- end
725
-
726
- config.write('.externals')
727
- reload_configuration
728
- end
729
-
730
652
  def version(args, options)
731
653
  puts Externals::VERSION
732
654
  end
@@ -736,16 +658,8 @@ Please use the --type option to tell ext which to use."
736
658
  end
737
659
 
738
660
  def install_project_type name
739
- Externals.module_eval("#{name.classify}ProjectType", __FILE__, __LINE__).install
740
661
  self.path_calculator = Externals.module_eval("#{name.classify}ProjectType::DefaultPathCalculator", __FILE__, __LINE__)
741
662
  end
742
- #
743
- #
744
- # def self.determine_project_type path = "."
745
- # Dir.chdir path do
746
- # raise "not done"
747
- # end
748
- # end
749
663
 
750
664
  protected
751
665
  def do_checkout_or_export repository, path, options, sym
@@ -39,14 +39,19 @@ module Externals
39
39
  end
40
40
 
41
41
  def self.scm
42
- raise "subclass responsibility"
42
+ if self == Project
43
+ raise "subclass responsibility"
44
+ end
43
45
  end
46
+
44
47
  def scm
45
48
  self.class.scm
46
49
  end
50
+
47
51
  def self.default_branch
48
52
  raise "subclass responsibility"
49
53
  end
54
+
50
55
  def default_branch
51
56
  self.class.default_branch
52
57
  end
@@ -177,10 +182,15 @@ module Externals
177
182
 
178
183
 
179
184
  def self.inherited child
180
- #create the <scm_name>_opts_co/ex/st/up and <scm_opts>_opts setting
181
- #such as svn_opts and svn_opts_co from the main project (stored
182
- #in the parrent attribute.)
183
- def child.install_scm_opts_methods
185
+ child.class_eval do
186
+ def self.scm
187
+ @scm ||= /^([^:]*::)*([^:]+)Project$/.match(name)[2].downcase
188
+ end
189
+
190
+ #create the <scm_name>_opts_co/ex/st/up and <scm_opts>_opts setting
191
+ #such as svn_opts and svn_opts_co from the main project (stored
192
+ #in the parrent attribute.)
193
+
184
194
  raise unless scm && scm != ""
185
195
 
186
196
  #first we create global <scm_name>_opts accessors that will apply to all
@@ -225,7 +235,6 @@ module Externals
225
235
  attributes[name.to_sym] = value
226
236
  end
227
237
  end
228
-
229
238
  end
230
239
  end
231
240
 
@@ -1,24 +1,13 @@
1
1
  module Externals
2
2
  module RailsProjectType
3
- def self.install
4
- #obj.send(:extend, Externals::RailsProjectType::Project)
5
- Externals::OldProject.send(:include, Externals::RailsProjectType::Project)
6
- end
7
-
8
3
  class DefaultPathCalculator
9
4
  def default_path name
10
5
  if name
11
- (name == 'rails') ? File.join("vendor","rails") : File.join("vendor","plugins", name)
12
- else
13
- raise "couldn't figure out project name..."
14
- end
15
- end
16
- end
17
-
18
- module Project
19
- def default_path
20
- if name
21
- (name == 'rails') ? File.join("vendor","rails") : File.join("vendor","plugins", name)
6
+ if name == 'rails'
7
+ File.join("vendor","rails")
8
+ else
9
+ File.join("vendor","plugins", name)
10
+ end
22
11
  else
23
12
  raise "couldn't figure out project name..."
24
13
  end
@@ -26,7 +15,6 @@ module Externals
26
15
  end
27
16
  end
28
17
 
29
-
30
18
  class RailsDetector
31
19
  def self.detected?
32
20
  application_path = File.join('config', 'application.rb')
@@ -69,10 +69,10 @@ module Externals
69
69
 
70
70
  def up *args
71
71
  if File.exists? path
72
+ puts "updating #{path}:"
72
73
  if revision
73
74
  change_to_branch_revision "up"
74
75
  else
75
- puts "updating #{path}:"
76
76
  Dir.chdir path do
77
77
  puts `git #{scm_opts_up} pull`
78
78
  end
@@ -98,13 +98,6 @@ module Externals
98
98
  Integer) {sub_options[:scm] = main_options[:scm] = 'git'}
99
99
  end
100
100
 
101
-
102
- def self.scm
103
- "git"
104
- end
105
-
106
- install_scm_opts_methods
107
-
108
101
  def self.detected?
109
102
  File.exists? ".git"
110
103
  end
@@ -50,10 +50,10 @@ module Externals
50
50
 
51
51
  def up *args
52
52
  if File.exists? path
53
+ puts "updating #{path}:"
53
54
  if revision
54
55
  change_to_revision "up"
55
56
  else
56
- puts "updating #{path}:"
57
57
  Dir.chdir path do
58
58
  puts `svn #{scm_opts_up} up .`
59
59
  end
@@ -73,12 +73,12 @@ module Externals
73
73
  def self.scm_path? path
74
74
  return true if path =~ /^svn(\+ssh)?:/
75
75
 
76
- # Look for http(s)://svn.*/*
76
+ # Look for http(s)://svn.*/*
77
77
  if path =~ /^https?:\/\/([\w+\-_]+)\.(?:[\w+\-_]+\.)*[\w\-_]+(?:\/|$)/
78
78
  return true if $1.downcase == "svn"
79
79
  end
80
80
 
81
- # Look for http(s)://*/*svn*/
81
+ # Look for http(s)://*/*svn*/
82
82
  if path =~ /^https?:\/\/(?:[\w+\-_]+\.?)+\/(\w+)/
83
83
  return true if $1.downcase.include? "svn"
84
84
  end
@@ -91,12 +91,6 @@ module Externals
91
91
  Integer) {sub_options[:scm] = main_options[:scm] = 'svn'}
92
92
  end
93
93
 
94
- def self.scm
95
- "svn"
96
- end
97
-
98
- install_scm_opts_methods
99
-
100
94
  def self.detected?
101
95
  File.exists? ".svn"
102
96
  end
@@ -6,6 +6,14 @@ module Externals
6
6
  class TestProjects < TestCase
7
7
  include ExtTestCase
8
8
 
9
+ def test_project_scm
10
+ assert_equal "svn", SvnProject.scm
11
+ assert_equal "git", GitProject.scm
12
+ assert_raise RuntimeError do
13
+ Project.scm
14
+ end
15
+ end
16
+
9
17
  def test_svn_global_opts
10
18
  Dir.chdir File.join(root_dir, 'test') do
11
19
  `rm -rf test_svn_global_opts`
metadata CHANGED
@@ -1,16 +1,21 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ext
3
3
  version: !ruby/object:Gem::Version
4
- prerelease:
5
- version: 1.0.0
4
+ hash: 21
5
+ prerelease: false
6
+ segments:
7
+ - 1
8
+ - 0
9
+ - 1
10
+ version: 1.0.1
6
11
  platform: ruby
7
12
  authors:
8
- - Miles Georgi
13
+ - Miles Georgi
9
14
  autorequire:
10
15
  bindir: bin
11
16
  cert_chain: []
12
17
 
13
- date: 2011-03-29 00:00:00 -07:00
18
+ date: 2011-07-19 00:00:00 -07:00
14
19
  default_executable: ext
15
20
  dependencies: []
16
21
 
@@ -44,43 +49,38 @@ description: |-
44
49
  the main project.
45
50
  email: azimux@gmail.com
46
51
  executables:
47
- - ext
52
+ - ext
48
53
  extensions: []
49
54
 
50
55
  extra_rdoc_files: []
51
56
 
52
57
  files:
53
- - Rakefile
54
- - README
55
- - MIT_LICENSE.txt
56
- - CHANGELOG
57
- - lib/externals/old_project.rb
58
- - lib/externals/command.rb
59
- - lib/externals/project.rb
60
- - lib/externals/test_case.rb
61
- - lib/externals/ext.rb
62
- - lib/externals/project_types/rails.rb
63
- - lib/externals/old_scms/old_git_project.rb
64
- - lib/externals/old_scms/old_svn_project.rb
65
- - lib/externals/extensions/string.rb
66
- - lib/externals/extensions/symbol.rb
67
- - lib/externals/configuration/configuration.rb
68
- - lib/externals/configuration/old_configuration.rb
69
- - lib/externals/scms/git_project.rb
70
- - lib/externals/scms/svn_project.rb
71
- - test/test_rails_detection.rb
72
- - test/test_string_extensions.rb
73
- - test/test_git_project_extract_name.rb
74
- - test/test_version.rb
75
- - test/test_init_git.rb
76
- - test/test_upgrade_externals_file.rb
77
- - test/test_checkout_git.rb
78
- - test/test_checkout_with_subprojects_svn.rb
79
- - test/test_freeze_to_revision.rb
80
- - test/test_checkout_with_subprojects_git.rb
81
- - test/test_touch_emptydirs.rb
82
- - test/test_projects.rb
83
- - bin/ext
58
+ - Rakefile
59
+ - README
60
+ - MIT_LICENSE.txt
61
+ - CHANGELOG
62
+ - lib/externals/command.rb
63
+ - lib/externals/configuration/configuration.rb
64
+ - lib/externals/ext.rb
65
+ - lib/externals/extensions/string.rb
66
+ - lib/externals/extensions/symbol.rb
67
+ - lib/externals/project.rb
68
+ - lib/externals/project_types/rails.rb
69
+ - lib/externals/scms/git_project.rb
70
+ - lib/externals/scms/svn_project.rb
71
+ - lib/externals/test_case.rb
72
+ - test/test_checkout_git.rb
73
+ - test/test_checkout_with_subprojects_git.rb
74
+ - test/test_checkout_with_subprojects_svn.rb
75
+ - test/test_freeze_to_revision.rb
76
+ - test/test_git_project_extract_name.rb
77
+ - test/test_init_git.rb
78
+ - test/test_projects.rb
79
+ - test/test_rails_detection.rb
80
+ - test/test_string_extensions.rb
81
+ - test/test_touch_emptydirs.rb
82
+ - test/test_version.rb
83
+ - bin/ext
84
84
  has_rdoc: true
85
85
  homepage: http://nopugs.com/ext-tutorial
86
86
  licenses: []
@@ -89,36 +89,41 @@ post_install_message:
89
89
  rdoc_options: []
90
90
 
91
91
  require_paths:
92
- - lib
92
+ - lib
93
93
  required_ruby_version: !ruby/object:Gem::Requirement
94
94
  none: false
95
95
  requirements:
96
- - - ">="
97
- - !ruby/object:Gem::Version
98
- version: "0"
96
+ - - ">="
97
+ - !ruby/object:Gem::Version
98
+ hash: 3
99
+ segments:
100
+ - 0
101
+ version: "0"
99
102
  required_rubygems_version: !ruby/object:Gem::Requirement
100
103
  none: false
101
104
  requirements:
102
- - - ">="
103
- - !ruby/object:Gem::Version
104
- version: "0"
105
+ - - ">="
106
+ - !ruby/object:Gem::Version
107
+ hash: 3
108
+ segments:
109
+ - 0
110
+ version: "0"
105
111
  requirements: []
106
112
 
107
113
  rubyforge_project: ext
108
- rubygems_version: 1.5.0
114
+ rubygems_version: 1.3.7
109
115
  signing_key:
110
116
  specification_version: 3
111
117
  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.
112
118
  test_files:
113
- - test/test_rails_detection.rb
114
- - test/test_string_extensions.rb
115
- - test/test_git_project_extract_name.rb
116
- - test/test_version.rb
117
- - test/test_init_git.rb
118
- - test/test_upgrade_externals_file.rb
119
- - test/test_checkout_git.rb
120
- - test/test_checkout_with_subprojects_svn.rb
121
- - test/test_freeze_to_revision.rb
122
- - test/test_checkout_with_subprojects_git.rb
123
- - test/test_touch_emptydirs.rb
124
- - test/test_projects.rb
119
+ - test/test_checkout_git.rb
120
+ - test/test_checkout_with_subprojects_git.rb
121
+ - test/test_checkout_with_subprojects_svn.rb
122
+ - test/test_freeze_to_revision.rb
123
+ - test/test_git_project_extract_name.rb
124
+ - test/test_init_git.rb
125
+ - test/test_projects.rb
126
+ - test/test_rails_detection.rb
127
+ - test/test_string_extensions.rb
128
+ - test/test_touch_emptydirs.rb
129
+ - test/test_version.rb
@@ -1,167 +0,0 @@
1
- module Externals
2
- module OldConfiguration
3
- SECTION_TITLE_REGEX = /^\s*\[(\w+)\]\s*$/
4
- SECTION_TITLE_REGEX_NO_GROUPS = /^\s*\[(?:\w+)\]\s*$/
5
-
6
-
7
- class Section
8
- attr_accessor :title_string, :body_string, :title, :rows, :scm
9
-
10
- def main?
11
- title == 'main'
12
- end
13
-
14
- def initialize title_string, body_string, scm = nil
15
- self.title_string = title_string
16
- self.body_string = body_string
17
- self.scm = scm
18
-
19
- self.title = SECTION_TITLE_REGEX.match(title_string)[1]
20
-
21
- self.scm ||= self.title
22
-
23
- raise "Invalid section title: #{title_string}" unless title
24
-
25
- self.rows = body_string.split(/\n/)
26
- end
27
-
28
- def setting key
29
- if !main?
30
- raise "this isn't a section of the configuration that can contain settings"
31
- end
32
-
33
- rows.each do |row|
34
- if row =~ /\s*(\w+)\s*=\s*([^#\n]*)(?:#[^\n])?$/ && key.to_s == $1
35
- return $2.strip
36
- end
37
- end
38
- nil
39
- end
40
-
41
- def [] key
42
- setting(key)
43
- end
44
-
45
-
46
- def projects
47
- return @projects if @projects
48
-
49
- @projects = []
50
-
51
- if main?
52
- @projects = [Ext.old_project_class(self['scm']).new(".", :is_main)]
53
- else
54
- rows.each do |row|
55
- if Project.project_line?(row)
56
- @projects << Ext.old_project_class(title).new(row)
57
- end
58
- end
59
- @projects
60
- end
61
- end
62
-
63
- def add_row(row)
64
- rows << row
65
-
66
- self.body_string = body_string.chomp + "\n#{row}\n"
67
- clear_caches
68
- end
69
-
70
- def clear_caches
71
- @projects = nil
72
- end
73
-
74
- def to_s
75
- "#{title_string}#{body_string}"
76
- end
77
- end
78
-
79
- class Configuration
80
- attr_accessor :file_string
81
-
82
- def sections
83
- @sections ||= []
84
- end
85
-
86
- def [] title
87
- title = title.to_s
88
- sections.detect {|section| section.title == title}
89
- end
90
-
91
- def add_empty_section title
92
- raise "Section already exists" if self[title]
93
- sections << Section.new("\n\n[#{title.to_s}]\n", "")
94
- end
95
-
96
- def self.new_empty
97
- new nil, true
98
- end
99
-
100
- def initialize externals_file = nil, empty = false
101
- if empty
102
- self.file_string = ''
103
- return
104
- end
105
-
106
- if !externals_file && File.exists?('.externals')
107
- open('.externals', 'r') do |f|
108
- externals_file = f.read
109
- end
110
- end
111
-
112
- externals_file ||= ""
113
-
114
- self.file_string = externals_file
115
-
116
- titles = []
117
- externals_file.each_line {|line| titles << line if line =~ SECTION_TITLE_REGEX}
118
- bodies = externals_file.split SECTION_TITLE_REGEX_NO_GROUPS
119
-
120
- if titles.size > 0 && bodies.size > 0
121
- if titles.size + 1 != bodies.size
122
- raise "bodies and sections do not match up"
123
- end
124
-
125
- bodies = bodies[1..(bodies.size - 1)]
126
-
127
- (0...(bodies.size)).each do |index|
128
- sections << Section.new(titles[index], bodies[index])
129
- end
130
- end
131
- end
132
-
133
- def projects
134
- retval = []
135
- sections.each do |section|
136
- retval += section.projects
137
- end
138
-
139
- retval
140
- end
141
-
142
- def subprojects
143
- retval = []
144
- sections.each do |section|
145
- retval += section.projects unless section.main?
146
- end
147
-
148
- retval
149
- end
150
-
151
- def main_project
152
- sections.each do |section|
153
- return section.projects.first if section.main?
154
- end
155
- nil
156
- end
157
-
158
- def write path = ".externals"
159
- open(path, 'w') do |f|
160
- sections.each do |section|
161
- f.write section.to_s
162
- end
163
- end
164
- end
165
- end
166
- end
167
- end
@@ -1,114 +0,0 @@
1
- module Externals
2
- # this regular expression will match a quoted string
3
- # it will allow for " to be escaped with "" within the string
4
- quoted = '(?:"(?:(?:[^"]*(?:"")?)*)")'
5
-
6
- # this regular expression will match strings of text that are not quoted. They must appear at the start of a line or after a ,
7
- # it will also match empty strings like ,,
8
- unquoted = '(?:[^"\\s][^\\s$]*)'
9
-
10
- column = "(#{quoted}|#{unquoted})"
11
- PROJECT_LINE_REGEX = Regexp.new("^\\s*#{column}(?:\\s+#{column})?\\s*$")
12
-
13
- class OldProject
14
- attr_accessor :branch, :repository, :path
15
- attr_writer :is_main, :name
16
-
17
- def name
18
- @name ||= (extract_name(repository))
19
- end
20
-
21
- def main?
22
- @is_main
23
- end
24
-
25
- def self.scm
26
- raise "subclass responsibility"
27
- end
28
-
29
-
30
- def scm
31
- self.class.scm
32
- end
33
-
34
-
35
- def initialize row_string, is_main = false
36
- #raise "Abstract class" if self.class == Project
37
-
38
- #It's the main project
39
- self.is_main = is_main || row_string == "."
40
-
41
- if row_string =~ PROJECT_LINE_REGEX
42
- repbranch = trim_quotes($1)
43
- self.path = trim_quotes($2)
44
-
45
- repbranch = repbranch.strip if repbranch
46
-
47
- if repbranch =~ /^([^\n]*):(\w+)$/
48
- self.repository = $1
49
- self.branch = $2
50
- else
51
- self.repository = repbranch
52
- end
53
-
54
- self.path = self.path.strip if self.path
55
- else
56
- raise "poorly formatted .externals entry: #{row_string}"
57
- end
58
- end
59
-
60
- [:co, :ex].each do |method_name|
61
- define_method method_name do |args|
62
- raise "subclass responsibility"
63
- end
64
- end
65
-
66
- def update_ignore path
67
- if !ignore_contains?(path)
68
- append_ignore path
69
- end
70
- end
71
-
72
- def checkout *args
73
- co(*args)
74
- end
75
-
76
- def export *args
77
- ex(*args)
78
- end
79
-
80
- def extract_name repository
81
- if repository =~ /\/([\w_-]+)(?:\.git)?$/
82
- $1
83
- end
84
- end
85
-
86
- def path
87
- @path || default_path
88
- end
89
-
90
- def parent_path
91
- File.dirname path
92
- end
93
-
94
- def self.project_line? line
95
- #Make sure it's not a comment
96
- return false if line =~ /^\s*#/
97
-
98
- line =~ PROJECT_LINE_REGEX
99
- end
100
-
101
-
102
-
103
- protected
104
- def trim_quotes value
105
- if value
106
- if [value[0].chr, value[-1].chr] == ['"', '"']
107
- value[1..-2]
108
- else
109
- value
110
- end
111
- end
112
- end
113
- end
114
- end
@@ -1,116 +0,0 @@
1
- module Externals
2
- class OldGitProject < OldProject
3
- def co *args
4
- puts "path is #{path} repository is #{repository}"
5
- if path != '.'
6
- (rmdircmd = "rmdir #{path}")
7
- `#{rmdircmd}` if File.exists?(path)
8
- end
9
-
10
- dest = path
11
- dest = '' if dest == '.'
12
- dest = "\"#{dest}\"" if dest && !dest.empty?
13
-
14
- puts(gitclonecmd = "git clone \"#{repository}\" #{dest}")
15
- puts `#{gitclonecmd}`
16
- if branch
17
- Dir.chdir path do
18
- puts `git checkout --track -b #{branch} origin/#{branch}`
19
- end
20
- end
21
- end
22
-
23
- def ex *args
24
- if path != '.'
25
- (rmdircmd = "rmdir #{path}")
26
- `#{rmdircmd}` if File.exists? path
27
- end
28
-
29
- dest = path
30
-
31
- dest = '' if dest == '.'
32
-
33
- dest = "\"#{dest}\"" if dest && !dest.empty?
34
-
35
- puts(gitclonecmd = "git clone --depth 1 \"#{repository}\" #{dest}")
36
-
37
- puts `#{gitclonecmd}`
38
- if branch
39
- puts `cd #{path}; git checkout --track -b #{branch} origin/#{branch}`
40
- end
41
- end
42
-
43
- def up *args
44
- puts "updating #{path}:"
45
- Dir.chdir path do
46
- puts `git pull`
47
- end
48
- end
49
-
50
- def st *args
51
- puts "\nstatus for #{path}:"
52
- Dir.chdir path do
53
- puts `git status`
54
- end
55
- end
56
-
57
- def self.scm_path? path
58
- path =~ /^git:/ || path =~ /.git$/
59
- end
60
-
61
- def self.fill_in_opts opts, main_options, sub_options
62
- opts.on("--git", "-g", "same as '--scm git' Uses git to checkout/export the main project",
63
- Integer) {sub_options[:scm] = main_options[:scm] = 'git'}
64
- end
65
-
66
-
67
- def self.scm
68
- "git"
69
- end
70
-
71
- def self.detected?
72
- File.exists? ".git"
73
- end
74
-
75
- def self.add_all
76
- puts `git add .`
77
- end
78
-
79
-
80
- protected
81
- def ignore_contains? path
82
- text = ignore_text
83
- text.split(/\n/).detect {|r| r.strip == path.strip}
84
- end
85
-
86
- def ignore_text
87
- return '' unless File.exists? '.gitignore'
88
- retval = ''
89
- open('.gitignore') do |f|
90
- retval = f.read
91
- end
92
- retval
93
- end
94
-
95
- def append_ignore path
96
- rows = ignore_text || ''
97
- return if rows.index path.strip
98
-
99
- rows = rows.split(/\n/)
100
- rows << path.strip
101
-
102
- rows.delete_if {|row| row =~ /^\s*$/}
103
-
104
-
105
- open('.gitignore', 'w') do |f|
106
- f.write "#{rows.compact.join("\n")}\n"
107
- end
108
- end
109
-
110
- def extract_name s
111
- if s =~ /\/([\w_-]+)(?:\.git)?$/
112
- $1
113
- end
114
- end
115
- end
116
- end
@@ -1,98 +0,0 @@
1
- module Externals
2
- class OldSvnProject < OldProject
3
- def co *args
4
- (rmdircmd = "rmdir #{path}")
5
-
6
- `#{rmdircmd}` if File.exists? path
7
- puts(svncocmd = "svn co #{repository} #{path}")
8
- puts `#{svncocmd}`
9
- end
10
-
11
- def ex *args
12
- (rmdircmd = "rmdir #{path}")
13
-
14
- `#{rmdircmd}` if File.exists? path
15
- puts(svncocmd = "svn export #{repository} #{path}")
16
- puts `#{svncocmd}`
17
- end
18
-
19
- def up *args
20
- puts "updating #{path}:"
21
- Dir.chdir path do
22
- puts `svn up .`
23
- end
24
- end
25
-
26
- def st *args
27
- puts "\nstatus for #{path}:"
28
- Dir.chdir path do
29
- puts `svn status`
30
- end
31
- end
32
-
33
- def self.scm_path? path
34
- return true if path =~ /^svn(\+ssh)?:/
35
- if path =~ /^https?:\/\/([\w+\-_]+)\.(?:[\w+\-_]+\.)*[\w\-_]+(?:\/|$)/
36
- return true if $1.downcase == "svn"
37
-
38
- if path =~ /^https?:\/\/(?:[\w_\-]+\.)*[\w\-_]+\/(\w+)\//
39
- return true if $1.downcase == "svn"
40
- end
41
- end
42
-
43
- false
44
- end
45
-
46
- def self.fill_in_opts opts, main_options, sub_options
47
- opts.on("--svn", "--subversion","-s", "same as '--scm svn' Uses subversion to checkout/export the main project",
48
- Integer) {sub_options[:scm] = main_options[:scm] = 'svn'}
49
- end
50
-
51
- def self.scm
52
- "svn"
53
- end
54
-
55
- def self.detected?
56
- File.exists? ".svn"
57
- end
58
-
59
- def self.add_all
60
- status = `svn st`
61
-
62
- status.split("\n").grep(/^\?/).each do |to_add|
63
- puts `svn add #{to_add.gsub(/^\?\s*/,"")}`
64
- end
65
- end
66
-
67
-
68
- protected
69
- def ignore_contains? path
70
- ignore_text(path) =~ Regexp.new("^\\s*#{File.basename(path)}\\s*$")
71
- end
72
-
73
- def append_ignore path
74
- parent = File.dirname(path)
75
- child = File.basename(path)
76
-
77
- rows = ignore_text(path).split(/\n/)
78
-
79
- return if rows.detect {|row| row.strip == child.strip}
80
-
81
- rows << child.strip
82
-
83
- rows.delete_if {|row| row =~ /^\s*$/}
84
-
85
- Dir.chdir(parent) do
86
- puts `svn propset svn:ignore "#{rows.compact.join("\n")}\n" .`
87
- end
88
- end
89
-
90
- def ignore_text(path)
91
- ignore_text = ''
92
- Dir.chdir File.dirname(path) do
93
- puts(ignore_text = `svn propget svn:ignore`)
94
- end
95
- ignore_text
96
- end
97
- end
98
- end
@@ -1,86 +0,0 @@
1
- $:.unshift File.join(File.dirname(__FILE__), '..', 'lib') if $0 == __FILE__
2
- require 'externals/test_case'
3
- require 'externals/ext'
4
-
5
- module Externals
6
- class TestUpgradeExternalsFile < TestCase
7
- include ExtTestCase
8
-
9
- def test_upgrade
10
- Dir.chdir File.join(root_dir, 'test') do
11
- `rm -rf test_upgrade`
12
- `mkdir test_upgrade`
13
-
14
-
15
- Dir.chdir 'test_upgrade' do
16
- open '.externals', 'w' do |f|
17
- f.write "[main]
18
-
19
- scm = git
20
- type = rails
21
- [git]
22
-
23
- git://github.com/rails/rails.git
24
- git://github.com/rails/acts_as_list.git:edge
25
- [svn]
26
-
27
- svn://rubyforge.org/var/svn/redhillonrails/trunk/vendor/plugins/foreign_key_migrations
28
- svn://rubyforge.org/var/svn/redhillonrails/trunk/vendor/plugins/redhillonrails_core"
29
- end
30
-
31
- assert Ext.externals_file_obsolete?
32
-
33
- Ext.run "upgrade_externals_file"
34
- assert !Ext.externals_file_obsolete?
35
-
36
- new_text = nil
37
- open '.externals', 'r' do |f|
38
- new_text = f.read
39
- end
40
- puts new_text
41
-
42
- config1 = Configuration::Configuration.new(new_text)
43
-
44
- config2 = Configuration::Configuration.new("[.]
45
- scm = git
46
- type = rails
47
-
48
- [vendor/rails]
49
- scm = git
50
- repository = git://github.com/rails/rails.git
51
-
52
- [vendor/plugins/acts_as_list]
53
- scm = git
54
- repository = git://github.com/rails/acts_as_list.git
55
- branch = edge
56
-
57
- [vendor/plugins/foreign_key_migrations]
58
- scm = svn
59
- repository = svn://rubyforge.org/var/svn/redhillonrails/trunk/vendor/plugins/foreign_key_migrations
60
-
61
- [vendor/plugins/redhillonrails_core]
62
- scm = svn
63
- repository = svn://rubyforge.org/var/svn/redhillonrails/trunk/vendor/plugins/redhillonrails_core")
64
-
65
-
66
- assert(config1.sections.size == 5)
67
-
68
- [[config1, config2], [config2,config1]].each do |array|
69
- c1 = array[0]
70
- c2 = array[1]
71
-
72
- c1.sections.each do |section|
73
- s2 = c2[section.title]
74
- assert s2
75
- section.attributes.each_pair do |key,value|
76
- assert s2[key] == value
77
- end
78
- end
79
- end
80
- end
81
-
82
- `rm -rf test_upgrade`
83
- end
84
- end
85
- end
86
- end