Wiki2Go 1.15.1 → 1.16.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (89) hide show
  1. data/bin/DebugWiki2GoServer.rb +10 -0
  2. data/bin/{Wiki2Go_make_repository.rb → Wiki2Go_make_cvs_repository.rb} +1 -1
  3. data/lib/Web2Go/WebrickRequest.rb +1 -1
  4. data/lib/Web2Go/WebrickResponse.rb +3 -3
  5. data/lib/Wiki2Go/BlackList.rb +24 -11
  6. data/lib/Wiki2Go/DotGraphics.rb +45 -5
  7. data/lib/Wiki2Go/FileStorage.rb +8 -2
  8. data/lib/Wiki2Go/GreyList.rb +38 -22
  9. data/lib/Wiki2Go/Install/make_repository.rb +351 -36
  10. data/lib/Wiki2Go/Install/make_site.rb +17 -8
  11. data/lib/Wiki2Go/Install/site/ruby.css +18 -0
  12. data/lib/Wiki2Go/Install/templates/admin.htm +11 -0
  13. data/lib/Wiki2Go/Install/templates/admin_pages/commit_site.txt +21 -0
  14. data/lib/Wiki2Go/Install/templates/admin_pages/edit.txt +33 -0
  15. data/lib/Wiki2Go/Install/templates/admin_pages/editfiles.txt +33 -0
  16. data/lib/Wiki2Go/Install/templates/admin_pages/greylist.txt +19 -37
  17. data/lib/Wiki2Go/Install/templates/admin_pages/show_log.txt +21 -0
  18. data/lib/Wiki2Go/Install/templates/admin_pages/update_conflicts.txt +38 -0
  19. data/lib/Wiki2Go/Install/templates/admin_pages/update_site.txt +49 -0
  20. data/lib/Wiki2Go/Install/wiki/ruby.css +18 -0
  21. data/lib/Wiki2Go/LineFormatter.rb +504 -0
  22. data/lib/Wiki2Go/Page.rb +50 -18
  23. data/lib/Wiki2Go/PublicWikiConfig.rb +34 -11
  24. data/lib/Wiki2Go/Server.rb +13 -2
  25. data/lib/Wiki2Go/SpamFilter.rb +27 -8
  26. data/lib/Wiki2Go/SyntaxHighlighter.rb +41 -0
  27. data/lib/Wiki2Go/Web.rb +0 -3
  28. data/lib/Wiki2Go/WebrickServlet.rb +2 -0
  29. data/lib/Wiki2Go/Wiki2Go.rb +19 -8
  30. data/lib/Wiki2Go/Wiki2GoConfig.rb +125 -18
  31. data/lib/Wiki2Go/Wiki2GoServlet.rb +32 -21
  32. data/lib/Wiki2Go/WikiFormatter.rb +55 -468
  33. data/lib/Wiki2Go/cgi/secure/log_rss +21 -0
  34. data/test/All.rb +21 -0
  35. data/test/TestBlackList.rb +82 -0
  36. data/test/TestConfig.rb +205 -0
  37. data/test/TestDot.rb +109 -0
  38. data/test/TestFormatter.rb +491 -0
  39. data/test/TestInstall.rb +120 -0
  40. data/test/TestLineFormatter.rb +553 -0
  41. data/test/TestMail.rb +29 -0
  42. data/test/TestRSS.rb +183 -0
  43. data/test/TestRepositoryMaker.rb +101 -0
  44. data/test/TestServer.rb +65 -0
  45. data/test/TestSpamFilter.rb +130 -0
  46. data/test/TestStorage.rb +212 -0
  47. data/test/TestSyntaxHighlighter.rb +41 -0
  48. data/test/TestUnitTestFiles.rb +27 -0
  49. data/test/TestUrlFinder.rb +39 -0
  50. data/test/TestWeb.rb +197 -0
  51. data/test/TestWeb2Go.rb +90 -0
  52. data/test/TestWiki2Go.rb +184 -0
  53. data/test/TestWiki2GoServlet.rb +747 -0
  54. data/test/UnitTestFiles.rb +102 -0
  55. data/test/Wiki2GoConfigForTest.rb +93 -0
  56. data/test/checksite.rb +56 -0
  57. data/test/testdata/changes.txt +4 -0
  58. data/test/testdata/expected_changes.html +93 -0
  59. data/test/testdata/expected_edit.html +105 -0
  60. data/test/testdata/expected_full_rss.xml +29 -0
  61. data/test/testdata/expected_header_rss.xml +13 -0
  62. data/test/testdata/expected_out.html +97 -0
  63. data/test/testdata/expected_put.html +99 -0
  64. data/test/testdata/expected_save.html +66 -0
  65. data/test/testdata/expected_savehtml.html +66 -0
  66. data/test/testdata/expected_search.html +67 -0
  67. data/test/testdata/expected_upload.html +69 -0
  68. data/test/testdata/expected_versions.html +85 -0
  69. data/test/testdata/expected_view.html +97 -0
  70. data/test/testdata/site/html/Xpday/rss.xml +103 -0
  71. data/test/testdata/templates/Test/child.htm +2 -0
  72. data/test/testdata/templates/Test/grandchild.htm +1 -0
  73. data/test/testdata/templates/Test/master.htm +3 -0
  74. data/test/testdata/texts/Test/FrontPage.txt +7 -0
  75. data/test/testdata/texts/Test/NewPage.txt +3 -0
  76. data/test/testdata/texts/Test/Subdir/Subpage.txt +1 -0
  77. data/test/testdata/texts/Test/empty.txt +3 -0
  78. data/test/testdata/texts/Test/test.txt +3 -0
  79. data/test/testdata/texts/Xpday/FrontPage.txt +36 -0
  80. data/test/testdata/texts/Xpday/Page.txt +3 -0
  81. data/test/testdata/texts/Xpday/VersionedPage.log +14 -0
  82. data/test/testdata/texts/Xpday/VersionedPage.txt +3 -0
  83. data/test/testdata/texts/Xpday/empty.log +3482 -0
  84. data/test/testdata/texts/Xpday/empty.txt +4 -0
  85. data/test/testdata/texts/Xpday/test.log +9425 -0
  86. data/test/testdata/texts/Xpday/test.txt +5 -0
  87. data/test/testdata/texts/whitelist.txt +1 -0
  88. metadata +85 -5
  89. data/lib/Wiki2Go/Install/templates/admin_pages/update.txt +0 -13
