overapp 0.3.1 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (70) hide show
  1. checksums.yaml +8 -8
  2. data/Gemfile +1 -1
  3. data/Gemfile.lock +2 -2
  4. data/VERSION +1 -1
  5. data/lib/overapp/files.rb +11 -47
  6. data/lib/overapp/from_command.rb +1 -11
  7. data/lib/overapp/load/base.rb +20 -0
  8. data/lib/overapp/load/factory.rb +19 -0
  9. data/lib/overapp/load/instance.rb +35 -0
  10. data/lib/overapp/load/types/command.rb +19 -0
  11. data/lib/overapp/load/types/empty.rb +9 -0
  12. data/lib/overapp/load/types/local_dir.rb +15 -0
  13. data/lib/overapp/load/types/project.rb +12 -0
  14. data/lib/overapp/load/types/raw_dir.rb +22 -0
  15. data/lib/overapp/load/types/repo.rb +13 -0
  16. data/lib/overapp/project/config.rb +28 -0
  17. data/lib/overapp/project/config_entry.rb +6 -0
  18. data/lib/overapp/project/write.rb +21 -0
  19. data/lib/overapp/project.rb +27 -85
  20. data/lib/overapp/util/cmd.rb +7 -0
  21. data/lib/overapp/util/dir.rb +23 -0
  22. data/lib/overapp/util/git.rb +25 -0
  23. data/lib/overapp/util/tmp_dir.rb +32 -0
  24. data/lib/overapp/util/write.rb +9 -0
  25. data/lib/overapp.rb +23 -27
  26. data/overapp.gemspec +60 -6
  27. data/spec/from_command_spec.rb +19 -7
  28. data/spec/input/rails_post_overlay/.overapp +1 -0
  29. data/spec/input/rails_post_overlay/app/models/post.rb +2 -0
  30. data/spec/input/rails_widget_overlay/.overapp +1 -0
  31. data/spec/input/rails_widget_overlay/app/models/widget.rb +2 -0
  32. data/spec/input/repo/.abc +1 -0
  33. data/spec/input/repo/README.md +1 -0
  34. data/spec/input/repo/b.txt +4 -0
  35. data/spec/input/repo/git_dir/COMMIT_EDITMSG +1 -0
  36. data/spec/input/repo/git_dir/HEAD +1 -0
  37. data/{lib/overapp/thor_file.rb → spec/input/repo/git_dir/MERGE_RR} +0 -0
  38. data/spec/input/repo/git_dir/config +7 -0
  39. data/spec/input/repo/git_dir/description +1 -0
  40. data/spec/input/repo/git_dir/hooks/applypatch-msg.sample +15 -0
  41. data/spec/input/repo/git_dir/hooks/commit-msg.sample +24 -0
  42. data/spec/input/repo/git_dir/hooks/post-update.sample +8 -0
  43. data/spec/input/repo/git_dir/hooks/pre-applypatch.sample +14 -0
  44. data/spec/input/repo/git_dir/hooks/pre-commit.sample +50 -0
  45. data/spec/input/repo/git_dir/hooks/pre-push.sample +53 -0
  46. data/spec/input/repo/git_dir/hooks/pre-rebase.sample +169 -0
  47. data/spec/input/repo/git_dir/hooks/prepare-commit-msg.sample +36 -0
  48. data/spec/input/repo/git_dir/hooks/update.sample +128 -0
  49. data/spec/input/repo/git_dir/index +0 -0
  50. data/spec/input/repo/git_dir/info/exclude +6 -0
  51. data/spec/input/repo/git_dir/logs/HEAD +3 -0
  52. data/spec/input/repo/git_dir/logs/refs/heads/master +3 -0
  53. data/spec/input/repo/git_dir/objects/0f/0920d9d41f24629586ec1c20d2283d7df3a950 +0 -0
  54. data/spec/input/repo/git_dir/objects/16/b5741fe01104ea0bdf50603b4c5d42ae5dcbc1 +2 -0
  55. data/spec/input/repo/git_dir/objects/20/508dfdb202a80e2c533f259a526205448b0152 +0 -0
  56. data/spec/input/repo/git_dir/objects/59/c5d2b4bc66e952a99b3b18a89cbc1e6704ffa0 +0 -0
  57. data/spec/input/repo/git_dir/objects/7b/1c8984cafd98a5b369ef325a85cb80e3985148 +2 -0
  58. data/spec/input/repo/git_dir/objects/bf/9307f21baa545173db65a417026088a033aa91 +2 -0
  59. data/spec/input/repo/git_dir/objects/d6/8dd4031d2ad5b7a3829ad7df6635e27a7daa22 +0 -0
  60. data/spec/input/repo/git_dir/objects/d6/cd9e553ef95332f3b77f70d11d0106ca06071c +0 -0
  61. data/spec/input/repo/git_dir/objects/f8/4c814d15674489c0b41035eb4243ccce522511 +0 -0
  62. data/spec/input/repo/git_dir/refs/heads/master +1 -0
  63. data/spec/input/top/.overlay +1 -1
  64. data/spec/nesting_spec.rb +44 -0
  65. data/spec/project_note_spec.rb +19 -13
  66. data/spec/spec_helper.rb +36 -1
  67. data/spec/support/output_dir.rb +6 -9
  68. data/spec/support/tmp_dir.rb +11 -0
  69. data/tmp/.gitkeep +0 -0
  70. metadata +59 -5
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- YTE3YjQ3MTdlYmU0OTBiN2YzY2I2NGM0YTViYjQ3Njc2MDc2NjUzMg==
4
+ NzYzNmI4Y2M5OWRmYTE0M2E4OGM5MzZlZWQwODE5NGQ0ZjFkMTg5Zg==
5
5
  data.tar.gz: !binary |-
