motiro 0.6.6 → 0.6.7

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.
Files changed (40) hide show
  1. data/README +1 -1
  2. data/app/controllers/wiki_controller.rb +14 -1
  3. data/app/core/version.rb +1 -1
  4. data/app/core/wiki_reporter.rb +4 -17
  5. data/app/helpers/application_helper.rb +33 -0
  6. data/app/helpers/report_helper.rb +39 -0
  7. data/app/helpers/report_helper.rb.rej +46 -0
  8. data/app/helpers/wiki_helper.rb +1 -1
  9. data/app/models/change.rb +12 -41
  10. data/app/models/chunk.rb +56 -0
  11. data/app/models/page.rb +17 -0
  12. data/app/models/revision.rb +31 -0
  13. data/app/reporters/events_reporter.rb +0 -2
  14. data/app/views/report/show.rhtml +2 -2
  15. data/app/views/wiki/diff.rhtml +4 -0
  16. data/app/views/wiki/history.rhtml +32 -21
  17. data/app/views/wiki/history.rhtml.rej +63 -0
  18. data/config/motiro.yml +1 -1
  19. data/config/routes.rb +3 -0
  20. data/db/motirodb.sqlite.initial +0 -0
  21. data/db/translation/pt-BR.rb +6 -1
  22. data/db/translation/pt-BR.rb.rej +26 -0
  23. data/lib/diff_chunk_builder.rb +98 -0
  24. data/lib/tasks/packaging.rake +2 -1
  25. data/public/stylesheets/motiro.css +49 -18
  26. data/public/stylesheets/motiro.css.rej +37 -0
  27. data/public/wiki/history/OtherPage-en-us.xml +40 -0
  28. data/test/fixtures/pages.yml +1 -1
  29. data/test/fixtures/revisions.yml +15 -4
  30. data/test/functional/report_features_test.rb +7 -1
  31. data/test/functional/root_controller_test.rb +1 -1
  32. data/test/functional/wiki_controller_test.rb +44 -4
  33. data/test/unit/change_test.rb +29 -56
  34. data/test/unit/diff_chunk_builder_test.rb +269 -0
  35. data/test/unit/page_test.rb +46 -0
  36. data/test/unit/revision_test.rb +160 -0
  37. data/test/unit/wiki_reporter_test.rb +2 -1
  38. metadata +301 -283
  39. data/app/models/diff_table_builder.rb +0 -285
  40. data/test/unit/diff_table_builder_test.rb +0 -602
data/README CHANGED
@@ -15,7 +15,7 @@ You should have received a copy of the GNU General Public License
15
15
  along with this program; if not, write to the Free Software
16
16
  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
17
17
  --------------------------------------------------------------------------------
18
- Motiro version 0.6.6 - June 2007
18
+ Motiro version 0.6.7 - July 2007
19
19
 
20
20
  Please refer to your preferred language README. Every text file below this
21
21
  directory is UTF-8 encoded. Please make sure to set up your reader accordingly.
@@ -19,7 +19,7 @@ class WikiController < ApplicationController
19
19
 
20
20
  layout :choose_layout
21
21
 
22
- before_filter :login_required, :except => [:show, :last, :history]
22
+ before_filter :login_required, :except => [:show, :last, :history, :diff]
23
23
  before_filter :fetch_page, :fetch_revision
24
24
  before_filter :check_edit_access, :only => [:edit, :save]
25
25
 
@@ -100,6 +100,19 @@ class WikiController < ApplicationController
100
100
  end
101
101
  end
102
102
 
103
+ def diff
104
+ redirect_to params.delete_if {|k,v| :btnCompare == k.to_sym} if params[:btnCompare]
105
+ @old_revision_num = params[:old_revision]
106
+ @new_revision_num = params[:new_revision]
107
+ @old_revision = @page.revisions[@old_revision_num.to_i - 1]
108
+ new_revision = @page.revisions[@new_revision_num.to_i - 1]
109
+ unless @old_revision && new_revision
110
+ flash[:notice] = '%s has no revision %s' / @page.name /
111
+ (@old_revision.nil? ? @old_revision_num : @new_revision_num)
112
+ redirect_to :action => 'show', :page_name => params[:page_name]
113
+ end
114
+ end
115
+
103
116
  def access_denied
