2009-09-30 02:47:03 +03:00
|
|
|
/*
|
|
|
|
* Copyright (C) 2008, Shawn O. Pearce <spearce@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.
|
|
|
|
*/
|
|
|
|
|
|
|
|
package org.eclipse.jgit.util;
|
|
|
|
|
|
|
|
import java.io.File;
|
|
|
|
import java.security.AccessController;
|
|
|
|
import java.security.PrivilegedAction;
|
|
|
|
|
|
|
|
/** Abstraction to support various file system operations not in Java. */
|
|
|
|
public abstract class FS {
|
2010-04-20 22:01:19 +03:00
|
|
|
/** The auto-detected implementation selected for this operating system and JRE. */
|
|
|
|
public static final FS DETECTED;
|
2009-09-30 02:47:03 +03:00
|
|
|
|
|
|
|
static {
|
|
|
|
if (FS_Win32.detect()) {
|
|
|
|
if (FS_Win32_Cygwin.detect())
|
2010-04-20 22:01:19 +03:00
|
|
|
DETECTED = new FS_Win32_Cygwin();
|
2009-09-30 02:47:03 +03:00
|
|
|
else
|
2010-04-20 22:01:19 +03:00
|
|
|
DETECTED = new FS_Win32();
|
2009-09-30 02:47:03 +03:00
|
|
|
} else if (FS_POSIX_Java6.detect())
|
2010-04-20 22:01:19 +03:00
|
|
|
DETECTED = new FS_POSIX_Java6();
|
2009-09-30 02:47:03 +03:00
|
|
|
else
|
2010-04-20 22:01:19 +03:00
|
|
|
DETECTED = new FS_POSIX_Java5();
|
|
|
|
}
|
|
|
|
|
|
|
|
private final File userHome;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Constructs a file system abstraction.
|
|
|
|
*/
|
|
|
|
protected FS() {
|
|
|
|
this.userHome = userHomeImpl();
|
2009-09-30 02:47:03 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Does this operating system and JRE support the execute flag on files?
|
2009-10-19 11:48:00 +03:00
|
|
|
*
|
2009-09-30 02:47:03 +03:00
|
|
|
* @return true if this implementation can provide reasonably accurate
|
|
|
|
* executable bit information; false otherwise.
|
|
|
|
*/
|
|
|
|
public abstract boolean supportsExecute();
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Determine if the file is executable (or not).
|
|
|
|
* <p>
|
|
|
|
* Not all platforms and JREs support executable flags on files. If the
|
|
|
|
* feature is unsupported this method will always return false.
|
2009-10-19 11:48:00 +03:00
|
|
|
*
|
2009-09-30 02:47:03 +03:00
|
|
|
* @param f
|
|
|
|
* abstract path to test.
|
|
|
|
* @return true if the file is believed to be executable by the user.
|
|
|
|
*/
|
|
|
|
public abstract boolean canExecute(File f);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Set a file to be executable by the user.
|
|
|
|
* <p>
|
|
|
|
* Not all platforms and JREs support executable flags on files. If the
|
|
|
|
* feature is unsupported this method will always return false and no
|
|
|
|
* changes will be made to the file specified.
|
2009-10-19 11:48:00 +03:00
|
|
|
*
|
2009-09-30 02:47:03 +03:00
|
|
|
* @param f
|
|
|
|
* path to modify the executable status of.
|
|
|
|
* @param canExec
|
|
|
|
* true to enable execution; false to disable it.
|
|
|
|
* @return true if the change succeeded; false otherwise.
|
|
|
|
*/
|
|
|
|
public abstract boolean setExecute(File f, boolean canExec);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Resolve this file to its actual path name that the JRE can use.
|
|
|
|
* <p>
|
|
|
|
* This method can be relatively expensive. Computing a translation may
|
|
|
|
* require forking an external process per path name translated. Callers
|
|
|
|
* should try to minimize the number of translations necessary by caching
|
|
|
|
* the results.
|
|
|
|
* <p>
|
|
|
|
* Not all platforms and JREs require path name translation. Currently only
|
|
|
|
* Cygwin on Win32 require translation for Cygwin based paths.
|
2009-10-19 11:48:00 +03:00
|
|
|
*
|
2009-09-30 02:47:03 +03:00
|
|
|
* @param dir
|
|
|
|
* directory relative to which the path name is.
|
|
|
|
* @param name
|
|
|
|
* path name to translate.
|
|
|
|
* @return the translated path. <code>new File(dir,name)</code> if this
|
|
|
|
* platform does not require path name translation.
|
|
|
|
*/
|
2010-04-20 22:01:19 +03:00
|
|
|
public File resolve(final File dir, final String name) {
|
2009-09-30 02:47:03 +03:00
|
|
|
final File abspn = new File(name);
|
|
|
|
if (abspn.isAbsolute())
|
|
|
|
return abspn;
|
|
|
|
return new File(dir, name);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Determine the user's home directory (location where preferences are).
|
|
|
|
* <p>
|
|
|
|
* This method can be expensive on the first invocation if path name
|
|
|
|
* translation is required. Subsequent invocations return a cached result.
|
|
|
|
* <p>
|
|
|
|
* Not all platforms and JREs require path name translation. Currently only
|
|
|
|
* Cygwin on Win32 requires translation of the Cygwin HOME directory.
|
2009-10-19 11:48:00 +03:00
|
|
|
*
|
2009-09-30 02:47:03 +03:00
|
|
|
* @return the user's home directory; null if the user does not have one.
|
|
|
|
*/
|
2010-04-20 22:01:19 +03:00
|
|
|
public File userHome() {
|
|
|
|
return userHome;
|
2009-09-30 02:47:03 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Determine the user's home directory (location where preferences are).
|
2009-10-19 11:48:00 +03:00
|
|
|
*
|
2009-09-30 02:47:03 +03:00
|
|
|
* @return the user's home directory; null if the user does not have one.
|
|
|
|
*/
|
|
|
|
protected File userHomeImpl() {
|
|
|
|
final String home = AccessController
|
|
|
|
.doPrivileged(new PrivilegedAction<String>() {
|
|
|
|
public String run() {
|
|
|
|
return System.getProperty("user.home");
|
|
|
|
}
|
|
|
|
});
|
|
|
|
if (home == null || home.length() == 0)
|
|
|
|
return null;
|
|
|
|
return new File(home).getAbsoluteFile();
|
|
|
|
}
|
|
|
|
}
|