##// END OF EJS Templates
Introduce virtual MenuNodes (#15880)....
Introduce virtual MenuNodes (#15880). They are characterized by having a blank url. they will only be rendered if the user is authorized to see at least one of its children. they render as links which do nothing when clicked. Patch by Jan Schulz-Hofen. git-svn-id: http://svn.redmine.org/redmine/trunk@15501 e93f8b46-1217-0410-a6f0-8f06a7374b81

File last commit:

r14856:cda9c63d9c21
r15119:53710d80fc88
Show More
mercurial.rb
211 lines | 6.7 KiB | text/x-ruby | RubyLexer
Toshi MARUYAMA
scm: mercurial: remove trailing white-spaces from model source....
r5636 # Redmine - project management software
Jean-Philippe Lang
Updates copyright for 2016....
r14856 # Copyright (C) 2006-2016 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,
Jean-Philippe Lang
Merged rails-4.1 branch (#14534)....
r13100 lambda {order("#{Changeset.table_name}.id DESC")},
Toshi MARUYAMA
scm: mercurial: code clean up model....
r5811 :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 12 chars id for format_changeset_identifier (#14361)...
r12474 "#{changeset.revision}:#{changeset.scmid[0, 12]}"
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: switch short or long id of entry by existing value in DB (#14361)...
r12485 def modify_entry_lastrev_identifier(entry)
if entry.lastrev && entry.lastrev.identifier
entry.lastrev.identifier = scmid_for_inserting_db(entry.lastrev.identifier)
end
end
private :modify_entry_lastrev_identifier
Toshi MARUYAMA
scm: mercurial: override entry and scm_entries (#14361)...
r12484 def entry(path=nil, identifier=nil)
Toshi MARUYAMA
scm: mercurial: switch short or long id of entry by existing value in DB (#14361)...
r12485 entry = scm.entry(path, identifier)
return nil if entry.nil?
modify_entry_lastrev_identifier(entry)
entry
Toshi MARUYAMA
scm: mercurial: override entry and scm_entries (#14361)...
r12484 end
def scm_entries(path=nil, identifier=nil)
Toshi MARUYAMA
scm: mercurial: switch short or long id of entry by existing value in DB (#14361)...
r12485 entries = scm.entries(path, identifier)
return nil if entries.nil?
entries.each {|entry| modify_entry_lastrev_identifier(entry)}
entries
Toshi MARUYAMA
scm: mercurial: override entry and scm_entries (#14361)...
r12484 end
protected :scm_entries
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
Toshi MARUYAMA
scm: mercurial: use Rails3 ActiveRecord syntax with same as git r9807 at find_changeset_by_name...
r9629 cs = changesets.where(:scmid => s).first
Toshi MARUYAMA
scm: mercurial: accept both of revision and nodeid as changeset id (#3724)....
r4534 else
Toshi MARUYAMA
scm: mercurial: use Rails3 ActiveRecord syntax with same as git r9807 at find_changeset_by_name...
r9629 cs = changesets.where(:revision => s).first
Toshi MARUYAMA
scm: mercurial: accept both of revision and nodeid as changeset id (#3724)....
r4534 end
Toshi MARUYAMA
scm: mercurial: use Rails3 ActiveRecord syntax with same as git r9807 at find_changeset_by_name...
r9629 return cs if cs
changesets.where('scmid LIKE ?', "#{s}%").first
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)
Jean-Philippe Lang
Replaces find(:all) calls....
r10690 changesets.
includes(:user).
where(latest_changesets_cond(path, rev, limit)).
Jean-Philippe Lang
Merged rails-4.1 branch (#14534)....
r13100 references(:user).
Toshi MARUYAMA
backout r12562 : remove unneeded Relation#all from Repository::Mercurial#latest_changesets...
r12292 limit(limit).
Jean-Philippe Lang
Replaces find(:all) calls....
r10690 order("#{Changeset.table_name}.id DESC").
Jean-Philippe Lang
Merged rails-4.1 branch (#14534)....
r13100 to_a
Toshi MARUYAMA
scm: mercurial: latest changesets improvement and supporting tag (#1981)....
r5003 end
Toshi MARUYAMA
scm: mercurial: insert long id to DB unless existing id in DB is not short id (#14361)...
r12502 def is_short_id_in_db?
return @is_short_id_in_db unless @is_short_id_in_db.nil?
cs = changesets.first
@is_short_id_in_db = (!cs.nil? && cs.scmid.length != 40)
end
private :is_short_id_in_db?
Toshi MARUYAMA
scm: mercurial: add method to switch short or long id by existing value in DB (#14361)...
r12480 def scmid_for_inserting_db(scmid)
Toshi MARUYAMA
scm: mercurial: insert long id to DB unless existing id in DB is not short id (#14361)...
r12502 is_short_id_in_db? ? scmid[0, 12] : scmid
Toshi MARUYAMA
scm: mercurial: add method to switch short or long id by existing value in DB (#14361)...
r12480 end
Toshi MARUYAMA
scm: mercurial: split Repository::Mercurial#latest_changesets_cond for short and long id (#14361)...
r12476 def nodes_in_branch(rev, branch_limit)
scm.nodes_in_branch(rev, :limit => branch_limit).collect do |b|
Toshi MARUYAMA
scm: mercurial: add method to switch short or long id by existing value in DB (#14361)...
r12480 scmid_for_inserting_db(b)
Toshi MARUYAMA
scm: mercurial: split Repository::Mercurial#latest_changesets_cond for short and long id (#14361)...
r12476 end
end
def tag_scmid(rev)
scmid = scm.tagmap[rev]
Toshi MARUYAMA
scm: mercurial: add method to switch short or long id by existing value in DB (#14361)...
r12480 scmid.nil? ? nil : scmid_for_inserting_db(scmid)
Toshi MARUYAMA
scm: mercurial: split Repository::Mercurial#latest_changesets_cond for short and long id (#14361)...
r12476 end
Toshi MARUYAMA
scm: mercurial: latest changesets improvement and supporting tag (#1981)....
r5003 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
fix typo of app/models/repository/mercurial.rb...
r12854 # Mercurial does not treat directory.
Toshi MARUYAMA
scm: mercurial: increase limit of branch directory latest changesets....
r5026 # So, "hg log DIR" is very heavy.
branch_limit = path.blank? ? limit : ( limit * 5 )
Toshi MARUYAMA
scm: mercurial: split Repository::Mercurial#latest_changesets_cond for short and long id (#14361)...
r12476 args << nodes_in_branch(rev, branch_limit)
elsif last = rev ? find_changeset_by_name(tag_scmid(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: add method to switch short or long id by existing value in DB (#14361)...
r12480 parents = (re.parents || []).collect do |rp|
find_changeset_by_name(scmid_for_inserting_db(rp))
end.compact
Toshi MARUYAMA
scm: mercurial: code clean up model....
r5811 cs = Changeset.create(:repository => self,
:revision => re.revision,
Toshi MARUYAMA
scm: mercurial: add method to switch short or long id by existing value in DB (#14361)...
r12480 :scmid => scmid_for_inserting_db(re.scmid),
Toshi MARUYAMA
scm: mercurial: code clean up model....
r5811 :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?
Toshi MARUYAMA
scm: mercurial: add method to switch short or long id by existing value in DB (#14361)...
r12480 re.paths.each do |e|
if from_revision = e[:from_revision]
e[:from_revision] = scmid_for_inserting_db(from_revision)
end
cs.create_change(e)
end
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