Mercurial: Get proper file action on revision (#983).

git-svn-id: http://redmine.rubyforge.org/svn/trunk@1332 e93f8b46-1217-0410-a6f0-8f06a7374b81
This commit is contained in:
Jean-Philippe Lang 2008-04-06 12:00:11 +00:00
parent a7ca01a8de
commit db7f890030
1 changed files with 43 additions and 14 deletions

View File

@ -88,13 +88,7 @@ module Redmine
value = $2 value = $2
if parsing_descr && line_feeds > 1 if parsing_descr && line_feeds > 1
parsing_descr = false parsing_descr = false
revisions << Revision.new({:identifier => changeset[:changeset].split(':').first.to_i, revisions << build_revision_from_changeset(changeset)
:scmid => changeset[:changeset].split(':').last,
:author => changeset[:user],
:time => Time.parse(changeset[:date]),
:message => changeset[:description],
:paths => changeset[:files].to_s.split.collect{|path| {:action => 'X', :path => "/#{path}"}}
})
changeset = {} changeset = {}
end end
if !parsing_descr if !parsing_descr
@ -111,13 +105,7 @@ module Redmine
line_feeds += 1 if line.chomp.empty? line_feeds += 1 if line.chomp.empty?
end end
end end
revisions << Revision.new({:identifier => changeset[:changeset].split(':').first.to_i, revisions << build_revision_from_changeset(changeset)
:scmid => changeset[:changeset].split(':').last,
:author => changeset[:user],
:time => Time.parse(changeset[:date]),
:message => changeset[:description],
:paths => changeset[:files].to_s.split.collect{|path| {:action => 'X', :path => "/#{path}"}}
})
end end
return nil if $? && $?.exitstatus != 0 return nil if $? && $?.exitstatus != 0
revisions revisions
@ -171,6 +159,47 @@ module Redmine
return nil if $? && $?.exitstatus != 0 return nil if $? && $?.exitstatus != 0
blame blame
end end
private
# Builds a revision objet from the changeset returned by hg command
def build_revision_from_changeset(changeset)
rev_id = changeset[:changeset].to_s.split(':').first.to_i
# Changes
paths = (rev_id == 0) ?
# Can't get changes for revision 0 with hg status
changeset[:files].to_s.split.collect{|path| {:action => 'A', :path => "/#{path}"}} :
status(rev_id)
Revision.new({:identifier => rev_id,
:scmid => changeset[:changeset].to_s.split(':').last,
:author => changeset[:user],
:time => Time.parse(changeset[:date]),
:message => changeset[:description],
:paths => paths
})
end
# Returns the file changes for a given revision
def status(rev_id)
cmd = "#{HG_BIN} -R #{target('')} status --rev #{rev_id.to_i - 1}:#{rev_id.to_i}"
result = []
shellout(cmd) do |io|
io.each_line do |line|
action, file = line.chomp.split
next unless action && file
file.gsub!("\\", "/")
case action
when 'R'
result << { :action => 'D' , :path => "/#{file}" }
else
result << { :action => action, :path => "/#{file}" }
end
end
end
result
end
end end
end end
end end