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
|
commitOnRepoWithoutHEADCurrentlyNotSupported=Commit on repo without HEAD currently not supported
|
||||||
commitAmendOnInitialNotPossible=Amending is not possible on initial commit.
|
commitAmendOnInitialNotPossible=Amending is not possible on initial commit.
|
||||||
compressingObjects=Compressing objects
|
compressingObjects=Compressing objects
|
||||||
|
configHandleIsStale=config file handle is stale, {0}. retry
|
||||||
connectionFailed=connection failed
|
connectionFailed=connection failed
|
||||||
connectionTimeOut=Connection time out: {0}
|
connectionTimeOut=Connection time out: {0}
|
||||||
contextMustBeNonNegative=context must be >= 0
|
contextMustBeNonNegative=context must be >= 0
|
||||||
|
|
|
@ -185,6 +185,7 @@ public static JGitText get() {
|
||||||
/***/ public String commitOnRepoWithoutHEADCurrentlyNotSupported;
|
/***/ public String commitOnRepoWithoutHEADCurrentlyNotSupported;
|
||||||
/***/ public String commitAmendOnInitialNotPossible;
|
/***/ public String commitAmendOnInitialNotPossible;
|
||||||
/***/ public String compressingObjects;
|
/***/ public String compressingObjects;
|
||||||
|
/***/ public String configHandleIsStale;
|
||||||
/***/ public String connectionFailed;
|
/***/ public String connectionFailed;
|
||||||
/***/ public String connectionTimeOut;
|
/***/ public String connectionTimeOut;
|
||||||
/***/ public String contextMustBeNonNegative;
|
/***/ public String contextMustBeNonNegative;
|
||||||
|
|
|
@ -65,13 +65,19 @@
|
||||||
import org.eclipse.jgit.lib.ObjectId;
|
import org.eclipse.jgit.lib.ObjectId;
|
||||||
import org.eclipse.jgit.lib.StoredConfig;
|
import org.eclipse.jgit.lib.StoredConfig;
|
||||||
import org.eclipse.jgit.util.FS;
|
import org.eclipse.jgit.util.FS;
|
||||||
|
import org.eclipse.jgit.util.FileUtils;
|
||||||
import org.eclipse.jgit.util.IO;
|
import org.eclipse.jgit.util.IO;
|
||||||
import org.eclipse.jgit.util.RawParseUtils;
|
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.
|
* The configuration file that is stored in the file of the file system.
|
||||||
*/
|
*/
|
||||||
public class FileBasedConfig extends StoredConfig {
|
public class FileBasedConfig extends StoredConfig {
|
||||||
|
private final static Logger LOG = LoggerFactory
|
||||||
|
.getLogger(FileBasedConfig.class);
|
||||||
|
|
||||||
private final File configFile;
|
private final File configFile;
|
||||||
|
|
||||||
private boolean utf8Bom;
|
private boolean utf8Bom;
|
||||||
|
@ -135,41 +141,58 @@ public final File getFile() {
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public void load() throws IOException, ConfigInvalidException {
|
public void load() throws IOException, ConfigInvalidException {
|
||||||
final FileSnapshot oldSnapshot = snapshot;
|
final int maxStaleRetries = 5;
|
||||||
final FileSnapshot newSnapshot = FileSnapshot.save(getFile());
|
int retries = 0;
|
||||||
try {
|
while (true) {
|
||||||
final byte[] in = IO.readFully(getFile());
|
final FileSnapshot oldSnapshot = snapshot;
|
||||||
final ObjectId newHash = hash(in);
|
final FileSnapshot newSnapshot = FileSnapshot.save(getFile());
|
||||||
if (hash.equals(newHash)) {
|
try {
|
||||||
if (oldSnapshot.equals(newSnapshot))
|
final byte[] in = IO.readFully(getFile());
|
||||||
oldSnapshot.setClean(newSnapshot);
|
final ObjectId newHash = hash(in);
|
||||||
else
|
if (hash.equals(newHash)) {
|
||||||
snapshot = newSnapshot;
|
if (oldSnapshot.equals(newSnapshot)) {
|
||||||
} else {
|
oldSnapshot.setClean(newSnapshot);
|
||||||
final String decoded;
|
} else {
|
||||||
if (isUtf8(in)) {
|
snapshot = newSnapshot;
|
||||||
decoded = RawParseUtils.decode(RawParseUtils.UTF8_CHARSET,
|
}
|
||||||
in, 3, in.length);
|
|
||||||
utf8Bom = true;
|
|
||||||
} else {
|
} 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;
|
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