Class FS
-
Nested Class Summary
Nested ClassesModifier and TypeClassDescriptionstatic class
File attributes we typically care for.static class
Result of an executed process.static final class
Attributes of FileStores on this systemstatic class
This class creates FS instances.private static class
private static class
static class
A token representing a file created bycreateNewFileAtomic(File)
.private static class
This runnable will consume an input stream's content into an output stream as soon as it gets available. -
Field Summary
FieldsModifier and TypeFieldDescriptionstatic final FS
The auto-detected implementation selected for this operating system and JRE.private static FS.FSFactory
private static final org.slf4j.Logger
protected static final WorkingTreeIterator.Entry[]
An empty array of entries, suitable as a return value forlist(File, FileModeStrategy)
.private Boolean
private static final Pattern
-
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptionabstract boolean
canExecute
(File f) Determine if the file is executable (or not).boolean
createNewFile
(File path) Deprecated.createNewFileAtomic
(File path) Create a new file.void
createSymLink
(File path, String target) Create a symbolic linkprivate File
void
Delete a file.static FS
detect()
Auto-detect the appropriate file system abstraction.static FS
Auto-detect the appropriate file system abstraction, taking into account the presence of a Cygwin installation on the system.private void
protected abstract File
Discover the path to the Git executable.protected File
Discover the path to the system-wide Git configuration fileexecute
(ProcessBuilder pb, InputStream in) Execute a command defined by aProcessBuilder
.boolean
Tests if the path exists, in case of a symbolic link, true even if the target does not existfileAttributes
(File file) Return all the attributes of a file, without following symbolic links.findHook
(Repository repository, String hookName) Tries to find a hook matching the given one in the given repository.getAttributes
(File path) Get the file attributes we care for.static FS.FileStoreAttributes
Get cached FileStore attributes, if not yet available measure them using a probe file under the given directory.Get the currently used path to the system-wide Git configuration file.private File
getHooksDirectory
(Repository repository) private File
getRunDirectory
(Repository repository, String hookName) protected ProcessResult
internalRunHookIfPresent
(Repository repository, String hookName, String[] args, OutputStream outRedirect, OutputStream errRedirect, String stdinArgs) abstract boolean
Is this file system case sensitiveboolean
isDirectory
(File path) Check if path is a directory.boolean
Examine if path represents a regular file.boolean
Whether path is hidden, either starts with .boolean
Whether the path is a symbolic link (and we support these).long
lastModified
(File f) Deprecated.uselastModifiedInstant(Path)
insteadGet the last modified time of a file system object.Get the last modified time of a file system object.long
Get the length of a file or link, If the OS/JRE supports symbolic links it's the length of the link, else the length of the target.list
(File directory, FileTreeIterator.FileModeStrategy fileModeStrategy) Enumerates children of a directory.private long
makeVersion
(int major, int minor, int patch) abstract FS
Create a new instance of the same type of FS.Normalize the unicode path to composed form.Normalize the unicode path to composed form.private long
parseVersion
(String version) protected static String
Execute a command and return a single line of output as a Stringprotected static String
Execute a command and return a single line of output as a StringreadSymLink
(File path) Check if a file is a symbolic link and read itrelativize
(String base, String other) Resolve this file to its actual path name that the JRE can use.protected static File
resolveGrandparentFile
(File grandchild) Get the parent directory of this file's parent directoryabstract boolean
Does this file system have problems with atomic renames?runHookIfPresent
(Repository repository, String hookName, String[] args) Checks whether the given hook is defined for the given repository, then runs it with the given arguments.runHookIfPresent
(Repository repository, String hookName, String[] args, OutputStream outRedirect, OutputStream errRedirect, String stdinArgs) Checks whether the given hook is defined for the given repository, then runs it with the given arguments.abstract ProcessBuilder
runInShell
(String cmd, String[] args) Initialize a ProcessBuilder to run a command using the system shell.int
runProcess
(ProcessBuilder processBuilder, OutputStream outRedirect, OutputStream errRedirect, InputStream inRedirect) Runs the given process until termination, clearing its stdout and stderr streams on-the-fly.int
runProcess
(ProcessBuilder processBuilder, OutputStream outRedirect, OutputStream errRedirect, String stdinArgs) Runs the given process until termination, clearing its stdout and stderr streams on-the-fly.private File
protected static File
searchPath
(String path, String... lookFor) Searches the given path to see if it contains one of the given files.static void
setAsyncFileStoreAttributes
(boolean asynch) Deprecated.UseFS.FileStoreAttributes.setBackground(boolean)
insteadabstract boolean
setExecute
(File f, boolean canExec) Set a file to be executable by the user.setGitSystemConfig
(File configFile) Set the path to the system-wide Git configuration file to use.void
Set the hidden attribute for file whose name starts with a period.void
setLastModified
(File f, long time) Deprecated.usesetLastModified(Path, Instant)
insteadvoid
setLastModified
(Path p, Instant time) Set the last modified time of a file system object.setUserHome
(File path) Set the user's home directory location.(package private) String
shellQuote
(String cmd) Quote a string (such as a file system path obtained from a JavaFile
orPath
object) such that it can be passed as first argument torunInShell(String, String[])
.private static boolean
Shuts down anExecutorService
in two phases, first by callingshutdown
to reject incoming tasks, and then callingshutdownNow
, if necessary, to cancel any lingering tasks.boolean
Does this file system support atomic file creation via java.io.File#createNewFile()? In certain environments (e.g.abstract boolean
Does this operating system and JRE support the execute flag on files?boolean
Does this operating system and JRE supports symbolic links.userHome()
Determine the user's home directory (location where preferences are).protected File
Determine the user's home directory (location where preferences are).
-
Field Details
-
LOG
private static final org.slf4j.Logger LOG -
NO_ENTRIES
An empty array of entries, suitable as a return value forlist(File, FileModeStrategy)
.- Since:
- 5.0
-
VERSION
-
supportSymlinks
-
DETECTED
The auto-detected implementation selected for this operating system and JRE. -
factory
-
userHome
-
gitSystemConfig
-
-
Constructor Details
-
FS
protected FS()Constructs a file system abstraction. -
FS
Initialize this FS using another's current settings.- Parameters:
src
- the source FS to copy from.
-
-
Method Details
-
detect
Auto-detect the appropriate file system abstraction.- Returns:
- detected file system abstraction
-
setAsyncFileStoreAttributes
Deprecated.UseFS.FileStoreAttributes.setBackground(boolean)
insteadWhether FileStore attributes should be determined asynchronously- Parameters:
asynch
- whether FileStore attributes should be determined asynchronously. If false access to cached attributes may block for some seconds for the first call per FileStore- Since:
- 5.1.9
-
detect
Auto-detect the appropriate file system abstraction, taking into account the presence of a Cygwin installation on the system. Using jgit in combination with Cygwin requires a more elaborate (and possibly slower) resolution of file system paths.- Parameters:
cygwinUsed
-Boolean.TRUE
to assume that Cygwin is used in combination with jgitBoolean.FALSE
to assume that Cygwin is not used with jgitnull
to auto-detect whether a Cygwin installation is present on the system and in this case assume that Cygwin is used
- Returns:
- detected file system abstraction
-
getFileStoreAttributes
Get cached FileStore attributes, if not yet available measure them using a probe file under the given directory.- Parameters:
dir
- the directory under which the probe file will be created to measure the timer resolution.- Returns:
- measured filesystem timestamp resolution
- Since:
- 5.1.9
-
newInstance
Create a new instance of the same type of FS.- Returns:
- a new instance of the same type of FS.
-
supportsExecute
public abstract boolean supportsExecute()Does this operating system and JRE support the execute flag on files?- Returns:
- true if this implementation can provide reasonably accurate executable bit information; false otherwise.
-
supportsAtomicCreateNewFile
public boolean supportsAtomicCreateNewFile()Does this file system support atomic file creation via java.io.File#createNewFile()? In certain environments (e.g. on NFS) it is not guaranteed that when two file system clients run createNewFile() in parallel only one will succeed. In such cases both clients may think they created a new file.- Returns:
- true if this implementation support atomic creation of new Files
by
File.createNewFile()
- Since:
- 4.5
-
supportsSymlinks
public boolean supportsSymlinks()Does this operating system and JRE supports symbolic links. The capability to handle symbolic links is detected at runtime.- Returns:
- true if symbolic links may be used
- Since:
- 3.0
-
detectSymlinkSupport
private void detectSymlinkSupport() -
isCaseSensitive
public abstract boolean isCaseSensitive()Is this file system case sensitive- Returns:
- true if this implementation is case sensitive
-
canExecute
Determine if the file is executable (or not).Not all platforms and JREs support executable flags on files. If the feature is unsupported this method will always return false.
If the platform supports symbolic links and
f
is a symbolic link this method returns false, rather than the state of the executable flags on the target file.- Parameters:
f
- abstract path to test.- Returns:
- true if the file is believed to be executable by the user.
-
setExecute
Set a file to be executable by the user.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.
- Parameters:
f
- path to modify the executable status of.canExec
- true to enable execution; false to disable it.- Returns:
- true if the change succeeded; false otherwise.
-
lastModified
Deprecated.uselastModifiedInstant(Path)
insteadGet the last modified time of a file system object. If the OS/JRE support symbolic links, the modification time of the link is returned, rather than that of the link target.- Parameters:
f
- aFile
object.- Returns:
- last modified time of f
- Throws:
IOException
- Since:
- 3.0
-
lastModifiedInstant
Get the last modified time of a file system object. If the OS/JRE support symbolic links, the modification time of the link is returned, rather than that of the link target.- Parameters:
p
- aPath
object.- Returns:
- last modified time of p
- Since:
- 5.1.9
-
lastModifiedInstant
Get the last modified time of a file system object. If the OS/JRE support symbolic links, the modification time of the link is returned, rather than that of the link target.- Parameters:
f
- aFile
object.- Returns:
- last modified time of p
- Since:
- 5.1.9
-
setLastModified
Deprecated.usesetLastModified(Path, Instant)
insteadSet the last modified time of a file system object.For symlinks it sets the modified time of the link target.
- Parameters:
f
- aFile
object.time
- last modified time- Throws:
IOException
- Since:
- 3.0
-
setLastModified
Set the last modified time of a file system object.For symlinks it sets the modified time of the link target.
- Parameters:
p
- aPath
object.time
- last modified time- Throws:
IOException
- Since:
- 5.1.9
-
length
Get the length of a file or link, If the OS/JRE supports symbolic links it's the length of the link, else the length of the target.- Parameters:
path
- aFile
object.- Returns:
- length of a file
- Throws:
IOException
- Since:
- 3.0
-
delete
Delete a file. Throws an exception if delete fails.- Parameters:
f
- aFile
object.- Throws:
IOException
- this may be a Java7 subclass with detailed information- Since:
- 3.3
-
resolve
Resolve this file to its actual path name that the JRE can use.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.
Not all platforms and JREs require path name translation. Currently only Cygwin on Win32 require translation for Cygwin based paths.
- Parameters:
dir
- directory relative to which the path name is.name
- path name to translate.- Returns:
- the translated path.
new File(dir,name)
if this platform does not require path name translation.
-
userHome
Determine the user's home directory (location where preferences are).This method can be expensive on the first invocation if path name translation is required. Subsequent invocations return a cached result.
Not all platforms and JREs require path name translation. Currently only Cygwin on Win32 requires translation of the Cygwin HOME directory.
- Returns:
- the user's home directory; null if the user does not have one.
-
safeUserHomeImpl
-
setUserHome
Set the user's home directory location.- Parameters:
path
- the location of the user's preferences; null if there is no home directory for the current user.- Returns:
this
.
-
retryFailedLockFileCommit
public abstract boolean retryFailedLockFileCommit()Does this file system have problems with atomic renames?- Returns:
- true if the caller should retry a failed rename of a lock file.
-
fileAttributes
Return all the attributes of a file, without following symbolic links.- Parameters:
file
-- Returns:
BasicFileAttributes
of the file- Throws:
IOException
- in case of any I/O errors accessing the file- Since:
- 4.5.6
-
userHomeImpl
Determine the user's home directory (location where preferences are).- Returns:
- the user's home directory; null if the user does not have one.
-
defaultUserHomeImpl
-
searchPath
Searches the given path to see if it contains one of the given files. Returns the first it finds which is executable. Returns null if not found or if path is null.- Parameters:
path
- List of paths to search separated by File.pathSeparatorlookFor
- Files to search for in the given path- Returns:
- the first match found, or null
- Since:
- 3.0
-
readPipe
@Nullable protected static String readPipe(File dir, String[] command, String encoding) throws CommandFailedException Execute a command and return a single line of output as a String- Parameters:
dir
- Working directory for the commandcommand
- as component arrayencoding
- to be used to parse the command's output- Returns:
- the one-line output of the command or
null
if there is none - Throws:
CommandFailedException
- thrown when the command failed (return code was non-zero)
-
readPipe
@Nullable protected static String readPipe(File dir, String[] command, String encoding, Map<String, String> env) throws CommandFailedExceptionExecute a command and return a single line of output as a String- Parameters:
dir
- Working directory for the commandcommand
- as component arrayencoding
- to be used to parse the command's outputenv
- Map of environment variables to be merged with those of the current process- Returns:
- the one-line output of the command or
null
if there is none - Throws:
CommandFailedException
- thrown when the command failed (return code was non-zero)- Since:
- 4.0
-
discoverGitExe
Discover the path to the Git executable.- Returns:
- the path to the Git executable or
null
if it cannot be determined. - Since:
- 4.0
-
discoverGitSystemConfig
Discover the path to the system-wide Git configuration file- Returns:
- the path to the system-wide Git configuration file or
null
if it cannot be determined. - Since:
- 4.0
-
parseVersion
-
makeVersion
private long makeVersion(int major, int minor, int patch) -
getGitSystemConfig
Get the currently used path to the system-wide Git configuration file.- Returns:
- the currently used path to the system-wide Git configuration file
or
null
if none has been set. - Since:
- 4.0
-
setGitSystemConfig
Set the path to the system-wide Git configuration file to use.- Parameters:
configFile
- the path to the config file.- Returns:
this
- Since:
- 4.0
-
resolveGrandparentFile
Get the parent directory of this file's parent directory- Parameters:
grandchild
- aFile
object.- Returns:
- the parent directory of this file's parent directory or
null
in case there's no grandparent directory - Since:
- 4.0
-
readSymLink
Check if a file is a symbolic link and read it- Parameters:
path
- aFile
object.- Returns:
- target of link or null
- Throws:
IOException
- Since:
- 3.0
-
isSymLink
Whether the path is a symbolic link (and we support these).- Parameters:
path
- aFile
object.- Returns:
- true if the path is a symbolic link (and we support these)
- Throws:
IOException
- Since:
- 3.0
-
exists
Tests if the path exists, in case of a symbolic link, true even if the target does not exist- Parameters:
path
- aFile
object.- Returns:
- true if path exists
- Since:
- 3.0
-
isDirectory
Check if path is a directory. If the OS/JRE supports symbolic links and path is a symbolic link to a directory, this method returns false.- Parameters:
path
- aFile
object.- Returns:
- true if file is a directory,
- Since:
- 3.0
-
isFile
Examine if path represents a regular file. If the OS/JRE supports symbolic links the test returns false if path represents a symbolic link.- Parameters:
path
- aFile
object.- Returns:
- true if path represents a regular file
- Since:
- 3.0
-
isHidden
Whether path is hidden, either starts with . on unix or has the hidden attribute in windows- Parameters:
path
- aFile
object.- Returns:
- true if path is hidden, either starts with . on unix or has the hidden attribute in windows
- Throws:
IOException
- Since:
- 3.0
-
setHidden
Set the hidden attribute for file whose name starts with a period.- Parameters:
path
- aFile
object.hidden
- whether to set the file hidden- Throws:
IOException
- Since:
- 3.0
-
createSymLink
Create a symbolic link- Parameters:
path
- aFile
object.target
- target path of the symlink- Throws:
IOException
- Since:
- 3.0
-
createNewFile
Deprecated.usecreateNewFileAtomic(File)
insteadCreate a new file. SeeFile.createNewFile()
. Subclasses of this class may take care to provide a safe implementation for this even ifsupportsAtomicCreateNewFile()
isfalse
- Parameters:
path
- the file to be created- Returns:
true
if the file was created,false
if the file already existed- Throws:
IOException
- Since:
- 4.5
-
createNewFileAtomic
Create a new file. SeeFile.createNewFile()
. Subclasses of this class may take care to provide a safe implementation for this even ifsupportsAtomicCreateNewFile()
isfalse
- Parameters:
path
- the file to be created- Returns:
- LockToken this token must be closed after the created file was deleted
- Throws:
IOException
- Since:
- 4.7
-
relativize
- Parameters:
base
- The path against whichother
should be relativized.other
- The path that will be made relative tobase
.- Returns:
- A relative path that, when resolved against
base
, will yield the originalother
. - Since:
- 3.7
- See Also:
-
list
public WorkingTreeIterator.Entry[] list(File directory, FileTreeIterator.FileModeStrategy fileModeStrategy) Enumerates children of a directory.- Parameters:
directory
- to get the children offileModeStrategy
- to use to calculate the git mode of a child- Returns:
- an array of entries for the children
- Since:
- 5.0
-
runHookIfPresent
public ProcessResult runHookIfPresent(Repository repository, String hookName, String[] args) throws JGitInternalException Checks whether the given hook is defined for the given repository, then runs it with the given arguments.The hook's standard output and error streams will be redirected to
System.out
andSystem.err
respectively. The hook will have no stdin.- Parameters:
repository
- The repository for which a hook should be run.hookName
- The name of the hook to be executed.args
- Arguments to pass to this hook. Cannot benull
, but can be an empty array.- Returns:
- The ProcessResult describing this hook's execution.
- Throws:
JGitInternalException
- if we fail to run the hook somehow. Causes may include an interrupted process or I/O errors.- Since:
- 4.0
-
runHookIfPresent
public ProcessResult runHookIfPresent(Repository repository, String hookName, String[] args, OutputStream outRedirect, OutputStream errRedirect, String stdinArgs) throws JGitInternalException Checks whether the given hook is defined for the given repository, then runs it with the given arguments.- Parameters:
repository
- The repository for which a hook should be run.hookName
- The name of the hook to be executed.args
- Arguments to pass to this hook. Cannot benull
, but can be an empty array.outRedirect
- A print stream on which to redirect the hook's stdout. Can benull
, in which case the hook's standard output will be lost.errRedirect
- A print stream on which to redirect the hook's stderr. Can benull
, in which case the hook's standard error will be lost.stdinArgs
- A string to pass on to the standard input of the hook. May benull
.- Returns:
- The ProcessResult describing this hook's execution.
- Throws:
JGitInternalException
- if we fail to run the hook somehow. Causes may include an interrupted process or I/O errors.- Since:
- 5.11
-
internalRunHookIfPresent
protected ProcessResult internalRunHookIfPresent(Repository repository, String hookName, String[] args, OutputStream outRedirect, OutputStream errRedirect, String stdinArgs) throws JGitInternalException SeerunHookIfPresent(Repository, String, String[], OutputStream, OutputStream, String)
. Should only be called by FS supporting shell scripts execution.- Parameters:
repository
- The repository for which a hook should be run.hookName
- The name of the hook to be executed.args
- Arguments to pass to this hook. Cannot benull
, but can be an empty array.outRedirect
- A print stream on which to redirect the hook's stdout. Can benull
, in which case the hook's standard output will be lost.errRedirect
- A print stream on which to redirect the hook's stderr. Can benull
, in which case the hook's standard error will be lost.stdinArgs
- A string to pass on to the standard input of the hook. May benull
.- Returns:
- The ProcessResult describing this hook's execution.
- Throws:
JGitInternalException
- if we fail to run the hook somehow. Causes may include an interrupted process or I/O errors.- Since:
- 5.11
-
shellQuote
Quote a string (such as a file system path obtained from a JavaFile
orPath
object) such that it can be passed as first argument torunInShell(String, String[])
.This default implementation returns the string unchanged.
- Parameters:
cmd
- the String to quote- Returns:
- the quoted string
-
findHook
Tries to find a hook matching the given one in the given repository.- Parameters:
repository
- The repository within which to find a hook.hookName
- The name of the hook we're trying to find.- Returns:
- The
File
containing this particular hook if it exists in the given repository,null
otherwise. - Since:
- 4.0
-
getRunDirectory
-
getHooksDirectory
-
runProcess
public int runProcess(ProcessBuilder processBuilder, OutputStream outRedirect, OutputStream errRedirect, String stdinArgs) throws IOException, InterruptedException Runs the given process until termination, clearing its stdout and stderr streams on-the-fly.- Parameters:
processBuilder
- The process builder configured for this process.outRedirect
- A OutputStream on which to redirect the processes stdout. Can benull
, in which case the processes standard output will be lost.errRedirect
- A OutputStream on which to redirect the processes stderr. Can benull
, in which case the processes standard error will be lost.stdinArgs
- A string to pass on to the standard input of the hook. Can benull
.- Returns:
- the exit value of this process.
- Throws:
IOException
- if an I/O error occurs while executing this process.InterruptedException
- if the current thread is interrupted while waiting for the process to end.- Since:
- 4.2
-
runProcess
public int runProcess(ProcessBuilder processBuilder, OutputStream outRedirect, OutputStream errRedirect, InputStream inRedirect) throws IOException, InterruptedException Runs the given process until termination, clearing its stdout and stderr streams on-the-fly.- Parameters:
processBuilder
- The process builder configured for this process.outRedirect
- An OutputStream on which to redirect the processes stdout. Can benull
, in which case the processes standard output will be lost.errRedirect
- An OutputStream on which to redirect the processes stderr. Can benull
, in which case the processes standard error will be lost.inRedirect
- An InputStream from which to redirect the processes stdin. Can benull
, in which case the process doesn't get any data over stdin. It is assumed that the whole InputStream will be consumed by the process. The method will close the inputstream after all bytes are read.- Returns:
- the return code of this process.
- Throws:
IOException
- if an I/O error occurs while executing this process.InterruptedException
- if the current thread is interrupted while waiting for the process to end.- Since:
- 4.2
-
shutdownAndAwaitTermination
Shuts down anExecutorService
in two phases, first by callingshutdown
to reject incoming tasks, and then callingshutdownNow
, if necessary, to cancel any lingering tasks. Returns true if the pool has been properly shutdown, false otherwise.- Parameters:
pool
- the pool to shutdown- Returns:
true
if the pool has been properly shutdown,false
otherwise.
-
runInShell
Initialize a ProcessBuilder to run a command using the system shell.- Parameters:
cmd
- command to execute. This string should originate from the end-user, and thus is platform specific.args
- arguments to pass to command. These should be protected from shell evaluation.- Returns:
- a partially completed process builder. Caller should finish populating directory, environment, and then start the process.
-
execute
public FS.ExecutionResult execute(ProcessBuilder pb, InputStream in) throws IOException, InterruptedException Execute a command defined by aProcessBuilder
.- Parameters:
pb
- The command to be executedin
- The standard input stream passed to the process- Returns:
- The result of the executed command
- Throws:
InterruptedException
IOException
- Since:
- 4.2
-
getAttributes
Get the file attributes we care for.- Parameters:
path
- aFile
object.- Returns:
- the file attributes we care for.
- Since:
- 3.3
-
normalize
Normalize the unicode path to composed form.- Parameters:
file
- aFile
object.- Returns:
- NFC-format File
- Since:
- 3.3
-
normalize
Normalize the unicode path to composed form.- Parameters:
name
- path name- Returns:
- NFC-format string
- Since:
- 3.3
-
createNewFileAtomic(File)
instead