Hello community, here is the log from the commit of package rubygem-net-scp for openSUSE:Factory checked in at 2019-04-01 12:36:36 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/rubygem-net-scp (Old) and /work/SRC/openSUSE:Factory/.rubygem-net-scp.new.25356 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "rubygem-net-scp" Mon Apr 1 12:36:36 2019 rev:11 rq:689703 version:2.0.0 Changes: -------- --- /work/SRC/openSUSE:Factory/rubygem-net-scp/rubygem-net-scp.changes 2014-10-14 07:10:55.000000000 +0200 +++ /work/SRC/openSUSE:Factory/.rubygem-net-scp.new.25356/rubygem-net-scp.changes 2019-04-01 12:36:46.413868337 +0200 @@ -1,0 +2,10 @@ +Fri Mar 29 06:07:13 UTC 2019 - Stephan Kulow <co...@suse.com> + +- updated to version 2.0.0 + see installed CHANGES.txt + + === 2.0.0 + + * NetSSH 5.* support + +------------------------------------------------------------------- Old: ---- net-scp-1.2.1.gem New: ---- gem2rpm.yml net-scp-2.0.0.gem ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ rubygem-net-scp.spec ++++++ --- /var/tmp/diff_new_pack.6IPVLC/_old 2019-04-01 12:36:49.369869783 +0200 +++ /var/tmp/diff_new_pack.6IPVLC/_new 2019-04-01 12:36:49.373869785 +0200 @@ -1,7 +1,7 @@ # # spec file for package rubygem-net-scp # -# Copyright (c) 2014 SUSE LINUX Products GmbH, Nuernberg, Germany. +# Copyright (c) 2019 SUSE LINUX GmbH, Nuernberg, Germany. # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -12,12 +12,19 @@ # license that conforms to the Open Source Definition (Version 1.9) # published by the Open Source Initiative. -# Please submit bugfixes or comments via http://bugs.opensuse.org/ +# Please submit bugfixes or comments via https://bugs.opensuse.org/ # +# +# This file was generated with a gem2rpm.yml and not just plain gem2rpm. +# All sections marked as MANUAL, license headers, summaries and descriptions +# can be maintained in that file. Please consult this file before editing any +# of those fields +# + Name: rubygem-net-scp -Version: 1.2.1 +Version: 2.0.0 Release: 0 %define mod_name net-scp %define mod_full_name %{mod_name}-%{version} @@ -26,7 +33,8 @@ BuildRequires: %{ruby} BuildRequires: ruby-macros >= 5 Url: https://github.com/net-ssh/net-scp -Source: http://rubygems.org/gems/%{mod_full_name}.gem +Source: https://rubygems.org/gems/%{mod_full_name}.gem +Source1: gem2rpm.yml Summary: A pure Ruby implementation of the SCP client protocol License: MIT Group: Development/Languages/Ruby ++++++ gem2rpm.yml ++++++ # --- # ## used by gem2rpm # :summary: this is a custom summary # ## used by gem2rpm # :description: |- # this is a custom description # # it can be multiline # ## used by gem2rpm # :license: MIT or Ruby # ## used by gem2rpm and gem_packages # :version_suffix: -x_y # ## used by gem2rpm and gem_packages # :disable_docs: true # ## used by gem2rpm # :disable_automatic_rdoc_dep: true # ## used by gem2rpm # :preamble: |- # BuildRequires: foobar # Requires: foobar # ## used by gem2rpm # :patches: # foo.patch: -p1 # bar.patch: # :post_patch: # if you need to fiddle with the source dir before rebuilding the gem # ## used by gem2rpm :sources: # - foo.desktop # - bar.desktop # :gem_install_args: '....' # ## used by gem2rpm # :pre_install: |- # %if 0%{?use_system_libev} # export USE_VENDORED_LIBEV="no" # %endif # ## used by gem2rpm # :post_install: |- # # delete custom files here or do other fancy stuff # install -D -m 0644 %{S:1} %{buildroot}%{_bindir}/gem2rpm-opensuse # ## used by gem2rpm # :testsuite_command: |- # (pushd %{buildroot}%{gem_base}/gems/%{mod_full_name} && rake test) # ## used by gem2rpm # :filelist: |- # /usr/bin/gem2rpm-opensuse # ## used by gem2rpm # :scripts: # :post: |- # /bin/echo foo # ## used by gem_packages # :main: # :preamble: |- # Requires: util-linux # Recommends: pwgen # :filelist: |- # /usr/bin/gem2rpm-opensuse # ## used by gem_packages # :custom_pkgs: # apache: # :preamble: |- # Requires: ..... # :filelist: |- # /etc/apache2/conf.d/passenger.conf # :summary: Custom summary is optional # :description: |- # Custom description is optional # # bar # :post: |- # /bin/echo foo # :preamble: |- # %if 0%{?suse_version} && 0%{?suse_version} < 1330 # %define rb_build_versions ruby24 ruby25 # %define rb_default_ruby_abi ruby:2.4.0 ruby:2.5.0 # %endif ++++++ net-scp-1.2.1.gem -> net-scp-2.0.0.gem ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/.gitignore new/.gitignore --- old/.gitignore 1970-01-01 01:00:00.000000000 +0100 +++ new/.gitignore 2019-03-20 12:25:00.000000000 +0100 @@ -0,0 +1,6 @@ +coverage +pkg +doc +*.swp + +.DS_Store diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/.travis.yml new/.travis.yml --- old/.travis.yml 1970-01-01 01:00:00.000000000 +0100 +++ new/.travis.yml 2019-03-20 12:25:00.000000000 +0100 @@ -1,11 +1,16 @@ language: ruby +cache: bundler rvm: - - "1.9.3" - - "2.0.0" - - "2.1.0" + - 2.3.8 + - 2.4.5 + - 2.5.3 + - 2.6.1 + - ruby-head +matrix: + allow_failures: + - rvm: ruby-head install: gem install jeweler test-unit mocha net-ssh script: rake test - diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/CHANGES.txt new/CHANGES.txt --- old/CHANGES.txt 1970-01-01 01:00:00.000000000 +0100 +++ new/CHANGES.txt 2019-03-20 12:25:00.000000000 +0100 @@ -1,3 +1,6 @@ +=== 2.0.0 + +* NetSSH 5.* support === 1.2.1 / 30 Apr 2014 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Gemfile new/Gemfile --- old/Gemfile 1970-01-01 01:00:00.000000000 +0100 +++ new/Gemfile 2019-03-20 12:25:00.000000000 +0100 @@ -0,0 +1,15 @@ +source 'https://rubygems.org' + +# Specify your gem's dependencies in mygem.gemspec +gemspec + +# TODO: add to gemspec +gem "bundler", "~> 1.11" +gem "rake", "~> 12.0" + +gem 'byebug', group: %i[development test] if !Gem.win_platform? && RUBY_ENGINE == "ruby" + +if ENV["CI"] + gem 'codecov', require: false, group: :test + gem 'simplecov', require: false, group: :test +end diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/README.rdoc new/README.rdoc --- old/README.rdoc 1970-01-01 01:00:00.000000000 +0100 +++ new/README.rdoc 2019-03-20 12:25:00.000000000 +0100 @@ -13,7 +13,7 @@ == DESCRIPTION: -Net::SCP is a pure-Ruby implementation of the SCP protocol. This operates over SSH (and requires the Net::SSH library), and allows files and directory trees to copied to and from a remote server. +Net::SCP is a pure-Ruby implementation of the SCP protocol. This operates over SSH (and requires the Net::SSH library), and allows files and directory trees to be copied to and from a remote server. == FEATURES/PROBLEMS: @@ -42,7 +42,7 @@ data = Net::SCP::download!("remote.host.com", "username", "/remote/path") # use a persistent connection to transfer files - Net::SCP.start("remote.host.com", "username", :ssh => { :password => "password" }) do |scp| + Net::SCP.start("remote.host.com", "username", :password => "password") do |scp| # upload a file to a remote server scp.upload! "/local/path", "/remote/path" @@ -74,12 +74,12 @@ * gem install net-scp (might need sudo privileges) -However, in order to be sure the code you're installing hasn't been tampered with, it's recommended that you verify the signiture[http://docs.rubygems.org/read/chapter/21]. To do this, you need to add my public key as a trusted certificate (you only need to do this once): +However, in order to be sure the code you're installing hasn't been tampered with, it's recommended that you verify the signiture[http://docs.seattlerb.org/rubygems/Gem/Security.html]. To do this, you need to add my public key as a trusted certificate (you only need to do this once): # Add the public key as a trusted certificate # (You only need to do this once) - $ curl -O https://raw.github.com/net-ssh/net-ssh/master/gem-public_cert.pem - $ gem cert --add gem-public_cert.pem + $ curl -O https://raw.githubusercontent.com/net-ssh/net-ssh/master/net-ssh-public_cert.pem + $ gem cert --add net-ssh-public_cert.pem Then, when install the gem, do so with high security: @@ -87,7 +87,6 @@ If you don't add the public key, you'll see an error like "Couldn't verify data signature". If you're still having trouble let me know and I'll give you a hand. - Or, you can do it the hard way (without Rubygems): * tar xzf net-scp-*.tgz diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Rakefile new/Rakefile --- old/Rakefile 1970-01-01 01:00:00.000000000 +0100 +++ new/Rakefile 2019-03-20 12:25:00.000000000 +0100 @@ -2,40 +2,64 @@ require "rake" require "rake/clean" require "rdoc/task" +require "bundler/gem_tasks" -task :default => ["build"] +desc "When releasing make sure NET_SSH_BUILDGEM_SIGNED is set" +task :check_NET_SSH_BUILDGEM_SIGNED do + raise "NET_SSH_BUILDGEM_SIGNED should be set to release" unless ENV['NET_SSH_BUILDGEM_SIGNED'] +end + +Rake::Task[:release].enhance [:check_NET_SSH_BUILDGEM_SIGNED] +Rake::Task[:release].prerequisites.unshift(:check_NET_SSH_BUILDGEM_SIGNED) + +task default: ["build"] CLEAN.include [ 'pkg', 'rdoc' ] name = "net-scp" -$:.unshift File.join(File.dirname(__FILE__), 'lib') -require "net/scp/version" -version = Net::SCP::Version::STRING.dup - -begin - require "jeweler" - Jeweler::Tasks.new do |s| - s.version = version - s.name = name - s.rubyforge_project = s.name - s.summary = "A pure Ruby implementation of the SCP client protocol" - s.description = s.summary - s.email = "net-...@solutious.com" - s.homepage = "https://github.com/net-ssh/net-scp" - s.authors = ["Jamis Buck", "Delano Mandelbaum"] - - s.add_dependency 'net-ssh', ">=2.6.5" - - s.add_development_dependency 'test-unit' - s.add_development_dependency 'mocha' +require_relative "lib/net/scp/version" +version = Net::SCP::Version::CURRENT - s.license = "MIT" +namespace :cert do + desc "Update public cert from private - only run if public is expired" + task :update_public_when_expired do + require 'openssl' + require 'time' + raw = File.read "net-scp-public_cert.pem" + certificate = OpenSSL::X509::Certificate.new raw + raise Exception, "Not yet expired: #{certificate.not_after}" unless certificate.not_after < Time.now + sh "gem cert --build net...@solutious.com --days 365*5 --private-key /mnt/gem/net-ssh-private_key.pem" + sh "mv gem-public_cert.pem net-scp-public_cert.pem" + sh "gem cert --add net-scp-public_cert.pem" + end +end - s.signing_key = File.join('/mnt/gem/', 'gem-private_key.pem') - s.cert_chain = ['gem-public_cert.pem'] +if false + begin + require "jeweler" + Jeweler::Tasks.new do |s| + s.version = version + s.name = name + s.rubyforge_project = s.name + s.summary = "A pure Ruby implementation of the SCP client protocol" + s.description = s.summary + s.email = "net-...@solutious.com" + s.homepage = "https://github.com/net-ssh/net-scp" + s.authors = ["Jamis Buck", "Delano Mandelbaum"] + + s.add_dependency 'net-ssh', ">=2.6.5" + + s.add_development_dependency 'test-unit' + s.add_development_dependency 'mocha' + + s.license = "MIT" + + s.signing_key = File.join('/mnt/gem/', 'gem-private_key.pem') + s.cert_chain = ['gem-public_cert.pem'] + end + Jeweler::GemcutterTasks.new + rescue LoadError + puts "Jeweler (or a dependency) not available. Install it with: sudo gem install jeweler" end - Jeweler::GemcutterTasks.new -rescue LoadError - puts "Jeweler (or a dependency) not available. Install it with: sudo gem install jeweler" end require 'rake/testtask' @@ -56,5 +80,3 @@ rdoc.rdoc_files.include(file) if File.exists?(file) } end - - Binary files old/checksums.yaml.gz and new/checksums.yaml.gz differ Binary files old/checksums.yaml.gz.sig and new/checksums.yaml.gz.sig differ Binary files old/data.tar.gz.sig and new/data.tar.gz.sig differ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gem-public_cert.pem new/gem-public_cert.pem --- old/gem-public_cert.pem 1970-01-01 01:00:00.000000000 +0100 +++ new/gem-public_cert.pem 1970-01-01 01:00:00.000000000 +0100 @@ -1,20 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIDNjCCAh6gAwIBAgIBADANBgkqhkiG9w0BAQUFADBBMQ8wDQYDVQQDDAZkZWxh -bm8xGTAXBgoJkiaJk/IsZAEZFglzb2x1dGlvdXMxEzARBgoJkiaJk/IsZAEZFgNj -b20wHhcNMTQwNDMwMTczNjI2WhcNMTUwNDMwMTczNjI2WjBBMQ8wDQYDVQQDDAZk -ZWxhbm8xGTAXBgoJkiaJk/IsZAEZFglzb2x1dGlvdXMxEzARBgoJkiaJk/IsZAEZ -FgNjb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDdbeFjM67+Txrq -+8HaD4wKEiacRoB8ps17Vzt9TBUyoMMj5KTtFiptr/+ZTug/YdYBquMprPsKlYM2 -NoG6BzvDcvQK1zrdHnyVosIDKAHk2wnyN/psZikS1bo9nUHCS5hJdPEnQZx/MxTZ -+GjuRsiBxPYBXnqObLhR83LBeWsauWTuo5gJt1DYxDTVrLoB+Z+ceMV+3vh0HBCb -iwegkx9GWG45h5wTksUIpzOMB3VsHGtGmBjCvdCgLJ2H6b8U9rmL7chunjdqfNf3 -zPtnH32c/zrFzeWJTyH2s8Ia+3D6vum2xjjn8FnLg3V4zOf5x598GFBJYDQv7zX/ -rV9eCzHDAgMBAAGjOTA3MAkGA1UdEwQCMAAwHQYDVR0OBBYEFA+Buc8ySEw2qKnq -VH4wh8KAm6hUMAsGA1UdDwQEAwIEsDANBgkqhkiG9w0BAQUFAAOCAQEAYsM0M42h -ZEUXvr/i18gkwHKLFDKDAcimgCoS5+syG6rkuSOnKGQolyKTNczNM4gWJJPH5aVq -mW2BtqpIom4YRYb9m3fDNNs6kcB5DedY9UPhVvJ8XTTB2YLxLql7UJid9ZOiqWzC -OTm06w7zkAT/ldt46p6BqyUy6PW4QMg0Bq7SMfRURVrp2lvhQvBdC7oDR9CGEBZC -/Ci++ZEh/QR9qy11AHciEIXnNkytidyZtLr4MWhtbV468y6shpPYdKU/uCINSgvt -FpMAM5Nit8L8nHwf3IIUPg7lsMCRzOkQ/FD87BI3V3SnFNoTCdGgnGj3jfW4zRlL -iFyareFPA84btQ== ------END CERTIFICATE----- diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/net/scp/download.rb new/lib/net/scp/download.rb --- old/lib/net/scp/download.rb 1970-01-01 01:00:00.000000000 +0100 +++ new/lib/net/scp/download.rb 2019-03-20 12:25:00.000000000 +0100 @@ -20,7 +20,7 @@ elsif channel[:local].respond_to?(:write) && channel[:options][:preserve] lwarn { ":preserve option is ignored when downloading to an in-memory buffer" } channel[:options].delete(:preserve) - elsif channel[:options][:recursive] && !File.exists?(channel[:local]) + elsif channel[:options][:recursive] && !File.exist?(channel[:local]) Dir.mkdir(channel[:local]) end @@ -128,9 +128,9 @@ channel[:local] = File.join(channel[:local], directive[:name]) - if File.exists?(channel[:local]) && !File.directory?(channel[:local]) - raise "#{channel[:local]} already exists and is not a directory" - elsif !File.exists?(channel[:local]) + if File.exist?(channel[:local]) && !File.directory?(channel[:local]) + raise Net::SCP::Error, "#{channel[:local]} already exists and is not a directory" + elsif !File.exist?(channel[:local]) Dir.mkdir(channel[:local], directive[:mode] | 0700) end @@ -162,4 +162,4 @@ end end -end; end \ No newline at end of file +end; end diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/net/scp/version.rb new/lib/net/scp/version.rb --- old/lib/net/scp/version.rb 1970-01-01 01:00:00.000000000 +0100 +++ new/lib/net/scp/version.rb 2019-03-20 12:25:00.000000000 +0100 @@ -1,18 +1,68 @@ -require 'net/ssh/version' +module Net + module SCP + # A class for describing the current version of a library. The version + # consists of three parts: the +major+ number, the +minor+ number, and the + # +tiny+ (or +patch+) number. + # + # Two Version instances may be compared, so that you can test that a version + # of a library is what you require: + # + # require 'net/scp/version' + # + # if Net::SCP::Version::CURRENT < Net::SCP::Version[2,1,0] + # abort "your software is too old!" + # end + class Version + include Comparable -module Net; class SCP + # A convenience method for instantiating a new Version instance with the + # given +major+, +minor+, and +tiny+ components. + def self.[](major, minor, tiny, pre = nil) + new(major, minor, tiny, pre) + end - # Describes the current version of the Net::SCP library. - class Version < Net::SSH::Version - MAJOR = 1 - MINOR = 2 - TINY = 1 + attr_reader :major, :minor, :tiny - # The current version, as a Version instance - CURRENT = new(MAJOR, MINOR, TINY) + # Create a new Version object with the given components. + def initialize(major, minor, tiny, pre = nil) + @major, @minor, @tiny, @pre = major, minor, tiny, pre + end - # The current version, as a String instance - STRING = CURRENT.to_s - end + # Compare this version to the given +version+ object. + def <=>(version) + to_i <=> version.to_i + end + + # Converts this version object to a string, where each of the three + # version components are joined by the '.' character. E.g., 2.0.0. + def to_s + @to_s ||= [@major, @minor, @tiny, @pre].compact.join(".") + end + + # Converts this version to a canonical integer that may be compared + # against other version objects. + def to_i + @to_i ||= @major * 1_000_000 + @minor * 1_000 + @tiny + end + + # The major component of this version of the Net::SSH library + MAJOR = 2 + + # The minor component of this version of the Net::SSH library + MINOR = 0 -end; end + # The tiny component of this version of the Net::SSH library + TINY = 0 + + # The prerelease component of this version of the Net::SSH library + # nil allowed + PRE = nil + + # The current version of the Net::SSH library as a Version instance + CURRENT = new(*[MAJOR, MINOR, TINY, PRE].compact) + + # The current version of the Net::SSH library as a String + STRING = CURRENT.to_s + end + end +end diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/net/scp.rb new/lib/net/scp.rb --- old/lib/net/scp.rb 1970-01-01 01:00:00.000000000 +0100 +++ new/lib/net/scp.rb 2019-03-20 12:25:00.000000000 +0100 @@ -194,7 +194,7 @@ include Net::SSH::Loggable include Upload, Download - # Starts up a new SSH connection and instantiates a new SCP session on + # Starts up a new SSH connection and instantiates a new SCP session on # top of it. If a block is given, the SCP session is yielded, and the # SSH session is closed automatically when the block terminates. If no # block is given, the SCP session is returned. @@ -293,7 +293,7 @@ # * :preserve - the atime and mtime of the file should be preserved. # * :verbose - the process should result in verbose output on the server # end (useful for debugging). - # + # # This method will return immediately, returning the Net::SSH::Connection::Channel # object that will support the download. To wait for the download to finish, # you can either call the #wait method on the channel, or otherwise run @@ -343,7 +343,7 @@ # (See Net::SCP::Upload and Net::SCP::Download). def start_command(mode, local, remote, options={}, &callback) session.open_channel do |channel| - + if options[:shell] escaped_file = shellescape(remote).gsub(/'/) { |m| "'\\''" } command = "#{options[:shell]} -c '#{scp_command(mode, options)} #{escaped_file}'" @@ -362,10 +362,10 @@ channel[:stack ] = [] channel[:error_string] = '' - channel.on_close { |ch| send("#{channel[:state]}_state", channel); raise Net::SCP::Error, "SCP did not finish successfully (#{channel[:exit]}): #{channel[:error_string]}" if channel[:exit] != 0 } - channel.on_data { |ch, data| channel[:buffer].append(data) } - channel.on_extended_data { |ch, type, data| debug { data.chomp } } - channel.on_request("exit-status") { |ch, data| channel[:exit] = data.read_long } + channel.on_close { |ch2| send("#{channel[:state]}_state", channel); raise Net::SCP::Error, "SCP did not finish successfully (#{channel[:exit]}): #{channel[:error_string]}" if channel[:exit] != 0 } + channel.on_data { |ch2, data| channel[:buffer].append(data) } + channel.on_extended_data { |ch2, type, data| debug { data.chomp } } + channel.on_request("exit-status") { |ch2, data| channel[:exit] = data.read_long } channel.on_process { send("#{channel[:state]}_state", channel) } else channel.close @@ -395,7 +395,7 @@ def await_response_state(channel) return if channel[:buffer].available == 0 c = channel[:buffer].read_byte - raise "#{c.chr}#{channel[:buffer].read}" if c != 0 + raise Net::SCP::Error, "#{c.chr}#{channel[:buffer].read}" if c != 0 channel[:next], channel[:state] = nil, channel[:next] send("#{channel[:state]}_state", channel) end diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/metadata new/metadata --- old/metadata 1970-01-01 01:00:00.000000000 +0100 +++ new/metadata 2019-03-20 12:25:00.000000000 +0100 @@ -1,108 +1,104 @@ --- !ruby/object:Gem::Specification name: net-scp version: !ruby/object:Gem::Version - version: 1.2.1 - prerelease: + version: 2.0.0 platform: ruby authors: - Jamis Buck - Delano Mandelbaum +- Miklós Fazekas autorequire: bindir: bin cert_chain: -- !binary |- - LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUROakNDQWg2Z0F3SUJB - Z0lCQURBTkJna3Foa2lHOXcwQkFRVUZBREJCTVE4d0RRWURWUVFEREFaa1pX - eGgKYm04eEdUQVhCZ29Ka2lhSmsvSXNaQUVaRmdsemIyeDFkR2x2ZFhNeEV6 - QVJCZ29Ka2lhSmsvSXNaQUVaRmdOagpiMjB3SGhjTk1UUXdORE13TVRjek5q - STJXaGNOTVRVd05ETXdNVGN6TmpJMldqQkJNUTh3RFFZRFZRUUREQVprClpX - eGhibTh4R1RBWEJnb0praWFKay9Jc1pBRVpGZ2x6YjJ4MWRHbHZkWE14RXpB - UkJnb0praWFKay9Jc1pBRVoKRmdOamIyMHdnZ0VpTUEwR0NTcUdTSWIzRFFF - QkFRVUFBNElCRHdBd2dnRUtBb0lCQVFEZGJlRmpNNjcrVHhycQorOEhhRDR3 - S0VpYWNSb0I4cHMxN1Z6dDlUQlV5b01NajVLVHRGaXB0ci8rWlR1Zy9ZZFlC - cXVNcHJQc0tsWU0yCk5vRzZCenZEY3ZRSzF6cmRIbnlWb3NJREtBSGsyd255 - Ti9wc1ppa1MxYm85blVIQ1M1aEpkUEVuUVp4L014VFoKK0dqdVJzaUJ4UFlC - WG5xT2JMaFI4M0xCZVdzYXVXVHVvNWdKdDFEWXhEVFZyTG9CK1orY2VNVisz - dmgwSEJDYgppd2Vna3g5R1dHNDVoNXdUa3NVSXB6T01CM1ZzSEd0R21CakN2 - ZENnTEoySDZiOFU5cm1MN2NodW5qZHFmTmYzCnpQdG5IMzJjL3pyRnplV0pU - eUgyczhJYSszRDZ2dW0yeGpqbjhGbkxnM1Y0ek9mNXg1OThHRkJKWURRdjd6 - WC8KclY5ZUN6SERBZ01CQUFHak9UQTNNQWtHQTFVZEV3UUNNQUF3SFFZRFZS - ME9CQllFRkErQnVjOHlTRXcycUtucQpWSDR3aDhLQW02aFVNQXNHQTFVZER3 - UUVBd0lFc0RBTkJna3Foa2lHOXcwQkFRVUZBQU9DQVFFQVlzTTBNNDJoClpF - VVh2ci9pMThna3dIS0xGREtEQWNpbWdDb1M1K3N5RzZya3VTT25LR1FvbHlL - VE5jek5NNGdXSkpQSDVhVnEKbVcyQnRxcElvbTRZUlliOW0zZkROTnM2a2NC - NURlZFk5VVBoVnZKOFhUVEIyWUx4THFsN1VKaWQ5Wk9pcVd6QwpPVG0wNnc3 - emtBVC9sZHQ0NnA2QnF5VXk2UFc0UU1nMEJxN1NNZlJVUlZycDJsdmhRdkJk - QzdvRFI5Q0dFQlpDCi9DaSsrWkVoL1FSOXF5MTFBSGNpRUlYbk5reXRpZHla - dExyNE1XaHRiVjQ2OHk2c2hwUFlkS1UvdUNJTlNndnQKRnBNQU01Tml0OEw4 - bkh3ZjNJSVVQZzdsc01DUnpPa1EvRkQ4N0JJM1YzU25GTm9UQ2RHZ25HajNq - Zlc0elJsTAppRnlhcmVGUEE4NGJ0UT09Ci0tLS0tRU5EIENFUlRJRklDQVRF - LS0tLS0K -date: 2014-04-30 00:00:00.000000000 Z +- | + -----BEGIN CERTIFICATE----- + MIIDeDCCAmCgAwIBAgIBATANBgkqhkiG9w0BAQsFADBBMQ8wDQYDVQQDDAZuZXRz + c2gxGTAXBgoJkiaJk/IsZAEZFglzb2x1dGlvdXMxEzARBgoJkiaJk/IsZAEZFgNj + b20wHhcNMTgwNjA0MTA0OTQwWhcNMTkwNjA0MTA0OTQwWjBBMQ8wDQYDVQQDDAZu + ZXRzc2gxGTAXBgoJkiaJk/IsZAEZFglzb2x1dGlvdXMxEzARBgoJkiaJk/IsZAEZ + FgNjb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDGJ4TbZ9H+qZ08 + pQfJhPJTHaDCyQvCsKTFrL5O9z3tllQ7B/zksMMM+qFBpNYu9HCcg4yBATacE/PB + qVVyUrpr6lbH/XwoN5ljXm+bdCfmnjZvTCL2FTE6o+bcnaF0IsJyC0Q2B1fbWdXN + 6Off1ZWoUk6We2BIM1bn6QJLxBpGyYhvOPXsYoqSuzDf2SJDDsWFZ8kV5ON13Ohm + JbBzn0oD8HF8FuYOewwsC0C1q4w7E5GtvHcQ5juweS7+RKsyDcVcVrLuNzoGRttS + KP4yMn+TzaXijyjRg7gECfJr3TGASaA4bQsILFGG5dAWcwO4OMrZedR7SHj/o0Kf + 3gL7P0axAgMBAAGjezB5MAkGA1UdEwQCMAAwCwYDVR0PBAQDAgSwMB0GA1UdDgQW + BBQF8qLA7Z4zg0SJGtUbv3eoQ8tjIzAfBgNVHREEGDAWgRRuZXRzc2hAc29sdXRp + b3VzLmNvbTAfBgNVHRIEGDAWgRRuZXRzc2hAc29sdXRpb3VzLmNvbTANBgkqhkiG + 9w0BAQsFAAOCAQEAXnNaYXWVr/sCsfZdza+yBBOobYPgjOgDRfqNO2YX8RFEyDNB + AxBCQIF4OeUaoMbTQTVh24MwaDHpDTgqBAEfSs9h41lZewQaw4QUGJ6yxNVzO194 + 2vYohv9vHpodBukIpUFGk40vQq8nOq2MzVyCb911wnt5d0ZQg+UJf5tdMYvRvATa + F/dkTaqhq3wq/JJRghq8fJUqWN5aBtMQb/61z5J3mKAUJsUN2/VdDph2fRPDpECa + uWREKzWwXbaB96/ZyzoyP7FsQBLgdDL++g2nF0neCENc5Wj5IlQZiH0a2+X3jAgm + 7UnoE3CP9Tk5GHVUina5gPyzl0VI4s4pYCPehQ== + -----END CERTIFICATE----- +date: 2019-03-20 00:00:00.000000000 Z dependencies: - !ruby/object:Gem::Dependency name: net-ssh requirement: !ruby/object:Gem::Requirement - none: false requirements: - - - ! '>=' + - - ">=" - !ruby/object:Gem::Version version: 2.6.5 + - - "<" + - !ruby/object:Gem::Version + version: 6.0.0 type: :runtime prerelease: false version_requirements: !ruby/object:Gem::Requirement - none: false requirements: - - - ! '>=' + - - ">=" - !ruby/object:Gem::Version version: 2.6.5 + - - "<" + - !ruby/object:Gem::Version + version: 6.0.0 - !ruby/object:Gem::Dependency name: test-unit requirement: !ruby/object:Gem::Requirement - none: false requirements: - - - ! '>=' + - - ">=" - !ruby/object:Gem::Version version: '0' type: :development prerelease: false version_requirements: !ruby/object:Gem::Requirement - none: false requirements: - - - ! '>=' + - - ">=" - !ruby/object:Gem::Version version: '0' - !ruby/object:Gem::Dependency name: mocha requirement: !ruby/object:Gem::Requirement - none: false requirements: - - - ! '>=' + - - ">=" - !ruby/object:Gem::Version version: '0' type: :development prerelease: false version_requirements: !ruby/object:Gem::Requirement - none: false requirements: - - - ! '>=' + - - ">=" - !ruby/object:Gem::Version version: '0' description: A pure Ruby implementation of the SCP client protocol -email: net-...@solutious.com +email: +- net-...@solutious.com executables: [] extensions: [] extra_rdoc_files: - LICENSE.txt - README.rdoc files: -- .travis.yml +- ".gitignore" +- ".travis.yml" - CHANGES.txt +- Gemfile - LICENSE.txt - Manifest - README.rdoc - Rakefile -- gem-public_cert.pem - lib/net/scp.rb - lib/net/scp/download.rb - lib/net/scp/errors.rb @@ -110,36 +106,31 @@ - lib/net/scp/version.rb - lib/uri/open-scp.rb - lib/uri/scp.rb +- net-scp-public_cert.pem - net-scp.gemspec - setup.rb -- test/common.rb -- test/test_all.rb -- test/test_download.rb -- test/test_scp.rb -- test/test_upload.rb homepage: https://github.com/net-ssh/net-scp licenses: - MIT +metadata: {} post_install_message: rdoc_options: [] require_paths: - lib required_ruby_version: !ruby/object:Gem::Requirement - none: false requirements: - - - ! '>=' + - - ">=" - !ruby/object:Gem::Version version: '0' required_rubygems_version: !ruby/object:Gem::Requirement - none: false requirements: - - - ! '>=' + - - ">=" - !ruby/object:Gem::Version version: '0' requirements: [] -rubyforge_project: net-scp -rubygems_version: 1.8.23 +rubyforge_project: +rubygems_version: 2.6.8 signing_key: specification_version: 3 -summary: A pure Ruby implementation of the SCP client protocol +summary: A pure Ruby implementation of the SCP client protocol. test_files: [] Binary files old/metadata.gz.sig and new/metadata.gz.sig differ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/net-scp-public_cert.pem new/net-scp-public_cert.pem --- old/net-scp-public_cert.pem 1970-01-01 01:00:00.000000000 +0100 +++ new/net-scp-public_cert.pem 2019-03-20 12:25:00.000000000 +0100 @@ -0,0 +1,21 @@ +-----BEGIN CERTIFICATE----- +MIIDeDCCAmCgAwIBAgIBATANBgkqhkiG9w0BAQsFADBBMQ8wDQYDVQQDDAZuZXRz +c2gxGTAXBgoJkiaJk/IsZAEZFglzb2x1dGlvdXMxEzARBgoJkiaJk/IsZAEZFgNj +b20wHhcNMTgwNjA0MTA0OTQwWhcNMTkwNjA0MTA0OTQwWjBBMQ8wDQYDVQQDDAZu +ZXRzc2gxGTAXBgoJkiaJk/IsZAEZFglzb2x1dGlvdXMxEzARBgoJkiaJk/IsZAEZ +FgNjb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDGJ4TbZ9H+qZ08 +pQfJhPJTHaDCyQvCsKTFrL5O9z3tllQ7B/zksMMM+qFBpNYu9HCcg4yBATacE/PB +qVVyUrpr6lbH/XwoN5ljXm+bdCfmnjZvTCL2FTE6o+bcnaF0IsJyC0Q2B1fbWdXN +6Off1ZWoUk6We2BIM1bn6QJLxBpGyYhvOPXsYoqSuzDf2SJDDsWFZ8kV5ON13Ohm +JbBzn0oD8HF8FuYOewwsC0C1q4w7E5GtvHcQ5juweS7+RKsyDcVcVrLuNzoGRttS +KP4yMn+TzaXijyjRg7gECfJr3TGASaA4bQsILFGG5dAWcwO4OMrZedR7SHj/o0Kf +3gL7P0axAgMBAAGjezB5MAkGA1UdEwQCMAAwCwYDVR0PBAQDAgSwMB0GA1UdDgQW +BBQF8qLA7Z4zg0SJGtUbv3eoQ8tjIzAfBgNVHREEGDAWgRRuZXRzc2hAc29sdXRp +b3VzLmNvbTAfBgNVHRIEGDAWgRRuZXRzc2hAc29sdXRpb3VzLmNvbTANBgkqhkiG +9w0BAQsFAAOCAQEAXnNaYXWVr/sCsfZdza+yBBOobYPgjOgDRfqNO2YX8RFEyDNB +AxBCQIF4OeUaoMbTQTVh24MwaDHpDTgqBAEfSs9h41lZewQaw4QUGJ6yxNVzO194 +2vYohv9vHpodBukIpUFGk40vQq8nOq2MzVyCb911wnt5d0ZQg+UJf5tdMYvRvATa +F/dkTaqhq3wq/JJRghq8fJUqWN5aBtMQb/61z5J3mKAUJsUN2/VdDph2fRPDpECa +uWREKzWwXbaB96/ZyzoyP7FsQBLgdDL++g2nF0neCENc5Wj5IlQZiH0a2+X3jAgm +7UnoE3CP9Tk5GHVUina5gPyzl0VI4s4pYCPehQ== +-----END CERTIFICATE----- diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/net-scp.gemspec new/net-scp.gemspec --- old/net-scp.gemspec 1970-01-01 01:00:00.000000000 +0100 +++ new/net-scp.gemspec 2019-03-20 12:25:00.000000000 +0100 @@ -1,69 +1,46 @@ -# Generated by jeweler -# DO NOT EDIT THIS FILE DIRECTLY -# Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec' -# -*- encoding: utf-8 -*- - -Gem::Specification.new do |s| - s.name = "net-scp" - s.version = "1.2.1" - - s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version= - s.authors = ["Jamis Buck", "Delano Mandelbaum"] - s.cert_chain = ["gem-public_cert.pem"] - s.date = "2014-04-30" - s.description = "A pure Ruby implementation of the SCP client protocol" - s.email = "net-...@solutious.com" - s.extra_rdoc_files = [ + +require_relative 'lib/net/scp/version' + +Gem::Specification.new do |spec| + spec.name = "net-scp" + spec.version = Net::SCP::Version::STRING + spec.authors = ["Jamis Buck", "Delano Mandelbaum", "Mikl\u{f3}s Fazekas"] + spec.email = ["net-...@solutious.com"] + + if ENV['NET_SSH_BUILDGEM_SIGNED'] + spec.cert_chain = ["net-scp-public_cert.pem"] + spec.signing_key = "/mnt/gem/net-ssh-private_key.pem" + end + + spec.summary = %q{A pure Ruby implementation of the SCP client protocol.} + spec.description = %q{A pure Ruby implementation of the SCP client protocol} + spec.homepage = "https://github.com/net-ssh/net-scp" + spec.license = "MIT" + spec.required_rubygems_version = Gem::Requirement.new(">= 0") if spec.respond_to? :required_rubygems_version= + + spec.extra_rdoc_files = [ "LICENSE.txt", "README.rdoc" ] - s.files = [ - ".travis.yml", - "CHANGES.txt", - "LICENSE.txt", - "Manifest", - "README.rdoc", - "Rakefile", - "gem-public_cert.pem", - "lib/net/scp.rb", - "lib/net/scp/download.rb", - "lib/net/scp/errors.rb", - "lib/net/scp/upload.rb", - "lib/net/scp/version.rb", - "lib/uri/open-scp.rb", - "lib/uri/scp.rb", - "net-scp.gemspec", - "setup.rb", - "test/common.rb", - "test/test_all.rb", - "test/test_download.rb", - "test/test_scp.rb", - "test/test_upload.rb" - ] - s.homepage = "https://github.com/net-ssh/net-scp" - s.licenses = ["MIT"] - s.require_paths = ["lib"] - s.rubyforge_project = "net-scp" - s.rubygems_version = "1.8.23" - s.signing_key = "/mnt/gem/gem-private_key.pem" - s.summary = "A pure Ruby implementation of the SCP client protocol" - if s.respond_to? :specification_version then - s.specification_version = 3 + spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) } + spec.require_paths = ["lib"] + + if spec.respond_to? :specification_version then + spec.specification_version = 3 if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then - s.add_runtime_dependency(%q<net-ssh>, [">= 2.6.5"]) - s.add_development_dependency(%q<test-unit>, [">= 0"]) - s.add_development_dependency(%q<mocha>, [">= 0"]) + spec.add_runtime_dependency(%q<net-ssh>, [">= 2.6.5", "< 6.0.0"]) + spec.add_development_dependency(%q<test-unit>, [">= 0"]) + spec.add_development_dependency(%q<mocha>, [">= 0"]) else - s.add_dependency(%q<net-ssh>, [">= 2.6.5"]) - s.add_dependency(%q<test-unit>, [">= 0"]) - s.add_dependency(%q<mocha>, [">= 0"]) + spec.add_dependency(%q<net-ssh>, [">= 2.6.5", "< 6.0.0"]) + spec.add_dependency(%q<test-unit>, [">= 0"]) + spec.add_dependency(%q<mocha>, [">= 0"]) end else - s.add_dependency(%q<net-ssh>, [">= 2.6.5"]) - s.add_dependency(%q<test-unit>, [">= 0"]) - s.add_dependency(%q<mocha>, [">= 0"]) + spec.add_dependency(%q<net-ssh>, [">= 2.6.5", "< 6.0.0"]) + spec.add_dependency(%q<test-unit>, [">= 0"]) + spec.add_dependency(%q<mocha>, [">= 0"]) end end - diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/test/common.rb new/test/common.rb --- old/test/common.rb 1970-01-01 01:00:00.000000000 +0100 +++ new/test/common.rb 1970-01-01 01:00:00.000000000 +0100 @@ -1,153 +0,0 @@ -require 'test/unit' -require 'mocha/setup' - -begin - gem 'net-ssh', ">= 2.0.0" - require 'net/ssh' -rescue LoadError - $LOAD_PATH.unshift "#{File.dirname(__FILE__)}/../../net-ssh/lib" - - begin - require 'net/ssh' - require 'net/ssh/version' - raise LoadError, "wrong version" unless Net::SSH::Version::STRING >= '1.99.0' - rescue LoadError => e - abort "could not load net/ssh v2 (#{e.inspect})" - end -end - -$LOAD_PATH.unshift "#{File.dirname(__FILE__)}/../lib" - -require 'net/scp' -require 'net/ssh/test' - -class Net::SSH::Test::Channel - def gets_ok - gets_data "\0" - end - - def sends_ok - sends_data "\0" - end -end - -class Net::SCP::TestCase < Test::Unit::TestCase - include Net::SSH::Test - - def default_test - # do nothing, this is just a hacky-hack to work around Test::Unit's - # insistence that all TestCase subclasses have at least one test - # method defined. - end - - protected - - def prepare_file(path, contents="", mode=0666, mtime=Time.now, atime=Time.now) - entry = FileEntry.new(path, contents, mode, mtime, atime) - entry.stub! - entry - end - - def prepare_directory(path, mode=0777, mtime=Time.now, atime=Time.now) - directory = DirectoryEntry.new(path, mode, mtime, atime) - yield directory if block_given? - directory.stub! - end - - # The POSIX spec unfortunately allows all characters in file names except - # ASCII 0x00(NUL) and 0x2F(/) - # - # Ideally, we should be testing filenames with newlines, but Mocha doesn't - # like this at all, so we leave them out. However, the Shellwords module - # handles newlines just fine, so we can be reasonably confident that they - # will work in practice - def awful_file_name - (((0x00..0x7f).to_a - [0x00, 0x0a, 0x2f]).map { |n| n.chr }).join + '.txt' - end - - def escaped_file_name - "\\\001\\\002\\\003\\\004\\\005\\\006\\\a\\\b\\\t\\\v\\\f\\\r\\\016\\\017\\\020\\\021\\\022\\\023\\\024\\\025\\\026\\\027\\\030\\\031\\\032\\\e\\\034\\\035\\\036\\\037\\ \\!\\\"\\#\\$\\%\\&\\'\\(\\)\\*\\+,-.0123456789:\\;\\<\\=\\>\\?@ABCDEFGHIJKLMNOPQRSTUVWXYZ\\[\\\\\\]\\^_\\`abcdefghijklmnopqrstuvwxyz\\{\\|\\}\\~\\\177.txt" - end - - class FileEntry - attr_reader :path, :contents, :mode, :mtime, :atime, :io - - def initialize(path, contents, mode=0666, mtime=Time.now, atime=Time.now) - @path, @contents, @mode = path, contents, mode - @mtime, @atime = mtime, atime - end - - def name - @name ||= File.basename(path) - end - - def stub! - stat = Mocha::Mock.new("file::stat") - stat.stubs(:size => contents.length, :mode => mode, :mtime => mtime, :atime => atime, :directory? => false) - - File.stubs(:stat).with(path).returns(stat) - File.stubs(:directory?).with(path).returns(false) - File.stubs(:file?).with(path).returns(true) - File.stubs(:open).with(path, "rb").returns(StringIO.new(contents)) - - @io = StringIO.new - File.stubs(:new).with(path, "wb", mode).returns(io) - end - end - - class DirectoryEntry - attr_reader :path, :mode, :mtime, :atime - attr_reader :entries - - def initialize(path, mode=0777, mtime=Time.now, atime=Time.now) - @path, @mode = path, mode - @mtime, @atime = mtime, atime - @entries = [] - end - - def name - @name ||= File.basename(path) - end - - def file(name, *args) - (entries << FileEntry.new(File.join(path, name), *args)).last - end - - def directory(name, *args) - entry = DirectoryEntry.new(File.join(path, name), *args) - yield entry if block_given? - (entries << entry).last - end - - def stub! - Dir.stubs(:mkdir).with { |*a| a.first == path } - - stat = Mocha::Mock.new("file::stat") - stat.stubs(:size => 1024, :mode => mode, :mtime => mtime, :atime => atime, :directory? => true) - - File.stubs(:stat).with(path).returns(stat) - File.stubs(:directory?).with(path).returns(true) - File.stubs(:file?).with(path).returns(false) - Dir.stubs(:entries).with(path).returns(%w(. ..) + entries.map { |e| e.name }.sort) - - entries.each { |e| e.stub! } - end - end - - def expect_scp_session(arguments) - story do |session| - channel = session.opens_channel - channel.sends_exec "scp #{arguments}" - yield channel if block_given? - channel.sends_eof - channel.gets_exit_status - channel.gets_eof - channel.gets_close - channel.sends_close - end - end - - def scp(options={}) - @scp ||= Net::SCP.new(connection(options)) - end -end diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/test/test_all.rb new/test/test_all.rb --- old/test/test_all.rb 1970-01-01 01:00:00.000000000 +0100 +++ new/test/test_all.rb 1970-01-01 01:00:00.000000000 +0100 @@ -1,3 +0,0 @@ -Dir.chdir(File.dirname(__FILE__)) do - Dir['**/test_*.rb'].each { |file| require(file) } -end \ No newline at end of file diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/test/test_download.rb new/test/test_download.rb --- old/test/test_download.rb 1970-01-01 01:00:00.000000000 +0100 +++ new/test/test_download.rb 1970-01-01 01:00:00.000000000 +0100 @@ -1,197 +0,0 @@ -require 'common' - -class TestDownload < Net::SCP::TestCase - def test_download_file_should_transfer_file - file = prepare_file("/path/to/local.txt", "a" * 1234) - - expect_scp_session "-f /path/to/remote.txt" do |channel| - simple_download(channel) - end - - assert_scripted { scp.download!("/path/to/remote.txt", "/path/to/local.txt") } - assert_equal "a" * 1234, file.io.string - end - - def test_download_file_with_spaces_in_name_should_escape_remote_file_name - file = prepare_file("/path/to/local file.txt", "") - - expect_scp_session "-f /path/to/remote\\ file.txt" do |channel| - channel.sends_ok - channel.gets_data "C0666 0 local file.txt\n" - channel.sends_ok - channel.gets_ok - channel.sends_ok - end - - assert_scripted { scp.download!("/path/to/remote file.txt", "/path/to/local file.txt") } - end - - def test_download_file_with_metacharacters_in_name_should_escape_remote_file_name - file = prepare_file("/path/to/local/#{awful_file_name}", "") - - expect_scp_session "-f /path/to/remote/#{escaped_file_name}" do |channel| - channel.sends_ok - channel.gets_data "C0666 0 #{awful_file_name}\n" - channel.sends_ok - channel.gets_ok - channel.sends_ok - end - - assert_scripted { scp.download!("/path/to/remote/#{awful_file_name}", "/path/to/local/#{awful_file_name}") } - end - - def test_download_with_preserve_should_send_times - file = prepare_file("/path/to/local.txt", "a" * 1234, 0644, Time.at(1234567890, 123456), Time.at(12121212, 232323)) - - expect_scp_session "-f -p /path/to/remote.txt" do |channel| - channel.sends_ok - channel.gets_data "T1234567890 123456 12121212 232323\n" - simple_download(channel, 0644) - end - - File.expects(:utime).with(Time.at(12121212, 232323), Time.at(1234567890, 123456), "/path/to/local.txt") - assert_scripted { scp.download!("/path/to/remote.txt", "/path/to/local.txt", :preserve => true) } - assert_equal "a" * 1234, file.io.string - end - - def test_download_with_error_should_respond_with_error_text - story do |session| - channel = session.opens_channel - channel.sends_exec "scp -f /path/to/remote.txt" - - channel.sends_ok - channel.gets_data "\x01File not found: /path/to/remote.txt\n" - channel.sends_ok - - channel.gets_eof - channel.gets_exit_status(1) - channel.gets_close - channel.sends_close - end - - error = nil - assert_scripted do - begin - scp.download!("/path/to/remote.txt") - rescue - error = $! - end - end - assert_equal Net::SCP::Error, error.class - assert_equal "SCP did not finish successfully (1): File not found: /path/to/remote.txt\n", error.message - end - - def test_download_with_progress_callback_should_invoke_callback - prepare_file("/path/to/local.txt", "a" * 3000 + "b" * 3000 + "c" * 3000 + "d" * 3000) - - expect_scp_session "-f /path/to/remote.txt" do |channel| - channel.sends_ok - channel.gets_data "C0666 12000 remote.txt\n" - channel.sends_ok - channel.gets_data "a" * 3000 - channel.inject_remote_delay! - channel.gets_data "b" * 3000 - channel.inject_remote_delay! - channel.gets_data "c" * 3000 - channel.inject_remote_delay! - channel.gets_data "d" * 3000 - channel.gets_ok - channel.sends_ok - end - - calls = [] - progress = Proc.new { |ch, *args| calls << args } - - assert_scripted do - scp.download!("/path/to/remote.txt", "/path/to/local.txt", &progress) - end - - assert_equal ["/path/to/local.txt", 0, 12000], calls.shift - assert_equal ["/path/to/local.txt", 3000, 12000], calls.shift - assert_equal ["/path/to/local.txt", 6000, 12000], calls.shift - assert_equal ["/path/to/local.txt", 9000, 12000], calls.shift - assert_equal ["/path/to/local.txt", 12000, 12000], calls.shift - assert calls.empty? - end - - def test_download_io_with_recursive_should_raise_error - expect_scp_session "-f -r /path/to/remote.txt" - assert_raises(Net::SCP::Error) { scp.download!("/path/to/remote.txt", StringIO.new, :recursive => true) } - end - - def test_download_io_with_preserve_should_ignore_preserve - expect_scp_session "-f -p /path/to/remote.txt" do |channel| - simple_download(channel) - end - - io = StringIO.new - assert_scripted { scp.download!("/path/to/remote.txt", io, :preserve => true) } - assert_equal "a" * 1234, io.string - end - - def test_download_io_should_transfer_data - expect_scp_session "-f /path/to/remote.txt" do |channel| - simple_download(channel) - end - - io = StringIO.new - assert_scripted { scp.download!("/path/to/remote.txt", io) } - assert_equal "a" * 1234, io.string - end - - def test_download_bang_without_target_should_return_string - expect_scp_session "-f /path/to/remote.txt" do |channel| - simple_download(channel) - end - - assert_scripted do - assert_equal "a" * 1234, scp.download!("/path/to/remote.txt") - end - end - - def test_download_directory_without_recursive_should_raise_error - expect_scp_session "-f /path/to/remote" do |channel| - channel.sends_ok - channel.gets_data "D0755 0 remote\n" - end - - assert_raises(Net::SCP::Error) { scp.download!("/path/to/remote") } - end - - def test_download_directory_should_create_directory_and_files_locally - file = nil - prepare_directory "/path/to/local" do |dir| - dir.directory "remote" do |dir2| - dir2.directory "sub" do |dir3| - file = dir3.file "remote.txt", "" - end - end - end - - expect_scp_session "-f -r /path/to/remote" do |channel| - channel.sends_ok - channel.gets_data "D0755 0 remote\n" - channel.sends_ok - channel.gets_data "D0755 0 sub\n" - simple_download(channel) - channel.gets_data "E\n" - channel.sends_ok - channel.gets_data "E\n" - channel.sends_ok - end - - scp.download!("/path/to/remote", "/path/to/local", :recursive => true, :ssh => { :verbose => :debug }) - assert_equal "a" * 1234, file.io.string - end - - private - - def simple_download(channel, mode=0666) - channel.sends_ok - channel.gets_data "C%04o 1234 remote.txt\n" % mode - channel.sends_ok - channel.gets_data "a" * 1234 - channel.gets_ok - channel.sends_ok - end -end diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/test/test_scp.rb new/test/test_scp.rb --- old/test/test_scp.rb 1970-01-01 01:00:00.000000000 +0100 +++ new/test/test_scp.rb 1970-01-01 01:00:00.000000000 +0100 @@ -1,60 +0,0 @@ -require 'common' - -class TestSCP < Net::SCP::TestCase - def test_start_without_block_should_return_scp_instance - ssh = stub('session', :logger => nil) - Net::SSH.expects(:start). - with("remote.host", "username", :password => "foo"). - returns(ssh) - - ssh.expects(:close).never - scp = Net::SCP.start("remote.host", "username", :password => "foo") - assert_instance_of Net::SCP, scp - assert_equal ssh, scp.session - end - - def test_start_with_block_should_yield_scp_and_close_ssh_session - ssh = stub('session', :logger => nil) - Net::SSH.expects(:start). - with("remote.host", "username", :password => "foo"). - returns(ssh) - - ssh.expects(:loop) - ssh.expects(:close) - - yielded = false - Net::SCP.start("remote.host", "username", :password => "foo") do |scp| - yielded = true - assert_instance_of Net::SCP, scp - assert_equal ssh, scp.session - end - - assert yielded - end - - def test_self_upload_should_instatiate_scp_and_invoke_synchronous_upload - scp = stub('scp') - scp.expects(:upload!).with("/path/to/local", "/path/to/remote", :recursive => true) - - Net::SCP.expects(:start). - with("remote.host", "username", :password => "foo"). - yields(scp) - - Net::SCP.upload!("remote.host", "username", "/path/to/local", "/path/to/remote", - :ssh => { :password => "foo" }, :recursive => true) - end - - def test_self_download_should_instatiate_scp_and_invoke_synchronous_download - scp = stub('scp') - scp.expects(:download!).with("/path/to/remote", "/path/to/local", :recursive => true).returns(:result) - - Net::SCP.expects(:start). - with("remote.host", "username", :password => "foo"). - yields(scp) - - result = Net::SCP.download!("remote.host", "username", "/path/to/remote", "/path/to/local", - :ssh => { :password => "foo" }, :recursive => true) - - assert_equal :result, result - end -end diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/test/test_upload.rb new/test/test_upload.rb --- old/test/test_upload.rb 1970-01-01 01:00:00.000000000 +0100 +++ new/test/test_upload.rb 1970-01-01 01:00:00.000000000 +0100 @@ -1,269 +0,0 @@ -require 'common' - -class TestUpload < Net::SCP::TestCase - def test_upload_file_should_transfer_file - prepare_file("/path/to/local.txt", "a" * 1234) - - expect_scp_session "-t /path/to/remote.txt" do |channel| - channel.gets_ok - channel.sends_data "C0666 1234 local.txt\n" - channel.gets_ok - channel.sends_data "a" * 1234 - channel.sends_ok - channel.gets_ok - end - - assert_scripted { scp.upload!("/path/to/local.txt", "/path/to/remote.txt") } - end - - def test_upload_file_with_spaces_in_name_should_escape_remote_file_name - prepare_file("/path/to/local file.txt", "") - - expect_scp_session "-t /path/to/remote\\ file.txt" do |channel| - channel.gets_ok - channel.sends_data "C0666 0 local file.txt\n" - channel.gets_ok - channel.sends_ok - channel.gets_ok - end - - assert_scripted { scp.upload!("/path/to/local file.txt", "/path/to/remote file.txt") } - end - - def test_upload_file_with_metacharacters_in_name_should_escape_remote_file_name - prepare_file("/path/to/local/#{awful_file_name}", "") - - expect_scp_session "-t /path/to/remote/#{escaped_file_name}" do |channel| - channel.gets_ok - channel.sends_data "C0666 0 #{awful_file_name}\n" - channel.gets_ok - channel.sends_ok - channel.gets_ok - end - - assert_scripted { scp.upload!("/path/to/local/#{awful_file_name}", "/path/to/remote/#{awful_file_name}") } - end - - def test_upload_file_with_preserve_should_send_times - prepare_file("/path/to/local.txt", "a" * 1234, 0666, Time.at(1234567890, 123456), Time.at(1234543210, 345678)) - - expect_scp_session "-t -p /path/to/remote.txt" do |channel| - channel.gets_ok - channel.sends_data "T1234567890 123456 1234543210 345678\n" - channel.gets_ok - channel.sends_data "C0666 1234 local.txt\n" - channel.gets_ok - channel.sends_data "a" * 1234 - channel.sends_ok - channel.gets_ok - end - - assert_scripted { scp.upload!("/path/to/local.txt", "/path/to/remote.txt", :preserve => true) } - end - - def test_upload_file_with_progress_callback_should_invoke_callback - prepare_file("/path/to/local.txt", "a" * 3000 + "b" * 3000 + "c" * 3000 + "d" * 3000) - - expect_scp_session "-t /path/to/remote.txt" do |channel| - channel.gets_ok - channel.sends_data "C0666 12000 local.txt\n" - channel.gets_ok - channel.sends_data "a" * 3000 - channel.sends_data "b" * 3000 - channel.sends_data "c" * 3000 - channel.sends_data "d" * 3000 - channel.sends_ok - channel.gets_ok - end - - calls = [] - progress = Proc.new do |ch, name, sent, total| - calls << [name, sent, total] - end - - assert_scripted do - scp.upload!("/path/to/local.txt", "/path/to/remote.txt", :chunk_size => 3000, &progress) - end - - assert_equal ["/path/to/local.txt", 0, 12000], calls.shift - assert_equal ["/path/to/local.txt", 3000, 12000], calls.shift - assert_equal ["/path/to/local.txt", 6000, 12000], calls.shift - assert_equal ["/path/to/local.txt", 9000, 12000], calls.shift - assert_equal ["/path/to/local.txt", 12000, 12000], calls.shift - assert calls.empty? - end - - def test_upload_io_with_recursive_should_ignore_recursive - expect_scp_session "-t -r /path/to/remote.txt" do |channel| - channel.gets_ok - channel.sends_data "C0640 1234 remote.txt\n" - channel.gets_ok - channel.sends_data "a" * 1234 - channel.sends_ok - channel.gets_ok - end - - io = StringIO.new("a" * 1234) - assert_scripted { scp.upload!(io, "/path/to/remote.txt", :recursive => true) } - end - - def test_upload_io_with_preserve_should_ignore_preserve - expect_scp_session "-t -p /path/to/remote.txt" do |channel| - channel.gets_ok - channel.sends_data "C0640 1234 remote.txt\n" - channel.gets_ok - channel.sends_data "a" * 1234 - channel.sends_ok - channel.gets_ok - end - - io = StringIO.new("a" * 1234) - assert_scripted { scp.upload!(io, "/path/to/remote.txt", :preserve => true) } - end - - def test_upload_io_should_transfer_data - expect_scp_session "-t /path/to/remote.txt" do |channel| - channel.gets_ok - channel.sends_data "C0640 1234 remote.txt\n" - channel.gets_ok - channel.sends_data "a" * 1234 - channel.sends_ok - channel.gets_ok - end - - io = StringIO.new("a" * 1234) - assert_scripted { scp.upload!(io, "/path/to/remote.txt") } - end - - def test_upload_io_with_mode_should_honor_mode_as_permissions - expect_scp_session "-t /path/to/remote.txt" do |channel| - channel.gets_ok - channel.sends_data "C0666 1234 remote.txt\n" - channel.gets_ok - channel.sends_data "a" * 1234 - channel.sends_ok - channel.gets_ok - end - - io = StringIO.new("a" * 1234) - assert_scripted { scp.upload!(io, "/path/to/remote.txt", :mode => 0666) } - end - - def test_upload_directory_without_recursive_should_error - prepare_directory("/path/to/local") - - expect_scp_session("-t /path/to/remote") do |channel| - channel.gets_ok - end - - assert_raises(Net::SCP::Error) { scp.upload!("/path/to/local", "/path/to/remote") } - end - - def test_upload_empty_directory_should_create_directory_and_finish - prepare_directory("/path/to/local") - - expect_scp_session("-t -r /path/to/remote") do |channel| - channel.gets_ok - channel.sends_data "D0777 0 local\n" - channel.gets_ok - channel.sends_data "E\n" - channel.gets_ok - end - - assert_scripted { scp.upload!("/path/to/local", "/path/to/remote", :recursive => true) } - end - - def test_upload_directory_should_recursively_create_and_upload_items - prepare_directory("/path/to/local") do |d| - d.file "hello.txt", "hello world\n" - d.directory "others" do |d2| - d2.file "data.dat", "abcdefghijklmnopqrstuvwxyz" - end - d.file "zoo.doc", "going to the zoo\n" - end - - expect_scp_session("-t -r /path/to/remote") do |channel| - channel.gets_ok - channel.sends_data "D0777 0 local\n" - channel.gets_ok - channel.sends_data "C0666 12 hello.txt\n" - channel.gets_ok - channel.sends_data "hello world\n" - channel.sends_ok - channel.gets_ok - channel.sends_data "D0777 0 others\n" - channel.gets_ok - channel.sends_data "C0666 26 data.dat\n" - channel.gets_ok - channel.sends_data "abcdefghijklmnopqrstuvwxyz" - channel.sends_ok - channel.gets_ok - channel.sends_data "E\n" - channel.gets_ok - channel.sends_data "C0666 17 zoo.doc\n" - channel.gets_ok - channel.sends_data "going to the zoo\n" - channel.sends_ok - channel.gets_ok - channel.sends_data "E\n" - channel.gets_ok - end - - assert_scripted { scp.upload!("/path/to/local", "/path/to/remote", :recursive => true) } - end - - def test_upload_directory_with_preserve_should_send_times_for_all_items - prepare_directory("/path/to/local", 0755, Time.at(17171717, 191919), Time.at(18181818, 101010)) do |d| - d.file "hello.txt", "hello world\n", 0640, Time.at(12345, 67890), Time.at(234567, 890) - d.directory "others", 0770, Time.at(112233, 4455), Time.at(22334455, 667788) do |d2| - d2.file "data.dat", "abcdefghijklmnopqrstuvwxyz", 0600, Time.at(13579135, 13131), Time.at(7654321, 654321) - end - d.file "zoo.doc", "going to the zoo\n", 0444, Time.at(12121212, 131313), Time.at(23232323, 242424) - end - - expect_scp_session("-t -r -p /path/to/remote") do |channel| - channel.gets_ok - channel.sends_data "T17171717 191919 18181818 101010\n" - channel.gets_ok - channel.sends_data "D0755 0 local\n" - channel.gets_ok - channel.sends_data "T12345 67890 234567 890\n" - channel.gets_ok - channel.sends_data "C0640 12 hello.txt\n" - channel.gets_ok - channel.sends_data "hello world\n" - channel.sends_ok - channel.gets_ok - channel.sends_data "T112233 4455 22334455 667788\n" - channel.gets_ok - channel.sends_data "D0770 0 others\n" - channel.gets_ok - channel.sends_data "T13579135 13131 7654321 654321\n" - channel.gets_ok - channel.sends_data "C0600 26 data.dat\n" - channel.gets_ok - channel.sends_data "abcdefghijklmnopqrstuvwxyz" - channel.sends_ok - channel.gets_ok - channel.sends_data "E\n" - channel.gets_ok - channel.sends_data "T12121212 131313 23232323 242424\n" - channel.gets_ok - channel.sends_data "C0444 17 zoo.doc\n" - channel.gets_ok - channel.sends_data "going to the zoo\n" - channel.sends_ok - channel.gets_ok - channel.sends_data "E\n" - channel.gets_ok - end - - assert_scripted { scp.upload!("/path/to/local", "/path/to/remote", :preserve => true, :recursive => true) } - end - - def test_upload_should_not_block - prepare_file("/path/to/local.txt", "data") - story { |s| s.opens_channel(false) } - assert_scripted { scp.upload("/path/to/local.txt", "/path/to/remote.txt") } - end -end