]> source.dussan.org Git - redmine.git/commitdiff
fixed problems when svn path doesn't point to the root directory of the repository.
authorJean-Philippe Lang <jp_lang@yahoo.fr>
Sun, 18 Mar 2007 15:48:05 +0000 (15:48 +0000)
committerJean-Philippe Lang <jp_lang@yahoo.fr>
Sun, 18 Mar 2007 15:48:05 +0000 (15:48 +0000)
a root_url property has been added on the repository. it's automatically retrieved the first time the repository is browsed

git-svn-id: http://redmine.rubyforge.org/svn/trunk@344 e93f8b46-1217-0410-a6f0-8f06a7374b81

app/models/repository.rb
app/models/svn_repos.rb
app/views/repositories/diff.rhtml
app/views/repositories/revision.rhtml
db/migrate/031_add_repository_root_url.rb [new file with mode: 0644]

index d6e0e11aa8e97f2c3d2e349e57c9ec14f3b3d79e..16bee25a76473a59dbcc8cdb3fbea5febb5c0954 100644 (file)
@@ -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
index 3ed81403d8af024e303b69849ddd803c2bfd1827..2fd907319602d52c674e671cab49aaa1262c4956 100644 (file)
@@ -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
index eb8777de4d7ea4299c6e89a55a52505111b3ec80..1671e44df2f33d75684c89d286c238502de3fee7 100644 (file)
@@ -1,4 +1,4 @@
-<h2><%= render :partial => 'navigation', :locals => { :path => @path, :kind => 'file', :revision => @rev } %></h2>
+<h2><%= l(:label_revision) %> <%= @rev %>: <%= @path.gsub(/^.*\//, '') %></h2>
 
 <% parsing = false
 line_num_l = 0
index d017a79f72ddc895ca7d6c71b9f8dae877f26396..22e965090d6f01fdb6237b9ba3d281ebbbe45504 100644 (file)
@@ -24,7 +24,7 @@
 <td><div class="square action_<%= path[:action] %>"></div> <%= path[:path] %></td>
 <td>
 <% 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 %>
 </td>
 </tr>
diff --git a/db/migrate/031_add_repository_root_url.rb b/db/migrate/031_add_repository_root_url.rb
new file mode 100644 (file)
index 0000000..df57809
--- /dev/null
@@ -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