mirror of https://github.com/jenkinsci/jenkins.git
copy a file with permissions
git-svn-id: https://hudson.dev.java.net/svn/hudson/trunk/hudson/main@18899 71c3de6d-444a-0410-be80-ed276b4c234a
This commit is contained in:
parent
b172a606e2
commit
00cf9f432f
|
|
@ -318,6 +318,11 @@ THE SOFTWARE.
|
|||
</exclusions>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.jruby.ext.posix</groupId>
|
||||
<artifactId>jna-posix</artifactId>
|
||||
<version>1.0.1</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.jvnet.hudson.svnkit</groupId>
|
||||
<artifactId>svnkit</artifactId>
|
||||
|
|
|
|||
|
|
@ -43,6 +43,7 @@ import hudson.util.FormValidation;
|
|||
import static hudson.util.jna.GNUCLibrary.LIBC;
|
||||
import static hudson.Util.fixEmpty;
|
||||
import static hudson.FilePath.TarCompression.GZIP;
|
||||
import hudson.os.PosixAPI;
|
||||
import org.apache.tools.ant.BuildException;
|
||||
import org.apache.tools.ant.DirectoryScanner;
|
||||
import org.apache.tools.ant.Project;
|
||||
|
|
@ -938,10 +939,14 @@ public final class FilePath implements Serializable {
|
|||
*
|
||||
* On Windows, no-op.
|
||||
*
|
||||
* @param mask
|
||||
* File permission mask. To simplify the permission copying,
|
||||
* if the parameter is -1, this method becomes no-op.
|
||||
* @since 1.303
|
||||
* @see #mode()
|
||||
*/
|
||||
public void chmod(final int mask) throws IOException, InterruptedException {
|
||||
if(!isUnix()) return;
|
||||
if(!isUnix() || mask==-1) return;
|
||||
act(new FileCallable<Void>() {
|
||||
public Void invoke(File f, VirtualChannel channel) throws IOException {
|
||||
if(LIBC.chmod(f.getAbsolutePath(),mask)!=0)
|
||||
|
|
@ -951,6 +956,23 @@ public final class FilePath implements Serializable {
|
|||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the file permission bit mask.
|
||||
*
|
||||
* @return
|
||||
* -1 on Windows, since such a concept doesn't make sense.
|
||||
* @since 1.311
|
||||
* @see #chmod(int)
|
||||
*/
|
||||
public int mode() throws IOException, InterruptedException {
|
||||
if(!isUnix()) return -1;
|
||||
return act(new FileCallable<Integer>() {
|
||||
public Integer invoke(File f, VirtualChannel channel) throws IOException {
|
||||
return PosixAPI.get().stat(f.getPath()).mode();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* List up files and directories in this directory.
|
||||
*
|
||||
|
|
@ -1186,6 +1208,16 @@ public final class FilePath implements Serializable {
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Copies this file to the specified target, with file permissions intact.
|
||||
* @since 1.311
|
||||
*/
|
||||
public void copyToWithPermission(FilePath target) throws IOException, InterruptedException {
|
||||
copyToWithPermission(target);
|
||||
// copy file permission
|
||||
target.chmod(mode());
|
||||
}
|
||||
|
||||
/**
|
||||
* Sends the contents of this file into the given {@link OutputStream}.
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -0,0 +1,72 @@
|
|||
package hudson.os;
|
||||
|
||||
import org.jruby.ext.posix.POSIX;
|
||||
import org.jruby.ext.posix.POSIXFactory;
|
||||
import org.jruby.ext.posix.POSIXHandler;
|
||||
import org.jruby.ext.posix.POSIX.ERRORS;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.InputStream;
|
||||
import java.io.PrintStream;
|
||||
import java.util.logging.Logger;
|
||||
|
||||
/**
|
||||
* POSIX API wrapper.
|
||||
*
|
||||
* @author Kohsuke Kawaguchi
|
||||
*/
|
||||
public class PosixAPI {
|
||||
public static POSIX get() {
|
||||
return posix;
|
||||
}
|
||||
|
||||
private static final POSIX posix = POSIXFactory.getPOSIX(new POSIXHandler() {
|
||||
public void error(ERRORS errors, String s) {
|
||||
throw new RuntimeException(s+" "+errors);
|
||||
}
|
||||
|
||||
public void unimplementedError(String s) {
|
||||
throw new UnsupportedOperationException(s);
|
||||
}
|
||||
|
||||
public void warn(WARNING_ID warning_id, String s, Object... objects) {
|
||||
LOGGER.fine(s);
|
||||
}
|
||||
|
||||
public boolean isVerbose() {
|
||||
return false;
|
||||
}
|
||||
|
||||
public File getCurrentWorkingDirectory() {
|
||||
// TODO
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
public String[] getEnv() {
|
||||
// TODO
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
public InputStream getInputStream() {
|
||||
// TODO
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
public PrintStream getOutputStream() {
|
||||
// TODO
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
public int getPID() {
|
||||
// TODO
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
public PrintStream getErrorStream() {
|
||||
// TODO
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
}, true);
|
||||
|
||||
private static final Logger LOGGER = Logger.getLogger(PosixAPI.class.getName());
|
||||
}
|
||||
Loading…
Reference in New Issue