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 / .svn / pristine / 43 / 43272555ea477da0c1b59cf98e2f63d68056c98b.svn-base @ 1297:0a574315af3e

History | View | Annotate | Download (3.79 KB)

1
# Redmine - project management software
2
# Copyright (C) 2006-2011  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 '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)
24
    attr_name = attribute_key_name
25
    if attr_name == "url"
26
      attr_name = "path_to_repository"
27
    end
28
    super(attr_name)
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 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

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

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

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