You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@ant.apache.org by "Maarten Coene (JIRA)" <ji...@apache.org> on 2007/12/07 21:05:43 UTC

[jira] Updated: (IVY-661) Incorrect parsing artifactPattern attribute in a sftp resolver

     [ https://issues.apache.org/jira/browse/IVY-661?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Maarten Coene updated IVY-661:
------------------------------

    Fix Version/s:     (was: 2.0.0-beta-1)
      Description: 
PROBLEM:

Ivy settings file contains description of resolver:
	<resolvers>
		<sftp name="remote">
			<ivy pattern="sftp://user:password@host:12345/repository/[module]/[module]-[revision].xml"/>
			<artifact pattern="sftp://user:password@host:12345/repository/[module]/[artifact]-[revision].[ext]"/>
		</sftp>
	</resolvers>

Then we try to publish to a repository for the first time on empty server we get a java.io.IOException and a following directory structure created on the server ~user/sftp:/.
Afterwards when we publish for the second time we get following directory structure ~user/sftp:/user:password@host:12435/repository/module/ and successfully published artifact.
During the first run the java.io.IOException caused by creation of a directory with empty name. Creation of the directory with empty name caused by double slash (//) following "sftp:".

SOLUTION:

Solution of this problem is in the patch listed below.

{code}
Index: SFTPRepository.java
===================================================================
--- SFTPRepository.java	(revision 601711)
+++ SFTPRepository.java	(working copy)
@@ -20,6 +20,8 @@
 import java.io.File;
 import java.io.IOException;
 import java.io.InputStream;
+import java.net.URI;
+import java.net.URISyntaxException;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Iterator;
@@ -132,14 +134,33 @@
     public void put(File source, String destination, boolean overwrite) throws IOException {
         fireTransferInitiated(getResource(destination), TransferEvent.REQUEST_PUT);
         ChannelSftp c = getSftpChannel(destination);
+		
+		String path = null;
+		try {
+            URI uri = new URI(destination);
+			path = uri.getPath();
+			
+            if (path == null) {
+                throw new URISyntaxException(destination, "Missing path in URI.");
+            }
+        } catch (URISyntaxException e) {
+			IOException ex = new IOException(e.getMessage() + " The uri is in the wrong format. Please use scheme://user:pass@hostname/path/to/repository.");
+			ex.initCause(e);
+			throw ex;
+        }
+
         try {
-            if (!overwrite && checkExistence(destination, c)) {
+            if (!overwrite && checkExistence(path, c)) {
                 throw new IOException("destination file exists and overwrite == true");
             }
-            if (destination.indexOf('/') != -1) {
-                mkdirs(destination.substring(0, destination.lastIndexOf('/')), c);
+			
+			if (path.indexOf('/') == 0) {
+				path = path.substring(1, path.length());
+			}
+            if (path.indexOf('/') != -1) {
+                mkdirs(path.substring(0, path.lastIndexOf('/')), c);
             }
-            c.put(source.getAbsolutePath(), destination, new MyProgressMonitor());
+            c.put(source.getAbsolutePath(), path, new MyProgressMonitor());
         } catch (SftpException e) {
             IOException ex = new IOException(e.getMessage());
             ex.initCause(e);
{code}

  was:
PROBLEM:

Ivy settings file contains description of resolver:
	<resolvers>
		<sftp name="remote">
			<ivy pattern="sftp://user:password@host:12345/repository/[module]/[module]-[revision].xml"/>
			<artifact pattern="sftp://user:password@host:12345/repository/[module]/[artifact]-[revision].[ext]"/>
		</sftp>
	</resolvers>

Then we try to publish to a repository for the first time on empty server we get a java.io.IOException and a following directory structure created on the server ~user/sftp:/.
Afterwards when we publish for the second time we get following directory structure ~user/sftp:/user:password@host:12435/repository/module/ and successfully published artifact.
During the first run the java.io.IOException caused by creation of a directory with empty name. Creation of the directory with empty name caused by double slash (//) following "sftp:".

SOLUTION:

Solution of this problem is in the patch listed below.

Index: SFTPRepository.java
===================================================================
--- SFTPRepository.java	(revision 601711)
+++ SFTPRepository.java	(working copy)
@@ -20,6 +20,8 @@
 import java.io.File;
 import java.io.IOException;
 import java.io.InputStream;
+import java.net.URI;
+import java.net.URISyntaxException;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Iterator;
@@ -132,14 +134,33 @@
     public void put(File source, String destination, boolean overwrite) throws IOException {
         fireTransferInitiated(getResource(destination), TransferEvent.REQUEST_PUT);
         ChannelSftp c = getSftpChannel(destination);
+		
+		String path = null;
+		try {
+            URI uri = new URI(destination);
+			path = uri.getPath();
+			
+            if (path == null) {
+                throw new URISyntaxException(destination, "Missing path in URI.");
+            }
+        } catch (URISyntaxException e) {
+			IOException ex = new IOException(e.getMessage() + " The uri is in the wrong format. Please use scheme://user:pass@hostname/path/to/repository.");
+			ex.initCause(e);
+			throw ex;
+        }
+
         try {
-            if (!overwrite && checkExistence(destination, c)) {
+            if (!overwrite && checkExistence(path, c)) {
                 throw new IOException("destination file exists and overwrite == true");
             }
-            if (destination.indexOf('/') != -1) {
-                mkdirs(destination.substring(0, destination.lastIndexOf('/')), c);
+			
+			if (path.indexOf('/') == 0) {
+				path = path.substring(1, path.length());
+			}
+            if (path.indexOf('/') != -1) {
+                mkdirs(path.substring(0, path.lastIndexOf('/')), c);
             }
-            c.put(source.getAbsolutePath(), destination, new MyProgressMonitor());
+            c.put(source.getAbsolutePath(), path, new MyProgressMonitor());
         } catch (SftpException e) {
             IOException ex = new IOException(e.getMessage());
             ex.initCause(e);



> Incorrect parsing artifactPattern attribute in a sftp resolver
> --------------------------------------------------------------
>
>                 Key: IVY-661
>                 URL: https://issues.apache.org/jira/browse/IVY-661
>             Project: Ivy
>          Issue Type: Bug
>          Components: Core
>    Affects Versions: 2.0.0-beta-1
>         Environment: Developer: Windows XP, jdk1.6.0_02, ant-1.7.0, jsch-0.1.36
> SFTP Server: FreeBSD-6.2-RELEASE.
>            Reporter: Alexey Kiselev
>            Priority: Minor
>
> PROBLEM:
> Ivy settings file contains description of resolver:
> 	<resolvers>
> 		<sftp name="remote">
> 			<ivy pattern="sftp://user:password@host:12345/repository/[module]/[module]-[revision].xml"/>
> 			<artifact pattern="sftp://user:password@host:12345/repository/[module]/[artifact]-[revision].[ext]"/>
> 		</sftp>
> 	</resolvers>
> Then we try to publish to a repository for the first time on empty server we get a java.io.IOException and a following directory structure created on the server ~user/sftp:/.
> Afterwards when we publish for the second time we get following directory structure ~user/sftp:/user:password@host:12435/repository/module/ and successfully published artifact.
> During the first run the java.io.IOException caused by creation of a directory with empty name. Creation of the directory with empty name caused by double slash (//) following "sftp:".
> SOLUTION:
> Solution of this problem is in the patch listed below.
> {code}
> Index: SFTPRepository.java
> ===================================================================
> --- SFTPRepository.java	(revision 601711)
> +++ SFTPRepository.java	(working copy)
> @@ -20,6 +20,8 @@
>  import java.io.File;
>  import java.io.IOException;
>  import java.io.InputStream;
> +import java.net.URI;
> +import java.net.URISyntaxException;
>  import java.util.ArrayList;
>  import java.util.Collection;
>  import java.util.Iterator;
> @@ -132,14 +134,33 @@
>      public void put(File source, String destination, boolean overwrite) throws IOException {
>          fireTransferInitiated(getResource(destination), TransferEvent.REQUEST_PUT);
>          ChannelSftp c = getSftpChannel(destination);
> +		
> +		String path = null;
> +		try {
> +            URI uri = new URI(destination);
> +			path = uri.getPath();
> +			
> +            if (path == null) {
> +                throw new URISyntaxException(destination, "Missing path in URI.");
> +            }
> +        } catch (URISyntaxException e) {
> +			IOException ex = new IOException(e.getMessage() + " The uri is in the wrong format. Please use scheme://user:pass@hostname/path/to/repository.");
> +			ex.initCause(e);
> +			throw ex;
> +        }
> +
>          try {
> -            if (!overwrite && checkExistence(destination, c)) {
> +            if (!overwrite && checkExistence(path, c)) {
>                  throw new IOException("destination file exists and overwrite == true");
>              }
> -            if (destination.indexOf('/') != -1) {
> -                mkdirs(destination.substring(0, destination.lastIndexOf('/')), c);
> +			
> +			if (path.indexOf('/') == 0) {
> +				path = path.substring(1, path.length());
> +			}
> +            if (path.indexOf('/') != -1) {
> +                mkdirs(path.substring(0, path.lastIndexOf('/')), c);
>              }
> -            c.put(source.getAbsolutePath(), destination, new MyProgressMonitor());
> +            c.put(source.getAbsolutePath(), path, new MyProgressMonitor());
>          } catch (SftpException e) {
>              IOException ex = new IOException(e.getMessage());
>              ex.initCause(e);
> {code}

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.