@@ -0,0 +1,10 @@
1
+ #!/usr/local/bin/ruby
2
+ $:.unshift File.expand_path(File.join(File.dirname(__FILE__),'..','lib'))
3
+
4
+ require "Wiki2Go/Server"
5
+
6
+ if $0 =~ /DebugWiki2GoServer\.rb/
7
+ server = Wiki2Go::Server.new(ARGV)
8
+ thread = server.start
9
+ thread.join
10
+ end
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
3
  require 'rubygems'
4
- require_gem "Wiki2Go"
4
+ #require_gem "Wiki2Go"
5
5
 
6
6
  require 'fileutils'
7
7
  require 'Wiki2Go/Install/make_repository'
@@ -1,4 +1,4 @@
1
- require 'Webrick/httputils'
1
+ require 'webrick/httputils'
2
2
 
3
3
  module Web2Go
4
4
 
@@ -1,5 +1,5 @@
1
- require 'Webrick/httputils'
2
- require 'Webrick/cookie'
1
+ require 'webrick/httputils'
2
+ require 'webrick/cookie'
3
3
 
4
4
  module Web2Go
5
5
 
@@ -34,7 +34,7 @@ module Web2Go
34
34
  cookie = WEBrick::Cookie.new(name,value)
35
35
  cookie.expires = expires unless expires.nil?
36
36
  cookie.domain = domain unless domain.nil?
37
- cookie.path = path unless path.nil?
37
+ cookie.path = path.nil? ? '/' : path
38
38
  set_cookie(cookie)
39
39
  end
40
40
 
@@ -1,38 +1,42 @@
1
1
 
2
2
  module Wiki2Go
3
-
3
+
4
4
  class BlackList
5
-
5
+
6
6
  attr_reader :name
7
-
7
+
8
8
  def initialize(name,items)
9
9
  @name = name
10
+ @banned = []
10
11
  items = items.collect {|line|
11
12
  line.strip!
12
13
  (line.empty? || line[0] == '#' ? nil : line)
13
14
  }
14
15
  @banned = items.compact
15
16
  end
16
-
17
+
17
18
  def all
18
19
  return @banned
19
20
  end
20
-
21
+
21
22
  def add(item)
23
+ if item =~ /(:\/\/[^\/:]+)/ then
24
+ item = $1
25
+ end
22
26
  item = escape_regex(item)
23
27
  @banned << item
24
28
  @banned = @banned.sort.uniq
25
29
  end
26
-
30
+
27
31
  def length
28
32
  return @banned.length
29
33
  end
30
-
34
+
31
35
  def contains(user)