104
117
  redirect_to :controller => 'wiki', :action => 'show',
105
118
  :page_name => params[:page_name]
data/app/core/version.rb CHANGED
@@ -1 +1 @@
1
- MOTIRO_VERSION = '0.6.6'
1
+ MOTIRO_VERSION = '0.6.7'
@@ -18,9 +18,6 @@
18
18
  require 'core/reporter'
19
19
  require 'core/settings'
20
20
 
21
- DEFAULT_AUTHOR = 'someone'
22
- DEFAULT_TIME = Time.local(2007, 1, 3, 15, 10)
23
-
24
21
  class WikiReporter < MotiroReporter
25
22
 
26
23
  caching :off
@@ -40,12 +37,13 @@ class WikiReporter < MotiroReporter
40
37
  end
41
38
 
42
39
  def latest_headlines(rid='')
43
- to_headlines @page_provider.find(:all, find_opts.merge(
44
- :limit => @settings.package_size))
40
+ @page_provider.find(:all, find_opts.merge(
41
+ :limit => @settings.package_size)).
42
+ map {|p| p.to_headline}
45
43
  end
46
44
 
47
45
  def headlines
48
- to_headlines @page_provider.find(:all, find_opts)
46
+ @page_provider.find(:all, find_opts).map {|p| p.to_headline}
49
47
  end
50
48
 
51
49
  def params_for(page_name)
@@ -54,8 +52,6 @@ class WikiReporter < MotiroReporter
54
52
 
55
53
  def column; 'modified_at'; end
56
54
 
57
- def extract_happened_at(page); page.modified_at; end
58
-
59
55
  private
60
56
 
61
57
  def self.button_for_creating(kind)
@@ -71,13 +67,4 @@ private
71
67
  { :conditions => "kind = '#{name.singularize}'", :order => "#{column} DESC" }
72
68
  end
73
69
 
74
- def to_headlines(pages)
75
- pages.map do |page|
76
- Headline.new(:rid => page.name,
77
- :author => page.last_editor ? page.last_editor.login : DEFAULT_AUTHOR,
78
- :happened_at => extract_happened_at(page) || DEFAULT_TIME,
79
- :description => page.title + "\n\n" + page.text)
80
- end
81
- end
82
-
83
70
  end
@@ -67,6 +67,39 @@ module ApplicationHelper
67
67
  end
68
68
  concat(xml, block.binding)
69
69
  end
70
+
71
+ def render_diff_table(chunks)
72
+ Builder::XmlMarkup.new.table :class => 'diff', :cellspacing => '0' do |b|
73
+ b.colgroup do
74
+ b.col :class => 'line_number'
75
+ b.col :class => 'left'
76
+ b.col :class => 'right'
77
+ b.col :class => 'line_number'
78
+ end
79
+ chunks.each do |chunk|
80
+ if chunk.separator?
81
+ b.tbody :class => 'separator' do
82
+ b.tr do
83
+ b.td
84
+ b.td('%s more lines' / chunk.num_lines.to_s, :colspan => '2')
85
+ b.td
86
+ end
87
+ end
88
+ else
89
+ b.tbody :class => chunk.action.to_s do
90
+ chunk.lines.each do |line|
91
+ b.tr do
92
+ b.td {b << (line.original_position || '&nbsp;').to_s}
93
+ b.td {b.pre{b << (h(line.original_text) || '&nbsp;')}}
94
+ b.td {b.pre{b << (h(line.modified_text) || '&nbsp;')}}
95
+ b.td {b << (line.modified_position || '&nbsp;').to_s}
96
+ end
97
+ end
98
+ end
99
+ end
100
+ end
101
+ end
102
+ end
70
103
 
71
104
  end
72
105
 
