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
|
||||
Import-Package: junit.framework;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.api;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.diff;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.events;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.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) 2007, Dave Watson <dwatson@mimvista.com>
|
||||
* Copyright (C) 2008-2010, Google Inc.
|
||||
|
@ -62,6 +63,10 @@
|
|||
|
||||
import org.eclipse.jgit.JGitText;
|
||||
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;
|
||||
|
||||
|
||||
|
@ -74,6 +79,9 @@ public class Config {
|
|||
private static final long MiB = 1024 * KiB;
|
||||
private static final long GiB = 1024 * MiB;
|
||||
|
||||
/** the change listeners */
|
||||
private final ListenerList listeners = new ListenerList();
|
||||
|
||||
/**
|
||||
* Immutable current state of the configuration data.
|
||||
* <p>
|
||||
|
@ -450,6 +458,43 @@ public void uncache(final SectionParser<?> 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,
|
||||
final String 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();
|
||||
res = replaceStringList(src, section, subsection, name, values);
|
||||
} while (!state.compareAndSet(src, res));
|
||||
if (notifyUponTransientChanges())
|
||||
fireConfigChangedEvent();
|
||||
}
|
||||
|
||||
private State replaceStringList(final State srcState,
|
||||
|
|
|
@ -101,6 +101,12 @@ public FileBasedConfig(Config base, File cfgLocation, 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 */
|
||||
public final File getFile() {
|
||||
return configFile;
|
||||
|
@ -159,6 +165,8 @@ public void save() throws IOException {
|
|||
lf.unlock();
|
||||
}
|
||||
lastModified = lf.getCommitLastModified();
|
||||
// notify the listeners
|
||||
fireConfigChangedEvent();
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -54,6 +54,8 @@
|
|||
|
||||
import org.eclipse.jgit.JGitText;
|
||||
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.ConfigConstants;
|
||||
import org.eclipse.jgit.lib.Constants;
|
||||
|
@ -157,6 +159,12 @@ public FileRepository(final BaseRepositoryBuilder options) throws IOException {
|
|||
loadUserConfig();
|
||||
loadRepoConfig();
|
||||
|
||||
getConfig().addChangeListener(new ConfigChangedListener() {
|
||||
public void onConfigChanged(ConfigChangedEvent event) {
|
||||
fireEvent(event);
|
||||
}
|
||||
});
|
||||
|
||||
refs = new RefDirectory(this);
|
||||
objectDatabase = new ObjectDirectory(repoConfig, //
|
||||
options.getObjectDirectory(), //
|
||||
|
|
Loading…
Reference in New Issue