32
36
  match = @banned.find { |ban| user =~ Regexp.new(ban,Regexp::IGNORECASE) }
33
37
  ! match.nil?
34
38
  end
35
-
39
+
36
40
  def found_in(lines)
37
41
  lines = lines.join(' ') if lines.kind_of? Array
38
42
  @banned.each do | pattern |
@@ -41,12 +45,21 @@ module Wiki2Go
41
45
  end
42
46
  return false
43
47
  end
44
-
48
+
45
49
  private
46
-
50
+
47
51
  def escape_regex(item)
48
52
  item.gsub(/\./,'\.')
49
53
  end
54
+
55
+ def add_line(item)
56
+ if item =~ /(:\/\/[^\/:]+)/ then
57
+ item = $1
58
+ end
59
+ @banned << item
60
+ @banned = @banned.sort.uniq
61
+ end
62
+
50
63
  end
51
-
64
+
52
65
  end
@@ -1,6 +1,7 @@
1
1
  #!/usr/bin/ruby
2
2
 
3
3
  require 'English'
4
+ require 'Wiki2Go/LineFormatter'
4
5
 
5
6
  module Wiki2Go
6
7
 
@@ -9,7 +10,7 @@ module Wiki2Go
9
10
 
10
11
  class DotGraphics
11
12
 
12
- def initialize(path)
13
+ def initialize(path='')
13
14
  @path = path
14
15
  end
15
16
 
@@ -28,7 +29,7 @@ module Wiki2Go
28
29
  def save_if_necessary(config,web,content,force)
29
30
  image = content
30
31
  result = ''
31
- if image =~ /^([^\s]*)\s/ then
32
+ if image =~ /^([^\s,]+)\s/ then
32
33
  filename = $1
33
34
  image = $POSTMATCH
34
35
  image = image.gsub('\n',' ').gsub('\r',' ')
@@ -46,12 +47,39 @@ module Wiki2Go
46
47
  config.log("Writing image file to #{fullname}")
47
48
  write(image,type,fullname)
48
49
  end
49
- return "<img src=\"#{web.name}/graphics/#{filename}\" border=0 alt=\"#{filename}\">"
50
+ if image =~ /url\s*=\s*\"([^\"]+)"/i then
51
+ mapname = File.basename(filename,'.*')
52
+ maptype = 'cmapx'
53
+ image = rewrite_urls(config,web,image)
54
+ map = generate(image,maptype)
55
+ map = map.gsub(/id="[^"]*"/,"id=\"#{mapname}\"").gsub(/name="[^"]*"/,"name=\"#{mapname}\"")
56
+ return "<img src=\"#{web.name}/graphics/#{filename}\" border=0 alt=\"#{filename}\" usemap=\"##{mapname}\">" + $/ + map
57
+ else
58
+ return "<img src=\"#{web.name}/graphics/#{filename}\" border=0 alt=\"#{filename}\">"
59
+ end
50
60
  end
51
61
 
62
+ def rewrite_urls(config,web,image)
63
+ formatter = Wiki2Go::LineFormatter.new(web,config.storage,config,true,false)
64
+
65
+ image = image.gsub(/url\s*=\s*\"([^\"]+)"/i) { rewrite_url(config,web,formatter,$1) }
66
+ image
67
+ end
68
+
69
+ def rewrite_url(config,web,formatter,url)
70
+ if url =~ /:\/\// then
71
+ if config.redirect_url?(web,url) then
72
+ url = web.base_url + formatter.redirect_url(url)
73
+ end
74
+ else
75
+ url = formatter.absolute_url_of_topic(url)
76
+ end
77
+ "URL=\"#{url}\""
78
+ end
52
79
 
53
80
  def write(graph,format,output)
54
- cmdline = "#{File.join(@path,'dot')} -T#{format} -o#{output}"
81
+ command = @path.empty? ? 'dot' : File.join(@path,'dot')
82
+ cmdline = "#{command} -T#{format} -o#{output}"
55
83
  IO.popen(cmdline,"w+") do |f|
56
84
  f.puts graph
57
85
  f.close_write
@@ -59,9 +87,21 @@ module Wiki2Go
59
87
  end
60
88
  end
61
89
 
90
+ def generate(graph,format)
91
+ command = @path.empty? ? 'dot' : File.join(@path,'dot')
92
+ cmdline = "#{command} -T#{format}"
93
+ result =""
94
+ IO.popen(cmdline,"w+") do |f|
95
+ f.puts graph
96
+ f.close_write
97
+ result = f.read
98
+ end
99
+ result
100
+ end
101
+
62
102
 
