diff --git a/app/models/repository.rb b/app/models/repository.rb index d6e0e11a..16bee25a 100644 --- a/app/models/repository.rb +++ b/app/models/repository.rb @@ -19,10 +19,18 @@ class Repository < ActiveRecord::Base belongs_to :project validates_presence_of :url validates_format_of :url, :with => /^(http|https|svn|file):\/\/.+/i - - @scm = nil def scm - @scm ||= SvnRepos::Base.new url, login, password + @scm ||= SvnRepos::Base.new url, root_url, login, password + update_attribute(:root_url, @scm.root_url) if root_url.blank? + @scm + end + + def url=(str) + unless str == self.url + self.attributes = {:root_url => nil } + @scm = nil + end + super end end diff --git a/app/models/svn_repos.rb b/app/models/svn_repos.rb index 3ed81403..2fd90731 100644 --- a/app/models/svn_repos.rb +++ b/app/models/svn_repos.rb @@ -24,10 +24,37 @@ module SvnRepos class Base - def initialize(url, login=nil, password=nil) + def initialize(url, root_url=nil, login=nil, password=nil) @url = url @login = login if login && !login.empty? @password = (password || "") if @login + @root_url = root_url.blank? ? retrieve_root_url : root_url + end + + def root_url + @root_url + end + + def url + @url + end + + # finds the root url of the svn repository + def retrieve_root_url + cmd = "svn info --xml #{target('')}" + cmd << " --username #{@login} --password #{@password}" if @login + root_url = nil + shellout(cmd) do |io| + begin + doc = REXML::Document.new(io) + root_url = doc.elements["info/entry/repository/root"].text + rescue + end + end + return nil if $? && $?.exitstatus != 0 + root_url + rescue Errno::ENOENT => e + return nil end # Returns the entry identified by path and revision identifier @@ -146,7 +173,9 @@ module SvnRepos private def target(path) - " \"" << "#{@url}/#{path}".gsub(/["'?<>\*]/, '') << "\"" + path ||= "" + base = path.match(/^\//) ? root_url : url + " \"" << "#{base}/#{path}".gsub(/["'?<>\*]/, '') << "\"" end def logger diff --git a/app/views/repositories/diff.rhtml b/app/views/repositories/diff.rhtml index eb8777de..1671e44d 100644 --- a/app/views/repositories/diff.rhtml +++ b/app/views/repositories/diff.rhtml @@ -1,4 +1,4 @@ -

<%= render :partial => 'navigation', :locals => { :path => @path, :kind => 'file', :revision => @rev } %>

+

<%= l(:label_revision) %> <%= @rev %>: <%= @path.gsub(/^.*\//, '') %>

<% parsing = false line_num_l = 0 diff --git a/app/views/repositories/revision.rhtml b/app/views/repositories/revision.rhtml index d017a79f..22e96509 100644 --- a/app/views/repositories/revision.rhtml +++ b/app/views/repositories/revision.rhtml @@ -24,7 +24,7 @@
<%= path[:path] %> <% if path[:action] == "M" %> -<%= link_to 'View diff', :action => 'diff', :id => @project, :path => path[:path].gsub(/^\//, ''), :rev => @revision.identifier %> +<%= link_to 'View diff', :action => 'diff', :id => @project, :path => path[:path], :rev => @revision.identifier %> <% end %> diff --git a/db/migrate/031_add_repository_root_url.rb b/db/migrate/031_add_repository_root_url.rb new file mode 100644 index 00000000..df57809c --- /dev/null +++ b/db/migrate/031_add_repository_root_url.rb @@ -0,0 +1,9 @@ +class AddRepositoryRootUrl < ActiveRecord::Migration + def self.up + add_column :repositories, :root_url, :string, :limit => 255, :default => "" + end + + def self.down + remove_column :repositories, :root_url + end +end