[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