depends_update 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -6,10 +6,13 @@
6
6
  # rake depends_update 命令来依据定义的依赖关系更新,很显然 .depends_update 定义了我
7
7
  # 们的依赖关系
8
8
 
9
-
9
+ require 'rubygems'
10
10
  require 'rake'
11
+ require 'depends_update/init.rb'
12
+
13
+
11
14
 
12
15
  desc 'depends update this code repository'
13
16
  task :depends_update do
14
-
17
+ DependUpdate::Depends.depends_update
15
18
  end
@@ -0,0 +1,170 @@
1
+ # encoding: UTF-8
2
+
3
+ require 'open-uri'
4
+ require 'svn/svntree'
5
+ require 'ruby-debug'
6
+
7
+ module DependUpdate
8
+ class Depends
9
+ extend DependUpdate
10
+
11
+ def initalize(&block)
12
+ return nil unless block_given?
13
+ yield self
14
+ end
15
+
16
+ def depend(*args)
17
+ dest = args.first
18
+ options = args.last.is_a?(::Hash) ? args.pop : {}
19
+
20
+ case options.keys.first.to_s
21
+ when "svn"
22
+ pattern = options[:svn]
23
+ command = SVN::SVNCommand
24
+ else
25
+ end
26
+
27
+
28
+
29
+ repos_root = command.repos_current_path()
30
+ repos_current = command.repos_root_path()
31
+ from = options.values.first
32
+
33
+ if pattern !~ /[\*|\?]/ # 非模式匹配
34
+ # dest == Directory
35
+ if pattern == /^(http[s]?|svn):\/\// # 不同仓库
36
+ from_path = pattern
37
+ to_path = dest
38
+ elsif pattern == /^\// # 根目录
39
+ from_path = url_join_path(from,repos_root)
40
+ to_path = dest
41
+ else
42
+ from_path = url_join_path(from,repos_current)
43
+ to_path = dest
44
+ end
45
+ puts "更新文件 #{from_path} 到 #{to_path}"
46
+ command.export(from_path,to_path)
47
+ else
48
+ if pattern == /^(http[s]?|svn):\/\// # 不同仓库
49
+ from_paths = command.ReposTree.new pattern
50
+ to_path = dest
51
+ elsif pattern == /^\// # 根目录
52
+ from_paths = command.ReposTree.new url_join_path(from,repos_root)
53
+ to_path = dest
54
+ else
55
+ from_paths = command.ReposTree.new url_join_path(form,repos_current)
56
+ to_path = dest
57
+ end
58
+
59
+ from_paths.each do |from_path|
60
+ puts "更新文件 #{from_path} 到 #{to_path}"
61
+ command.export(from_path,to_path)
62
+ end
63
+ end
64
+ end
65
+
66
+ private
67
+ def url_join_path(*paths)
68
+ return unless paths.respond_to?('length') && paths.length > 1
69
+ paths.inject do |snext,sconcat|
70
+ if snext.index(/[\/|\\]/) == 0 && sconcat.rindex(/[\/|\\]/) == sconcat.length - 1
71
+ sconcat + '/' + snext
72
+ else
73
+ sconcat + snext
74
+ end
75
+ end
76
+ end
77
+ end
78
+
79
+
80
+ def download(uri)
81
+ filename = File.basename(uri)
82
+ puts "downloadding #{uri}"
83
+ writeOut = open(filename, "wb")
84
+ writeOut.write(open(uri).read)
85
+ writeOut.close
86
+ puts "downloaded #{uri}"
87
+ filename
88
+ end
89
+
90
+ def get_depends_file
91
+
92
+ modulepath = File.expand_path(".depends",Dir.pwd)
93
+ return modulepath
94
+ end
95
+
96
+ def depends_list
97
+
98
+ end
99
+
100
+ SVN32_URL = 'http://www.sliksvn.com/pub/Slik-Subversion-1.6.16-win32.msi'
101
+ svn64_url = 'http://www.sliksvn.com/pub/Slik-Subversion-1.6.16-x64.msi'
102
+
103
+ def get_os(*os_string)
104
+ if os_string.respond_to?('length') && os_string.length == 0
105
+ os = RUBY_PLATFORM
106
+ else
107
+ os = os_string[0]
108
+ end
109
+
110
+ case os
111
+ when /mingw/,/cygwin/
112
+ :windows
113
+ when /linux/
114
+ :linux
115
+ end
116
+ end
117
+
118
+ def svn_installed?
119
+ begin
120
+ `svn`
121
+ true
122
+ rescue Errno::ENOENT
123
+ false
124
+ end
125
+ end
126
+
127
+ def load_depends_settings
128
+
129
+ end
130
+
131
+ def depends_update
132
+
133
+ if get_os == :windows
134
+ svn = DependUpdate::SVN32_URL
135
+ unless svn_installed?
136
+ svnfile = download svn
137
+ `#{svnfile}`
138
+ FileUtils.rm svnfile
139
+ end
140
+ return unless svn_installed?
141
+ end
142
+ puts get_depends_file
143
+
144
+ File.read(get_depends_file).each_line do |line|
145
+ values = line.split(',')
146
+
147
+ if values && values.length && values.length > 1
148
+
149
+ dest = values[0]
150
+ value = values[1]
151
+
152
+ options ||= {}
153
+ option_name ||= :svn
154
+
155
+ if value.split('=') && value.split('=') && value.split('=').length > 1
156
+ option_name = value.split('=').first.strip.to_sym
157
+ url_value = value.split('=').last.strip
158
+ else
159
+ url_value = value.strip
160
+ end
161
+
162
+ options[option_name] = url_value
163
+
164
+ d = ::DependUpdate::Depends.new
165
+ d.depend(dest, options)
166
+
167
+ end
168
+ end
169
+ end
170
+ end
@@ -0,0 +1,137 @@
1
+ require 'fileutils'
2
+
3
+ module SVN
4
+ class SVNTree
5
+ include Enumerable
6
+
7
+ attr_accessor :items
8
+ attr_accessor :url
9
+
10
+ def initialize(url,*args)
11
+ @url = url
12
+ @items = SVN::SVNCommand.ls(url)
13
+ end
14
+
15
+ def [](*args)
16
+ svn_tree = load_child(self)
17
+
18
+ svn_tree.reject do |item|
19
+ match = false
20
+ args.each do |p|
21
+ match = File.fnmatch(p,item,File::FNM_PATHNAME | File::FNM_DOTMATCH)
22
+ break if match
23
+ end
24
+ !match
25
+ end
26
+ end
27
+
28
+ def each(&block)
29
+ @items.each do |member|
30
+ if member.rindex(/[\\|\/]/) == member.length - 1
31
+ block.call(SVNTree.new url + member)
32
+ else
33
+ block.call(member)
34
+ end
35
+ end
36
+ end
37
+
38
+ private
39
+ def load_child(items,*args)
40
+ if args && args.length
41
+ prefix = args.first
42
+ end
43
+
44
+ ret_array ||= []
45
+ prefix ||= ""
46
+
47
+ items.each do |item|
48
+ if item.class == SVN::SVNTree
49
+ to_prefix = prefix + item.url[items.url.length,10000]
50
+ ret_array.concat load_child(item,to_prefix)
51
+ else
52
+ ret_array << prefix + item
53
+ end
54
+ end
55
+ ret_array
56
+ end
57
+ end
58
+
59
+ module SVNCommand
60
+ class << self
61
+
62
+ def ls(path)
63
+ `svn list #{path}`.split("\n")
64
+ end
65
+
66
+ def export(url,*args)
67
+ to_path = args.first
68
+ to_path = to_path.chomp.strip
69
+
70
+ if to_path.rindex(/[\/|\\]/) == to_path.length - 1 # Directory
71
+ path_name = to_path
72
+ else
73
+ last_separator = to_path.rindex(/[\/|\\]/)
74
+ if last_separator && last_separator > 0 # 有目录
75
+ path_name = to_path[0..last_separator]
76
+ end
77
+ end
78
+
79
+
80
+ FileUtils.mkdir_p(path_name) unless File.directory? path_name
81
+
82
+ `svn export --force #{url} #{to_path} `
83
+ end
84
+
85
+ def info()
86
+ ret = `svn info`
87
+ end
88
+
89
+ def repos_current_path
90
+ svn_info = info().split("\n")
91
+ get_svn_info_values(svn_info[1])
92
+ end
93
+
94
+ def repos_root_path
95
+ svn_info = info().split("\n")
96
+ get_svn_info_values(svn_info[2])
97
+ end
98
+
99
+
100
+ private
101
+ def get_svn_info_values(svn_info)
102
+ s = svn_info.chomp
103
+ s[s.index(":") + 1, 10000].chomp.strip
104
+ end
105
+
106
+ end
107
+
108
+ class ReposTree < SVN::SVNTree
109
+ end
110
+
111
+
112
+ end
113
+
114
+ # tree = SVN::SVNTree.new ("http://svn.localsvn.local/svn/repos1")
115
+ # tree.items =>
116
+ # |-- MIT-LICENSE
117
+ # |-- README
118
+ # |-- Rakefile
119
+ # |-- init.rb
120
+ # |-- install.rb
121
+ # |-- lib/
122
+ # |-- test/
123
+ # |-- uninstall.rb
124
+ # |-- wanew_client_validate.gemspec
125
+ #
126
+ # tree["lib/"] => SVN::SVNTree
127
+ # tree["README"] => SVN::SVNItem
128
+ # tree.items["lib/"] => SVN::SVNTree
129
+ # tree.each do |e|
130
+ # if (e.is_a(SVN::SVNTree))
131
+ # e.each do |i|
132
+ # puts i
133
+ # end
134
+ # end
135
+ # end
136
+
137
+ end
data/lib/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  module WaNew
2
2
  module DependUpdate
3
- VERSION = "0.0.1"
3
+ VERSION = "0.0.2"
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: depends_update
3
3
  version: !ruby/object:Gem::Version
4
- hash: 29
4
+ hash: 27
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 0
9
- - 1
10
- version: 0.0.1
9
+ - 2
10
+ version: 0.0.2
11
11
  platform: ruby
12
12
  authors:
13
13
  - wanliu corporation
@@ -16,7 +16,7 @@ autorequire:
16
16
  bindir: bin
17
17
  cert_chain: []
18
18
 
19
- date: 2011-05-31 00:00:00 +08:00
19
+ date: 2011-06-02 00:00:00 +08:00
20
20
  default_executable:
21
21
  dependencies: []
22
22
 
@@ -30,7 +30,9 @@ extensions: []
30
30
  extra_rdoc_files: []
31
31
 
32
32
  files:
33
+ - lib/depends_update/init.rb
33
34
  - lib/depends_update.rb
35
+ - lib/svn/svntree.rb
34
36
  - lib/version.rb
35
37
  - MIT-LICENSE
36
38
  has_rdoc: true