<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array">
    <added>
      <filename>vendor/plugins/acts_as_attachable/init.rb</filename>
    </added>
    <added>
      <filename>vendor/plugins/acts_as_attachable/lib/acts_as_attachable.rb</filename>
    </added>
  </added>
  <modified type="array">
    <modified>
      <diff>@@ -1,5 +1,5 @@
-# redMine - project management software
-# Copyright (C) 2006-2007  Jean-Philippe Lang
+# Redmine - project management software
+# Copyright (C) 2006-2008  Jean-Philippe Lang
 #
 # This program is free software; you can redistribute it and/or
 # modify it under the terms of the GNU General Public License
@@ -17,7 +17,11 @@
 
 class AttachmentsController &lt; ApplicationController
   before_filter :find_project
-
+  before_filter :read_authorize, :except =&gt; :destroy
+  before_filter :delete_authorize, :only =&gt; :destroy
+  
+  verify :method =&gt; :post, :only =&gt; :destroy
+  
   def show
     if @attachment.is_diff?
       @diff = File.new(@attachment.diskfile, &quot;rb&quot;).read
@@ -37,19 +41,32 @@ class AttachmentsController &lt; ApplicationController
     send_file @attachment.diskfile, :filename =&gt; filename_for_content_disposition(@attachment.filename),
                                     :type =&gt; @attachment.content_type, 
                                     :disposition =&gt; (@attachment.image? ? 'inline' : 'attachment')
+   
   end
- 
+  
+  def destroy
+    # Make sure association callbacks are called
+    @attachment.container.attachments.delete(@attachment)
+    redirect_to :back
+  rescue ::ActionController::RedirectBackError
+    redirect_to :controller =&gt; 'projects', :action =&gt; 'show', :id =&gt; @project
+  end
+  
 private
   def find_project
     @attachment = Attachment.find(params[:id])
     # Show 404 if the filename in the url is wrong
     raise ActiveRecord::RecordNotFound if params[:filename] &amp;&amp; params[:filename] != @attachment.filename
-    
     @project = @attachment.project
-    permission = @attachment.container.is_a?(Version) ? :view_files : &quot;view_#{@attachment.container.class.name.underscore.pluralize}&quot;.to_sym
-    allowed = User.current.allowed_to?(permission, @project)
-    allowed ? true : (User.current.logged? ? render_403 : require_login)
   rescue ActiveRecord::RecordNotFound
     render_404
   end
+  
+  def read_authorize
+    @attachment.visible? ? true : deny_access
+  end
+  
+  def delete_authorize
+    @attachment.deletable? ? true : deny_access
+  end
 end</diff>
      <filename>app/controllers/attachments_controller.rb</filename>
    </modified>
    <modified>
      <diff>@@ -70,11 +70,6 @@ class DocumentsController &lt; ApplicationController
     Mailer.deliver_attachments_added(attachments) if !attachments.empty? &amp;&amp; Setting.notified_events.include?('document_added')
     redirect_to :action =&gt; 'show', :id =&gt; @document
   end
-  
-  def destroy_attachment
-    @document.attachments.find(params[:attachment_id]).destroy
-    redirect_to :action =&gt; 'show', :id =&gt; @document
-  end
 
 private
   def find_project</diff>
      <filename>app/controllers/documents_controller.rb</filename>
    </modified>
    <modified>
      <diff>@@ -18,7 +18,7 @@
 class IssuesController &lt; ApplicationController
   menu_item :new_issue, :only =&gt; :new
   
-  before_filter :find_issue, :only =&gt; [:show, :edit, :reply, :destroy_attachment]
+  before_filter :find_issue, :only =&gt; [:show, :edit, :reply]
   before_filter :find_issues, :only =&gt; [:bulk_edit, :move, :destroy]
   before_filter :find_project, :only =&gt; [:new, :update_form, :preview]
   before_filter :authorize, :except =&gt; [:index, :changes, :gantt, :calendar, :preview, :update_form, :context_menu]
@@ -313,17 +313,6 @@ class IssuesController &lt; ApplicationController
     @issues.each(&amp;:destroy)
     redirect_to :action =&gt; 'index', :project_id =&gt; @project
   end