6
- M2JkZDVkNmM3ODVmNzIzODc2MGI0YmRlODAwODU1YzFjOWRjNDVmMg==
6
+ NmZiN2JkMmJhNmZhNjc0ZjllZGEzZmJiMDY3OGY3OGQ1OTFiMmMwMA==
7
7
  !binary "U0hBNTEy":
8
8
  metadata.gz: !binary |-
9
- ZTM5NDliOTc3MjBhOGMwZDM5N2RiOTliOTNmZDM0Njg5ZTY3NzJiMmRiYjk4
10
- ZGNjZTQ1MGVlMzc1YmE2M2FhYWVkZTUzZWFhYjUyYTgwNzZlYTU3NjUxMWZh
11
- MjcyZDNkZDk0MTI5ZDkzNjIxNmU1MTdlYjdiNzhlYWE5MmU0OTA=
9
+ NmMxNDFjZTVmMWM5YjY0MWQzZGQ5NzQ0YjBiZTYwZTE2YTk1ODI5NTI3NmZl
10
+ NTQ2ZmVlNjczZDI4OGUwMTBjMmI0ZjAzMWMwMTQzZGVjNDU1NzY2ZmFmNWM0
11
+ Yzg0NDM4NTk1NzIwZGFkZjEwYTQ3M2ViZmEzOWQ1N2UyNzUxMWE=
12
12
  data.tar.gz: !binary |-
13
- MDA2MDNhNDUwZjkxNTc1YjVkNGVjMmQ0MTllZDYwNWJhNjhlNmQzYTljZjcz
14
- ODNkMjkxMzUxYTU3YzY0NzUwOWM4YzlkZjczMWZmNTcyNWEwYWQyMjdkNWU3
15
- MTU2YmUwMDNlNDQzNDU0M2ZmYjYzZDU0MDk1NzUxMWNmMWVlNzc=
13
+ NTA1YzNjMzc1NTk0Mjc2NDM2MjJmNzBlMjUzMmRlZDA3YzE3ZTg2NzY5NjU4
14
+ NThhYTQ3NWVlMGRjMWIxZGU0YmVjZGYwOWIxZjM3ZDc4YjVmYzJiNDY0NDZk
15
+ ZGU4OGVjNDA1YzIxY2I2YzRhNmUyODk5ZDJiZTM5MTUzYTQwNTU=
data/Gemfile CHANGED
@@ -21,7 +21,7 @@ group :development do
21
21
  gem 'lre'
