comparison app/models/repository/git.rb @ 245:051f544170fe

* Update to SVN trunk revision 4993
author Chris Cannam
date Thu, 03 Mar 2011 11:42:28 +0000
parents 8661b858af72
children eeebe205a056 cbce1fd3b1b7
comparison
equal deleted inserted replaced
244:8972b600f4fb 245:051f544170fe
19 19
20 class Repository::Git < Repository 20 class Repository::Git < Repository
21 attr_protected :root_url 21 attr_protected :root_url
22 validates_presence_of :url 22 validates_presence_of :url
23 23
24 def scm_adapter 24 ATTRIBUTE_KEY_NAMES = {
25 "url" => "Path to repository",
26 }
27 def self.human_attribute_name(attribute_key_name)
28 ATTRIBUTE_KEY_NAMES[attribute_key_name] || super
29 end
30
31 def self.scm_adapter_class
25 Redmine::Scm::Adapters::GitAdapter 32 Redmine::Scm::Adapters::GitAdapter
26 end 33 end
27 34
28 def self.scm_name 35 def self.scm_name
29 'Git' 36 'Git'
37 end
38
39 def repo_log_encoding
40 'UTF-8'
30 end 41 end
31 42
32 # Returns the identifier for the given git changeset 43 # Returns the identifier for the given git changeset
33 def self.changeset_identifier(changeset) 44 def self.changeset_identifier(changeset)
34 changeset.scmid 45 changeset.scmid
43 scm.branches 54 scm.branches
44 end 55 end
45 56
46 def tags 57 def tags
47 scm.tags 58 scm.tags
59 end
60
61 def find_changeset_by_name(name)
62 return nil if name.nil? || name.empty?
63 e = changesets.find(:first, :conditions => ['revision = ?', name.to_s])
64 return e if e
65 changesets.find(:first, :conditions => ['scmid LIKE ?', "#{name}%"])
48 end 66 end
49 67
50 # With SCM's that have a sequential commit numbering, redmine is able to be 68 # With SCM's that have a sequential commit numbering, redmine is able to be
51 # clever and only fetch changesets going forward from the most recent one 69 # clever and only fetch changesets going forward from the most recent one
52 # it knows about. However, with git, you never know if people have merged 70 # it knows about. However, with git, you never know if people have merged
70 # Subtract revisions that redmine already knows about 88 # Subtract revisions that redmine already knows about
71 recent_revisions = recent_changesets.map{|c| c.scmid} 89 recent_revisions = recent_changesets.map{|c| c.scmid}
72 revisions.reject!{|r| recent_revisions.include?(r.scmid)} 90 revisions.reject!{|r| recent_revisions.include?(r.scmid)}
73 91
74 # Save the remaining ones to the database 92 # Save the remaining ones to the database
75 revisions.each{|r| r.save(self)} unless revisions.nil? 93 unless revisions.nil?
94 revisions.each do |rev|
95 transaction do
96 changeset = Changeset.new(
97 :repository => self,
98 :revision => rev.identifier,
99 :scmid => rev.scmid,
100 :committer => rev.author,
101 :committed_on => rev.time,
102 :comments => rev.message)
103
104 if changeset.save
105 rev.paths.each do |file|
106 Change.create(
107 :changeset => changeset,
108 :action => file[:action],
109 :path => file[:path])
110 end
111 end
112 end
113 end
114 end
76 end 115 end
77 116
78 def latest_changesets(path,rev,limit=10) 117 def latest_changesets(path,rev,limit=10)
79 revisions = scm.revisions(path, nil, rev, :limit => limit, :all => false) 118 revisions = scm.revisions(path, nil, rev, :limit => limit, :all => false)
80 return [] if revisions.nil? || revisions.empty? 119 return [] if revisions.nil? || revisions.empty?