in src/main/java/org/apache/netbeans/nbpackage/ArchiveUtils.java [437:477]
private static void createAndPutArchiveEntry(ArchiveType archiveType, ArchiveOutputStream archiveOutputStream,
Path directoryToArchive, Path filePathToArchive) throws IOException {
switch (archiveType) {
case ZIP: {
ZipArchiveEntry entry = new ZipArchiveEntry(filePathToArchive.toFile(), getRelativePathString(filePathToArchive, directoryToArchive));
entry.setUnixMode(getUnixMode(filePathToArchive));
final boolean isSymbolicLink = Files.isSymbolicLink(filePathToArchive);
if (isSymbolicLink) {
entry.setUnixMode(entry.getUnixMode() | ZIP_LINK_FLAG);
}
archiveOutputStream.putArchiveEntry(entry);
if (isSymbolicLink) {
String linkData = Files.readSymbolicLink(filePathToArchive).toString().replaceAll("\\\\", "/");
archiveOutputStream.write(linkData.getBytes(StandardCharsets.UTF_8));
} else {
Files.copy(filePathToArchive, archiveOutputStream);
}
break;
}
case TAR: {
final boolean isSymbolicLink = Files.isSymbolicLink(filePathToArchive);
TarArchiveEntry entry;
if (isSymbolicLink) {
entry = new TarArchiveEntry(getRelativePathString(filePathToArchive, directoryToArchive), TarConstants.LF_SYMLINK);
entry.setLinkName(getRelativePathString(
filePathToArchive.resolve(Files.readSymbolicLink(filePathToArchive)),
directoryToArchive));
} else {
entry = new TarArchiveEntry(filePathToArchive.toFile(), getRelativePathString(filePathToArchive, directoryToArchive));
}
entry.setMode(getUnixMode(filePathToArchive));
archiveOutputStream.putArchiveEntry(entry);
if (!isSymbolicLink) {
Files.copy(filePathToArchive, archiveOutputStream);
}
break;
}
}
}