@@ -1,2 +1,41 @@
1
+ # Motiro - A project tracking tool
2
+ # Copyright (C) 2006-2007 Thiago Arrais
3
+ #
4
+ # This program is free software; you can redistribute it and/or modify
5
+ # it under the terms of the GNU General Public License as published by
6
+ # the Free Software Foundation; either version 2 of the License, or
7
+ # any later version.
8
+ #
9
+ # This program is distributed in the hope that it will be useful,
10
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
+ # GNU General Public License for more details.
13
+ #
14
+ # You should have received a copy of the GNU General Public License
15
+ # along with this program; if not, write to the Free Software
16
+ # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
17
+
1
18
  module ReportHelper
19
+
20
+ def render_diff(change)
21
+ return '' unless change.chunked_diff
22
+ Builder::XmlMarkup.new.div(:id => ref(change),
23
+ :class => "diff-window") do |b|
24
+ b.h2 'Changes to %s' / change.resource_name
25
+ b << render_diff_table(change.chunked_diff)
26
+ end
27
+ end
28
+
29
+ def render_summary(change)
30
+ summary = html_escape(change.summary)
31
+ if (change.has_diff?)
32
+ "<a href='\#' onClick=\"showOnly('#{ref(change)}')\">#{summary}</a>"
33
+ else
34
+ summary
35
+ end
36
+ end
37
+
38
+ def ref(change)
39
+ "change" + change.summary.hash.to_s
40
+ end
2
41
  end
@@ -0,0 +1,46 @@
1
+ ***************
2
+ *** 22,57 ****
3
+ Builder::XmlMarkup.new.div(:id => ref(change),
4
+ :class => "diff-window") do |b|
5
+ b.h2 'Changes to %s' / change.resource_name
6
+ - b.table :class => 'diff', :cellspacing => '0' do
7
+ - b.colgroup do
8
+ - b.col :class => 'line_number'
9
+ - b.col :class => 'left'
10
+ - b.col :class => 'right'
11
+ - b.col :class => 'line_number'
12
+ - end
13
+ - change.chunked_diff.each do |chunk|
14
+ - if chunk.separator?
15
+ - b.tbody :class => 'separator' do
16
+ - b.tr do
17
+ - b.td
18
+ - b.td('%s more lines' / chunk.num_lines.to_s, :colspan => '2')
19
+ - b.td
20
+ - end
21
+ - end
22
+ - else
23
+ - b.tbody :class => chunk.action.to_s do
24
+ - chunk.lines.each do |line|
25
+ - b.tr do
26
+ - b.td {b << (line.original_position || '&nbsp;').to_s}
27
+ - b.td {b.pre{b << (h(line.original_text) || '&nbsp;')}}
28
+ - b.td {b.pre{b << (h(line.modified_text) || '&nbsp;')}}
29
+ - b.td {b << (line.modified_position || '&nbsp;').to_s}
30
+ - end
31
+ - end
32
+ - end
33
+ - end
34
+ - end
35
+ - end
36
+ end
37
+ end
38
+
39
+ --- 22,28 ----
40
+ Builder::XmlMarkup.new.div(:id => ref(change),
41
+ :class => "diff-window") do |b|
42
+ b.h2 'Changes to %s' / change.resource_name
43
+ + b << render_diff_table(change.chunked_diff)
44
+ end
45
+ end
46
+
@@ -4,7 +4,7 @@ module WikiHelper
4
4
  case page.revisions.size
5
5
  when 0 then ''
6
6
  when 1 then '| ' + 'Page has no history yet'.t
7
- else '| ' + link_to('Page history (%d revisions)' / page.revisions.size,
7
+ else '| ' + link_to('Page history (%s revisions)'/page.revisions.size.to_s,
8
8
  :controller => 'wiki', :action => 'history',
9
9
  :page_name => page.name)
10
10
  end
data/app/models/change.rb CHANGED
@@ -15,39 +15,12 @@
15
15
  # along with this program; if not, write to the Free Software
16
16
  # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
17
17
 
18
- require 'erb'
19
-
20
18
  class Change < ActiveRecord::Base
21
19
 
22
- include ERB::Util
23
-
24
- def to_s
25
- return summary
26
- end
27
-
28
- def render_summary
29
- if (has_diff?)
30
- return "<a href='\#' onClick=\"showOnly('#{ref}')\">#{html_escape(summary)}</a>"
31
- else
32
- return summary
33
- end
34
- end
35
-
36
- def render_diff
37
- if (has_diff?)
38
- return "<div id='#{ref}' class='diff-window'>" +
39
- "<center>" +
40
- "<h2>#{'Changes to %s' / resource_name}</h2>\n" +
41
- render_diff_table +
42
- "</center>" +
43
- "</div>"
44
- else
45
- return ''
46
- end
47
- end
48
-
49
- def render_diff_table
50
- @differ ||= DiffTableBuilder.new
20
+ def chunked_diff
21
+ return nil unless has_diff?
22
+ return @chunked_diff if @chunked_diff
23
+ @differ ||= DiffChunkBuilder.new
51
24
  diff.split("\n").each do |line|
52
25
  c = line[0,1]
53
26
  line_text = line[1, line.length - 1]
@@ -64,7 +37,11 @@ class Change < ActiveRecord::Base
64
37
  end
65
38
  end
66
39
 
67
- return @differ.render_diff_table
40
+ @chunked_diff = @differ.get_chunks
41
+ end
42
+
43
+ def to_s
44
+ return summary
68
45
  end
69
46
 
70
47
  def qualified_resource_name
@@ -76,21 +53,15 @@ class Change < ActiveRecord::Base
76
53
  end
77
54
 
78
55
  def filled?
79
- !self.resource_kind.nil? && ('dir' == self.resource_kind || !self.diff.nil?)
56
+ self.resource_kind && ('dir' == self.resource_kind || has_diff?)
80
57
  end
81
58
 
82
- def use_differ(differ)
83
- @differ = differ
84
- end
85
-
86
- private
87
-
88
59
  def has_diff?
89
60
  return ! (diff.nil? or diff.empty?)
90
61
  end
91
62
 
92
- def ref
93
- return "change" + summary.hash.to_s
63
+ def use_differ(differ)
64
+ @differ = differ
94
65
  end
95
66
 
96
67
  end
@@ -0,0 +1,56 @@
1
+ # Motiro - A project tracking tool
2
+ # Copyright (C) 2006-2007 Thiago Arrais
3
+ #
4
+ # This program is free software; you can redistribute it and/or modify
5
+ # it under the terms of the GNU General Public License as published by
6
+ # the Free Software Foundation; either version 2 of the License, or
7
+ # any later version.
8
+ #
9
+ # This program is distributed in the hope that it will be useful,
10
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
+ # GNU General Public License for more details.
13
+ #
14
+ # You should have received a copy of the GNU General Public License
15
+ # along with this program; if not, write to the Free Software
16
+ # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
17
+
18
+ class Chunk
19
+ attr_reader :lines, :action
20
+
21
+ def initialize(action)
22
+ @action = action
23
+ end
24
+
25
+ def unchanged?
26
+ :unchanged == action
27
+ end
28
+
29
+ def separator?; false; end
30
+
31
+ def <<(line)
32
+ @lines ||= []
33
+ @lines << line
34
+ end
35
+ end
36
+
37
+ class Line
38
+ attr_reader :original_text, :original_position,
39
+ :modified_text, :modified_position
40
+
41
+ def initialize(old_text, old_pos, new_text, new_pos)
42
+ @original_text, @modified_text = old_text, new_text
43
+ @original_position = old_text && old_pos
44
+ @modified_position = new_text && new_pos
45
+ end
46
+ end
47
+
48
+ class Separator
49
+ attr_reader :num_lines
50
+
51
+ def initialize(num_lines)
52
+ @num_lines = num_lines
53
+ end
54
+
55
+ def separator?; true; end
56
+ end
data/app/models/page.rb CHANGED
@@ -16,6 +16,8 @@
16
16
  # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
17
17
 
18
18
  PLACE_HOLDER_TITLE = 'Insert page title here'
19
+ DEFAULT_AUTHOR = 'someone'
20
+ DEFAULT_TIME = Time.local(2007, 1, 3, 15, 10)
19
21
 
20
22
  class Page < ActiveRecord::Base
21
23
 
@@ -110,8 +112,23 @@ class Page < ActiveRecord::Base
110
112
  self
111
113
  end
112
114
 
115
+ def to_headline
116
+ #TODO (for 0.7): headlines and pages should _really_ be the same thing
117
+ # reporters should write ordinary wiki pages
118
+ Headline.new(:rid => name,
119
+ :author => last_editor ? last_editor.login : DEFAULT_AUTHOR,
120
+ :happened_at => (kind == 'event' ? happens_at.to_t : modified_at) || DEFAULT_TIME,
121
+ :description => inject_title_into_text)
122
+ end
123
+
113
124
  private
114
125
 
126
+ def inject_title_into_text
127
+ title + "\n\n" +
128
+ text.gsub(/^--- (\S+) ----*[ \t\f]*\r?\n/,
129
+ "--- \\1 ---\n\n#{title}\n")
130
+ end
131
+
115
132
  def name_from_title
116
133
  sequence(Page, drop_non_alpha(clean(title)).downcase.gsub(/ /, '_').camelize, 'name')
117
134
  end
@@ -15,6 +15,9 @@
15
15
  # along with this program; if not, write to the Free Software
16
16
  # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
17
17
 
18
+ require 'diff/lcs'
19
+ require 'diff/lcs/array'
20
+
18
21
  class Revision < ActiveRecord::Base
19
22
  belongs_to :page
20
23
  belongs_to :last_editor, :class_name => 'User', :foreign_key => 'last_editor_id'
@@ -23,5 +26,33 @@ class Revision < ActiveRecord::Base
23
26
  %w{name original_author revisions}.each do |method|
24
27
  define_method(method) { page.send(method) }
25
28
  end
29
+
30
+ LCS_ACTION_TO_SYMBOL = {'=' => :unchanged, '!' => :modification,
31
+ '-' => :removal, '+' => :addition}
32
+
33
+ def diff(rev_num)
34
+ #position numbers are 1-based, but we want 0-based when indexing revisions
35
+ sdiffs = text.split($/).sdiff(page.revisions[rev_num - 1].text.split($/))
36
+ chunks = []
37
+ last_action = chunk = nil
38
+ sdiffs.each do |sdiff|
39
+ if chunk_break_needed(last_action, sdiff.action)
40
+ chunk = Chunk.new(LCS_ACTION_TO_SYMBOL[sdiff.action])
41
+ chunks << chunk
42
+ end
43
+ last_action = sdiff.action
44
+ #lcs's position are 0-based, but we want 1-based when rendering
45
+ chunk << Line.new(sdiff.old_element, sdiff.old_position + 1,
46
+ sdiff.new_element, sdiff.new_position + 1)
47
+ end
48
+
49
+ chunks
50
+ end
51
+
52
+ private
53
+
54
+ def chunk_break_needed(prev, curr)
55
+ prev.nil? || curr != prev && [prev, curr].include?('=')
56
+ end
26
57
 
27
58
  end
@@ -23,6 +23,4 @@ class EventsReporter < WikiReporter
23
23
 
24
24
  def column; 'happens_at'; end
25
25
 
26
- def extract_happened_at(page); page.happens_at.to_t; end
27
-
28
26
  end
@@ -4,7 +4,7 @@
4
4
  <%= @renderer.render_html(@headline.description(Translator.for(@locale))) %>
5
5
  <div id="summary">
6
6
  <% @headline.changes.each do |change| %>
7
- <%= change.render_summary -%>
7
+ <%= render_summary(change) -%>
8
8
  <br/>
9
9
  <% end %>
10
10
  </div>
@@ -13,7 +13,7 @@
13
13
  <% cache(:action => 'show', :suffix => 'changes', :locale => @locale) do %>
14
14
  <div id="changes">
15
15
  <% @headline.changes.each do |change| %>
16
- <%= change.render_diff %>
16
+ <%= render_diff(change) %>
17
17
  <% end %>
18
18
  </div>
19
19
  <% end %>
@@ -0,0 +1,4 @@
1
+ <% pagetext(@page.title, '(Comparing revisions %s and %s)' / @old_revision_num / @new_revision_num) do %>
2
+ <%= render_diff_table(@old_revision.diff(@new_revision_num.to_i))%>
3
+ <%= render :partial => 'editbar' %>
4
+ <% end %>
@@ -1,26 +1,37 @@
1
1
  <% pagetext('Page history for %s' / @page.title) do %>
2
- <table class="oldernews">
3
- <thead>
4
- <tr>
5
- <th class="date"><%= 'Date'.t -%></th>
6
- <th class="relative"/>
7
- <th><%= 'Author'.t -%></th>
8
- <th><%= 'Title'.t -%></th>
9
- </tr>
10
- </thead>
11
- <tbody>
12
- <% @page.revisions.reverse.each do |rev| %>
13
- <tr class="<%= rev.position % 2 == 0 ? 'odd' : 'even' -%>">
14
- <td class="date"><%= rev.modified_at-%></td>
15
- <td class="relative"><%= rev.modified_at.relative_to_now %></td>
16
- <td><%= rev.last_editor.login %></td>
17
- <td><%= content_tag :a, rev.title,
2
+ <% form_tag "/wiki/diff/#{params[:page_name]}", :method => 'get' do %>
3
+ <%= submit_tag 'Compare revisions'.t, :class => 'button',
4
+ :name => 'btnCompare' %>
5
+ <table class="oldernews">
6
+ <thead>
7
+ <tr>
8
+ <th/>
9
+ <th class="date"><%= 'Date'.t -%></th>
10
+ <th><%= 'Author'.t -%></th>
11
+ </tr>
12
+ </thead>
13
+ <tbody>
14
+ <% last_position = @page.revisions.last.position %>
15
+ <% @page.revisions.reverse.each do |rev| %>
16
+ <tr class="<%= rev.position % 2 == 0 ? 'odd' : 'even' -%>">
17
+ <td>
18
+ <input type="radio" name="old_revision" value="<%= rev.position-%>"
19
+ <%= 'checked="checked"' if last_position -1 == rev.position -%> />
20
+ <input type="radio" name="new_revision" value="<%= rev.position-%>"
21
+ <%= 'checked="checked"' if last_position == rev.position -%> />
22
+ </td>
23
+ <td class="date">
24
+ <%= content_tag :a, rev.modified_at,
18
25
  :href => server_url_for(:controller => 'wiki',
19
26
  :action => 'show',
20
27
  :page_name => @page.name,
21
- :revision => rev.position) -%></td>
22
- </tr>
23
- <% end %>
24
- </tbody>
25
- </table>
28
+ :revision => rev.position) %>
29
+ (<%= rev.modified_at.relative_to_now -%>)
30
+ </td>
31
+ <td><%= rev.last_editor.login %></td>
32
+ </tr>
33
+ <% end %>
34
+ </tbody>
35
+ </table>
36
+ <% end %>
26
37
  <% end %>
