Merge "Make Repository.getConfig aware of changed config"
This commit is contained in:
commit
d29618dd41
|
@ -62,6 +62,7 @@
|
||||||
*/
|
*/
|
||||||
public class FileBasedConfig extends Config {
|
public class FileBasedConfig extends Config {
|
||||||
private final File configFile;
|
private final File configFile;
|
||||||
|
private volatile long lastModified;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a configuration with no default fallback.
|
* Create a configuration with no default fallback.
|
||||||
|
@ -103,6 +104,7 @@ public final File getFile() {
|
||||||
* the file is not a properly formatted configuration file.
|
* the file is not a properly formatted configuration file.
|
||||||
*/
|
*/
|
||||||
public void load() throws IOException, ConfigInvalidException {
|
public void load() throws IOException, ConfigInvalidException {
|
||||||
|
lastModified = getFile().lastModified();
|
||||||
try {
|
try {
|
||||||
fromText(RawParseUtils.decode(IO.readFully(getFile())));
|
fromText(RawParseUtils.decode(IO.readFully(getFile())));
|
||||||
} catch (FileNotFoundException noFile) {
|
} catch (FileNotFoundException noFile) {
|
||||||
|
@ -134,16 +136,26 @@ public void save() throws IOException {
|
||||||
if (!lf.lock())
|
if (!lf.lock())
|
||||||
throw new IOException("Cannot lock " + getFile());
|
throw new IOException("Cannot lock " + getFile());
|
||||||
try {
|
try {
|
||||||
|
lf.setNeedStatInformation(true);
|
||||||
lf.write(out);
|
lf.write(out);
|
||||||
if (!lf.commit())
|
if (!lf.commit())
|
||||||
throw new IOException("Cannot commit write to " + getFile());
|
throw new IOException("Cannot commit write to " + getFile());
|
||||||
} finally {
|
} finally {
|
||||||
lf.unlock();
|
lf.unlock();
|
||||||
}
|
}
|
||||||
|
lastModified = lf.getCommitLastModified();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
return getClass().getSimpleName() + "[" + getFile().getPath() + "]";
|
return getClass().getSimpleName() + "[" + getFile().getPath() + "]";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return returns true if the currently loaded configuration file is older
|
||||||
|
* than the file on disk
|
||||||
|
*/
|
||||||
|
public boolean isOutdated() {
|
||||||
|
return getFile().lastModified() != lastModified;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -96,6 +96,8 @@ public class Repository {
|
||||||
|
|
||||||
private final File gitDir;
|
private final File gitDir;
|
||||||
|
|
||||||
|
private final FileBasedConfig userConfig;
|
||||||
|
|
||||||
private final RepositoryConfig config;
|
private final RepositoryConfig config;
|
||||||
|
|
||||||
private final RefDatabase refs;
|
private final RefDatabase refs;
|
||||||
|
@ -191,26 +193,11 @@ public Repository(final File d, final File workTree, final File objectDir,
|
||||||
throw new IllegalArgumentException("Either GIT_DIR or GIT_WORK_TREE must be passed to Repository constructor");
|
throw new IllegalArgumentException("Either GIT_DIR or GIT_WORK_TREE must be passed to Repository constructor");
|
||||||
}
|
}
|
||||||
|
|
||||||
final FileBasedConfig userConfig;
|
|
||||||
userConfig = SystemReader.getInstance().openUserConfig();
|
userConfig = SystemReader.getInstance().openUserConfig();
|
||||||
try {
|
|
||||||
userConfig.load();
|
|
||||||
} catch (ConfigInvalidException e1) {
|
|
||||||
IOException e2 = new IOException("User config file "
|
|
||||||
+ userConfig.getFile().getAbsolutePath() + " invalid: "
|
|
||||||
+ e1);
|
|
||||||
e2.initCause(e1);
|
|
||||||
throw e2;
|
|
||||||
}
|
|
||||||
config = new RepositoryConfig(userConfig, FS.resolve(gitDir, "config"));
|
config = new RepositoryConfig(userConfig, FS.resolve(gitDir, "config"));
|
||||||
|
|
||||||
try {
|
loadUserConfig();
|
||||||
getConfig().load();
|
loadConfig();
|
||||||
} catch (ConfigInvalidException e1) {
|
|
||||||
IOException e2 = new IOException("Unknown repository format");
|
|
||||||
e2.initCause(e1);
|
|
||||||
throw e2;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (workDir == null) {
|
if (workDir == null) {
|
||||||
String workTreeConfig = getConfig().getString("core", null, "worktree");
|
String workTreeConfig = getConfig().getString("core", null, "worktree");
|
||||||
|
@ -244,6 +231,29 @@ public Repository(final File d, final File workTree, final File objectDir,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void loadUserConfig() throws IOException {
|
||||||
|
try {
|
||||||
|
userConfig.load();
|
||||||
|
} catch (ConfigInvalidException e1) {
|
||||||
|
IOException e2 = new IOException("User config file "
|
||||||
|
+ userConfig.getFile().getAbsolutePath() + " invalid: "
|
||||||
|
+ e1);
|
||||||
|
e2.initCause(e1);
|
||||||
|
throw e2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void loadConfig() throws IOException {
|
||||||
|
try {
|
||||||
|
config.load();
|
||||||
|
} catch (ConfigInvalidException e1) {
|
||||||
|
IOException e2 = new IOException("Unknown repository format");
|
||||||
|
e2.initCause(e1);
|
||||||
|
throw e2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a new Git repository initializing the necessary files and
|
* Create a new Git repository initializing the necessary files and
|
||||||
* directories. Repository with working tree is created using this method.
|
* directories. Repository with working tree is created using this method.
|
||||||
|
@ -320,6 +330,20 @@ public RefDatabase getRefDatabase() {
|
||||||
* @return the configuration of this repository
|
* @return the configuration of this repository
|
||||||
*/
|
*/
|
||||||
public RepositoryConfig getConfig() {
|
public RepositoryConfig getConfig() {
|
||||||
|
if (userConfig.isOutdated()) {
|
||||||
|
try {
|
||||||
|
loadUserConfig();
|
||||||
|
} catch (IOException e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (config.isOutdated()) {
|
||||||
|
try {
|
||||||
|
loadConfig();
|
||||||
|
} catch (IOException e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
return config;
|
return config;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue