summaryrefslogtreecommitdiffstats
path: root/app
diff options
context:
space:
mode:
Diffstat (limited to 'app')
-rw-r--r--app/helpers/repositories_helper.rb4
-rw-r--r--app/models/changeset.rb1
-rw-r--r--app/models/repository.rb4
-rw-r--r--app/models/repository/darcs.rb90
-rw-r--r--app/views/repositories/changes.rhtml2
5 files changed, 101 insertions, 0 deletions
diff --git a/app/helpers/repositories_helper.rb b/app/helpers/repositories_helper.rb
index e2058a712..c2d564029 100644
--- a/app/helpers/repositories_helper.rb
+++ b/app/helpers/repositories_helper.rb
@@ -43,6 +43,10 @@ module RepositoriesHelper
content_tag('p', form.password_field(:password, :size => 30))
end
+ def darcs_field_tags(form, repository)
+ content_tag('p', form.text_field(:url, :label => 'Root directory', :size => 60, :required => true, :disabled => (repository && !repository.new_record?)))
+ end
+
def mercurial_field_tags(form, repository)
content_tag('p', form.text_field(:url, :label => 'Root directory', :size => 60, :required => true, :disabled => (repository && !repository.root_url.blank?)))
end
diff --git a/app/models/changeset.rb b/app/models/changeset.rb
index 2038266f9..879896fe4 100644
--- a/app/models/changeset.rb
+++ b/app/models/changeset.rb
@@ -23,6 +23,7 @@ class Changeset < ActiveRecord::Base
validates_presence_of :repository_id, :revision, :committed_on, :commit_date
validates_numericality_of :revision, :only_integer => true
validates_uniqueness_of :revision, :scope => :repository_id
+ validates_uniqueness_of :scmid, :scope => :repository_id, :allow_nil => true
def committed_on=(date)
self.commit_date = date
diff --git a/app/models/repository.rb b/app/models/repository.rb
index 667ef5efc..f77b51db2 100644
--- a/app/models/repository.rb
+++ b/app/models/repository.rb
@@ -30,6 +30,10 @@ class Repository < ActiveRecord::Base
self.class.scm_name
end
+ def supports_cat?
+ scm.supports_cat?
+ end
+
def entries(path=nil, identifier=nil)
scm.entries(path, identifier)
end
diff --git a/app/models/repository/darcs.rb b/app/models/repository/darcs.rb
new file mode 100644
index 000000000..48cc246fb
--- /dev/null
+++ b/app/models/repository/darcs.rb
@@ -0,0 +1,90 @@
+# redMine - project management software
+# Copyright (C) 2006-2007 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
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+require 'redmine/scm/adapters/darcs_adapter'
+
+class Repository::Darcs < Repository
+ validates_presence_of :url
+
+ def scm_adapter
+ Redmine::Scm::Adapters::DarcsAdapter
+ end
+
+ def self.scm_name
+ 'Darcs'
+ end
+
+ def entries(path=nil, identifier=nil)
+ entries=scm.entries(path, identifier)
+ if entries
+ entries.each do |entry|
+ # Search the DB for the entry's last change
+ changeset = changesets.find_by_scmid(entry.lastrev.scmid) if entry.lastrev && !entry.lastrev.scmid.blank?
+ if changeset
+ entry.lastrev.identifier = changeset.revision
+ entry.lastrev.name = changeset.revision
+ entry.lastrev.time = changeset.committed_on
+ entry.lastrev.author = changeset.committer
+ end
+ end
+ end
+ entries
+ end
+
+ def diff(path, rev, rev_to, type)
+ patch_from = changesets.find_by_revision(rev)
+ patch_to = changesets.find_by_revision(rev_to) if rev_to
+ if path.blank?
+ path = patch_from.changes.collect{|change| change.path}.join(' ')
+ end
+ scm.diff(path, patch_from.scmid, patch_to.scmid, type)
+ end
+
+ def fetch_changesets
+ scm_info = scm.info
+ if scm_info
+ db_last_id = latest_changeset ? latest_changeset.scmid : nil
+ next_rev = latest_changeset ? latest_changeset.revision + 1 : 1
+ # latest revision in the repository
+ scm_revision = scm_info.lastrev.scmid
+ unless changesets.find_by_scmid(scm_revision)
+ revisions = scm.revisions('', db_last_id, nil, :with_path => true)
+ transaction do
+ revisions.reverse_each do |revision|
+ changeset = Changeset.create(:repository => self,
+ :revision => next_rev,
+ :scmid => revision.scmid,
+ :committer => revision.author,
+ :committed_on => revision.time,
+ :comments => revision.message)
+
+ next if changeset.new_record?
+
+ revision.paths.each do |change|
+ Change.create(:changeset => changeset,
+ :action => change[:action],
+ :path => change[:path],
+ :from_path => change[:from_path],
+ :from_revision => change[:from_revision])
+ end
+ next_rev += 1
+ end if revisions
+ end
+ end
+ end
+ end
+end
diff --git a/app/views/repositories/changes.rhtml b/app/views/repositories/changes.rhtml
index 35ce939fc..b8610818b 100644
--- a/app/views/repositories/changes.rhtml
+++ b/app/views/repositories/changes.rhtml
@@ -2,6 +2,7 @@
<h3><%=h @entry.name %></h3>
+<% if @repository.supports_cat? %>
<p>
<% if @entry.is_text? %>
<%= link_to l(:button_view), {:action => 'entry', :id => @project, :path => @path, :rev => @rev } %> |
@@ -9,5 +10,6 @@
<%= link_to l(:button_download), {:action => 'entry', :id => @project, :path => @path, :rev => @rev, :format => 'raw' } %>
<%= "(#{number_to_human_size(@entry.size)})" if @entry.size %>
</p>
+<% end %>
<%= render :partial => 'revisions', :locals => {:project => @project, :path => @path, :revisions => @changes, :entry => @entry }%>