@@ -0,0 +1,63 @@
1
+ ***************
2
+ *** 1,26 ****
3
+ <% pagetext('Page history for %s' / @page.title) do %>
4
+ - <table class="oldernews">
5
+ - <thead>
6
+ - <tr>
7
+ - <th class="date"><%= 'Date'.t -%></th>
8
+ - <th class="relative"/>
9
+ - <th><%= 'Author'.t -%></th>
10
+ - <th><%= 'Title'.t -%></th>
11
+ - </tr>
12
+ - </thead>
13
+ - <tbody>
14
+ - <% @page.revisions.reverse.each do |rev| %>
15
+ - <tr class="<%= rev.position % 2 == 0 ? 'odd' : 'even' -%>">
16
+ - <td class="date"><%= rev.modified_at-%></td>
17
+ - <td class="relative"><%= rev.modified_at.relative_to_now %></td>
18
+ - <td><%= rev.last_editor.login %></td>
19
+ - <td><%= content_tag :a, rev.title,
20
+ :href => server_url_for(:controller => 'wiki',
21
+ :action => 'show',
22
+ :page_name => @page.name,
23
+ - :revision => rev.position) -%></td>
24
+ - </tr>
25
+ - <% end %>
26
+ - </tbody>
27
+ - </table>
28
+ <% end %>
29
+ --- 1,34 ----
30
+ <% pagetext('Page history for %s' / @page.title) do %>
31
+ + <% form_tag "/wiki/diff/#{params[:page_name]}", :method => 'get' do %>
32
+ + <%= submit_tag 'Compare revisions'.t, :class => 'button',
33
+ + :name => 'btnCompare' %>
34
+ + <table class="oldernews">
35
+ + <thead>
36
+ + <tr>
37
+ + <th/>
38
+ + <th class="date"><%= 'Date'.t -%></th>
39
+ + <th><%= 'Author'.t -%></th>
40
+ + </tr>
41
+ + </thead>
42
+ + <tbody>
43
+ + <% @page.revisions.reverse.each do |rev| %>
44
+ + <tr class="<%= rev.position % 2 == 0 ? 'odd' : 'even' -%>">
45
+ + <td>
46
+ + <input type="radio" name="old_revision" value="<%= rev.position-%>" />
47
+ + <input type="radio" name="new_revision" value="<%= rev.position-%>" />
48
+ + </td>
49
+ + <td class="date">
50
+ + <%= content_tag :a, rev.modified_at,
51
+ :href => server_url_for(:controller => 'wiki',
52
+ :action => 'show',
53
+ :page_name => @page.name,
54
+ + :revision => rev.position) %>
55
+ + (<%= rev.modified_at.relative_to_now -%>)
56
+ + </td>
57
+ + <td><%= rev.last_editor.login %></td>
58
+ + </tr>
59
+ + <% end %>
60
+ + </tbody>
61
+ + </table>
62
+ + <% end %>
63
+ <% end %>
data/config/motiro.yml CHANGED
@@ -29,7 +29,7 @@ subversion:
29
29
  #
