To check out this repository please hg clone the following URL, or open the URL using EasyMercurial or your preferred Mercurial client.

Statistics Download as Zip
| Branch: | Tag: | Revision:

root / app / models / repository / darcs.rb @ 1533:59e13100ea95

History | View | Annotate | Download (3.85 KB)

1
# Redmine - project management software
2
# Copyright (C) 2006-2014  Jean-Philippe Lang
3
#
4
# This program is free software; you can redistribute it and/or
5
# modify it under the terms of the GNU General Public License
6
# as published by the Free Software Foundation; either version 2
7
# of the License, or (at your option) 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 Street, Fifth Floor, Boston, MA  02110-1301, USA.
17

    
18
require_dependency 'redmine/scm/adapters/darcs_adapter'
19

    
20
class Repository::Darcs < Repository
21
  validates_presence_of :url, :log_encoding
22

    
23
  def self.human_attribute_name(attribute_key_name, *args)
24
    attr_name = attribute_key_name.to_s
25
    if attr_name == "url"
26
      attr_name = "path_to_repository"
27
    end
28
    super(attr_name, *args)
29
  end
30

    
31
  def self.scm_adapter_class
32
    Redmine::Scm::Adapters::DarcsAdapter
33
  end
34

    
35
  def self.scm_name
36
    'Darcs'
37
  end
38

    
39
  def supports_directory_revisions?
40
    true
41
  end
42

    
43
  def entry(path=nil, identifier=nil)
44
    patch = identifier.nil? ? nil : changesets.find_by_revision(identifier)
45
    scm.entry(path, patch.nil? ? nil : patch.scmid)
46
  end
47

    
48
  def scm_entries(path=nil, identifier=nil)
49
    patch = nil
50
    if ! identifier.nil?
51
      patch = changesets.find_by_revision(identifier)
52
      return nil if patch.nil?
53
    end
54
    entries = scm.entries(path, patch.nil? ? nil : patch.scmid)
55
    if entries
56
      entries.each do |entry|
57
        # Search the DB for the entry's last change
58
        if entry.lastrev && !entry.lastrev.scmid.blank?
59
          changeset = changesets.find_by_scmid(entry.lastrev.scmid)
60
        end
61
        if changeset
62
          entry.lastrev.identifier = changeset.revision
63
          entry.lastrev.name       = changeset.revision
64
          entry.lastrev.time       = changeset.committed_on
65
          entry.lastrev.author     = changeset.committer
66
        end
67
      end
68
    end
69
    entries
70
  end
71
  protected :scm_entries
72

    
73
  def cat(path, identifier=nil)
74
    patch = identifier.nil? ? nil : changesets.find_by_revision(identifier.to_s)
75
    scm.cat(path, patch.nil? ? nil : patch.scmid)
76
  end
77

    
78
  def diff(path, rev, rev_to)
79
    patch_from = changesets.find_by_revision(rev)
80
    return nil if patch_from.nil?
81
    patch_to = changesets.find_by_revision(rev_to) if rev_to
82
    if path.blank?
83
      path = patch_from.filechanges.collect{|change| change.path}.join(' ')
84
    end
85
    patch_from ? scm.diff(path, patch_from.scmid, patch_to ? patch_to.scmid : nil) : nil
86
  end
87

    
88
  def fetch_changesets
89
    scm_info = scm.info
90
    if scm_info
91
      db_last_id = latest_changeset ? latest_changeset.scmid : nil
92
      next_rev   = latest_changeset ? latest_changeset.revision.to_i + 1 : 1
93
      # latest revision in the repository
94
      scm_revision = scm_info.lastrev.scmid
95
      unless changesets.find_by_scmid(scm_revision)
96
        revisions = scm.revisions('', db_last_id, nil, :with_path => true)
97
        transaction do
98
          revisions.reverse_each do |revision|
99
            changeset = Changeset.create(:repository   => self,
100
                                         :revision     => next_rev,
101
                                         :scmid        => revision.scmid,
102
                                         :committer    => revision.author,
103
                                         :committed_on => revision.time,
104
                                         :comments     => revision.message)
105
            revision.paths.each do |change|
106
              changeset.create_change(change)
107
            end
108
            next_rev += 1
109
          end if revisions
110
        end
111
      end
112
    end
113
  end
114
end