-
-  def destroy_attachment
-    a = @issue.attachments.find(params[:attachment_id])
-    a.destroy
-    journal = @issue.init_journal(User.current)
-    journal.details &lt;&lt; JournalDetail.new(:property =&gt; 'attachment',
-                                         :prop_key =&gt; a.id,
-                                         :old_value =&gt; a.filename)
-    journal.save
-    redirect_to :action =&gt; 'show', :id =&gt; @issue
-  end
   
   def gantt
     @gantt = Redmine::Helpers::Gantt.new(params)</diff>
      <filename>app/controllers/issues_controller.rb</filename>
    </modified>
    <modified>
      <diff>@@ -37,12 +37,6 @@ class VersionsController &lt; ApplicationController
     redirect_to :controller =&gt; 'projects', :action =&gt; 'settings', :tab =&gt; 'versions', :id =&gt; @project
   end
   
-  def destroy_file
-    @version.attachments.find(params[:attachment_id]).destroy
-    flash[:notice] = l(:notice_successful_delete)
-    redirect_to :controller =&gt; 'projects', :action =&gt; 'list_files', :id =&gt; @project
-  end
-  
   def status_by
     respond_to do |format|
       format.html { render :action =&gt; 'show' }</diff>
      <filename>app/controllers/versions_controller.rb</filename>
    </modified>
    <modified>
      <diff>@@ -20,7 +20,7 @@ require 'diff'
 class WikiController &lt; ApplicationController
   before_filter :find_wiki, :authorize
   
-  verify :method =&gt; :post, :only =&gt; [:destroy, :destroy_attachment, :protect], :redirect_to =&gt; { :action =&gt; :index }
+  verify :method =&gt; :post, :only =&gt; [:destroy, :protect], :redirect_to =&gt; { :action =&gt; :index }
 
   helper :attachments
   include AttachmentsHelper   
@@ -187,13 +187,6 @@ class WikiController &lt; ApplicationController
     redirect_to :action =&gt; 'index', :page =&gt; @page.title
   end
 
-  def destroy_attachment
-    @page = @wiki.find_page(params[:page])
-    return render_403 unless editable?
-    @page.attachments.find(params[:attachment_id]).destroy
-    redirect_to :action =&gt; 'index', :page =&gt; @page.title
-  end
-
 private
   
   def find_wiki</diff>
      <filename>app/controllers/wiki_controller.rb</filename>
    </modified>
    <modified>
      <diff>@@ -16,10 +16,15 @@
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 
 module AttachmentsHelper
-  # displays the links to a collection of attachments
-  def link_to_attachments(attachments, options = {})
-    if attachments.any?
-      render :partial =&gt; 'attachments/links', :locals =&gt; {:attachments =&gt; attachments, :options =&gt; options}
+  # Displays view/delete links to the attachments of the given object
+  # Options:
+  #   :author -- author names are not displayed if set to false
+  def link_to_attachments(container, options = {})
+    options.assert_valid_keys(:author)
+    
+    if container.attachments.any?
+      options = {:deletable =&gt; container.attachments_deletable?, :author =&gt; true}.merge(options)
+      render :partial =&gt; 'attachments/links', :locals =&gt; {:attachments =&gt; container.attachments, :options =&gt; options}
     end
   end
   </diff>
      <filename>app/helpers/attachments_helper.rb</filename>
    </modified>
    <modified>
      <diff>@@ -98,6 +98,14 @@ class Attachment &lt; ActiveRecord::Base
     container.project
   end
   
+  def visible?(user=User.current)
+    container.attachments_visible?(user)
+  end
+  
+  def deletable?(user=User.current)
+    container.attachments_deletable?(user)
+  end
+  
   def image?
     self.filename =~ /\.(jpe?g|gif|png)$/i
   end</diff>
      <filename>app/models/attachment.rb</filename>
    </modified>
    <modified>
      <diff>@@ -18,7 +18,7 @@
 class Document &lt; ActiveRecord::Base
   belongs_to :project
   belongs_to :category, :class_name =&gt; &quot;Enumeration&quot;, :foreign_key =&gt; &quot;category_id&quot;