63
103
  def ensure_directory_exists(path)
64
- dir,filename = File.split(path)
104
+ dir = File.dirname(path)
65
105
  FileUtils.makedirs(dir) unless File.directory?(dir)
66
106
  end
67
107
  end
@@ -38,8 +38,8 @@ module Wiki2Go
38
38
  end
39
39
 
40
40
  def save_page(subwiki,page)
41
- path = text_filename(subwiki,page.title,"txt")
42
- logfile = text_filename(subwiki,page.title,"log")
41
+ path = text_filename(subwiki,page.filename,"txt")
42
+ logfile = text_filename(subwiki,page.filename,"log")
43
43
  ensure_directory_exists(path)
44
44
  append_current_text_to_logfile(path,logfile,page.author)
45
45
  File.open(path,File::CREAT|File::TRUNC|File::RDWR) do |file|
@@ -58,6 +58,12 @@ module Wiki2Go
58
58
  end
59
59
  end
60
60
 
61
+ def delete_spam(subwiki,page)
62
+ text = text_filename(subwiki,page.filename,"txt")
63
+ spam_path = text_filename(subwiki,page.filename,"spam")
64
+ FileUtils::mv text,spam,:force => true
65
+ end
66
+
61
67
  def save_html(subwiki,page, content)
62
68
  path = File.join(@html,subwiki,page + ".html")
63
69
  ensure_directory_exists(path)
@@ -1,74 +1,82 @@
1
1
 
2
2
  module Wiki2Go
3
-
3
+
4
4
  class GreyList
5
-
5
+
6
6
  class Suspect
7
7
  include Comparable
8
-
8
+
9
9
  attr_reader :url
10
10
  attr_reader :user
11
-
11
+
12
12
  def initialize(user,url)
13
13
  @user = user
14
14
  @url = url
15
15
  end
16
-
16
+
17
17
  def to_s
18
18
  @user + ' ' + @url
19
19
  end
20
-
20
+
21
21
  def hash
22
22
  self.to_s.hash
23
23
  end
24
-
24
+
25
25
  def <=>(other)
26
26
  return false if other.nil?
27
27
  self.to_s <=> other.to_s
28
28
  end
29
-
29
+
30
30
  def eql?(other)
31
31
  return false if other.nil?
32
32
  self.to_s == other.to_s
33
33
  end
34
-
34
+
35
35
  end
36
-
36
+
37
37
  attr_reader :name
38
-
38
+
39
39
  def initialize(name,items)
40
40
  @name = name
41
41
  items = items.collect {|line|
42
42
  user, url = line.strip.split
43
- (user.nil? || url.nil? ? nil : Suspect.new(user,url))
43
+ (user.nil? || url.nil? ? nil : Suspect.new(user,url))
44
44
  }
45
45
  @banned = items.compact
46
46
  end
47
-
47
+
48
+ def suspects
49
+ return @banned
50
+ end
51
+
48
52
  def all
49
53
  return @banned.collect { |suspect| suspect.to_s }
50
54
  end
51
-
55
+
52
56
  def add(user,url)
57
+ if url =~ /(:\/\/[^\/:]+)/ then
58
+ url = $1
59
+ end
60
+
53
61
  url = escape_regex(url)
54
62
  @banned << Suspect.new(user,url)
55
63
  @banned = @banned.sort.uniq
56
64
  end
57
-
65
+
58
66
  def length
59
67
  return @banned.length
60
68
  end
61
-
62
- def contains_user(user)
69
+
70
+ def contains_user?(user)
63
71
  match = @banned.find { |ban| user =~ Regexp.new(ban.user,Regexp::IGNORECASE) }
64
72
  ! match.nil?
65
73
  end
66
74
 
67
- def contains_url(url)
75
+ def contains_url?(url)
68
76
  match = @banned.find { |ban| url =~ Regexp.new(ban.url,Regexp::IGNORECASE) }
69
77
  ! match.nil?
70
78
  end
71
-
79
+
72
80
  def url_found_in(lines)
73
81
  lines = lines.join(' ') if lines.kind_of? Array
74
82
  @banned.each do | pattern |
@@ -77,12 +85,20 @@ module Wiki2Go
77
85
  end
78
86
  return false
79
87
  end
80
-
88
+
89
+ def remove(author,url)
90
+ if url =~ /(:\/\/[^\/:]+)/ then
91
+ url = $1
92
+ end
93
+ url = escape_regex(url)
94
+ @banned = @banned.reject { |suspect| suspect.user == author && suspect.url == url }
95
+ end
96
+
81
97
  private
82
-
98
+
83
99
  def escape_regex(item)
84
100
  item.gsub(/\./,'\.')
85
101
  end
86
102
  end
87
-
103
+
88
104
  end
@@ -2,9 +2,65 @@ require 'tmpdir'
2
2
  require 'fileutils'
3
3
  require 'optparse'
4
4
  require 'etc'
5
+ require 'logger'
5
6
 
6
7
  require 'rubygems'
7
8
  require_gem 'rscm'
9
+ require 'rscm/logging'
10
+ require 'rscm/better'
11
+
12
+ #Patch the RSCM 0.3 module
13
+
14
+ module RSCM
15
+ class Better
16
+ def Better.use_logger(logger)
17
+ @@logger = logger
18
+ end
19
+ end
20
+
21
+ class Cvs
22
+ # The extra simulate parameter is not in accordance with the AbstractSCM API,
23
+ # but it's optional and is only being used from within this class (uptodate? method).
24
+ def checkout(to_identifier=nil, simulate=false)
25
+ checked_out_files = []
26
+ if(checked_out?)
27
+ path_regex = /^([U|P|C]) (.*)/
28
+ cvs(@checkout_dir, update_command(to_identifier), simulate) do |line|
29
+ if(line =~ path_regex)
30
+ event = $1
31
+ path = $2.chomp
32
+ yield event,path if block_given?
33
+ checked_out_files << path
34
+ end
35
+ end
36
+ else
37
+ prefix = File.basename(@checkout_dir)
38
+ path_regex = /^([U|P|C]) #{prefix}\/(.*)/
39
+ # This is a workaround for the fact that -d . doesn't work - must be an existing sub folder.
40
+ mkdir_p(@checkout_dir) unless File.exist?(@checkout_dir)
41
+ target_dir = File.basename(@checkout_dir)
42
+ run_checkout_command_dir = File.dirname(@checkout_dir)
43
+ # -D is sticky, but subsequent updates will reset stickiness with -A
44
+ cvs(run_checkout_command_dir, checkout_command(target_dir, to_identifier), simulate) do |line|
45
+ if(line =~ path_regex)
46
+ event = $1
47
+ path = $2.chomp
48
+ yield event,path if block_given?
49
+ checked_out_files << path
50
+ end
51
+ end
52
+ end
53
+ checked_out_files
54
+ end
55
+
56
+ # def command_line(cmd, password=nil, simulate=false)
57
+ # cvs_options = simulate ? "-n" : ""
58
+ # dev_null = WIN32 ? "nul" : "/dev/null"
59
+ # "cvs -f \"-d#{root_with_password(password)}\" #{cvs_options} -q #{cmd} 2> c:\\temp\\out.log"
60
+ # end
61
+
62
+ end
63
+ end
8
64
 
9
65
  module Wiki2Go
10
66
  class RepositoryMaker
@@ -12,64 +68,299 @@ module Wiki2Go
12
68
  def RepositoryMaker.create(args)
13
69
  opts = OptionParser.new
14
70
 
15
- directory = ''
16
- user = ''
17
- group = ''
18
- opts.on("-d",'--directory dir',String) { |val| directory = File.expand_path(val) }
71
+ directory = ''
72
+ user = ''
73
+ group = ''
74
+ modulename = ''
75
+ opts.on("-d",'--directory dir',String) { |val| directory = expand_cvsroot(val) }
19
76
  opts.on("-u",'--user username',String) { |val| user = val }
20
77
  opts.on("-g",'--group groupname',String) { |val| group = val }
78
+ opts.on("-m",'--module name ',String) { |val| modulename = val }
21
79
  opts.on_tail("-h", "--help", "Show this message") do
22
80
  puts opts
23
81
  exit
24
82
  end
25
83
  opts.parse(args)
26
84
 
27
- puts "Directory = #{directory}"
28
85
  if directory.empty? then
29
86
  puts opts
30
87
  else
31
88
  puts "Creating CVS in directory #{directory}"
89
+ oldmask = File.umask(02)
32
90
  cvs = RepositoryMaker.new(directory)
33
91
  cvs.make_empty_repository(user,group)
