From 7a20a4d32b718f803aa4e3af286ab6a2275b8b6f Mon Sep 17 00:00:00 2001 From: Jean-Philippe Lang Date: Fri, 9 Mar 2007 18:03:31 +0000 Subject: [PATCH] feature #9137 Password-protected SVN repositories * added login and password attributes on repositories * fixed svn calls (svn waiting for user input) git-svn-id: http://redmine.rubyforge.org/svn/trunk@319 e93f8b46-1217-0410-a6f0-8f06a7374b81 --- app/models/repository.rb | 2 +- app/models/svn_repos.rb | 14 ++++++++------ app/views/projects/_form.rhtml | 2 ++ .../026_add_repository_login_and_password.rb | 11 +++++++++++ 4 files changed, 22 insertions(+), 7 deletions(-) create mode 100644 db/migrate/026_add_repository_login_and_password.rb diff --git a/app/models/repository.rb b/app/models/repository.rb index 29e87584..d6e0e11a 100644 --- a/app/models/repository.rb +++ b/app/models/repository.rb @@ -23,6 +23,6 @@ class Repository < ActiveRecord::Base @scm = nil def scm - @scm ||= SvnRepos::Base.new url + @scm ||= SvnRepos::Base.new url, login, password end end diff --git a/app/models/svn_repos.rb b/app/models/svn_repos.rb index 7c6f5e01..aed9f1b5 100644 --- a/app/models/svn_repos.rb +++ b/app/models/svn_repos.rb @@ -23,9 +23,6 @@ module SvnRepos end class Base - @url = nil - @login = nil - @password = nil def initialize(url, login=nil, password=nil) @url = url @@ -47,6 +44,7 @@ module SvnRepos identifier = 'HEAD' unless identifier and identifier > 0 entries = Entries.new cmd = "svn list --xml #{target(path)}@#{identifier}" + cmd << " --username #{@login} --password #{@password}" if @login shellout(cmd) do |io| begin doc = REXML::Document.new(io) @@ -76,8 +74,9 @@ module SvnRepos identifier_from = 'HEAD' unless identifier_from and identifier_from.to_i > 0 identifier_to = 1 unless identifier_to and identifier_to.to_i > 0 revisions = Revisions.new - cmd = "svn log --xml -r #{identifier_from}:#{identifier_to} " - cmd << "--verbose " if options[:with_paths] + cmd = "svn log --xml -r #{identifier_from}:#{identifier_to}" + cmd << " --username #{@login} --password #{@password}" if @login + cmd << " --verbose " if options[:with_paths] cmd << target(path) shellout(cmd) do |io| begin @@ -118,6 +117,7 @@ module SvnRepos cmd << "#{identifier_to}:" cmd << "#{identifier_from}" cmd << "#{target(path)}@#{identifier_from}" + cmd << " --username #{@login} --password #{@password}" if @login diff = [] shellout(cmd) do |io| io.each_line do |line| @@ -133,6 +133,7 @@ module SvnRepos def cat(path, identifier=nil) identifier = (identifier and identifier.to_i > 0) ? identifier.to_i : "HEAD" cmd = "svn cat #{target(path)}@#{identifier}" + cmd << " --username #{@login} --password #{@password}" if @login cat = nil shellout(cmd) do |io| cat = io.read @@ -154,7 +155,8 @@ module SvnRepos def shellout(cmd, &block) logger.debug "Shelling out: #{cmd}" if logger && logger.debug? - IO.popen(cmd) do |io| + IO.popen(cmd, "r+") do |io| + io.close_write block.call(io) if block_given? end end diff --git a/app/views/projects/_form.rhtml b/app/views/projects/_form.rhtml index 14c7a26e..2191e9fa 100644 --- a/app/views/projects/_form.rhtml +++ b/app/views/projects/_form.rhtml @@ -31,6 +31,8 @@
<% fields_for :repository, @project.repository, { :builder => TabularFormBuilder, :lang => current_language} do |repository| %>

<%= repository.text_field :url, :size => 60, :required => true %>
(http://, https://, svn://, file:///)

+

<%= repository.text_field :login, :size => 30 %>

+

<%= repository.password_field :password, :size => 30 %>

<% end %>
<%= javascript_tag "Element.hide('repository');" if @project.repository.nil? %> diff --git a/db/migrate/026_add_repository_login_and_password.rb b/db/migrate/026_add_repository_login_and_password.rb new file mode 100644 index 00000000..5fc91972 --- /dev/null +++ b/db/migrate/026_add_repository_login_and_password.rb @@ -0,0 +1,11 @@ +class AddRepositoryLoginAndPassword < ActiveRecord::Migration + def self.up + add_column :repositories, :login, :string, :limit => 60, :default => "" + add_column :repositories, :password, :string, :limit => 60, :default => "" + end + + def self.down + remove_column :repositories, :login + remove_column :repositories, :password + end +end