Merge "Make Repository.getConfig aware of changed config"

This commit is contained in:
Matthias Sohn 2010-04-13 04:16:58 -04:00 committed by Code Review
commit d29618dd41
2 changed files with 53 additions and 17 deletions

View File

@ -62,6 +62,7 @@
*/
public class FileBasedConfig extends Config {
private final File configFile;
private volatile long lastModified;
/**
* Create a configuration with no default fallback.
@ -103,6 +104,7 @@ public final File getFile() {
* the file is not a properly formatted configuration file.
*/
public void load() throws IOException, ConfigInvalidException {
lastModified = getFile().lastModified();
try {
fromText(RawParseUtils.decode(IO.readFully(getFile())));
} catch (FileNotFoundException noFile) {
@ -134,16 +136,26 @@ public void save() throws IOException {
if (!lf.lock())
throw new IOException("Cannot lock " + getFile());
try {
lf.setNeedStatInformation(true);
lf.write(out);
if (!lf.commit())
throw new IOException("Cannot commit write to " + getFile());
} finally {
lf.unlock();
}
lastModified = lf.getCommitLastModified();
}
@Override
public String toString() {
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;
}
}

View File

@ -96,6 +96,8 @@ public class Repository {
private final File gitDir;
private final FileBasedConfig userConfig;
private final RepositoryConfig config;
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");
}
final FileBasedConfig userConfig;
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"));
try {
getConfig().load();
} catch (ConfigInvalidException e1) {
IOException e2 = new IOException("Unknown repository format");
e2.initCause(e1);
throw e2;
}
loadUserConfig();
loadConfig();
if (workDir == null) {
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
* directories. Repository with working tree is created using this method.
@ -320,6 +330,20 @@ public RefDatabase getRefDatabase() {
* @return the configuration of this repository
*/
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;
}