##// END OF EJS Templates
scm: git: show only filename and filesize if setting of reporting last commit is disable (#8365, #7047)....
scm: git: show only filename and filesize if setting of reporting last commit is disable (#8365, #7047). git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@5775 e93f8b46-1217-0410-a6f0-8f06a7374b81

File last commit:

r5655:d65c3d438d28
r5655:d65c3d438d28
Show More
repository.rb
320 lines | 8.8 KiB | text/x-ruby | RubyLexer
Toshi MARUYAMA
scm: code clean up repository model....
r5533 # Redmine - project management software
# Copyright (C) 2006-2011 Jean-Philippe Lang
Jean-Philippe Lang
svn browser merged in trunk...
r103 #
# 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.
Toshi MARUYAMA
scm: code clean up repository model....
r5533 #
Jean-Philippe Lang
svn browser merged in trunk...
r103 # 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.
Toshi MARUYAMA
scm: code clean up repository model....
r5533 #
Jean-Philippe Lang
svn browser merged in trunk...
r103 # 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.
class Repository < ActiveRecord::Base
Jean-Philippe Lang
Adds support for SCM/LDAP passwords encryption in the database (#7411)....
r4830 include Redmine::Ciphering
Toshi MARUYAMA
scm: code clean up repository model....
r5533
Jean-Philippe Lang
svn browser merged in trunk...
r103 belongs_to :project
Jean-Philippe Lang
Clear changesets and changes with raw sql when deleting a repository (#1627)....
r1651 has_many :changesets, :order => "#{Changeset.table_name}.committed_on DESC, #{Changeset.table_name}.id DESC"
Jean-Philippe Lang
added simple svn statistics graphs, rendered using SVG::Graph...
r377 has_many :changes, :through => :changesets
Toshi MARUYAMA
scm: code clean up repository model....
r5533
Toshi MARUYAMA
scm: add "extra_info" column to repositories table and set serialize (#7146, #7047)....
r5642 serialize :extra_info
Jean-Philippe Lang
Clear changesets and changes with raw sql when deleting a repository (#1627)....
r1651 # Raw SQL to delete changesets and changes in the database
# has_many :changesets, :dependent => :destroy is too slow for big repositories
before_destroy :clear_changesets
Toshi MARUYAMA
scm: code clean up repository model....
r5533
Jean-Philippe Lang
Adds support for SCM/LDAP passwords encryption in the database (#7411)....
r4830 validates_length_of :password, :maximum => 255, :allow_nil => true
Jean-Philippe Lang
Ability to disable unused SCM adapters in application settings....
r1493 # Checks if the SCM is enabled when creating a repository
Jean-Philippe Lang
Merged Rails 2.2 branch. Redmine now requires Rails 2.2.2....
r2430 validate_on_create { |r| r.errors.add(:type, :invalid) unless Setting.enabled_scm.include?(r.class.name.demodulize) }
Toshi MARUYAMA
scm: update adapter initialize() to use path encoding (#2664, #2274)....
r4821
Toshi MARUYAMA
scm: use i18n string at commit log encoding setting (#1735)....
r5399 def self.human_attribute_name(attribute_key_name)
attr_name = attribute_key_name
if attr_name == "log_encoding"
attr_name = "commit_logs_encoding"
end
super(attr_name)
end
Jean-Philippe Lang
Strip repository urls (closes #852)....
r1234 # Removes leading and trailing whitespace
def url=(arg)
write_attribute(:url, arg ? arg.to_s.strip : nil)
end
Toshi MARUYAMA
scm: update adapter initialize() to use path encoding (#2664, #2274)....
r4821
Jean-Philippe Lang
Strip repository urls (closes #852)....
r1234 # Removes leading and trailing whitespace
def root_url=(arg)
write_attribute(:root_url, arg ? arg.to_s.strip : nil)
end
Toshi MARUYAMA
scm: code clean up repository model....
r5533
Jean-Philippe Lang
Adds support for SCM/LDAP passwords encryption in the database (#7411)....
r4830 def password
read_ciphered_attribute(:password)
end
Toshi MARUYAMA
scm: code clean up repository model....
r5533
Jean-Philippe Lang
Adds support for SCM/LDAP passwords encryption in the database (#7411)....
r4830 def password=(arg)
write_ciphered_attribute(:password, arg)
end
Jean-Philippe Lang
Strip repository urls (closes #852)....
r1234
Toshi MARUYAMA
scm: add scm command and version methods at repository models (#4273)....
r4702 def scm_adapter
self.class.scm_adapter_class
end
Jean-Philippe Lang
svn browser merged in trunk...
r103 def scm
Toshi MARUYAMA
scm: update adapter initialize() to use path encoding (#2664, #2274)....
r4821 @scm ||= self.scm_adapter.new(url, root_url,
login, password, path_encoding)
Jean-Philippe Lang
fixed problems when svn path doesn't point to the root directory of the repository....
r341 update_attribute(:root_url, @scm.root_url) if root_url.blank?
@scm
end
Toshi MARUYAMA
scm: update adapter initialize() to use path encoding (#2664, #2274)....
r4821
Jean-Philippe Lang
Added basic support for CVS and Mercurial SCMs....
r556 def scm_name
self.class.scm_name
Jean-Philippe Lang
SVN commits are now stored in the database, and added to the activity view and the search engine....
r374 end
Toshi MARUYAMA
scm: add scm command and version methods at repository models (#4273)....
r4702
Toshi MARUYAMA
scm: add a repository model method "merge_extra_info()" to merge "extra_info" serializing hash yaml (#7146, #7047)....
r5646 def merge_extra_info(arg)
h = extra_info || {}
return h if arg.nil?
h.merge!(arg)
write_attribute(:extra_info, h)
end
Toshi MARUYAMA
scm: git: show only filename and filesize if setting of reporting last commit is disable (#8365, #7047)....
r5655 def report_last_commit
true
end
Jean-Philippe Lang
Added Darcs basic support....
r570 def supports_cat?
scm.supports_cat?
end
Jean-Philippe Lang
Added Annotate/Blame view for Subversion, CVS and Mercurial repositories....
r934
def supports_annotate?
scm.supports_annotate?
end
Toshi MARUYAMA
scm: set supporting all revisions or not at scm level....
r5023
def supports_all_revisions?
true
end
Toshi MARUYAMA
scm: code clean up repository model....
r5533
Toshi MARUYAMA
scm: set supporting directory revisions or not at scm level....
r5024 def supports_directory_revisions?
false
end
Toshi MARUYAMA
scm: code clean up repository model....
r5533
Jean-Philippe Lang
Fixed: view file at given revision with CVS....
r1539 def entry(path=nil, identifier=nil)
scm.entry(path, identifier)
end
Toshi MARUYAMA
scm: code clean up repository model....
r5533
Jean-Philippe Lang
Added basic support for CVS and Mercurial SCMs....
r556 def entries(path=nil, identifier=nil)
scm.entries(path, identifier)
Jean-Philippe Lang
added pagination on revisions list...
r378 end
Eric Davis
Added branch and tag support to the git repository viewer. (#1406)...
r2735
def branches
scm.branches
end
def tags
scm.tags
end
def default_branch
scm.default_branch
end
Toshi MARUYAMA
scm: set supporting all revisions or not at scm level....
r5023
Jean-Philippe Lang
Display svn properties in the browser, svn >= 1.5.0 only (#1581)....
r1613 def properties(path, identifier=nil)
scm.properties(path, identifier)
end
Toshi MARUYAMA
scm: set supporting all revisions or not at scm level....
r5023
Jean-Philippe Lang
Fixed: view file at given revision with CVS....
r1539 def cat(path, identifier=nil)
scm.cat(path, identifier)
end
Toshi MARUYAMA
scm: set supporting all revisions or not at scm level....
r5023
Jean-Philippe Lang
Move unified diff parser out of the scm abstract adapter so it can be reused for viewing attached diffs (#1403)....
r1499 def diff(path, rev, rev_to)
scm.diff(path, rev, rev_to)
Jean-Philippe Lang
SVN commits are now stored in the database, and added to the activity view and the search engine....
r374 end
Toshi MARUYAMA
scm: changing two revision diff text at SCM adapter level (#3724)....
r4578
def diff_format_revisions(cs, cs_to, sep=':')
text = ""
text << cs_to.format_identifier + sep if cs_to
text << cs.format_identifier if cs
text
end
Jean-Philippe Lang
Fixed: View differences for individual file of a changeset fails if the subversion repository URL doesn't point to the repository root (#1209, #1262, #1275)....
r1432 # Returns a path relative to the url of the repository
def relative_path(path)
path
end
Toshi MARUYAMA
scm: use #blank? instead of #nil? || #empty? at Repository#find_changeset_by_name(name) (#7307)....
r4592
Jean-Philippe Lang
Fixed: RepositoriesController#revision may show wrong revision (#3779)....
r2784 # Finds and returns a revision with a number or the beginning of a hash
def find_changeset_by_name(name)
Toshi MARUYAMA
scm: use #blank? instead of #nil? || #empty? at Repository#find_changeset_by_name(name) (#7307)....
r4592 return nil if name.blank?
Toshi MARUYAMA
scm: code clean up repository model....
r5527 changesets.find(:first, :conditions => (name.match(/^\d*$/) ?
["revision = ?", name.to_s] : ["revision LIKE ?", name + '%']))
Jean-Philippe Lang
Fixed: RepositoriesController#revision may show wrong revision (#3779)....
r2784 end
Toshi MARUYAMA
scm: use #blank? instead of #nil? || #empty? at Repository#find_changeset_by_name(name) (#7307)....
r4592
Jean-Philippe Lang
Added basic support for CVS and Mercurial SCMs....
r556 def latest_changeset
@latest_changeset ||= changesets.find(:first)
end
Eric Davis
Added branch and tag support to the git repository viewer. (#1406)...
r2735
Jean-Philippe Lang
SCM:...
r2739 # Returns the latest changesets for +path+
# Default behaviour is to search in cached changesets
def latest_changesets(path, rev, limit=10)
if path.blank?
Toshi MARUYAMA
scm: code clean up repository model....
r5533 changesets.find(
:all,
:include => :user,
:order => "#{Changeset.table_name}.committed_on DESC, #{Changeset.table_name}.id DESC",
:limit => limit)
Jean-Philippe Lang
SCM:...
r2739 else
Toshi MARUYAMA
scm: code clean up repository model....
r5533 changes.find(
:all,
:include => {:changeset => :user},
:conditions => ["path = ?", path.with_leading_slash],
:order => "#{Changeset.table_name}.committed_on DESC, #{Changeset.table_name}.id DESC",
:limit => limit
).collect(&:changeset)
Jean-Philippe Lang
SCM:...
r2739 end
Eric Davis
Added branch and tag support to the git repository viewer. (#1406)...
r2735 end
Toshi MARUYAMA
scm: code clean up repository model....
r5527
Jean-Philippe Lang
Commit messages are now scanned for referenced or fixed issue IDs....
r470 def scan_changesets_for_issue_ids
self.changesets.each(&:scan_comment_for_issue_ids)
end
Eric Davis
Added branch and tag support to the git repository viewer. (#1406)...
r2735
Jean-Philippe Lang
Maps repository users to Redmine users (#1383)....
r2004 # Returns an array of committers usernames and associated user_id
def committers
Toshi MARUYAMA
scm: code clean up repository model....
r5527 @committers ||= Changeset.connection.select_rows(
"SELECT DISTINCT committer, user_id FROM #{Changeset.table_name} WHERE repository_id = #{id}")
Jean-Philippe Lang
Maps repository users to Redmine users (#1383)....
r2004 end
Toshi MARUYAMA
scm: code clean up repository model....
r5527
Jean-Philippe Lang
Maps repository users to Redmine users (#1383)....
r2004 # Maps committers username to a user ids
def committer_ids=(h)
if h.is_a?(Hash)
committers.each do |committer, user_id|
new_user_id = h[committer]
if new_user_id && (new_user_id.to_i != user_id.to_i)
new_user_id = (new_user_id.to_i > 0 ? new_user_id.to_i : nil)
Toshi MARUYAMA
scm: code clean up repository model....
r5527 Changeset.update_all(
"user_id = #{ new_user_id.nil? ? 'NULL' : new_user_id }",
["repository_id = ? AND committer = ?", id, committer])
Jean-Philippe Lang
Maps repository users to Redmine users (#1383)....
r2004 end
end
Toshi MARUYAMA
scm: code clean up repository model....
r5527 @committers = nil
Jean-Philippe Lang
Memorize commit authors to speed up changesets loading....
r3358 @found_committer_users = nil
Jean-Philippe Lang
Maps repository users to Redmine users (#1383)....
r2004 true
else
false
end
end
Toshi MARUYAMA
scm: code clean up repository model....
r5527
Jean-Philippe Lang
Maps repository users to Redmine users (#1383)....
r2004 # Returns the Redmine User corresponding to the given +committer+
# It will return nil if the committer is not yet mapped and if no User
# with the same username or email was found
def find_committer_user(committer)
Jean-Philippe Lang
Memorize commit authors to speed up changesets loading....
r3358 unless committer.blank?
@found_committer_users ||= {}
return @found_committer_users[committer] if @found_committer_users.has_key?(committer)
Toshi MARUYAMA
scm: code clean up repository model....
r5527
Jean-Philippe Lang
Memorize commit authors to speed up changesets loading....
r3358 user = nil
Jean-Philippe Lang
Maps repository users to Redmine users (#1383)....
r2004 c = changesets.find(:first, :conditions => {:committer => committer}, :include => :user)
if c && c.user
Jean-Philippe Lang
Memorize commit authors to speed up changesets loading....
r3358 user = c.user
Jean-Philippe Lang
Maps repository users to Redmine users (#1383)....
r2004 elsif committer.strip =~ /^([^<]+)(<(.*)>)?$/
username, email = $1.strip, $3
u = User.find_by_login(username)
u ||= User.find_by_mail(email) unless email.blank?
Jean-Philippe Lang
Memorize commit authors to speed up changesets loading....
r3358 user = u
Jean-Philippe Lang
Maps repository users to Redmine users (#1383)....
r2004 end
Jean-Philippe Lang
Memorize commit authors to speed up changesets loading....
r3358 @found_committer_users[committer] = user
user
Jean-Philippe Lang
Maps repository users to Redmine users (#1383)....
r2004 end
end
Toshi MARUYAMA
scm: catch exception of getting command and version in model (#4273)....
r4762
Toshi MARUYAMA
scm: ignore log encoding setting in Subversion and Mercurial (#7597)....
r4842 def repo_log_encoding
Toshi MARUYAMA
scm: add feature of per project repository log encoding setting (#1735)....
r4862 encoding = log_encoding.to_s.strip
Toshi MARUYAMA
scm: ignore log encoding setting in Subversion and Mercurial (#7597)....
r4842 encoding.blank? ? 'UTF-8' : encoding
end
Jean-Philippe Lang
Fixed: Repository.fetch_changesets tries to fetch changesets for archived projects (#4782)....
r3288 # Fetches new changesets for all repositories of active projects
# Can be called periodically by an external script
Jean-Philippe Lang
SVN commits are now stored in the database, and added to the activity view and the search engine....
r374 # eg. ruby script/runner "Repository.fetch_changesets"
def self.fetch_changesets
Jean-Philippe Lang
Fixed: Repository.fetch_changesets tries to fetch changesets for archived projects (#4782)....
r3288 Project.active.has_module(:repository).find(:all, :include => :repository).each do |project|
if project.repository
Toshi MARUYAMA
scm: catch CommandFailed during bulk Repository.fetch_changesets (#4455)....
r4704 begin
project.repository.fetch_changesets
rescue Redmine::Scm::Adapters::CommandFailed => e
Toshi MARUYAMA
scm: catch exception of getting command and version in model (#4273)....
r4762 logger.error "scm: error during fetching changesets: #{e.message}"
Toshi MARUYAMA
scm: catch CommandFailed during bulk Repository.fetch_changesets (#4455)....
r4704 end
Jean-Philippe Lang
Fixed: Repository.fetch_changesets tries to fetch changesets for archived projects (#4782)....
r3288 end
end
Jean-Philippe Lang
svn browser merged in trunk...
r103 end
Toshi MARUYAMA
scm: catch exception of getting command and version in model (#4273)....
r4762
Jean-Philippe Lang
Commit messages are now scanned for referenced or fixed issue IDs....
r470 # scan changeset comments to find related and fixed issues for all repositories
def self.scan_changesets_for_issue_ids
find(:all).each(&:scan_changesets_for_issue_ids)
end
Jean-Philippe Lang
Added basic support for CVS and Mercurial SCMs....
r556
def self.scm_name
'Abstract'
end
Toshi MARUYAMA
scm: code clean up repository model....
r5533
Jean-Philippe Lang
Added basic support for CVS and Mercurial SCMs....
r556 def self.available_scm
subclasses.collect {|klass| [klass.scm_name, klass.name]}
end
Toshi MARUYAMA
scm: ignore log encoding setting in Subversion and Mercurial (#7597)....
r4842
Jean-Philippe Lang
Added basic support for CVS and Mercurial SCMs....
r556 def self.factory(klass_name, *args)
klass = "Repository::#{klass_name}".constantize
klass.new(*args)
rescue
nil
end
Toshi MARUYAMA
scm: add scm command and version methods at repository models (#4273)....
r4702
def self.scm_adapter_class
nil
end
def self.scm_command
Toshi MARUYAMA
scm: catch exception of getting command and version in model (#4273)....
r4762 ret = ""
begin
ret = self.scm_adapter_class.client_command if self.scm_adapter_class
rescue Redmine::Scm::Adapters::CommandFailed => e
logger.error "scm: error during get command: #{e.message}"
end
ret
Toshi MARUYAMA
scm: add scm command and version methods at repository models (#4273)....
r4702 end
def self.scm_version_string
Toshi MARUYAMA
scm: catch exception of getting command and version in model (#4273)....
r4762 ret = ""
begin
ret = self.scm_adapter_class.client_version_string if self.scm_adapter_class
rescue Redmine::Scm::Adapters::CommandFailed => e
logger.error "scm: error during get version string: #{e.message}"
end
ret
Toshi MARUYAMA
scm: add scm command and version methods at repository models (#4273)....
r4702 end
def self.scm_available
Toshi MARUYAMA
scm: catch exception of getting command and version in model (#4273)....
r4762 ret = false
begin
Toshi MARUYAMA
scm: code clean up repository model....
r5533 ret = self.scm_adapter_class.client_available if self.scm_adapter_class
Toshi MARUYAMA
scm: catch exception of getting command and version in model (#4273)....
r4762 rescue Redmine::Scm::Adapters::CommandFailed => e
logger.error "scm: error during get scm available: #{e.message}"
end
ret
Toshi MARUYAMA
scm: add scm command and version methods at repository models (#4273)....
r4702 end
Jean-Philippe Lang
Strip repository urls (closes #852)....
r1234 private
Toshi MARUYAMA
scm: update adapter initialize() to use path encoding (#2664, #2274)....
r4821
Jean-Philippe Lang
Strip repository urls (closes #852)....
r1234 def before_save
# Strips url and root_url
url.strip!
root_url.strip!
true
end
Toshi MARUYAMA
scm: code clean up repository model....
r5527
Jean-Philippe Lang
Clear changesets and changes with raw sql when deleting a repository (#1627)....
r1651 def clear_changesets
Jean-Philippe Lang
Removes hardcoded table names in Repository#clear_changesets....
r2619 cs, ch, ci = Changeset.table_name, Change.table_name, "#{table_name_prefix}changesets_issues#{table_name_suffix}"
connection.delete("DELETE FROM #{ch} WHERE #{ch}.changeset_id IN (SELECT #{cs}.id FROM #{cs} WHERE #{cs}.repository_id = #{id})")
connection.delete("DELETE FROM #{ci} WHERE #{ci}.changeset_id IN (SELECT #{cs}.id FROM #{cs} WHERE #{cs}.repository_id = #{id})")
connection.delete("DELETE FROM #{cs} WHERE #{cs}.repository_id = #{id}")
Jean-Philippe Lang
Clear changesets and changes with raw sql when deleting a repository (#1627)....
r1651 end
Jean-Philippe Lang
svn browser merged in trunk...
r103 end