Index: E:/Java/Eclipse/Workspace/Normal/wagon-ssh/src/main/java/org/apache/maven/wagon/providers/ssh/ScpWagon.java =================================================================== --- E:/Java/Eclipse/Workspace/Normal/wagon-ssh/src/main/java/org/apache/maven/wagon/providers/ssh/ScpWagon.java (revision 399846) +++ E:/Java/Eclipse/Workspace/Normal/wagon-ssh/src/main/java/org/apache/maven/wagon/providers/ssh/ScpWagon.java (working copy) @@ -71,12 +71,80 @@ firePutInitiated( resource, source ); + RepositoryPermissions permissions = getRepository().getPermissions(); + + ChannelExec channel = null; + + InputStream in = null; + + OutputStream out = null; + + String mode = "644"; + + // get writing mode for file + if ( permissions != null && permissions.getFileMode() != null ) + { + mode = permissions.getFileMode(); + } + else + { + try + { + // exec 'umask' remotely + channel = (ChannelExec) session.openChannel( EXEC_CHANNEL ); + + channel.setCommand( "umask" ); + + in = channel.getInputStream(); + + channel.connect(); + + String modeStr = readLine( in ); + + // TODO: mode = PermissionModeUtils.getUserMaskFor( modeStr, 0666 ); + int umask = Integer.valueOf( modeStr, 8 ).intValue(); + + umask = umask % 8 + ( ( umask / 8 ) % 8 ) * 8 + ( ( umask / 64 ) % 8 ) * 64; + + mode = Integer.toOctalString( 0666 - umask ); + } + catch ( IOException e ) + { + throw new TransferFailedException( "Error performing commands for file transfer", e ); + } + catch ( JSchException e ) + { + throw new TransferFailedException( "Error performing commands for file transfer", e ); + } + catch ( NumberFormatException e ) + { + // do nothing + } + finally + { + if ( channel != null ) + { + IOUtil.close( in ); + + IOUtil.close( out ); + + channel.disconnect(); + } + } + } + + if ( !mode.matches( "[0-9]{3}" ) ) + { + // TODO: as warning + fireSessionDebug( "Not using non-octal permissions: " + mode ); + } + try { String umaskCmd = null; - if ( getRepository().getPermissions() != null ) + if ( permissions != null ) { - String dirPerms = getRepository().getPermissions().getDirectoryMode(); + String dirPerms = permissions.getDirectoryMode(); if ( dirPerms != null ) { @@ -98,14 +166,8 @@ throw new TransferFailedException( "Error performing commands for file transfer", e ); } - ChannelExec channel = null; - - OutputStream out = null; - String path = getPath( basedir, resourceName ); - RepositoryPermissions permissions = getRepository().getPermissions(); - try { // exec 'scp -t -d rfile' remotely @@ -120,29 +182,15 @@ // get I/O streams for remote scp out = channel.getOutputStream(); - InputStream in = channel.getInputStream(); + in = channel.getInputStream(); channel.connect(); checkAck( in ); - // send "C0644 filesize filename", where filename should not include '/' + // send "C0XXX filesize filename", where filename should not include '/' long filesize = source.length(); - String mode = "644"; - if ( permissions != null && permissions.getFileMode() != null ) - { - if ( permissions.getFileMode().matches( "[0-9]{3}" ) ) - { - mode = permissions.getFileMode(); - } - else - { - // TODO: as warning - fireSessionDebug( "Not using non-octal permissions: " + mode ); - } - } - command = "C0" + mode + " " + filesize + " "; if ( resourceName.lastIndexOf( PATH_SEPARATOR ) > 0 ) @@ -174,15 +222,15 @@ } catch ( IOException e ) { - String msg = "Error occured while deploying '" + resourceName + "' to remote repository: " + - getRepository().getUrl(); + String msg = "Error occured while deploying '" + resourceName + "' to remote repository: " + + getRepository().getUrl(); throw new TransferFailedException( msg, e ); } catch ( JSchException e ) { - String msg = "Error occured while deploying '" + resourceName + "' to remote repository: " + - getRepository().getUrl(); + String msg = "Error occured while deploying '" + resourceName + "' to remote repository: " + + getRepository().getUrl(); throw new TransferFailedException( msg, e ); } @@ -190,6 +238,8 @@ { if ( channel != null ) { + IOUtil.close( in ); + IOUtil.close( out ); channel.disconnect(); @@ -325,8 +375,8 @@ if ( destination.length() != filesize ) { - throw new TransferFailedException( - "Expected file length: " + filesize + "; received = " + destination.length() ); + throw new TransferFailedException( "Expected file length: " + filesize + "; received = " + + destination.length() ); } // TODO: we could possibly have received additional files here