Skip to content

Commit f713c5d

Browse files
committed
Add support for symbolic links in tar file resource collections
1 parent b272c12 commit f713c5d

File tree

3 files changed

+53
-1
lines changed

3 files changed

+53
-1
lines changed

src/main/java/org/codehaus/plexus/archiver/tar/PlexusIoTarFileResourceCollection.java

+3-1
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,9 @@ public boolean hasNext()
5454
public PlexusIoResource next()
5555
{
5656
final TarArchiveEntry entry = (TarArchiveEntry) en.nextElement();
57-
return new TarResource( tarFile, entry );
57+
return !entry.isSymbolicLink()
58+
? new TarResource( tarFile, entry )
59+
: new TarSymlinkResource( tarFile, entry );
5860
}
5961

6062
public void remove()
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package org.codehaus.plexus.archiver.tar;
2+
3+
import java.io.IOException;
4+
5+
import org.apache.commons.compress.archivers.tar.TarArchiveEntry;
6+
import org.codehaus.plexus.components.io.functions.SymlinkDestinationSupplier;
7+
8+
/**
9+
* A {@link TarResource} that represents symbolic link.
10+
*/
11+
public class TarSymlinkResource
12+
extends TarResource
13+
implements SymlinkDestinationSupplier
14+
{
15+
private final String symlinkDestination;
16+
17+
public TarSymlinkResource(TarFile tarFile, TarArchiveEntry entry) {
18+
super(tarFile, entry);
19+
symlinkDestination = entry.getLinkName();
20+
}
21+
22+
@Override
23+
public String getSymlinkDestination() throws IOException {
24+
return symlinkDestination;
25+
}
26+
27+
@Override
28+
public boolean isSymbolicLink() {
29+
return true;
30+
}
31+
32+
}

src/test/java/org/codehaus/plexus/archiver/tar/TarArchiverTest.java

+18
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
import org.codehaus.plexus.archiver.gzip.GZipCompressor;
3535
import org.codehaus.plexus.archiver.util.ArchiveEntryUtils;
3636
import org.codehaus.plexus.archiver.util.Compressor;
37+
import org.codehaus.plexus.archiver.util.DefaultArchivedFileSet;
3738
import org.codehaus.plexus.archiver.zip.ArchiveFileComparator;
3839
import org.codehaus.plexus.components.io.attributes.PlexusIoResourceAttributeUtils;
3940
import org.codehaus.plexus.components.io.attributes.PlexusIoResourceAttributes;
@@ -533,4 +534,21 @@ private void testCreateResourceCollection( TarHandler tarHandler )
533534
cmp1.close();
534535
cmp2.close();
535536
}
537+
538+
public void testSymlinkArchivedFileSet()
539+
throws Exception
540+
{
541+
final File tarFile = getTestFile( "src/test/resources/symlinks/symlinks.tar" );
542+
final File tarFile2 = getTestFile( "target/output/pasymlinks-archivedFileset.tar" );
543+
final TarArchiver tarArchiver = getPosixTarArchiver();
544+
tarArchiver.setDestFile( tarFile2 );
545+
DefaultArchivedFileSet archivedFileSet = DefaultArchivedFileSet.archivedFileSet( tarFile );
546+
archivedFileSet.setUsingDefaultExcludes( false );
547+
tarArchiver.addArchivedFileSet( archivedFileSet );
548+
tarArchiver.createArchive();
549+
550+
final TarFile cmp1 = new TarFile( tarFile );
551+
final TarFile cmp2 = new TarFile( tarFile2 );
552+
ArchiveFileComparator.assertEquals( cmp1, cmp2, "" );
553+
}
536554
}

0 commit comments

Comments
 (0)