22
22
  end
23
23
 
24
- gem 'mharris_ext'
24
+ gem 'mharris_ext',">= 1.7.1"
25
25
  #gem "rchoice", :path => "/users/mharris717/gems/rchoice-0.2.0"
26
26
  #gem 'rchoice','0.2.0'
27
27
  #gem 'rchoice', :git => "git@github.com:mharris717/rchoice.git", :branch => "gemdir"
data/Gemfile.lock CHANGED
@@ -61,7 +61,7 @@ GEM
61
61
  watchr
62
62
  lumberjack (1.0.4)
63
63
  method_source (0.8.2)
64
- mharris_ext (1.7.0)
64
+ mharris_ext (1.7.1)
65
65
  facets
66
66
  fattr
67
67
  multi_json (1.8.2)
@@ -115,7 +115,7 @@ DEPENDENCIES
115
115
  guard-spork
116
116
  jeweler (~> 1.8.4)
117
117
  lre
118
- mharris_ext
118
+ mharris_ext (>= 1.7.1)
119
119
  rb-fsevent (~> 0.9)
120
120
  rdoc (~> 3.12)
121
121
  rspec (~> 2.8.0)
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.3.1
1
+ 0.4.0
data/lib/overapp/files.rb CHANGED
@@ -1,4 +1,13 @@
1
1
  module Overapp
2
+ class MissingBaseFileError < RuntimeError
3
+ include FromHash
4
+ attr_accessor :top_file, :base
5
+ def message
6
+ res = "Cannot overlay onto missing file #{top_file.path}\nBase File Count: #{base.files.size}\n"
7
+ res += base.map { |x| x.path }.join("\n")
8
+ res
9
+ end
10
+ end
2
11
  class Files
3
12
  include FromHash
4
13
  include Enumerable
@@ -19,7 +28,7 @@ module Overapp
19
28
  new_file = top_file.combined(existing)
20
29
  res << new_file if new_file
21
30
  elsif top_file.has_note?
22
- raise "cannot overlay onto missing file #{top_file.path}"
31
+ raise MissingBaseFileError.new(:top_file => top_file, :base => self)
23
32
  else
24
33
  res << top_file
25
34
  end
@@ -34,58 +43,13 @@ module Overapp
34
43
  each do |f|
35
44
  f.write_to! dir
36
45
  end
46
+ self
37
47
  end
38
48
 
39
49
  class << self
40
- def dir_files(dir)
41
- res = Dir["#{dir}/**/*"] + Dir["#{dir}/**/.*"]
42
- res - [".","..",".git"]
43
- end
44
- def load_dir(dir,ops={})
45
- raise "Bad dir" unless dir.present?
46
- raise "Dir not there #{dir}" unless FileTest.exist?(dir)
47
- res = new
48
- res.file_class = ops[:file_class] if ops[:file_class]
49
- dir_files(dir).each do |full_file|
50
- if FileTest.file?(full_file)
51
- f = full_file.gsub("#{dir}/","")
52
- raise "bad #{f}" if f == full_file
53
- res.add :file => f, :body => File.read(full_file)
54
- end
55
- end
56
- res
57
- end
58
-
59
50
  def load_command(cmd,ops)
60
51
  FromCommand.new(:command => cmd, :path => ops[:path]||".").files
61
52
  end