30
30
  # Tells the reporter where to find your project's repository
31
31
  # Default: https://svn.sourceforge.net/svnroot/motiro
32
- repo: https://svn.sourceforge.net/svnroot/motiro
32
+ repo: https://motiro.svn.sourceforge.net/svnroot/motiro
33
33
 
34
34
  # subversion/{user,password}
35
35
  #
data/config/routes.rb CHANGED
@@ -42,6 +42,9 @@ ActionController::Routing::Routes.draw do |map|
42
42
  :action => 'last',
43
43
  :defaults => locale_defaults.merge(:kind => 'common')
44
44
 
45
+ map.connect 'wiki/diff/:page_name/:old_revision/:new_revision',
46
+ :controller => 'wiki', :action => 'diff'
47
+
45
48
  map.connect 'wiki/:action/:locale',
46
49
  :controller => 'wiki',
47
50
  :requirements => { :action => /properties_(show|edit)/ },
Binary file
@@ -44,6 +44,7 @@
44
44
  'Revision %s' => 'Revisão %s',
45
45
  'Changes to %s' => 'Alterações em %s',
46
46
  'The article %s from the %s reporter could not be found' => 'Não foi possível encontrar o artigo %s do repórter %s',
47
+ '%s more lines' => '%s linhas a mais',
47
48
 
48
49
  # Event details and new event pages
49
50
  'Events' => 'Eventos',
@@ -70,10 +71,14 @@
70
71
  'event description' => 'descrição de evento',
71
72
  'Who should be able to edit this page?' => 'Quem pode editar esta página?',
72
73
  '(Usernames separated by spaces. Blank for everyone)' => '(Nomes de usuário separados por espaços. Em branco para todos.)',
74
+ '(Comparing revisions %s and %s)' => '(Diferenças entre as revisões %s e %s)',
73
75
 
74
76
  # Older headlines and history pages
75
77
  'Author' => 'Autor',
78
+ 'Page has no history yet' => 'Página ainda sem histórico',
76
79
  'Page history for %s' => 'Histórico da página %s',
80
+ 'Page history (%s revisions)' => 'Histórico da página (%s revisões)',
77
81
  'Page history' => 'Histórico da página',
78
- '(Revision %s)' => '(Revisão %s)'
82
+ '(Revision %s)' => '(Revisão %s)',
83
+ 'Compare revisions' => 'Comparar revisões'
79
84
  }