34
- cvs.update_configuration
92
+ cvs.add_module(modulename,user,group)
93
+ File.umask(oldmask)
94
+ end
95
+ end
96
+
97
+ def RepositoryMaker.addwiki(args)
98
+ opts = OptionParser.new
99
+
100
+ directory = ''
101
+ wikidir = ''
102
+ modulename = ''
103
+ comment = 'Store wiki'
104
+ opts.on("-d",'--directory dir',String) { |val| directory = expand_cvsroot(val) }
105
+ opts.on("-w",'--wikidirectory dir',String) { |val| wikidir = File.expand_path(val) }
106
+ opts.on("-m",'--module name',String) { |val| modulename = val }
107
+ opts.on("-c",'--comment string',String) { |val| comment = val }
108
+ opts.on_tail("-h", "--help", "Show this message") do
109
+ puts opts
110
+ exit
111
+ end
112
+ opts.parse(args)
113
+
114
+ if directory.empty? || wikidir.empty? || modulename.empty? then
115
+ puts opts
116
+ return []
117
+ else
118
+ puts "Adding wiki #{wikidir} as module '#{modulename}' in CVS #{directory}"
119
+ oldmask = File.umask(02)
120
+ cvs = RepositoryMaker.new(directory)
121
+ added = cvs.add_wiki(wikidir,modulename,comment)
122
+ File.umask(oldmask)
123
+ return added
124
+ end
125
+ end
126
+
127
+ def RepositoryMaker.updatewiki(args)
128
+ opts = OptionParser.new
129
+
130
+ wikidir = ''
131
+ directory = ''
132
+ modulename = ''
133
+ opts.on("-d",'--directory dir',String) { |val| directory = expand_cvsroot(val) }
134
+ opts.on("-w",'--wikidirectory dir',String) { |val| wikidir = File.expand_path(val) }
135
+ opts.on("-m",'--module name ',String) { |val| modulename = val }
136
+ opts.on_tail("-h", "--help", "Show this message") do
137
+ puts opts
138
+ exit
139
+ end
140
+ opts.parse(args)
141
+
142
+ if wikidir.empty? then
143
+ puts opts
144
+ else
145
+ puts "Updating wiki #{wikidir}"
146
+ oldmask = File.umask(02)
147
+ cvs = RepositoryMaker.new(directory)
148
+ cvs.update(wikidir,modulename)
149
+ File.umask(oldmask)
35
150
  end
36
151
  end
37
152
 
38
- def initialize(dir)
153
+ def initialize(dir,logger=nil)
39
154
  @dir = dir
40
- @repository = RSCM::Cvs.new(@dir)
155
+ @logger = logger || Logger.new(STDERR)
156
+ RSCM::Better.use_logger @logger
41
157
  end
42
158
 
43
159
  def make_empty_repository(user,group)
44
- FileUtils::mkdir_p @dir
45
- FileUtils::chmod 02775,@dir
160
+ if !File.exists?(File.join(@dir,'CVSROOT')) then
161
+ repository = RSCM::Cvs.new(@dir)
162
+ FileUtils::mkdir_p @dir
46
163
 
47
- lockdir = File.join(@dir,'locks')
48
- FileUtils::mkdir_p lockdir
49
- FileUtils::chmod 02775,lockdir
164
+ repository.create_central
50
165
 
51
- @repository.create
52
- set_owner(@dir,user,group)
166
+ lockdir = File.join(@dir,'locks')
167
+ FileUtils::mkdir_p lockdir
168
+
169
+ set_owner(@dir,user,group)
170
+ end
171
+ update_configuration
172
+
173
+ end
174
+
175
+ def add_module(modulename,user,group)
176
+ if !modulename.nil? && !modulename.empty? then
177
+ moduledir = File.join(@dir,modulename)
178
+ FileUtils::mkdir_p moduledir
179
+ set_owner(moduledir,user,group)
180
+ end
53
181
 
54
182
  end
55
183
 