62
-
63
- def load(descriptor, ops={})
64
- raise "bad #{descriptor}" if descriptor.blank?
65
- if ops[:type] == :command
66
- load_command(descriptor,ops)
67
- elsif descriptor =~ /\.git/ || descriptor =~ /file:\/\//
68
- load_repo(descriptor)
69
- else
70
- load_dir(descriptor,ops)
71
- end
72
- end
73
-
74
- def write_combined(base_dir, top_dir, output_dir)
75
- base = load(base_dir)
76
- top = load(top_dir)
77
- combined = base.apply(top)
78
- combined.write_to! output_dir
79
- end
80
-
81
- def load_repo(url)
82
- url = url.gsub "ROOT_DIR", File.expand_path(File.dirname(__FILE__) + "/../..")
83
- dir = "/tmp/#{rand(1000000000000000000)}"
84
- ec "git clone #{url} #{dir} 2>&1", :silent => true
85
- load dir
86
- ensure
87
- ec "rm -rf #{dir}", :silent => true
88
- end
89
53
  end
90
54
  end
91
55
  end
@@ -3,18 +3,8 @@ module Overapp
3
3
  include FromHash
4
4
  attr_accessor :command, :path
5
5
 
6
- def with_tmp_dir
7
- dir = "/tmp/#{rand(1000000000000000000)}"
8
- `mkdir #{dir}`
9
- Dir.chdir(dir) do
10
- yield dir
11
- end
12
- ensure
13
- ec "rm -rf #{dir}", :silent => true
14
- end
15
-
16
6
  fattr(:files) do
17
- with_tmp_dir do |dir|
7
+ Overapp.with_tmp_dir do |dir|
18
8
  Overapp.ec command, :silent => true
19
9
  Files.load [dir,path].select { |x| x.present? }.join("/"), :file_class => BasicFile
20
10
  end
