Fix missing Configuration Change eventing
Configuration change events were not being triggered, now they are forwarded from the FileConfig up to the Repository's listeners. Change-Id: Ida94a59f5a2b7fa8ae0126e33c13343275483ee5 Signed-off-by: Mathias Kinzler <mathias.kinzler@sap.com> Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
This commit is contained in:
parent
75c9b24385
commit
b7388637d8
|
@ -9,13 +9,14 @@ Bundle-ActivationPolicy: lazy
|
||||||
Bundle-RequiredExecutionEnvironment: J2SE-1.5
|
Bundle-RequiredExecutionEnvironment: J2SE-1.5
|
||||||
Import-Package: junit.framework;version="[3.8.2,4.0.0)",
|
Import-Package: junit.framework;version="[3.8.2,4.0.0)",
|
||||||
junit.textui;version="[3.8.2,4.0.0)",
|
junit.textui;version="[3.8.2,4.0.0)",
|
||||||
org.eclipse.jgit.api;version="[0.9.0,0.10.0)",
|
|
||||||
org.eclipse.jgit;version="[0.9.0,0.10.0)",
|
org.eclipse.jgit;version="[0.9.0,0.10.0)",
|
||||||
|
org.eclipse.jgit.api;version="[0.9.0,0.10.0)",
|
||||||
org.eclipse.jgit.awtui;version="[0.9.0,0.10.0)",
|
org.eclipse.jgit.awtui;version="[0.9.0,0.10.0)",
|
||||||
org.eclipse.jgit.console;version="[0.9.0,0.10.0)",
|
org.eclipse.jgit.console;version="[0.9.0,0.10.0)",
|
||||||
org.eclipse.jgit.diff;version="[0.9.0,0.10.0)",
|
org.eclipse.jgit.diff;version="[0.9.0,0.10.0)",
|
||||||
org.eclipse.jgit.dircache;version="[0.9.0,0.10.0)",
|
org.eclipse.jgit.dircache;version="[0.9.0,0.10.0)",
|
||||||
org.eclipse.jgit.errors;version="[0.9.0,0.10.0)",
|
org.eclipse.jgit.errors;version="[0.9.0,0.10.0)",
|
||||||
|
org.eclipse.jgit.events;version="[0.9.0,0.10.0)",
|
||||||
org.eclipse.jgit.fnmatch;version="[0.9.0,0.10.0)",
|
org.eclipse.jgit.fnmatch;version="[0.9.0,0.10.0)",
|
||||||
org.eclipse.jgit.http.server;version="[0.9.0,0.10.0)",
|
org.eclipse.jgit.http.server;version="[0.9.0,0.10.0)",
|
||||||
org.eclipse.jgit.ignore;version="[0.9.0,0.10.0)",
|
org.eclipse.jgit.ignore;version="[0.9.0,0.10.0)",
|
||||||
|
|
|
@ -0,0 +1,81 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2010, Mathias Kinzler <mathias.kinzler@sap.com>
|
||||||
|
* and other copyright owners as documented in the project's IP log.
|
||||||
|
*
|
||||||
|
* This program and the accompanying materials are made available
|
||||||
|
* under the terms of the Eclipse Distribution License v1.0 which
|
||||||
|
* accompanies this distribution, is reproduced below, and is
|
||||||
|
* available at http://www.eclipse.org/org/documents/edl-v10.php
|
||||||
|
*
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or
|
||||||
|
* without modification, are permitted provided that the following
|
||||||
|
* conditions are met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* - Redistributions in binary form must reproduce the above
|
||||||
|
* copyright notice, this list of conditions and the following
|
||||||
|
* disclaimer in the documentation and/or other materials provided
|
||||||
|
* with the distribution.
|
||||||
|
*
|
||||||
|
* - Neither the name of the Eclipse Foundation, Inc. nor the
|
||||||
|
* names of its contributors may be used to endorse or promote
|
||||||
|
* products derived from this software without specific prior
|
||||||
|
* written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
|
||||||
|
* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||||
|
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
|
||||||
|
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||||
|
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||||
|
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||||
|
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
package org.eclipse.jgit.events;
|
||||||
|
|
||||||
|
import org.eclipse.jgit.lib.RepositoryTestCase;
|
||||||
|
import org.eclipse.jgit.storage.file.FileBasedConfig;
|
||||||
|
|
||||||
|
public class ConfigChangeEventTest extends RepositoryTestCase {
|
||||||
|
public void testFileRepository_ChangeEventsOnlyOnSave() throws Exception {
|
||||||
|
final ConfigChangedEvent[] events = new ConfigChangedEvent[1];
|
||||||
|
db.getListenerList().addConfigChangedListener(
|
||||||
|
new ConfigChangedListener() {
|
||||||
|
public void onConfigChanged(ConfigChangedEvent event) {
|
||||||
|
events[0] = event;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
FileBasedConfig config = db.getConfig();
|
||||||
|
assertNull(events[0]);
|
||||||
|
|
||||||
|
// set a value to some arbitrary key
|
||||||
|
config.setString("test", "section", "event", "value");
|
||||||
|
// no changes until we save
|
||||||
|
assertNull(events[0]);
|
||||||
|
config.save();
|
||||||
|
assertNotNull(events[0]);
|
||||||
|
// correct repository?
|
||||||
|
assertEquals(events[0].getRepository(), db);
|
||||||
|
|
||||||
|
// reset for the next test
|
||||||
|
events[0] = null;
|
||||||
|
|
||||||
|
// unset the value we have just set above
|
||||||
|
config.unset("test", "section", "event");
|
||||||
|
// no changes until we save
|
||||||
|
assertNull(events[0]);
|
||||||
|
config.save();
|
||||||
|
assertNotNull(events[0]);
|
||||||
|
// correct repository?
|
||||||
|
assertEquals(events[0].getRepository(), db);
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,4 +1,5 @@
|
||||||
/*
|
/*
|
||||||
|
* Copyright (C) 2010, Mathias Kinzler <mathias.kinzler@sap.com>
|
||||||
* Copyright (C) 2009, Constantine Plotnikov <constantine.plotnikov@gmail.com>
|
* Copyright (C) 2009, Constantine Plotnikov <constantine.plotnikov@gmail.com>
|
||||||
* Copyright (C) 2007, Dave Watson <dwatson@mimvista.com>
|
* Copyright (C) 2007, Dave Watson <dwatson@mimvista.com>
|
||||||
* Copyright (C) 2008-2010, Google Inc.
|
* Copyright (C) 2008-2010, Google Inc.
|
||||||
|
@ -62,6 +63,10 @@
|
||||||
|
|
||||||
import org.eclipse.jgit.JGitText;
|
import org.eclipse.jgit.JGitText;
|
||||||
import org.eclipse.jgit.errors.ConfigInvalidException;
|
import org.eclipse.jgit.errors.ConfigInvalidException;
|
||||||
|
import org.eclipse.jgit.events.ConfigChangedEvent;
|
||||||
|
import org.eclipse.jgit.events.ConfigChangedListener;
|
||||||
|
import org.eclipse.jgit.events.ListenerHandle;
|
||||||
|
import org.eclipse.jgit.events.ListenerList;
|
||||||
import org.eclipse.jgit.util.StringUtils;
|
import org.eclipse.jgit.util.StringUtils;
|
||||||
|
|
||||||
|
|
||||||
|
@ -74,6 +79,9 @@ public class Config {
|
||||||
private static final long MiB = 1024 * KiB;
|
private static final long MiB = 1024 * KiB;
|
||||||
private static final long GiB = 1024 * MiB;
|
private static final long GiB = 1024 * MiB;
|
||||||
|
|
||||||
|
/** the change listeners */
|
||||||
|
private final ListenerList listeners = new ListenerList();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Immutable current state of the configuration data.
|
* Immutable current state of the configuration data.
|
||||||
* <p>
|
* <p>
|
||||||
|
@ -450,6 +458,43 @@ public void uncache(final SectionParser<?> parser) {
|
||||||
state.get().cache.remove(parser);
|
state.get().cache.remove(parser);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adds a listener to be notified about changes.
|
||||||
|
* <p>
|
||||||
|
* Clients are supposed to remove the listeners after they are done with
|
||||||
|
* them using the {@link ListenerHandle#remove()} method
|
||||||
|
*
|
||||||
|
* @param listener
|
||||||
|
* the listener
|
||||||
|
* @return the handle to the registered listener
|
||||||
|
*/
|
||||||
|
public ListenerHandle addChangeListener(ConfigChangedListener listener) {
|
||||||
|
return listeners.addConfigChangedListener(listener);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Determine whether to issue change events for transient changes.
|
||||||
|
* <p>
|
||||||
|
* If <code>true</code> is returned (which is the default behavior),
|
||||||
|
* {@link #fireConfigChangedEvent()} will be called upon each change.
|
||||||
|
* <p>
|
||||||
|
* Subclasses that override this to return <code>false</code> are
|
||||||
|
* responsible for issuing {@link #fireConfigChangedEvent()} calls
|
||||||
|
* themselves.
|
||||||
|
*
|
||||||
|
* @return <code></code>
|
||||||
|
*/
|
||||||
|
protected boolean notifyUponTransientChanges() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Notifies the listeners
|
||||||
|
*/
|
||||||
|
protected void fireConfigChangedEvent() {
|
||||||
|
listeners.dispatch(new ConfigChangedEvent());
|
||||||
|
}
|
||||||
|
|
||||||
private String getRawString(final String section, final String subsection,
|
private String getRawString(final String section, final String subsection,
|
||||||
final String name) {
|
final String name) {
|
||||||
final List<String> lst = getRawStringList(section, subsection, name);
|
final List<String> lst = getRawStringList(section, subsection, name);
|
||||||
|
@ -681,6 +726,8 @@ public void setStringList(final String section, final String subsection,
|
||||||
src = state.get();
|
src = state.get();
|
||||||
res = replaceStringList(src, section, subsection, name, values);
|
res = replaceStringList(src, section, subsection, name, values);
|
||||||
} while (!state.compareAndSet(src, res));
|
} while (!state.compareAndSet(src, res));
|
||||||
|
if (notifyUponTransientChanges())
|
||||||
|
fireConfigChangedEvent();
|
||||||
}
|
}
|
||||||
|
|
||||||
private State replaceStringList(final State srcState,
|
private State replaceStringList(final State srcState,
|
||||||
|
|
|
@ -101,6 +101,12 @@ public FileBasedConfig(Config base, File cfgLocation, FS fs) {
|
||||||
this.fs = fs;
|
this.fs = fs;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected boolean notifyUponTransientChanges() {
|
||||||
|
// we will notify listeners upon save()
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
/** @return location of the configuration file on disk */
|
/** @return location of the configuration file on disk */
|
||||||
public final File getFile() {
|
public final File getFile() {
|
||||||
return configFile;
|
return configFile;
|
||||||
|
@ -159,6 +165,8 @@ public void save() throws IOException {
|
||||||
lf.unlock();
|
lf.unlock();
|
||||||
}
|
}
|
||||||
lastModified = lf.getCommitLastModified();
|
lastModified = lf.getCommitLastModified();
|
||||||
|
// notify the listeners
|
||||||
|
fireConfigChangedEvent();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -54,6 +54,8 @@
|
||||||
|
|
||||||
import org.eclipse.jgit.JGitText;
|
import org.eclipse.jgit.JGitText;
|
||||||
import org.eclipse.jgit.errors.ConfigInvalidException;
|
import org.eclipse.jgit.errors.ConfigInvalidException;
|
||||||
|
import org.eclipse.jgit.events.ConfigChangedEvent;
|
||||||
|
import org.eclipse.jgit.events.ConfigChangedListener;
|
||||||
import org.eclipse.jgit.lib.BaseRepositoryBuilder;
|
import org.eclipse.jgit.lib.BaseRepositoryBuilder;
|
||||||
import org.eclipse.jgit.lib.ConfigConstants;
|
import org.eclipse.jgit.lib.ConfigConstants;
|
||||||
import org.eclipse.jgit.lib.Constants;
|
import org.eclipse.jgit.lib.Constants;
|
||||||
|
@ -157,6 +159,12 @@ public FileRepository(final BaseRepositoryBuilder options) throws IOException {
|
||||||
loadUserConfig();
|
loadUserConfig();
|
||||||
loadRepoConfig();
|
loadRepoConfig();
|
||||||
|
|
||||||
|
getConfig().addChangeListener(new ConfigChangedListener() {
|
||||||
|
public void onConfigChanged(ConfigChangedEvent event) {
|
||||||
|
fireEvent(event);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
refs = new RefDirectory(this);
|
refs = new RefDirectory(this);
|
||||||
objectDatabase = new ObjectDirectory(repoConfig, //
|
objectDatabase = new ObjectDirectory(repoConfig, //
|
||||||
options.getObjectDirectory(), //
|
options.getObjectDirectory(), //
|
||||||
|
|
Loading…
Reference in New Issue