##// END OF EJS Templates
set default category_id instead of the object (#11665)...
set default category_id instead of the object (#11665) Rails 2.3 still has issues with synchronizing the association_id and association attributes of an object. That means, if you set the association with an object first and then just set the id afterwards, the object wins and the setting of the id gets lost. This is not an issue in Rails >= 3.1 anymore. Contributed by Holger Just. git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.4-stable@10226 e93f8b46-1217-0410-a6f0-8f06a7374b81

File last commit:

r9177:29782860b7c2
r10043:14dcefaa97f9
Show More
mercurial.rb
158 lines | 5.5 KiB | text/x-ruby | RubyLexer
Toshi MARUYAMA
scm: mercurial: remove trailing white-spaces from model source....
r5636 # Redmine - project management software
# Copyright (C) 2006-2011 Jean-Philippe Lang
Jean-Philippe Lang
Added basic support for CVS and Mercurial SCMs....
r556 #
# 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: mercurial: remove trailing white-spaces from model source....
r5636 #
Jean-Philippe Lang
Added basic support for CVS and Mercurial SCMs....
r556 # 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: mercurial: remove trailing white-spaces from model source....
r5636 #
Jean-Philippe Lang
Added basic support for CVS and Mercurial SCMs....
r556 # 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.
require 'redmine/scm/adapters/mercurial_adapter'
class Repository::Mercurial < Repository
Toshi MARUYAMA
Fixed: repository: mercurial: sort changesets by revision (#3449, #3567)....
r4491 # sort changesets by revision number
Toshi MARUYAMA
scm: mercurial: code clean up model....
r5811 has_many :changesets,
:order => "#{Changeset.table_name}.id DESC",
:foreign_key => 'repository_id'
Toshi MARUYAMA
Fixed: repository: mercurial: sort changesets by revision (#3449, #3567)....
r4491
Toshi MARUYAMA
scm: mercurial: code clean up model....
r5811 attr_protected :root_url
Jean-Philippe Lang
Added basic support for CVS and Mercurial SCMs....
r556 validates_presence_of :url
Toshi MARUYAMA
scm: mercurial: code clean up model....
r5811 # number of changesets to fetch at once
FETCH_AT_ONCE = 100
Toshi MARUYAMA
scm: mercurial: refactor Repository::Mercurial#fetch_changesets (#4455)....
r4729
Jean-Philippe Lang
human_attribute_name accepts optional argument....
r8166 def self.human_attribute_name(attribute_key_name, *args)
Toshi MARUYAMA
Rails3: scm: mercurial: use .to_s for overriding human_attribute_name parameter...
r8856 attr_name = attribute_key_name.to_s
Toshi MARUYAMA
scm: use i18n string at 'Path to repository' setting in Mercurial, Git, Bazaar and Darcs....
r5409 if attr_name == "url"
attr_name = "path_to_repository"
end
Jean-Philippe Lang
human_attribute_name accepts optional argument....
r8166 super(attr_name, *args)
Toshi MARUYAMA
scm: add scm specific human_attribute_name for input validation....
r4855 end
Toshi MARUYAMA
scm: add scm command and version methods at repository models (#4273)....
r4702 def self.scm_adapter_class
Jean-Philippe Lang
Added basic support for CVS and Mercurial SCMs....
r556 Redmine::Scm::Adapters::MercurialAdapter
end
Toshi MARUYAMA
scm: mercurial: use scmid as identifier (#3724)....
r4575
Jean-Philippe Lang
Added basic support for CVS and Mercurial SCMs....
r556 def self.scm_name
'Mercurial'
end
Toshi MARUYAMA
scm: mercurial: use scmid as identifier (#3724)....
r4575
Toshi MARUYAMA
scm: set supporting directory revisions or not at scm level....
r5024 def supports_directory_revisions?
true
end
Toshi MARUYAMA
scm: model: mercurial: set revision graph support true (#5501)...
r7598 def supports_revision_graph?
true
end
Toshi MARUYAMA
scm: ignore log encoding setting in Subversion and Mercurial (#7597)....
r4842 def repo_log_encoding
'UTF-8'
end
Toshi MARUYAMA
scm: mercurial: use scmid as identifier (#3724)....
r4575 # Returns the readable identifier for the given mercurial changeset
def self.format_changeset_identifier(changeset)
Toshi MARUYAMA
scm: mercurial: use revision text mercurial style "2:400bb8672109" (#3724)....
r4577 "#{changeset.revision}:#{changeset.scmid}"
Toshi MARUYAMA
scm: mercurial: use scmid as identifier (#3724)....
r4575 end
# Returns the identifier for the given Mercurial changeset
def self.changeset_identifier(changeset)
changeset.scmid
end
Toshi MARUYAMA
scm: mercurial: change two revision diff text of mercurial (#3724)....
r4579 def diff_format_revisions(cs, cs_to, sep=':')
super(cs, cs_to, ' ')
end
Toshi MARUYAMA
scm: mercurial: accept both of revision and nodeid as changeset id (#3724)....
r4534 # Finds and returns a revision with a number or the beginning of a hash
def find_changeset_by_name(name)
Toshi MARUYAMA
scm: mercurial: use to_s for revision in find_changeset_by_name method...
r8818 return nil if name.blank?
s = name.to_s
if /[^\d]/ =~ s or s.size > 8
e = changesets.find(:first, :conditions => ['scmid = ?', s])
Toshi MARUYAMA
scm: mercurial: accept both of revision and nodeid as changeset id (#3724)....
r4534 else
Toshi MARUYAMA
scm: mercurial: use to_s for revision in find_changeset_by_name method...
r8818 e = changesets.find(:first, :conditions => ['revision = ?', s])
Toshi MARUYAMA
scm: mercurial: accept both of revision and nodeid as changeset id (#3724)....
r4534 end
return e if e
Toshi MARUYAMA
scm: mercurial: use to_s for revision in find_changeset_by_name method...
r8818 changesets.find(:first, :conditions => ['scmid LIKE ?', "#{s}%"]) # last ditch
Toshi MARUYAMA
scm: mercurial: accept both of revision and nodeid as changeset id (#3724)....
r4534 end
Toshi MARUYAMA
Fixed: repository: mercurial: sort changesets by revision (#3449, #3567)....
r4491 # Returns the latest changesets for +path+; sorted by revision number
Toshi MARUYAMA
scm: mercurial: add :order => 'id DESC' explicitly for MySQL test fails....
r4971 #
# Because :order => 'id DESC' is defined at 'has_many',
# there is no need to set 'order'.
# But, MySQL test fails.
# Sqlite3 and PostgreSQL pass.
# Is this MySQL bug?
Toshi MARUYAMA
Fixed: repository: mercurial: sort changesets by revision (#3449, #3567)....
r4491 def latest_changesets(path, rev, limit=10)
Toshi MARUYAMA
scm: mercurial: code clean up model....
r5811 changesets.find(:all,
:include => :user,
Toshi MARUYAMA
scm: mercurial: latest changesets improvement and supporting tag (#1981)....
r5003 :conditions => latest_changesets_cond(path, rev, limit),
Toshi MARUYAMA
scm: mercurial: code clean up model....
r5811 :limit => limit,
:order => "#{Changeset.table_name}.id DESC")
Toshi MARUYAMA
scm: mercurial: latest changesets improvement and supporting tag (#1981)....
r5003 end
def latest_changesets_cond(path, rev, limit)
cond, args = [], []
Toshi MARUYAMA
scm: mercurial: latest changesets support named branch (#7246)....
r5007 if scm.branchmap.member? rev
# Mercurial named branch is *stable* in each revision.
# So, named branch can be stored in database.
# Mercurial provides *bookmark* which is equivalent with git branch.
# But, bookmark is not implemented.
cond << "#{Changeset.table_name}.scmid IN (?)"
# Revisions in root directory and sub directory are not equal.
# So, in order to get correct limit, we need to get all revisions.
# But, it is very heavy.
Toshi MARUYAMA
scm: mercurial: increase limit of branch directory latest changesets....
r5026 # Mercurial does not treat direcotry.
# So, "hg log DIR" is very heavy.
branch_limit = path.blank? ? limit : ( limit * 5 )
args << scm.nodes_in_branch(rev, :limit => branch_limit)
Toshi MARUYAMA
scm: mercurial: latest changesets support named branch (#7246)....
r5007 elsif last = rev ? find_changeset_by_name(scm.tagmap[rev] || rev) : nil
Toshi MARUYAMA
scm: mercurial: latest changesets improvement and supporting tag (#1981)....
r5003 cond << "#{Changeset.table_name}.id <= ?"
args << last.id
Toshi MARUYAMA
Fixed: repository: mercurial: sort changesets by revision (#3449, #3567)....
r4491 end
Toshi MARUYAMA
scm: mercurial: latest changesets improvement and supporting tag (#1981)....
r5003 unless path.blank?
cond << "EXISTS (SELECT * FROM #{Change.table_name}
WHERE #{Change.table_name}.changeset_id = #{Changeset.table_name}.id
Toshi MARUYAMA
scm: mercurial: remove trailing white-spaces from model source....
r5636 AND (#{Change.table_name}.path = ?
Toshi MARUYAMA
scm: mercurial: latest changesets improvement and supporting tag (#1981)....
r5003 OR #{Change.table_name}.path LIKE ? ESCAPE ?))"
args << path.with_leading_slash
Toshi MARUYAMA
scm: mercurial: use regexp %r{} instead of // in model latest_changesets_cond()....
r5810 args << "#{path.with_leading_slash.gsub(%r{[%_\\]}) { |s| "\\#{s}" }}/%" << '\\'
Toshi MARUYAMA
scm: mercurial: latest changesets improvement and supporting tag (#1981)....
r5003 end
[cond.join(' AND '), *args] unless cond.empty?
Toshi MARUYAMA
Fixed: repository: mercurial: sort changesets by revision (#3449, #3567)....
r4491 end
Toshi MARUYAMA
scm: mercurial: latest changesets improvement and supporting tag (#1981)....
r5003 private :latest_changesets_cond
Toshi MARUYAMA
Fixed: repository: mercurial: sort changesets by revision (#3449, #3567)....
r4491
Jean-Philippe Lang
Added basic support for CVS and Mercurial SCMs....
r556 def fetch_changesets
Toshi MARUYAMA
scm: mercurial: do nothing in fetching if info is nil (#8777)....
r6126 return if scm.info.nil?
Toshi MARUYAMA
scm: mercurial: refactor Repository::Mercurial#fetch_changesets (#4455)....
r4729 scm_rev = scm.info.lastrev.revision.to_i
Toshi MARUYAMA
scm: mercurial: code clean up model....
r5811 db_rev = latest_changeset ? latest_changeset.revision.to_i : -1
Toshi MARUYAMA
scm: mercurial: refactor Repository::Mercurial#fetch_changesets (#4455)....
r4729 return unless db_rev < scm_rev # already up-to-date
logger.debug "Fetching changesets for repository #{url}" if logger
(db_rev + 1).step(scm_rev, FETCH_AT_ONCE) do |i|
Toshi MARUYAMA
scm: mercurial: transaction for each imported revisions (#10470)...
r9154 scm.each_revision('', i, [i + FETCH_AT_ONCE - 1, scm_rev].min) do |re|
transaction do
Toshi MARUYAMA
scm: mercurial: git: save parents in creating changesets (#10470)...
r9177 parents = (re.parents || []).collect{|rp| find_changeset_by_name(rp)}.compact
Toshi MARUYAMA
scm: mercurial: code clean up model....
r5811 cs = Changeset.create(:repository => self,
:revision => re.revision,
:scmid => re.scmid,
:committer => re.author,
Toshi MARUYAMA
scm: mercurial: refactor Repository::Mercurial#fetch_changesets (#4455)....
r4729 :committed_on => re.time,
Toshi MARUYAMA
scm: mercurial: git: save parents in creating changesets (#10470)...
r9177 :comments => re.message,
:parents => parents)
Toshi MARUYAMA
scm: mercurial: transaction for each imported revisions (#10470)...
r9154 unless cs.new_record?
re.paths.each { |e| cs.create_change(e) }
Toshi MARUYAMA
scm: mercurial: model: save parent/child relation for changesets (#5501)...
r7593 end
Jean-Philippe Lang
Added basic support for CVS and Mercurial SCMs....
r556 end
end
end
end
end