@@ -0,0 +1,20 @@
1
+ module Overapp
2
+ module Load
3
+ class Base
4
+ include FromHash
5
+ attr_accessor :descriptor
6
+
7
+ def apply_to(base,ops)
8
+ base.apply(load(base,ops))
9
+ end
10
+
11
+ def commit_message
12
+ "Message Pending"
13
+ end
14
+
15
+ def load(*args)
16
+ raise "load unimplemented"
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,19 @@
1
+ module Overapp
2
+ module Load
3
+ class Factory
4
+ include FromHash
5
+ attr_accessor :descriptor, :type, :entry_ops
6
+
7
+ def loader
8
+ raise "bad #{descriptor}" if descriptor.blank?
9
+ if type.to_s.to_sym == :command
10
+ Command.new(:descriptor => descriptor).tap { |x| x.relative_output_path = entry_ops[:path] if entry_ops[:path].present? }
11
+ elsif Git.repo?(descriptor)
12
+ Repo.new(:descriptor => descriptor)
13
+ else
14
+ LocalDir.new(:descriptor => descriptor)
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,35 @@
1
+ module Overapp
2
+ module Load
3
+ class Instance
4
+ include FromHash
5
+ attr_accessor :path, :overlays
6
+
7
+ fattr(:starting_files) do
8
+ raise "path doesn't exist #{path}" unless FileTest.exist?(path)
9
+ if Overapp.dir_files(path).empty?
10
+ Overapp::Files.new
11
+ else
12
+ RawDir.new(:descriptor => path).load(nil,{})
13
+ end
14
+ end
15
+
16
+ fattr(:combined_files) do
17
+ files = starting_files
18
+
19
+ overlays.each do |overlay|
20
+ files = apply_overlay(files,overlay)
21
+ end
22
+
23
+ files
24
+ end
25
+
26
+ def apply_overlay(base,overlay)
27
+ Overapp::Git.commit(path,overlay.commit_message) do
28
+ overlay.apply_to(base, :path => path).tap do |res|
29
+ res.write_to! path
30
+ end
31
+ end.tap { |res| raise "nil return" unless res }
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,19 @@
1
+ module Overapp
2
+ module Load
3
+ class Command < Base
4
+ attr_accessor :relative_output_path
5
+ def command; descriptor; end
6
+ def load(base,ops={})
7
+ if relative_output_path.present?
8
+ TmpDir.with do |dir|
9
+ Overapp.ec "cd #{dir} && #{command}", :silent => true
10
+ RawDir.new(:descriptor => "#{dir}/#{relative_output_path}").load(base,ops)
11
+ end
12
+ else
13
+ Overapp.ec "cd #{ops[:path]} && #{command}", :silent => true
14
+ RawDir.new(:descriptor => ops[:path]).load(base,ops)
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,9 @@
1
+ module Overapp
2
+ module Load
3
+ class Empty
4
+ def load(base,ops)
5
+ Overapp::Files.new
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,15 @@
1
+ module Overapp
2
+ module Load
3
+ class LocalDir < Base
4
+ def path; Overapp.to_proper_dir(descriptor); end
5
+
6
+ def load(base,ops)
7
+ if Overapp::Project.project? path
8
+ Project.new(:descriptor => path).load(base,ops)
9
+ else
10
+ RawDir.new(:descriptor => path).load(base,ops)
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,12 @@
1
+ module Overapp
2
+ module Load
3
+ class Project < Base
4
+ def path; descriptor; end
5
+ def load(base,ops={})
6
+ project = Overapp::Project.new(:path => path)
7
+ project.write_to! ops[:path]
8
+ RawDir.new(:descriptor => ops[:path]).load(base,ops)
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,22 @@
1
+ module Overapp
2
+ module Load
3
+ class RawDir < Base
4
+ def dir; Overapp.to_proper_dir(descriptor); end
5
+ def load(base,ops)
6
+ ops = {}
7
+ raise "Bad dir" unless dir.present?
8
+ raise "Dir not there #{dir}" unless FileTest.exist?(dir)
9
+ res = Files.new
10
+ res.file_class = ops[:file_class] if ops[:file_class]
11
+ Overapp.dir_files(dir).each do |full_file|
12
+ if FileTest.file?(full_file)
13
+ f = full_file.gsub("#{dir}/","")
14
+ raise "bad #{f}" if f == full_file
15
+ res.add :file => f, :body => File.read(full_file)
16
+ end
17
+ end
18
+ res
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,13 @@
1
+ module Overapp
2
+ module Load
3
+ class Repo < Base
4
+ def url; descriptor; end
5
+
6
+ def load(base,ops)
7
+ TmpDir.with_repo_path(url) do |dir|
8
+ LocalDir.new(:descriptor => dir).load(base,ops)
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,28 @@
1
+ module Overapp
2
+ class ProjectConfig
3
+ include FromHash
4
+ attr_accessor :body, :base_ops
5
+ fattr(:overapps) { [] }
6
+
7
+ def base(*args)
8
+ overapp(*args)
9
+ end
10
+
11
+ def overapp(name)
12
+ self.overapps << ConfigEntry.new(:descriptor => name, :type => :overapp)
13
+ end
14
+
15
+ def overlay(name)
16
+ overapp(name)
17
+ end
18
+
19
+ def command(cmd,ops={})
20
+ self.overapps << ConfigEntry.new(:descriptor => cmd, :type => :command, :entry_ops => ops)
21
+ end
22
+
23
+ def load!
24
+ c = self
25
+ eval(body)
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,6 @@
1
+ module Overapp
2
+ class ConfigEntry
3
+ include FromHash
4
+ attr_accessor :descriptor, :type, :entry_ops
5
+ end
6
+ end
@@ -0,0 +1,21 @@
1
+ module Overapp
2
+ class Project
3
+ class Write
4
+ include FromHash
5
+ attr_accessor :output_path, :project
6
+
7
+ fattr(:instance) do
8
+ Load::Instance.new(:path => output_path, :overlays => project.overapps)
9
+ end
10
+
11
+ def combined_files
12
+ instance.combined_files
13
+ end
14
+
15
+ def write!
16
+ raise "no combined files" unless combined_files
17
+ combined_files.write_to!(output_path)
18
+ end
19
+ end
20
+ end
21
+ end
@@ -3,15 +3,22 @@ module Overapp
3
3
  include FromHash