-  has_many :attachments, :as =&gt; :container, :dependent =&gt; :destroy
+  acts_as_attachable :delete_permission =&gt; :manage_documents
 
   acts_as_searchable :columns =&gt; ['title', &quot;#{table_name}.description&quot;], :include =&gt; :project
   acts_as_event :title =&gt; Proc.new {|o| &quot;#{l(:label_document)}: #{o.title}&quot;},</diff>
      <filename>app/models/document.rb</filename>
    </modified>
    <modified>
      <diff>@@ -26,13 +26,13 @@ class Issue &lt; ActiveRecord::Base
   belongs_to :category, :class_name =&gt; 'IssueCategory', :foreign_key =&gt; 'category_id'
 
   has_many :journals, :as =&gt; :journalized, :dependent =&gt; :destroy
-  has_many :attachments, :as =&gt; :container, :dependent =&gt; :destroy
   has_many :time_entries, :dependent =&gt; :delete_all
   has_and_belongs_to_many :changesets, :order =&gt; &quot;#{Changeset.table_name}.committed_on ASC, #{Changeset.table_name}.id ASC&quot;
   
   has_many :relations_from, :class_name =&gt; 'IssueRelation', :foreign_key =&gt; 'issue_from_id', :dependent =&gt; :delete_all
   has_many :relations_to, :class_name =&gt; 'IssueRelation', :foreign_key =&gt; 'issue_to_id', :dependent =&gt; :delete_all
   
+  acts_as_attachable :after_remove =&gt; :attachment_removed
   acts_as_customizable
   acts_as_watchable
   acts_as_searchable :columns =&gt; ['subject', &quot;#{table_name}.description&quot;, &quot;#{Journal.table_name}.notes&quot;],
@@ -261,4 +261,15 @@ class Issue &lt; ActiveRecord::Base
   def to_s
     &quot;#{tracker} ##{id}: #{subject}&quot;
   end
+  
+  private
+  
+  # Callback on attachment deletion
+  def attachment_removed(obj)
+    journal = init_journal(User.current)
+    journal.details &lt;&lt; JournalDetail.new(:property =&gt; 'attachment',
+                                         :prop_key =&gt; obj.id,
+                                         :old_value =&gt; obj.filename)
+    journal.save
+  end
 end</diff>
      <filename>app/models/issue.rb</filename>
    </modified>
    <modified>
      <diff>@@ -19,7 +19,7 @@ class Message &lt; ActiveRecord::Base
   belongs_to :board
   belongs_to :author, :class_name =&gt; 'User', :foreign_key =&gt; 'author_id'
   acts_as_tree :counter_cache =&gt; :replies_count, :order =&gt; &quot;#{Message.table_name}.created_on ASC&quot;
-  has_many :attachments, :as =&gt; :container, :dependent =&gt; :destroy
+  acts_as_attachable
   belongs_to :last_reply, :class_name =&gt; 'Message', :foreign_key =&gt; 'last_reply_id'
   
   acts_as_searchable :columns =&gt; ['subject', 'content'],</diff>
      <filename>app/models/message.rb</filename>
    </modified>
    <modified>
      <diff>@@ -19,7 +19,8 @@ class Version &lt; ActiveRecord::Base
   before_destroy :check_integrity
   belongs_to :project
   has_many :fixed_issues, :class_name =&gt; 'Issue', :foreign_key =&gt; 'fixed_version_id'
-  has_many :attachments, :as =&gt; :container, :dependent =&gt; :destroy
+  acts_as_attachable :view_permission =&gt; :view_files,
+                     :delete_permission =&gt; :manage_files
 
   validates_presence_of :name
   validates_uniqueness_of :name, :scope =&gt; [:project_id]</diff>
      <filename>app/models/version.rb</filename>
    </modified>
    <modified>
      <diff>@@ -21,7 +21,7 @@ require 'enumerator'
 class WikiPage &lt; ActiveRecord::Base
   belongs_to :wiki
   has_one :content, :class_name =&gt; 'WikiContent', :foreign_key =&gt; 'page_id', :dependent =&gt; :destroy
-  has_many :attachments, :as =&gt; :container, :dependent =&gt; :destroy
+  acts_as_attachable :delete_permission =&gt; :delete_wiki_pages_attachments
   acts_as_tree :order =&gt; 'title'
   
   acts_as_event :title =&gt; Proc.new {|o| &quot;#{l(:label_wiki)}: #{o.title}&quot;},
@@ -111,6 +111,10 @@ class WikiPage &lt; ActiveRecord::Base
   def editable_by?(usr)
     !protected? || usr.allowed_to?(:protect_wiki_pages, wiki.project)
   end
+        
+  def attachments_deletable?(usr=User.current)
+    editable_by?(usr) &amp;&amp; super(usr)
+  end
   
   def parent_title
     @parent_title || (self.parent &amp;&amp; self.parent.pretty_title)</diff>
      <filename>app/models/wiki_page.rb</filename>
    </modified>
    <modified>
      <diff>@@ -3,14 +3,14 @@
 &lt;p&gt;&lt;%= link_to_attachment attachment, :class =&gt; 'icon icon-attachment' -%&gt;
 &lt;%= h(&quot; - #{attachment.description}&quot;) unless attachment.description.blank? %&gt;
   &lt;span class=&quot;size&quot;&gt;(&lt;%= number_to_human_size attachment.filesize %&gt;)&lt;/span&gt;
-  &lt;% if options[:delete_url] %&gt;
-    &lt;%= link_to image_tag('delete.png'), options[:delete_url].update({:attachment_id =&gt; attachment}),
+  &lt;% if options[:deletable] %&gt;
+    &lt;%= link_to image_tag('delete.png'), {:controller =&gt; 'attachments', :action =&gt; 'destroy', :id =&gt; attachment},
                                          :confirm =&gt; l(:text_are_you_sure),
                                          :method =&gt; :post,
                                          :class =&gt; 'delete',
                                          :title =&gt; l(:button_delete) %&gt;
   &lt;% end %&gt;
-  &lt;% unless options[:no_author] %&gt;
+  &lt;% if options[:author] %&gt;
     &lt;span class=&quot;author&quot;&gt;&lt;%= attachment.author %&gt;, &lt;%= format_time(attachment.created_on) %&gt;&lt;/span&gt;
   &lt;% end %&gt;
   &lt;/p&gt;</diff>
      <filename>app/views/attachments/_links.rhtml</filename>
    </modified>
    <modified>
      <diff>@@ -12,7 +12,7 @@
 &lt;/div&gt;
 
 &lt;h3&gt;&lt;%= l(:label_attachment_plural) %&gt;&lt;/h3&gt;
-&lt;%= link_to_attachments @attachments, :delete_url =&gt; (authorize_for('documents', 'destroy_attachment') ? {:controller =&gt; 'documents', :action =&gt; 'destroy_attachment', :id =&gt; @document} : nil) %&gt;
+&lt;%= link_to_attachments @document %&gt;
 
 &lt;% if authorize_for('documents', 'add_attachment') %&gt;
 &lt;p&gt;&lt;%= link_to l(:label_attachment_new), {}, :onclick =&gt; &quot;Element.show('add_attachment_form'); Element.hide(this); Element.scrollTo('add_attachment_form'); return false;&quot;,</diff>
      <filename>app/views/documents/show.rhtml</filename>
    </modified>
    <modified>
      <diff>@@ -67,9 +67,7 @@ end %&gt;
 &lt;%= textilizable @issue, :description, :attachments =&gt; @issue.attachments %&gt;
 &lt;/div&gt;
 
-&lt;% if @issue.attachments.any? %&gt;
-&lt;%= link_to_attachments @issue.attachments, :delete_url =&gt; (authorize_for('issues', 'destroy_attachment') ? {:controller =&gt; 'issues', :action =&gt; 'destroy_attachment', :id =&gt; @issue} : nil) %&gt;
-&lt;% end %&gt;
+&lt;%= link_to_attachments @issue %&gt;
 
 &lt;% if authorize_for('issue_relations', 'new') || @issue.relations.any? %&gt;
 &lt;hr /&gt;</diff>
      <filename>app/views/issues/show.rhtml</filename>
    </modified>
    <modified>
      <diff>@@ -15,7 +15,7 @@
 &lt;div class=&quot;wiki&quot;&gt;
 &lt;%= textilizable(@topic.content, :attachments =&gt; @topic.attachments) %&gt;
 &lt;/div&gt;
-&lt;%= link_to_attachments @topic.attachments, :no_author =&gt; true %&gt;
+&lt;%= link_to_attachments @topic, :author =&gt; false %&gt;
 &lt;/div&gt;
 &lt;br /&gt;
 
@@ -31,7 +31,7 @@
   &lt;div class=&quot;message reply&quot;&gt;
   &lt;h4&gt;&lt;%=h message.subject %&gt; - &lt;%= authoring message.created_on, message.author %&gt;&lt;/h4&gt;
   &lt;div class=&quot;wiki&quot;&gt;&lt;%= textilizable message, :content, :attachments =&gt; message.attachments %&gt;&lt;/div&gt;
-  &lt;%= link_to_attachments message.attachments, :no_author =&gt; true %&gt;
+  &lt;%= link_to_attachments message, :author =&gt; false %&gt;
   &lt;/div&gt;
 &lt;% end %&gt;
 &lt;% end %&gt;</diff>
      <filename>app/views/messages/show.rhtml</filename>
    </modified>
    <modified>
      <diff>@@ -4,7 +4,7 @@
 
 &lt;h2&gt;&lt;%=l(:label_attachment_plural)%&gt;&lt;/h2&gt;
 
-&lt;% delete_allowed = authorize_for('versions', 'destroy_file') %&gt;
+&lt;% delete_allowed = User.current.allowed_to?(:manage_files, @project) %&gt;
 
 &lt;table class=&quot;list&quot;&gt;
   &lt;thead&gt;&lt;tr&gt;
@@ -30,7 +30,8 @@
     &lt;td align=&quot;center&quot;&gt;&lt;small&gt;&lt;%= file.digest %&gt;&lt;/small&gt;&lt;/td&gt;
     &lt;% if delete_allowed %&gt;
     &lt;td align=&quot;center&quot;&gt;
-        &lt;%= link_to_if_authorized image_tag('delete.png'), {:controller =&gt; 'versions', :action =&gt; 'destroy_file', :id =&gt; version, :attachment_id =&gt; file}, :confirm =&gt; l(:text_are_you_sure), :method =&gt; :post %&gt;
+        &lt;%= link_to image_tag('delete.png'), {:controller =&gt; 'attachments', :action =&gt; 'destroy', :id =&gt; file},
+																						 :confirm =&gt; l(:text_are_you_sure), :method =&gt; :post %&gt;
     &lt;/td&gt;
     &lt;% end %&gt;
   &lt;/tr&gt;		</diff>
      <filename>app/views/projects/list_files.rhtml</filename>
    </modified>
    <modified>
      <diff>@@ -28,7 +28,7 @@
 
 &lt;%= render(:partial =&gt; &quot;wiki/content&quot;, :locals =&gt; {:content =&gt; @content}) %&gt;
 
-&lt;%= link_to_attachments @page.attachments, :delete_url =&gt; ((@editable &amp;&amp; authorize_for('wiki', 'destroy_attachment')) ? {:controller =&gt; 'wiki', :action =&gt; 'destroy_attachment', :page =&gt; @page.title} : nil) %&gt;
+&lt;%= link_to_attachments @page %&gt;
 
 &lt;% if @editable &amp;&amp; authorize_for('wiki', 'add_attachment') %&gt;
 &lt;p&gt;&lt;%= link_to l(:label_attachment_new), {}, :onclick =&gt; &quot;Element.show('add_attachment_form'); Element.hide(this); Element.scrollTo('add_attachment_form'); return false;&quot;,</diff>
      <filename>app/views/wiki/show.rhtml</filename>
    </modified>
    <modified>
      <diff>@@ -35,7 +35,7 @@ Redmine::AccessControl.map do |map|
                                   :queries =&gt; :index,
                                   :reports =&gt; :issue_report}, :public =&gt; true                    
     map.permission :add_issues, {:issues =&gt; :new}
-    map.permission :edit_issues, {:issues =&gt; [:edit, :reply, :bulk_edit, :destroy_attachment]}
+    map.permission :edit_issues, {:issues =&gt; [:edit, :reply, :bulk_edit]}
     map.permission :manage_issue_relations, {:issue_relations =&gt; [:new, :destroy]}
     map.permission :add_issue_notes, {:issues =&gt; [:edit, :reply]}
     map.permission :edit_issue_notes, {:journals =&gt; :edit}, :require =&gt; :loggedin
@@ -67,12 +67,12 @@ Redmine::AccessControl.map do |map|
   end
 
   map.project_module :documents do |map|
-    map.permission :manage_documents, {:documents =&gt; [:new, :edit, :destroy, :add_attachment, :destroy_attachment]}, :require =&gt; :loggedin
+    map.permission :manage_documents, {:documents =&gt; [:new, :edit, :destroy, :add_attachment]}, :require =&gt; :loggedin
     map.permission :view_documents, :documents =&gt; [:index, :show, :download]
   end
   
   map.project_module :files do |map|
-    map.permission :manage_files, {:projects =&gt; :add_file, :versions =&gt; :destroy_file}, :require =&gt; :loggedin
+    map.permission :manage_files, {:projects =&gt; :add_file}, :require =&gt; :loggedin
     map.permission :view_files, :projects =&gt; :list_files, :versions =&gt; :download
   end
     
@@ -83,7 +83,7 @@ Redmine::AccessControl.map do |map|
     map.permission :view_wiki_pages, :wiki =&gt; [:index, :special]
     map.permission :view_wiki_edits, :wiki =&gt; [:history, :diff, :annotate]
     map.permission :edit_wiki_pages, :wiki =&gt; [:edit, :preview, :add_attachment]
-    map.permission :delete_wiki_pages_attachments, :wiki =&gt; :destroy_attachment
+    map.permission :delete_wiki_pages_attachments, {}
     map.permission :protect_wiki_pages, {:wiki =&gt; :protect}, :require =&gt; :member
   end
     </diff>
      <filename>lib/redmine.rb</filename>
    </modified>
    <modified>
      <diff>@@ -76,4 +76,33 @@ class AttachmentsControllerTest &lt; Test::Unit::TestCase
     get :download, :id =&gt; 7
     assert_redirected_to 'account/login'
   end
+  
+  def test_destroy_issue_attachment
+    issue = Issue.find(3)
+    @request.session[:user_id] = 2
+    
+    assert_difference 'issue.attachments.count', -1 do
+      post :destroy, :id =&gt; 1
+    end
+    # no referrer
+    assert_redirected_to 'projects/show/ecookbook'
+    assert_nil Attachment.find_by_id(1)
+    j = issue.journals.find(:first, :order =&gt; 'created_on DESC')
+    assert_equal 'attachment', j.details.first.property
+    assert_equal '1', j.details.first.prop_key
+    assert_equal 'error281.txt', j.details.first.old_value
+  end
+  
+  def test_destroy_wiki_page_attachment
+    @request.session[:user_id] = 2
+    assert_difference 'Attachment.count', -1 do
+      post :destroy, :id =&gt; 3
+    end
+  end
+  
+  def test_destroy_without_permission
+    post :destroy, :id =&gt; 3
+    assert_redirected_to '/login'
+    assert Attachment.find_by_id(3)
+  end
 end</diff>
      <filename>test/functional/attachments_controller_test.rb</filename>
    </modified>
    <modified>
      <diff>@@ -713,17 +713,4 @@ class IssuesControllerTest &lt; Test::Unit::TestCase
     assert_equal 2, TimeEntry.find(1).issue_id
     assert_equal 2, TimeEntry.find(2).issue_id
   end
-  
-  def test_destroy_attachment
-    issue = Issue.find(3)
-    a = issue.attachments.size
-    @request.session[:user_id] = 2
-    post :destroy_attachment, :id =&gt; 3, :attachment_id =&gt; 1
-    assert_redirected_to 'issues/show/3'
-    assert_nil Attachment.find_by_id(1)
-    issue.reload
-    assert_equal((a-1), issue.attachments.size)
-    j = issue.journals.find(:first, :order =&gt; 'created_on DESC')
-    assert_equal 'attachment', j.details.first.property
-  end
 end</diff>
      <filename>test/functional/issues_controller_test.rb</filename>
    </modified>
    <modified>
      <diff>@@ -251,11 +251,4 @@ class WikiControllerTest &lt; Test::Unit::TestCase
     assert_response :success
     assert_template 'edit'    
   end
-  
-  def test_destroy_attachment
-    @request.session[:user_id] = 2
-    assert_difference 'Attachment.count', -1 do
-      post :destroy_attachment, :id =&gt; 1, :page =&gt; 'Page_with_an_inline_image', :attachment_id =&gt; 3
-    end
-  end
 end</diff>
      <filename>test/functional/wiki_controller_test.rb</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>92f9f17acfa1c79f04f33eeffcdbf9e45facf204</id>
    </parent>
  </parents>
  <author>
    <name>jplang</name>
    <email>jplang@e93f8b46-1217-0410-a6f0-8f06a7374b81</email>
  </author>
  <url>http://github.com/yugui/redmine4ruby-lang/commit/c8fac31f1d4b3417f3fb9abf155e659ac2ed114f</url>
  <id>c8fac31f1d4b3417f3fb9abf155e659ac2ed114f</id>
  <committed-date>2008-12-09T08:54:46-08:00</committed-date>
  <authored-date>2008-12-09T08:54:46-08:00</authored-date>
  <message>AttachmentsController now handles attachments deletion.

git-svn-id: http://redmine.rubyforge.org/svn/trunk@2116 e93f8b46-1217-0410-a6f0-8f06a7374b81</message>
  <tree>eb64711c0150fafb698da9d92eb0d6735a5461cf</tree>
  <committer>
    <name>jplang</name>
    <email>jplang@e93f8b46-1217-0410-a6f0-8f06a7374b81</email>
  </committer>
</commit>