184
+ def update(wikidir,modulename)
185
+ repository = RSCM::Cvs.new(@dir,modulename)
186
+ repository.checkout_dir = wikidir
187
+ updated = []
188
+ clashed = []
189
+ begin
190
+ repository.checkout do |event,path|
191
+ updated << path if event == 'U' || event == 'P'
192
+ clashed << path if event == 'C'
193
+ end
194
+ rescue Exception => e
195
+ clashed = [ e.to_s ]
196
+ end
197
+ return updated,clashed
198
+ end
199
+
200
+ def add_wiki(wikidir,modulename,comment='No Comment')
201
+ repository = RSCM::Cvs.new(@dir,modulename)
202
+ repository.checkout_dir = wikidir
203
+ repository.checkout unless repository.checked_out?
204
+
205
+ output = []
206
+ added_files = []
207
+
208
+ added_files += add_contents_of(modulename,wikidir,'texts') { |dir,name|
209
+ checkin = ((name =~ /^\./) ? false : true)
210
+ # output << "Add #{name.inspect} in #{dir} ? => #{checkin}"
211
+ checkin
212
+ }
213
+ added_files += add_contents_of(modulename,wikidir,'templates') { |dir,name|
214
+ checkin = ((name =~ /^\./) ? false : true)
215
+ # output << "Add #{name} in #{dir} ? => #{checkin}"
216
+ checkin
217
+ }
218
+ added_files += add_contents_of(modulename,File.join(wikidir,'site'),'html') { |dir,name|
219
+ checkin = ((name == 'rss.xml' || (name =~ /^\./)) ? false : true)
220
+ output << "Add #{name} in #{dir} ? => #{checkin}"
221
+ checkin
222
+ }
223
+
224
+ sitedir = File.join(wikidir,'site')
225
+ if File.exists?(sitedir) then
226
+ add_directory modulename,wikidir,'site'
227
+ scriptdir = File.join(sitedir,'scripts')
228
+ if File.exists?(scriptdir) then
229
+ add_directory modulename,sitedir,'scripts'
230
+ added_files += add_files modulename,scriptdir,[ 'CgiOptions.rb']
231
+ end
232
+ end
233
+
234
+ added_files += add_contents_of(modulename,wikidir,'config') { |dir,name|
235
+ checkin = ((name == 'chonqed_blacklist.txt' || (name =~ /^\./)) ? false : true)
236
+ # output << "Add #{name} in #{dir} ? => #{checkin}"
237
+ checkin
238
+ }
239
+ begin
240
+ repository.commit comment do |line|
241
+ output << line
242
+ end
243
+ rescue Exception => e
244
+ output << e.to_s
245
+ end
246
+ output
247
+ end
248
+
249
+ def is_local?(wikidir,modulename)
250
+ repository = RSCM::Cvs.new(@dir,modulename)
251
+ repository.checkout_dir = wikidir
252
+ repository.can_create_central?
253
+ end
254
+
255
+ private
256
+
257
+ def files_checked_in(dir)
258
+ files = []
259
+ entries = File.join(dir,'CVS','Entries')
260
+ pattern = Regexp.new("^/([^\/]+)/")
261
+ if File.exists?(entries) then
262
+ File.open(entries,File::RDONLY) do |f|
263
+ lines = f.readlines
264
+ lines.each do |line|
265
+ if line =~ pattern
266
+ files << $1
267
+ end
268
+ end
269
+ end
270
+ end
271
+ files
272
+ end
273
+
274
+ def not_checked_in(dir,filenames)
275
+ checked_in = files_checked_in(dir)
276
+ new_files = filenames - checked_in
277
+ new_files
278
+ end
279
+
280
+
281
+ def add_directory(modulename,dir,subdir)
282
+ repository = RSCM::Cvs.new(@dir,modulename)
283
+ repository.checkout_dir = dir
284
+
285
+ repository.add subdir unless dir_in_repository?(File.join(dir,subdir))
286
+ end
287
+
288
+ def add_files(modulename,dir,files)
289
+ added = []
290
+ if files.length > 0 then
291
+ files = not_checked_in(dir,files)
292
+ if files.length > 0 then
293
+ repository = RSCM::Cvs.new(@dir,modulename)
294
+ repository.checkout_dir = dir
295
+ repository.add files.join(' ')
296
+ added = files
297
+ end
298
+ end
299
+ return added
300
+ end
301
+
302
+ def dir_in_repository?(dir)
303
+ repository = RSCM::Cvs.new
304
+ repository.checkout_dir = dir
305
+ result = repository.checked_out?
306
+ result
307
+ end
308
+
309
+ def add_contents_of(modulename,dir,subdir,&proc)
310
+ return [] if !File.exists?(dir)
311
+
312
+ cvs = RSCM::Cvs.new(@dir,modulename)
313
+ cvs.checkout_dir = dir
314
+
315
+ added = []
316
+
317
+ current_dir = File.join(dir,subdir)
318
+ if File.exists?(current_dir) then
319
+ do_add = (block_given? ? yield(dir,subdir) : true)
320
+ if do_add then
321
+ add_directory(modulename,dir,subdir)
322
+ added << subdir
323
+ end
324
+ names = []
325
+ Dir.entries(current_dir).each do |name|
326
+ if name != '.' && name != '..' && name != 'CVS' then
327
+ if File.directory?(File.join(current_dir,name)) then
328
+ added += add_contents_of(modulename,current_dir,name,&proc)
329
+ else
330
+ do_add = (block_given? ? yield(current_dir,name) : true)
331
+ if do_add then
332
+ names << name
333
+ end
334
+ end
335
+ end
336
+ end
337
+ if names.length > 0 then
338
+ added += add_files(modulename,current_dir,names)
339
+ end
340
+ end
341
+ added
342
+ end
343
+
56
344
  def update_configuration