4
4
  attr_accessor :path
5
5
 
6
+ class << self
7
+ def project_files
8
+ %w(.fstemplate .overapp .overlay)
9
+ end
10
+
11
+ def project?(path)
12
+ !!project_files.map { |x| "#{path}/#{x}" }.find { |x| FileTest.exist?(x) }
13
+ end
14
+ end
15
+
6
16
  def config_body
7
- if FileTest.exist?("#{path}/.fstemplate")
8
- File.read("#{path}/.fstemplate")
9
- elsif FileTest.exist?("#{path}/.overapp")
10
- File.read("#{path}/.overapp")
11
- elsif FileTest.exist?("#{path}/.overlay")
12
- File.read("#{path}/.overlay")
17
+ file = klass.project_files.map { |x| "#{path}/#{x}" }.find { |x| FileTest.exist?(x) }
18
+ if file
19
+ File.read(file)
13
20
  else
14
- raise "no config"
21
+ raise "no config found in #{path}"
15
22
  end
16
23
  end
17
24
 
@@ -22,92 +29,27 @@ module Overapp
22
29
  res
23
30
  end
24
31
 
25
- def overapp_paths
26
- config.overapps + [path]
27
- end
28
-
29
- def commands(phase)
30
- config.commands.select { |x| x[:phase] == phase }.map { |x| x[:command] }
31
- end
32
-
33
- fattr(:overapps) do
34
- overapp_paths.map { |x| Files.load(x) }
32
+ def overapp_entries
33
+ config.overapps + [ConfigEntry.new(:descriptor => path)]
35
34
  end
36
35
 
37
- fattr(:base_files) do
38
- if config.base
39
- Files.load(config.base,config.base_ops)
40
- else
41
- nil
36
+ def overapps
37
+ overapp_entries.map do |entry|
38
+ if path == entry.descriptor
39
+ Load::RawDir.new(:descriptor => path)
40
+ else
41
+ Load::Factory.new(:descriptor => entry.descriptor, :type => entry.type, :entry_ops => entry.entry_ops).loader
42
+ end
42
43
  end
43
44
  end
44
45
 
45
- fattr(:combined_files) do
46
- res = base_files
47
- overapps.each do |overapp|
48
- res = res.apply(overapp)
49
- end
50
- res
51
- end
52
-
53
- def git_commit(output_path,message,init=false)
54
- if init
55
- `rm -rf #{output_path}/.git`
56
- ec "cd #{output_path} && git init && git config user.email johnsmith@fake.com && git config user.name 'John Smith'", :silent => true
57
- end
58
- ec "cd #{output_path} && git add . && git commit -m '#{message}'", :silent => true
59
- end
60
-
61
-
62
46
  def write_to!(output_path)
63
- commands(:before).each do |cmd|
64
- Overapp.ec "cd #{output_path} && #{cmd}", :silent => true
65
- git_commit output_path, "Ran Command: #{cmd}"
66
- end
67
-
68
- base_files.write_to! output_path
69
-
70
- git_commit output_path, "Base Files #{config.base}", true
71
- combined_files.write_to!(output_path)
72
- git_commit output_path, "Overapp Files #{path}"
73
-
74
- commands(:after).each do |cmd|
75
- Overapp.ec "cd #{output_path} && #{cmd}", :silent => true
76
- git_commit output_path, "Ran Command: #{cmd}"
77
- end
78
- end
79
- end
80
-
81
- class ProjectConfig
82
- include FromHash
83
- attr_accessor :body, :base, :base_ops
84
- fattr(:overapps) { [] }
85
- fattr(:commands) { [] }
86
-
87
- def base(*args)
88
- if args.empty?
89
- @base
90
- else
91
- @base = args.first
92
- @base_ops = args[1] || {}
93
- end
94
- end
95
-
96
- def overapp(name)
97
- self.overapps << name
98
- end
99
-
100
- def overlay(name)
101
- overapp(name)
102
- end
103
-
104
- def command(cmd,phase=:after)
105
- self.commands << {:command => cmd, :phase => phase}
47
+ Write.new(:output_path => output_path, :project => self).write!
106
48
  end
