##// END OF EJS Templates
scm: git: return saved revision at model "save_revision" (#5501)...
Toshi MARUYAMA -
r7534:8dc7f1d1eef6
parent child
Show More
@@ -1,184 +1,185
1 1 # Redmine - project management software
2 2 # Copyright (C) 2006-2011 Jean-Philippe Lang
3 3 # Copyright (C) 2007 Patrick Aljord patcito@ŋmail.com
4 4 #
5 5 # This program is free software; you can redistribute it and/or
6 6 # modify it under the terms of the GNU General Public License
7 7 # as published by the Free Software Foundation; either version 2
8 8 # of the License, or (at your option) any later version.
9 9 #
10 10 # This program is distributed in the hope that it will be useful,
11 11 # but WITHOUT ANY WARRANTY; without even the implied warranty of
12 12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 13 # GNU General Public License for more details.
14 14 #
15 15 # You should have received a copy of the GNU General Public License
16 16 # along with this program; if not, write to the Free Software
17 17 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
18 18
19 19 require 'redmine/scm/adapters/git_adapter'
20 20
21 21 class Repository::Git < Repository
22 22 attr_protected :root_url
23 23 validates_presence_of :url
24 24
25 25 def self.human_attribute_name(attribute_key_name)
26 26 attr_name = attribute_key_name
27 27 if attr_name == "url"
28 28 attr_name = "path_to_repository"
29 29 end
30 30 super(attr_name)
31 31 end
32 32
33 33 def self.scm_adapter_class
34 34 Redmine::Scm::Adapters::GitAdapter
35 35 end
36 36
37 37 def self.scm_name
38 38 'Git'
39 39 end
40 40
41 41 def report_last_commit
42 42 extra_report_last_commit
43 43 end
44 44
45 45 def extra_report_last_commit
46 46 return false if extra_info.nil?
47 47 v = extra_info["extra_report_last_commit"]
48 48 return false if v.nil?
49 49 v.to_s != '0'
50 50 end
51 51
52 52 def supports_directory_revisions?
53 53 true
54 54 end
55 55
56 56 def repo_log_encoding
57 57 'UTF-8'
58 58 end
59 59
60 60 # Returns the identifier for the given git changeset
61 61 def self.changeset_identifier(changeset)
62 62 changeset.scmid
63 63 end
64 64
65 65 # Returns the readable identifier for the given git changeset
66 66 def self.format_changeset_identifier(changeset)
67 67 changeset.revision[0, 8]
68 68 end
69 69
70 70 def branches
71 71 scm.branches
72 72 end
73 73
74 74 def tags
75 75 scm.tags
76 76 end
77 77
78 78 def default_branch
79 79 scm.default_branch
80 80 rescue Exception => e
81 81 logger.error "git: error during get default branch: #{e.message}"
82 82 nil
83 83 end
84 84
85 85 def find_changeset_by_name(name)
86 86 return nil if name.nil? || name.empty?
87 87 e = changesets.find(:first, :conditions => ['revision = ?', name.to_s])
88 88 return e if e
89 89 changesets.find(:first, :conditions => ['scmid LIKE ?', "#{name}%"])
90 90 end
91 91
92 92 def entries(path=nil, identifier=nil)
93 93 scm.entries(path,
94 94 identifier,
95 95 options = {:report_last_commit => extra_report_last_commit})
96 96 end
97 97
98 98 # In Git and Mercurial, revisions are not in date order.
99 99 # Redmine Mercurial fixed issues.
100 100 # * Redmine Takes Too Long On Large Mercurial Repository
101 101 # http://www.redmine.org/issues/3449
102 102 # * Sorting for changesets might go wrong on Mercurial repos
103 103 # http://www.redmine.org/issues/3567
104 104 #
105 105 # Database revision column is text, so Redmine can not sort by revision.
106 106 # Mercurial has revision number, and revision number guarantees revision order.
107 107 # Redmine Mercurial model stored revisions ordered by database id to database.
108 108 # So, Redmine Mercurial model can use correct ordering revisions.
109 109 #
110 110 # Redmine Mercurial adapter uses "hg log -r 0:tip --limit 10"
111 111 # to get limited revisions from old to new.
112 112 # But, Git 1.7.3.4 does not support --reverse with -n or --skip.
113 113 #
114 114 # The repository can still be fully reloaded by calling #clear_changesets
115 115 # before fetching changesets (eg. for offline resync)
116 116 def fetch_changesets
117 117 scm_brs = branches
118 118 return if scm_brs.nil? || scm_brs.empty?
119 119 h1 = extra_info || {}
120 120 h = h1.dup
121 121 h["branches"] ||= {}
122 122 h["db_consistent"] ||= {}
123 123 if changesets.count == 0
124 124 h["db_consistent"]["ordering"] = 1
125 125 merge_extra_info(h)
126 126 self.save
127 127 elsif ! h["db_consistent"].has_key?("ordering")
128 128 h["db_consistent"]["ordering"] = 0
129 129 merge_extra_info(h)
130 130 self.save
131 131 end
132 132 scm_brs.each do |br1|
133 133 br = br1.to_s
134 134 from_scmid = nil
135 135 from_scmid = h["branches"][br]["last_scmid"] if h["branches"][br]
136 136 h["branches"][br] ||= {}
137 137 scm.revisions('', from_scmid, br, {:reverse => true}) do |rev|
138 138 db_rev = find_changeset_by_name(rev.revision)
139 139 transaction do
140 140 if db_rev.nil?
141 141 save_revision(rev)
142 142 end
143 143 h["branches"][br]["last_scmid"] = rev.scmid
144 144 merge_extra_info(h)
145 145 self.save
146 146 end
147 147 end
148 148 end
149 149 end
150 150
151 151 def save_revision(rev)
152 152 changeset = Changeset.new(
153 153 :repository => self,
154 154 :revision => rev.identifier,
155 155 :scmid => rev.scmid,
156 156 :committer => rev.author,
157 157 :committed_on => rev.time,
158 158 :comments => rev.message
159 159 )
160 160 if changeset.save
161 161 rev.paths.each do |file|
162 162 Change.create(
163 163 :changeset => changeset,
164 164 :action => file[:action],
165 165 :path => file[:path])
166 166 end
167 167 end
168 changeset
168 169 end
169 170 private :save_revision
170 171
171 172 def latest_changesets(path,rev,limit=10)
172 173 revisions = scm.revisions(path, nil, rev, :limit => limit, :all => false)
173 174 return [] if revisions.nil? || revisions.empty?
174 175
175 176 changesets.find(
176 177 :all,
177 178 :conditions => [
178 179 "scmid IN (?)",
179 180 revisions.map!{|c| c.scmid}
180 181 ],
181 182 :order => 'committed_on DESC'
182 183 )
183 184 end
184 185 end
General Comments 0
You need to be logged in to leave comments. Login now