Archive for the ‘ruby’ Category

InfoQ の SSHとRubyでファイル・アップロードを自動化 の再帰版は自分も利用してるんだけど、こいつは階層の深いディレクトリ作成に問題がある。
以下はInfoQからの引用。

RUBY:
  1. 19:         begin
  2. 20:         remote_dir = File.dirname(remote_file)
  3. 21:         sftp.stat(remote_dir)
  4. 22:     rescue Net::SFTP::Operations::StatusException => e
  5. 23:       raise unless e.code == 2
  6.  
  7. 24:       sftp.mkdir(remote_dir, :permissions => dir_perm)
  8. 25:     end

何か不思議なインデントだけど、それは置いておいて。
ディレクトリを再帰的に潜っていくのだけれども、ファイルを見つけた時点で必要なディレクトリを作成している。
sftp.mkdir(remote_dir, :permissions => dir_perm) でディレクトリを作成しているのだけども、こいつは親ディレクトリがない場合はディレクトリ作成に失敗する。

ちゅーことで下記のように修正して利用している。

RUBY:
  1. begin
  2.   remote_dir = File.dirname(remote_file)
  3.   sftp.stat(remote_dir)
  4. rescue Net::SFTP::Operations::StatusException => e
  5.   raise unless e.code == 2
  6.  
  7.   # sftp.mkdir(remote_dir, :permissions => dir_perm)
  8.   shell = ssh.shell.sync
  9.   if shell.open?
  10.     shell.send_command("mkdir -p #{remote_dir}")
  11.     shell.exit
  12.   end
  13. end