107
49
 
108
- def load!
109
- c = self
110
- eval(body)
50
+ def combined_files(output_path)
51
+ raise 'here'
52
+ Write.new(:output_path => output_path, :project => self).combined_files
111
53
  end
112
54
  end
113
55
  end
@@ -0,0 +1,7 @@
1
+ module Overapp
2
+ class << self
3
+ def ec(*args)
4
+ MharrisExt.ec(*args)
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,23 @@
1
+ module Overapp
2
+ class << self
3
+ def dir_files(dir)
4
+ res = Dir["#{dir}/**/*"] + Dir["#{dir}/**/.*"]
5
+ res - [".","..",".git"]
6
+ end
7
+
8
+ def with_local_path(overapp_path,&b)
9
+ if Git.repo?(overapp_path)
10
+ TmpDir.with_repo_path(overapp_path) do |dir|
11
+ b[dir]
12
+ end
13
+ else
14
+ yield overapp_path
15
+ end
16
+ end
17
+
18
+ def to_proper_dir(dir)
19
+ base = File.expand_path(File.dirname(__FILE__) + "/../../..")
20
+ dir.gsub("OVERAPP_ROOT_DIR",base)
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,25 @@
1
+ module Overapp
2
+ class Git
3
+ class << self
4
+ def commit_inner(output_path,message,init,&b)
5
+ res = nil
6
+ res = yield if block_given?
7
+ if init
8
+ `rm -rf #{output_path}/.git`
9
+ ec "cd #{output_path} && git init && git config user.email johnsmith@fake.com && git config user.name 'John Smith'", :silent => true
10
+ end
11
+
12
+ ec "cd #{output_path} && git add . && git commit -m '#{message}'", :silent => true
13
+ res
14
+ end
15
+ def commit(output_path,message,&b)
16
+ init = !FileTest.exist?("#{output_path}/.git")
17
+ commit_inner(output_path,message,init,&b)
18
+ end
19
+
20
+ def repo?(path)
21
+ path =~ /\.git/ || path =~ /file:\/\// || path =~ /git:\/\//
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,32 @@
1
+ module Overapp
2
+ class TmpDir
3
+ class << self
4
+ def base_dir
5
+ File.expand_path(File.dirname(__FILE__) + "/../../../tmp")
6
+ end
7
+ def with(ops={})
8
+ dir = "#{base_dir}/#{rand(1000000000000000000)}"
9
+ `mkdir #{dir}`
10
+ if block_given?
11
+ Dir.chdir(dir) do
12
+ yield dir
13
+ end
14
+ else
15
+ dir
16
+ end
17
+ ensure
18
+ if block_given?
19
+ ec "rm -rf #{dir}", :silent => true
20
+ end
21
+ end
22
+
23
+ def with_repo_path(url)
24
+ url = Overapp.to_proper_dir(url)
25
+ with do |dir|
26
+ `git clone #{url} . 2>&1`
27
+ yield dir
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,9 @@
1
+ module Overapp
2
+ class << self
3
+ def write_project(overapp_path,output_path)
4
+ Overapp.with_local_path(overapp_path) do |dir|
5
+ Overapp::Project.new(:path => dir).write_to!(output_path)
6
+ end
7
+ end
8
+ end
9
+ end