diff --git a/lib/redmine/scm/adapters/mercurial_adapter.rb b/lib/redmine/scm/adapters/mercurial_adapter.rb index 7607dd1ca..a493a94ee 100644 --- a/lib/redmine/scm/adapters/mercurial_adapter.rb +++ b/lib/redmine/scm/adapters/mercurial_adapter.rb @@ -183,25 +183,33 @@ module Redmine return nil if $? && $?.exitstatus != 0 cat end - + def annotate(path, identifier=nil) path ||= '' cmd = "#{HG_BIN} -R #{target('')}" - cmd << " annotate -n -u" - cmd << " -r " + shell_quote(identifier ? identifier.to_s : "tip") - cmd << " -r #{identifier.to_i}" if identifier + cmd << " annotate -ncu" + cmd << " -r #{hgrev(identifier)}" cmd << " #{target(path)}" blame = Annotate.new shellout(cmd) do |io| io.each_line do |line| - next unless line =~ %r{^([^:]+)\s(\d+):(.*)$} - blame.add_line($3.rstrip, Revision.new(:identifier => $2.to_i, :author => $1.strip)) + next unless line =~ %r{^([^:]+)\s(\d+)\s([0-9a-f]+):\s(.*)$} + r = Revision.new(:author => $1.strip, :revision => $2, :scmid => $3, + :identifier => $3) + blame.add_line($4.rstrip, r) end end return nil if $? && $?.exitstatus != 0 blame end + class Revision < Redmine::Scm::Adapters::Revision + # Returns the readable identifier + def format_identifier + "#{revision}:#{scmid}" + end + end + # Returns correct revision identifier def hgrev(identifier) identifier.blank? ? 'tip' : identifier.to_s diff --git a/test/functional/repositories_mercurial_controller_test.rb b/test/functional/repositories_mercurial_controller_test.rb index b577da87e..41f5462fd 100644 --- a/test/functional/repositories_mercurial_controller_test.rb +++ b/test/functional/repositories_mercurial_controller_test.rb @@ -134,7 +134,7 @@ class RepositoriesMercurialControllerTest < ActionController::TestCase :attributes => { :class => /diff_out/ }, :content => /def remove/ } end - + def test_annotate get :annotate, :id => 3, :path => ['sources', 'watchers_controller.rb'] assert_response :success @@ -147,8 +147,7 @@ class RepositoriesMercurialControllerTest < ActionController::TestCase { :tag => 'td', :attributes => { :class => 'revision' }, - :child => { :tag => 'a', :content => '4' } - # :child => { :tag => 'a', :content => /4:def6d2f1/ } + :child => { :tag => 'a', :content => '4:def6d2f1254a' } } assert_tag :tag => 'th', :content => '23', diff --git a/test/unit/lib/redmine/scm/adapters/mercurial_adapter_test.rb b/test/unit/lib/redmine/scm/adapters/mercurial_adapter_test.rb index 088664bdd..2285d92b6 100644 --- a/test/unit/lib/redmine/scm/adapters/mercurial_adapter_test.rb +++ b/test/unit/lib/redmine/scm/adapters/mercurial_adapter_test.rb @@ -71,6 +71,19 @@ begin assert_nil @adapter.cat('sources/welcome_controller.rb') end + def test_annotate + assert_equal [], @adapter.annotate("sources/welcome_controller.rb").lines + [2, '400bb8672109', '400', 400].each do |r| + ann = @adapter.annotate('sources/welcome_controller.rb', r) + assert ann + assert_equal '1', ann.revisions[17].revision + assert_equal '9d5b5b004199', ann.revisions[17].identifier + assert_equal 'jsmith', ann.revisions[0].author + assert_equal 25, ann.lines.length + assert_equal 'class WelcomeController < ApplicationController', ann.lines[17] + end + end + def test_access_by_nodeid path = 'sources/welcome_controller.rb' assert_equal @adapter.cat(path, 2), @adapter.cat(path, '400bb8672109')