57
345
  checkout_to = File.join(Dir.tmpdir,'cvs_config')
58
346
  FileUtils::rm_r checkout_to if File.exists?(checkout_to)
59
347
  cvsroot = RSCM::Cvs.new(@dir,'CVSROOT')
60
- cvsroot.checkout(checkout_to)
348
+ cvsroot.checkout_dir = checkout_to
349
+ cvsroot.checkout
61
350
 
62
351
  update_cvswrappers(checkout_to)
63
352
  update_config(checkout_to)
64
353
 
65
- cvsroot.commit(checkout_to,'update cvswrappers for binary files')
354
+ cvsroot.commit('update cvswrappers for binary files')
66
355
  FileUtils::rm_r(checkout_to)
67
356
  end
68
357
 
69
- private
358
+ def self.expand_cvsroot(path)
359
+ path.include?(':') ? path : File.expand_path(path)
360
+ end
70
361
 
71
362
  def update_cvswrappers(dir)
72
- File.open(File.join(dir,'cvswrappers'),File::APPEND|File::WRONLY) do |file|
363
+ File.open(File.join(dir,'cvswrappers'),File::CREAT|File::WRONLY) do |file|
73
364
  file.write cvswrappers_content
74
365
  end
75
366
  end
@@ -106,6 +397,25 @@ module Wiki2Go
106
397
 
107
398
  def cvswrappers_content
108
399
  return <<-END_CVS_WRAPPERS
400
+ # This file affects handling of files based on their names.
401
+ #
402
+ # The -m option specifies whether CVS attempts to merge files.
403
+ #
404
+ # The -k option specifies keyword expansion (e.g. -kb for binary).
405
+ #
406
+ # Format of wrapper file ($CVSROOT/CVSROOT/cvswrappers or .cvswrappers)
407
+ #
408
+ # wildcard [option value][option value]...
409
+ #
410
+ # where option is one of
411
+ # -f from cvs filter value: path to filter
412
+ # -t to cvs filter value: path to filter
413
+ # -m update methodology value: MERGE or COPY
414
+ # -k expansion mode value: b, o, kkv, &c
415
+ #
416
+ # and value is a single-quote delimited value.
417
+ # For example:
418
+ #*.gif -k 'b'
109
419
  *.gif -k 'b'
110
420
  *.jpg -k 'b'
111
421
  *.jpeg -k 'b'
@@ -113,28 +423,33 @@ module Wiki2Go
113
423
 
114
424
  *.doc -k 'b'
115
425
  *.pdf -k 'b'
426
+ *.xls -k 'b'
427
+ *.ppt -k 'b'
116
428
  END_CVS_WRAPPERS
117
429
  end
118
430
 
119
- def set_owner(dir,username,groupname)
120
- info = Etc.getpwnam(username)
121
- if !info.nil? then
122
- user_id = info.uid
123
- group_id = info.gid
124
- if !groupname.nil? then
125
- group_id = Etc.getgrnam(groupname).gid
126
- end
127
- File.chown(user_id,group_id,dir)
128
- Dir.glob(File.join(dir,'**/*')).each do |file|
129
- if file[0] != '.' then
130
- mode = File.stat(file).mode | 0020
131
- File.chmod(mode,file)
132
- File.chown(user_id,group_id,file)
133
- end
431
+ def set_owner(dir,username,groupname)
432
+ info = Etc.getpwnam(username)
433
+ if !info.nil? then
434
+ user_id = info.uid
435
+ group_id = info.gid
436
+ if !groupname.nil? then
437
+ group_id = Etc.getgrnam(groupname).gid
438
+ end
439
+ mode = File.stat(dir).mode | 02775
440
+ File.chmod(mode,dir)
441
+ File.chown(user_id,group_id,dir)
442
+ Dir.glob(File.join(dir,'**/*')).each do |file|
443
+ if file[0] != '.' then
444
+ mode = File.stat(file).mode | 02775
445
+ File.chmod(mode,file)
446
+ File.chown(user_id,group_id,file)
134
447
  end
135
448
  end
136
449
  end
137
-
138
450
  end
139
451
 
140
- end
452
+ end
453
+
454
+ end
455
+