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

Alexey Kiselev updated IVY-661:
-------------------------------

          Description: 
PROBLEM:

Ivy settings file contains description of resolver:
        <resolvers>
                <sftp name="remote">
                        <ivy pattern="sftp://user:[EMAIL 
PROTECTED]:12345/repository/[module]/[module]-[revision].xml"/>
                        <artifact pattern="sftp://user:[EMAIL 
PROTECTED]: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:[EMAIL PROTECTED]: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:".
Then if we try to retrieve a file from the repository we get an exception with 
message "reolving resource error: No such file". This problem appears because 
after establishing connection to the sftp server we are automatically moved to 
the user home directory. 
Thats why we must use a relative path in put, get and list commands when we 
work with a repository.

SOLUTION:

Solution of this problem is in the attached patch.


  was:
PROBLEM:

Ivy settings file contains description of resolver:
        <resolvers>
                <sftp name="remote">
                        <ivy pattern="sftp://user:[EMAIL 
PROTECTED]:12345/repository/[module]/[module]-[revision].xml"/>
                        <artifact pattern="sftp://user:[EMAIL 
PROTECTED]: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:[EMAIL PROTECTED]: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:[EMAIL 
PROTECTED]/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}

    Affects Version/s:     (was: 2.0.0-beta-1)
                       2.0.0-beta-2

The solution was slightly extended. 
Now it considers not only a publish, but also a retrieve process.

> 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-2
>         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:[EMAIL 
> PROTECTED]:12345/repository/[module]/[module]-[revision].xml"/>
>                       <artifact pattern="sftp://user:[EMAIL 
> PROTECTED]: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:[EMAIL PROTECTED]: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:".
> Then if we try to retrieve a file from the repository we get an exception 
> with message "reolving resource error: No such file". This problem appears 
> because after establishing connection to the sftp server we are automatically 
> moved to the user home directory. 
> Thats why we must use a relative path in put, get and list commands when we 
> work with a repository.
> SOLUTION:
> Solution of this problem is in the attached patch.

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

Reply via email to