org.netbeans.modules.mercurial.MercurialVCS Maven / Gradle / Ivy
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.netbeans.modules.mercurial;
import java.io.File;
import java.util.Set;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeEvent;
import java.util.prefs.PreferenceChangeEvent;
import java.util.prefs.PreferenceChangeListener;
import org.netbeans.spi.queries.CollocationQueryImplementation;
import org.netbeans.modules.versioning.spi.VCSAnnotator;
import org.netbeans.modules.versioning.spi.VCSHistoryProvider;
import org.netbeans.modules.versioning.spi.VCSInterceptor;
import org.netbeans.modules.versioning.spi.VersioningSystem;
/**
* Extends framework VersioningSystem
to Mercurial module functionality.
*
* @author Maros Sandor
*/
@VersioningSystem.Registration(
displayName="#CTL_Mercurial_DisplayName",
menuLabel="#CTL_Mercurial_MainMenu",
actionsCategory="Mercurial",
metadataFolderNames=".hg")
public class MercurialVCS extends VersioningSystem implements PropertyChangeListener, PreferenceChangeListener {
public MercurialVCS() {
putProperty(PROP_DISPLAY_NAME, getDisplayName()); // NOI18N
putProperty(PROP_MENU_LABEL, org.openide.util.NbBundle.getMessage(MercurialVCS.class, "CTL_Mercurial_MainMenu")); // NOI18N
HgModuleConfig.getDefault().getPreferences().addPreferenceChangeListener(this);
Mercurial.getInstance().register(this);
}
public static String getDisplayName() {
return org.openide.util.NbBundle.getMessage(MercurialVCS.class, "CTL_Mercurial_DisplayName");
}
@Override
public CollocationQueryImplementation getCollocationQueryImplementation() {
return collocationQueryImplementation;
}
@Override
public VCSHistoryProvider getVCSHistoryProvider() {
return Mercurial.getInstance().getMercurialHistoryProvider();
}
private final CollocationQueryImplementation collocationQueryImplementation = new CollocationQueryImplementation() {
@Override
public boolean areCollocated(File a, File b) {
File fra = getTopmostManagedAncestor(a);
File frb = getTopmostManagedAncestor(b);
if (fra == null || !fra.equals(frb)) return false;
return true;
}
@Override
public File findRoot(File file) {
// TODO: we should probably return the closest common ancestor
return getTopmostManagedAncestor(file);
}
};
/**
* Tests whether the file is managed by this versioning system. If it is,
* the method should return the topmost
* ancestor of the file that is still versioned.
*
* @param file a file
* @return File the file itself or one of its ancestors or null if the
* supplied file is NOT managed by this versioning system
*/
@Override
public File getTopmostManagedAncestor(File file) {
return Mercurial.getInstance().getTopmostManagedAncestor(file);
}
/**
* Coloring label, modifying icons, providing action on file
*/
@Override
public VCSAnnotator getVCSAnnotator() {
return Mercurial.getInstance().getMercurialAnnotator();
}
/**
* Handle file system events such as delete, create, remove etc.
*/
@Override
public VCSInterceptor getVCSInterceptor() {
return Mercurial.getInstance().getMercurialInterceptor();
}
@Override
public void getOriginalFile(File workingCopy, File originalFile) {
Mercurial.getInstance().getOriginalFile(workingCopy, originalFile);
}
@SuppressWarnings("unchecked") // Property Change event.getNewValue returning Object
@Override
public void propertyChange(PropertyChangeEvent event) {
if (event.getPropertyName().equals(FileStatusCache.PROP_FILE_STATUS_CHANGED)) {
FileStatusCache.ChangedEvent changedEvent = (FileStatusCache.ChangedEvent) event.getNewValue();
fireStatusChanged(changedEvent.getFile());
} else if (event.getPropertyName().equals(Mercurial.PROP_HEAD_CHANGED)) {
Set files = (Set) event.getNewValue();
fireStatusChanged(files == null || files.isEmpty() ? null : files);
} else if (event.getPropertyName().equals(Mercurial.PROP_ANNOTATIONS_CHANGED)) {
fireAnnotationsChanged((Set) event.getNewValue());
} else if (event.getPropertyName().equals(Mercurial.PROP_VERSIONED_FILES_CHANGED)) {
Mercurial.LOG.fine("cleaning unversioned parents cache"); //NOI18N
Mercurial.getInstance().clearAncestorCaches();
fireVersionedFilesChanged();
}
}
@Override
public void preferenceChange(PreferenceChangeEvent evt) {
if (evt.getKey().startsWith(HgModuleConfig.PROP_COMMIT_EXCLUSIONS)) {
fireStatusChanged((Set) null);
}
}
}