Merge branch 'stable-4.6' into stable-4.7
* stable-4.6: Retry stale file handles on .git/config file Change-Id: If5a21d38224528edfc551b3216daca6a2582e3ac
This commit is contained in:
commit
1887c83477
|
@ -126,6 +126,7 @@ commitMessageNotSpecified=commit message not specified
|
|||
commitOnRepoWithoutHEADCurrentlyNotSupported=Commit on repo without HEAD currently not supported
|
||||
commitAmendOnInitialNotPossible=Amending is not possible on initial commit.
|
||||
compressingObjects=Compressing objects
|
||||
configHandleIsStale=config file handle is stale, {0}. retry
|
||||
connectionFailed=connection failed
|
||||
connectionTimeOut=Connection time out: {0}
|
||||
contextMustBeNonNegative=context must be >= 0
|
||||
|
|
|
@ -185,6 +185,7 @@ public static JGitText get() {
|
|||
/***/ public String commitOnRepoWithoutHEADCurrentlyNotSupported;
|
||||
/***/ public String commitAmendOnInitialNotPossible;
|
||||
/***/ public String compressingObjects;
|
||||
/***/ public String configHandleIsStale;
|
||||
/***/ public String connectionFailed;
|
||||
/***/ public String connectionTimeOut;
|
||||
/***/ public String contextMustBeNonNegative;
|
||||
|
|
|
@ -65,13 +65,19 @@
|
|||
import org.eclipse.jgit.lib.ObjectId;
|
||||
import org.eclipse.jgit.lib.StoredConfig;
|
||||
import org.eclipse.jgit.util.FS;
|
||||
import org.eclipse.jgit.util.FileUtils;
|
||||
import org.eclipse.jgit.util.IO;
|
||||
import org.eclipse.jgit.util.RawParseUtils;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
/**
|
||||
* The configuration file that is stored in the file of the file system.
|
||||
*/
|
||||
public class FileBasedConfig extends StoredConfig {
|
||||
private final static Logger LOG = LoggerFactory
|
||||
.getLogger(FileBasedConfig.class);
|
||||
|
||||
private final File configFile;
|
||||
|
||||
private boolean utf8Bom;
|
||||
|
@ -135,41 +141,58 @@ public final File getFile() {
|
|||
*/
|
||||
@Override
|
||||
public void load() throws IOException, ConfigInvalidException {
|
||||
final FileSnapshot oldSnapshot = snapshot;
|
||||
final FileSnapshot newSnapshot = FileSnapshot.save(getFile());
|
||||
try {
|
||||
final byte[] in = IO.readFully(getFile());
|
||||
final ObjectId newHash = hash(in);
|
||||
if (hash.equals(newHash)) {
|
||||
if (oldSnapshot.equals(newSnapshot))
|
||||
oldSnapshot.setClean(newSnapshot);
|
||||
else
|
||||
snapshot = newSnapshot;
|
||||
} else {
|
||||
final String decoded;
|
||||
if (isUtf8(in)) {
|
||||
decoded = RawParseUtils.decode(RawParseUtils.UTF8_CHARSET,
|
||||
in, 3, in.length);
|
||||
utf8Bom = true;
|
||||
final int maxStaleRetries = 5;
|
||||
int retries = 0;
|
||||
while (true) {
|
||||
final FileSnapshot oldSnapshot = snapshot;
|
||||
final FileSnapshot newSnapshot = FileSnapshot.save(getFile());
|
||||
try {
|
||||
final byte[] in = IO.readFully(getFile());
|
||||
final ObjectId newHash = hash(in);
|
||||
if (hash.equals(newHash)) {
|
||||
if (oldSnapshot.equals(newSnapshot)) {
|
||||
oldSnapshot.setClean(newSnapshot);
|
||||
} else {
|
||||
snapshot = newSnapshot;
|
||||
}
|
||||
} else {
|
||||
decoded = RawParseUtils.decode(in);
|
||||
final String decoded;
|
||||
if (isUtf8(in)) {
|
||||
decoded = RawParseUtils.decode(
|
||||
RawParseUtils.UTF8_CHARSET, in, 3, in.length);
|
||||
utf8Bom = true;
|
||||
} else {
|
||||
decoded = RawParseUtils.decode(in);
|
||||
}
|
||||
fromText(decoded);
|
||||
snapshot = newSnapshot;
|
||||
hash = newHash;
|
||||
}
|
||||
fromText(decoded);
|
||||
return;
|
||||
} catch (FileNotFoundException noFile) {
|
||||
if (configFile.exists()) {
|
||||
throw noFile;
|
||||
}
|
||||
clear();
|
||||
snapshot = newSnapshot;
|
||||
hash = newHash;
|
||||
return;
|
||||
} catch (IOException e) {
|
||||
if (FileUtils.isStaleFileHandle(e)
|
||||
&& retries < maxStaleRetries) {
|
||||
if (LOG.isDebugEnabled()) {
|
||||
LOG.debug(MessageFormat.format(
|
||||
JGitText.get().configHandleIsStale,
|
||||
Integer.valueOf(retries)), e);
|
||||
}
|
||||
retries++;
|
||||
continue;
|
||||
}
|
||||
throw new IOException(MessageFormat
|
||||
.format(JGitText.get().cannotReadFile, getFile()), e);
|
||||
} catch (ConfigInvalidException e) {
|
||||
throw new ConfigInvalidException(MessageFormat
|
||||
.format(JGitText.get().cannotReadFile, getFile()), e);
|
||||
}
|
||||
} catch (FileNotFoundException noFile) {
|
||||
if (configFile.exists()) {
|
||||
throw noFile;
|
||||
}
|
||||
clear();
|
||||
snapshot = newSnapshot;
|
||||
} catch (IOException e) {
|
||||
final IOException e2 = new IOException(MessageFormat.format(JGitText.get().cannotReadFile, getFile()));
|
||||
e2.initCause(e);
|
||||
throw e2;
|
||||
} catch (ConfigInvalidException e) {
|
||||
throw new ConfigInvalidException(MessageFormat.format(JGitText.get().cannotReadFile, getFile()), e);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue