[takari-archiver] Unbundle part of jgit
Mikolaj Izdebski
mizdebsk at fedoraproject.org
Thu Mar 12 13:15:31 UTC 2015
commit 96c00e6b4150ef455823e304f58e090ef5a90598
Author: Mikolaj Izdebski <mizdebsk at redhat.com>
Date: Thu Mar 12 11:38:25 2015 +0100
Unbundle part of jgit
takari-archiver-unbundle-jgit.patch | 530 ++++++++++++++++++++++++++++++++++++
takari-archiver.spec | 6 +
2 files changed, 536 insertions(+)
---
diff --git a/takari-archiver-unbundle-jgit.patch b/takari-archiver-unbundle-jgit.patch
new file mode 100644
index 0000000..cd17c20
--- /dev/null
+++ b/takari-archiver-unbundle-jgit.patch
@@ -0,0 +1,530 @@
+diff --git a/pom.xml b/pom.xml
+index 82801ac..d14a148 100644
+--- a/pom.xml
++++ b/pom.xml
+@@ -12,6 +12,11 @@
+ <name>Provisio :: Archiver</name>
+ <dependencies>
+ <dependency>
++ <groupId>com.github.jnr</groupId>
++ <artifactId>jnr-posix</artifactId>
++ <version>3.0.9</version>
++ </dependency>
++ <dependency>
+ <groupId>com.google.guava</groupId>
+ <artifactId>guava</artifactId>
+ <version>14.0.1</version>
+diff --git a/src/main/java/io/tesla/proviso/archive/ArchiveHandlerSupport.java b/src/main/java/io/tesla/proviso/archive/ArchiveHandlerSupport.java
+index 026fa78..1f019fd 100644
+--- a/src/main/java/io/tesla/proviso/archive/ArchiveHandlerSupport.java
++++ b/src/main/java/io/tesla/proviso/archive/ArchiveHandlerSupport.java
+@@ -12,11 +12,11 @@ public abstract class ArchiveHandlerSupport implements ArchiveHandler {
+ if (archiveEntry.getFileMode() != -1) {
+ entry.setFileMode(archiveEntry.getFileMode());
+ if (isExecutable) {
+- entry.setFileMode(FileMode.makeExecutable(entry.getFileMode()));
++ entry.setFileMode(entry.getFileMode() | 0111);
+ }
+ } else {
+ if (isExecutable) {
+- entry.setFileMode(FileMode.EXECUTABLE_FILE.getBits());
++ entry.setFileMode(0100755);
+ }
+ }
+ return entry;
+diff --git a/src/main/java/io/tesla/proviso/archive/FileMode.java b/src/main/java/io/tesla/proviso/archive/FileMode.java
+deleted file mode 100644
+index 7473fae..0000000
+--- a/src/main/java/io/tesla/proviso/archive/FileMode.java
++++ /dev/null
+@@ -1,375 +0,0 @@
+-package io.tesla.proviso.archive;
+-
+-/*
+- * Copyright (C) 2007, Robin Rosenberg <robin.rosenberg at dewire.com>
+- * Copyright (C) 2006-2008, Shawn O. Pearce <spearce at spearce.org>
+- * and other copyright owners as documented in the project's IP log.
+- *
+- * This program and the accompanying materials are made available
+- * under the terms of the Eclipse Distribution License v1.0 which
+- * accompanies this distribution, is reproduced below, and is
+- * available at http://www.eclipse.org/org/documents/edl-v10.php
+- *
+- * All rights reserved.
+- *
+- * Redistribution and use in source and binary forms, with or
+- * without modification, are permitted provided that the following
+- * conditions are met:
+- *
+- * - Redistributions of source code must retain the above copyright
+- * notice, this list of conditions and the following disclaimer.
+- *
+- * - Redistributions in binary form must reproduce the above
+- * copyright notice, this list of conditions and the following
+- * disclaimer in the documentation and/or other materials provided
+- * with the distribution.
+- *
+- * - Neither the name of the Eclipse Foundation, Inc. nor the
+- * names of its contributors may be used to endorse or promote
+- * products derived from this software without specific prior
+- * written permission.
+- *
+- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+- * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+- * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+- * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+- * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+- */
+-
+-import static java.nio.file.attribute.PosixFilePermission.GROUP_EXECUTE;
+-import static java.nio.file.attribute.PosixFilePermission.GROUP_READ;
+-import static java.nio.file.attribute.PosixFilePermission.GROUP_WRITE;
+-import static java.nio.file.attribute.PosixFilePermission.OTHERS_EXECUTE;
+-import static java.nio.file.attribute.PosixFilePermission.OTHERS_READ;
+-import static java.nio.file.attribute.PosixFilePermission.OTHERS_WRITE;
+-import static java.nio.file.attribute.PosixFilePermission.OWNER_EXECUTE;
+-import static java.nio.file.attribute.PosixFilePermission.OWNER_READ;
+-import static java.nio.file.attribute.PosixFilePermission.OWNER_WRITE;
+-
+-import java.io.File;
+-import java.io.IOException;
+-import java.io.OutputStream;
+-import java.nio.file.Files;
+-import java.nio.file.attribute.PosixFilePermission;
+-import java.util.EnumSet;
+-import java.util.Set;
+-
+-/**
+- * Constants describing various file modes recognized by GIT.
+- * <p>
+- * GIT uses a subset of the available UNIX file permission bits. The <code>FileMode</code> class provides access to constants defining the modes actually used by GIT.
+- * </p>
+- */
+-public abstract class FileMode {
+- /**
+- * Mask to apply to a file mode to obtain its type bits.
+- *
+- * @see #TYPE_TREE
+- * @see #TYPE_SYMLINK
+- * @see #TYPE_FILE
+- * @see #TYPE_GITLINK
+- * @see #TYPE_MISSING
+- */
+- public static final int TYPE_MASK = 0170000;
+-
+- /** Bit pattern for {@link #TYPE_MASK} matching {@link #TREE}. */
+- public static final int TYPE_TREE = 0040000;
+-
+- /** Bit pattern for {@link #TYPE_MASK} matching {@link #SYMLINK}. */
+- public static final int TYPE_SYMLINK = 0120000;
+-
+- /** Bit pattern for {@link #TYPE_MASK} matching {@link #REGULAR_FILE}. */
+- public static final int TYPE_FILE = 0100000;
+-
+- /** Bit pattern for {@link #TYPE_MASK} matching {@link #GITLINK}. */
+- public static final int TYPE_GITLINK = 0160000;
+-
+- /** Bit pattern for {@link #TYPE_MASK} matching {@link #MISSING}. */
+- public static final int TYPE_MISSING = 0000000;
+-
+- /** Mode indicating an entry is a tree (aka directory). */
+- @SuppressWarnings("synthetic-access")
+- public static final FileMode TREE = new FileMode(TYPE_TREE) {
+- public boolean equals(final int modeBits) {
+- return (modeBits & TYPE_MASK) == TYPE_TREE;
+- }
+- };
+-
+- /** Mode indicating an entry is a symbolic link. */
+- @SuppressWarnings("synthetic-access")
+- public static final FileMode SYMLINK = new FileMode(TYPE_SYMLINK) {
+- public boolean equals(final int modeBits) {
+- return (modeBits & TYPE_MASK) == TYPE_SYMLINK;
+- }
+- };
+-
+- /** Mode indicating an entry is a non-executable file. */
+- @SuppressWarnings("synthetic-access")
+- public static final FileMode REGULAR_FILE = new FileMode(0100644) {
+- public boolean equals(final int modeBits) {
+- return (modeBits & TYPE_MASK) == TYPE_FILE && (modeBits & 0111) == 0;
+- }
+- };
+-
+- /** Mode indicating an entry is an executable file. */
+- @SuppressWarnings("synthetic-access")
+- public static final FileMode EXECUTABLE_FILE = new FileMode(0100755) {
+- public boolean equals(final int modeBits) {
+- return (modeBits & TYPE_MASK) == TYPE_FILE && (modeBits & 0111) != 0;
+- }
+- };
+-
+- /** Mode indicating an entry is a submodule commit in another repository. */
+- @SuppressWarnings("synthetic-access")
+- public static final FileMode GITLINK = new FileMode(TYPE_GITLINK) {
+- public boolean equals(final int modeBits) {
+- return (modeBits & TYPE_MASK) == TYPE_GITLINK;
+- }
+- };
+-
+- /** Mode indicating an entry is missing during parallel walks. */
+- @SuppressWarnings("synthetic-access")
+- public static final FileMode MISSING = new FileMode(TYPE_MISSING) {
+- public boolean equals(final int modeBits) {
+- return modeBits == 0;
+- }
+- };
+-
+- /**
+- * Convert a set of mode bits into a FileMode enumerated value.
+- *
+- * @param bits the mode bits the caller has somehow obtained.
+- * @return the FileMode instance that represents the given bits.
+- */
+- public static final FileMode fromBits(final int bits) {
+- switch (bits & TYPE_MASK) {
+- case TYPE_MISSING:
+- if (bits == 0) return MISSING;
+- break;
+- case TYPE_TREE:
+- return TREE;
+- case TYPE_FILE:
+- if ((bits & 0111) != 0) return EXECUTABLE_FILE;
+- return REGULAR_FILE;
+- case TYPE_SYMLINK:
+- return SYMLINK;
+- case TYPE_GITLINK:
+- return GITLINK;
+- }
+-
+- return new FileMode(bits) {
+- @Override
+- public boolean equals(final int a) {
+- return bits == a;
+- }
+- };
+- }
+-
+- private final byte[] octalBytes;
+-
+- private final int modeBits;
+-
+- private FileMode(int mode) {
+- modeBits = mode;
+- if (mode != 0) {
+- final byte[] tmp = new byte[10];
+- int p = tmp.length;
+-
+- while (mode != 0) {
+- tmp[--p] = (byte) ('0' + (mode & 07));
+- mode >>= 3;
+- }
+-
+- octalBytes = new byte[tmp.length - p];
+- for (int k = 0; k < octalBytes.length; k++) {
+- octalBytes[k] = tmp[p + k];
+- }
+- } else {
+- octalBytes = new byte[] {'0'};
+- }
+- }
+-
+- /**
+- * Test a file mode for equality with this {@link FileMode} object.
+- *
+- * @param modebits
+- * @return true if the mode bits represent the same mode as this object
+- */
+- public abstract boolean equals(final int modebits);
+-
+- /**
+- * Copy this mode as a sequence of octal US-ASCII bytes.
+- * <p>
+- * The mode is copied as a sequence of octal digits using the US-ASCII character encoding. The sequence does not use a leading '0' prefix to indicate octal notation. This method is suitable for
+- * generation of a mode string within a GIT tree object.
+- * </p>
+- *
+- * @param os stream to copy the mode to.
+- * @throws IOException the stream encountered an error during the copy.
+- */
+- public void copyTo(final OutputStream os) throws IOException {
+- os.write(octalBytes);
+- }
+-
+- /**
+- * Copy this mode as a sequence of octal US-ASCII bytes.
+- *
+- * The mode is copied as a sequence of octal digits using the US-ASCII character encoding. The sequence does not use a leading '0' prefix to indicate octal notation. This method is suitable for
+- * generation of a mode string within a GIT tree object.
+- *
+- * @param buf buffer to copy the mode to.
+- * @param ptr position within {@code buf} for first digit.
+- */
+- public void copyTo(byte[] buf, int ptr) {
+- System.arraycopy(octalBytes, 0, buf, ptr, octalBytes.length);
+- }
+-
+- /**
+- * @return the number of bytes written by {@link #copyTo(OutputStream)}.
+- */
+- public int copyToLength() {
+- return octalBytes.length;
+- }
+-
+- /** Format this mode as an octal string (for debugging only). */
+- public String toString() {
+- return Integer.toOctalString(modeBits);
+- }
+-
+- /**
+- * @return The mode bits as an integer.
+- */
+- public int getBits() {
+- return modeBits;
+- }
+-
+- //
+- // Utilities for dealing with file modes
+- //
+-
+- public static int makeExecutable(int fileMode) {
+- return fileMode | 0111;
+- }
+-
+- public static int getFileMode(File file) {
+- Set<PosixFilePermission> posixPermissions;
+- try {
+- posixPermissions = Files.getPosixFilePermissions(file.toPath());
+- } catch (IOException | UnsupportedOperationException e) {
+- return -1;
+- }
+- int result = 0;
+- if (posixPermissions.contains(OWNER_READ)) {
+- result = result | 0400;
+- }
+- if (posixPermissions.contains(OWNER_WRITE)) {
+- result = result | 0200;
+- }
+- if (posixPermissions.contains(OWNER_EXECUTE)) {
+- result = result | 0100;
+- }
+- if (posixPermissions.contains(GROUP_READ)) {
+- result = result | 040;
+- }
+- if (posixPermissions.contains(GROUP_WRITE)) {
+- result = result | 020;
+- }
+- if (posixPermissions.contains(GROUP_EXECUTE)) {
+- result = result | 010;
+- }
+- if (posixPermissions.contains(OTHERS_READ)) {
+- result = result | 04;
+- }
+- if (posixPermissions.contains(OTHERS_WRITE)) {
+- result = result | 02;
+- }
+- if (posixPermissions.contains(OTHERS_EXECUTE)) {
+- result = result | 01;
+- }
+- return result;
+- }
+-
+- public static Set<PosixFilePermission> toPermissionsSet(int mode) {
+- Set<PosixFilePermission> result = EnumSet.noneOf(PosixFilePermission.class);
+- if (isSet(mode, 0400)) {
+- result.add(OWNER_READ);
+- }
+- if (isSet(mode, 0200)) {
+- result.add(OWNER_WRITE);
+- }
+- if (isSet(mode, 0100)) {
+- result.add(OWNER_EXECUTE);
+- }
+-
+- if (isSet(mode, 040)) {
+- result.add(GROUP_READ);
+- }
+- if (isSet(mode, 020)) {
+- result.add(GROUP_WRITE);
+- }
+- if (isSet(mode, 010)) {
+- result.add(GROUP_EXECUTE);
+- }
+- if (isSet(mode, 04)) {
+- result.add(OTHERS_READ);
+- }
+- if (isSet(mode, 02)) {
+- result.add(OTHERS_WRITE);
+- }
+- if (isSet(mode, 01)) {
+- result.add(OTHERS_EXECUTE);
+- }
+- return result;
+- }
+-
+- //
+- // drwxrwxrwx
+- //
+- public static String toUnix(int mode) {
+- char[] unix = new char[10];
+- for (int i = 0; i < 10; i++) {
+- unix[i] = '-';
+- }
+- Set<PosixFilePermission> result = EnumSet.noneOf(PosixFilePermission.class);
+- if (isSet(mode, 0400)) {
+- unix[1] = 'r';
+- }
+- if (isSet(mode, 0200)) {
+- unix[2] = 'w';
+- }
+- if (isSet(mode, 0100)) {
+- unix[3] = 'x';
+- }
+- if (isSet(mode, 040)) {
+- unix[4] = 'r';
+- }
+- if (isSet(mode, 020)) {
+- unix[5] = 'w';
+- }
+- if (isSet(mode, 010)) {
+- unix[6] = 'x';
+- }
+- if (isSet(mode, 04)) {
+- unix[7] = 'r';
+- }
+- if (isSet(mode, 02)) {
+- unix[8] = 'w';
+- }
+- if (isSet(mode, 01)) {
+- unix[9] = 'x';
+- }
+- return new String(unix);
+- }
+-
+- private static boolean isSet(int mode, int bit) {
+- return (mode & bit) == bit;
+- }
+-}
+diff --git a/src/main/java/io/tesla/proviso/archive/UnArchiver.java b/src/main/java/io/tesla/proviso/archive/UnArchiver.java
+index c552837..c3fdf9c 100644
+--- a/src/main/java/io/tesla/proviso/archive/UnArchiver.java
++++ b/src/main/java/io/tesla/proviso/archive/UnArchiver.java
+@@ -6,13 +6,15 @@ import java.io.FileOutputStream;
+ import java.io.IOException;
+ import java.io.InputStream;
+ import java.io.OutputStream;
+-import java.nio.file.Files;
+ import java.util.ArrayList;
+ import java.util.List;
+
+ import javax.inject.Named;
+ import javax.inject.Singleton;
+
++import jnr.posix.POSIX;
++import jnr.posix.POSIXFactory;
++
+ import org.codehaus.plexus.util.SelectorUtils;
+
+ import com.google.common.collect.ImmutableList;
+@@ -32,6 +34,8 @@ import com.google.common.io.ByteStreams;
+ @Singleton
+ public class UnArchiver {
+
++ private static final POSIX POSIX = POSIXFactory.getPOSIX();
++
+ private final List<String> includes;
+ private final List<String> excludes;
+ private final boolean useRoot;
+@@ -126,11 +130,8 @@ public class UnArchiver {
+ }
+ int mode = archiveEntry.getFileMode();
+ if (mode != -1) {
+- try {
+- Files.setPosixFilePermissions(outputFile.toPath(), FileMode.toPermissionsSet(mode));
+- } catch (UnsupportedOperationException e) {
+- // ignore, must be windows
+- }
++ int err = POSIX.chmod(outputFile.getPath(), mode);
++ if (err != 0) throw new IOException("Unable to set permissions for file " + outputFile);
+ }
+ }
+ source.close();
+diff --git a/src/main/java/io/tesla/proviso/archive/source/FileEntry.java b/src/main/java/io/tesla/proviso/archive/source/FileEntry.java
+index 8e96055..0b69b40 100644
+--- a/src/main/java/io/tesla/proviso/archive/source/FileEntry.java
++++ b/src/main/java/io/tesla/proviso/archive/source/FileEntry.java
+@@ -1,19 +1,22 @@
+ package io.tesla.proviso.archive.source;
+
+ import io.tesla.proviso.archive.Entry;
+-import io.tesla.proviso.archive.FileMode;
+
+ import java.io.File;
+ import java.io.FileInputStream;
+ import java.io.IOException;
+ import java.io.InputStream;
+ import java.io.OutputStream;
+-import java.nio.file.Files;
++
++import jnr.posix.POSIX;
++import jnr.posix.POSIXFactory;
+
+ import com.google.common.io.ByteStreams;
+
+ public class FileEntry implements Entry {
+
++ private static final POSIX POSIX = POSIXFactory.getPOSIX();
++
+ private final String name;
+ private final File file;
+
+@@ -46,7 +49,7 @@ public class FileEntry implements Entry {
+
+ @Override
+ public int getFileMode() {
+- return FileMode.getFileMode(file);
++ return POSIX.stat(file.getPath()).mode();
+ }
+
+ @Override
+@@ -56,6 +59,7 @@ public class FileEntry implements Entry {
+
+ @Override
+ public boolean isExecutable() {
+- return FileMode.EXECUTABLE_FILE.equals(getFileMode());
++ int mode = getFileMode();
++ return (mode & 0170000) == 0100000 && (mode & 0111) != 0;
+ }
+ }
+diff --git a/src/main/java/io/tesla/proviso/archive/zip/ZipArchiveSource.java b/src/main/java/io/tesla/proviso/archive/zip/ZipArchiveSource.java
+index 84ff685..61d8bee 100644
+--- a/src/main/java/io/tesla/proviso/archive/zip/ZipArchiveSource.java
++++ b/src/main/java/io/tesla/proviso/archive/zip/ZipArchiveSource.java
+@@ -1,7 +1,6 @@
+ package io.tesla.proviso.archive.zip;
+
+ import io.tesla.proviso.archive.Entry;
+-import io.tesla.proviso.archive.FileMode;
+ import io.tesla.proviso.archive.Source;
+
+ import java.io.File;
+@@ -81,8 +80,9 @@ public class ZipArchiveSource implements Source {
+
+ @Override
+ public boolean isExecutable() {
+- System.out.println(">>>> " + getFileMode());
+- return FileMode.EXECUTABLE_FILE.equals(getFileMode());
++ int mode = getFileMode();
++ System.out.println(">>>> " + mode);
++ return (mode & 0170000) == 0100000 && (mode & 0111) != 0;
+ }
+ }
+
diff --git a/takari-archiver.spec b/takari-archiver.spec
index 37dd0e6..feff944 100644
--- a/takari-archiver.spec
+++ b/takari-archiver.spec
@@ -12,7 +12,11 @@ BuildArch: noarch
Source0: %{name}-%{version}-clean.tar.xz
Source1: create-tarball.sh
+# Replace use of bundled jgit class with jnr-posix.
+Patch0: takari-archiver-unbundle-jgit.patch
+
BuildRequires: maven-local
+BuildRequires: mvn(com.github.jnr:jnr-posix)
BuildRequires: mvn(com.google.guava:guava)
BuildRequires: mvn(javax.inject:javax.inject)
BuildRequires: mvn(junit:junit)
@@ -37,6 +41,7 @@ This package provides %{summary}.
%prep
%setup -q
+%patch0 -p1
%if %{with bootstrap}
%pom_remove_parent
@@ -66,6 +71,7 @@ This package provides %{summary}.
%changelog
* Thu Mar 12 2015 Mikolaj Izdebski <mizdebsk at redhat.com> - 0.1.8-2
- Remove bundled JARs
+- Unbundle part of jgit
* Fri Mar 06 2015 Michael Simacek <msimacek at redhat.com> - 0.1.8-1
- Initial packaging
More information about the scm-commits
mailing list