package org.bndtools.versioncontrol.ignores.manager.api;

import java.io.File;
import java.util.List;

import org.bndtools.api.NamedPlugin;
import org.osgi.annotation.versioning.ConsumerType;

/**
 * <p>
 * The interface of a version control ignores plugin.
 * </p>
 * <p>
 * A version control ignores plugin can apply ignore globs (in Git format) to a directory that is under version control
 * of a certain version control system.
 * </p>
 * <p>
 * Bndtools internally always works with ignore globs in Git format. It is the responsibility of the plugin to interpret
 * those globs and translate them into the appropriate format.
 * </p>
 */
@ConsumerType
public interface VersionControlIgnoresPlugin {
    /**
     * @return generic plugin information
     */
    NamedPlugin getInformation();

    /**
     * @return true when the version control system can store empty directories, false otherwise
     */
    boolean canStoreEmptyDirectories();

    /**
     * @param repositoryProviderId the Eclipse plugin id that provides version control for a project
     * @return true when this plugin provides can apply version control ignore globs for the specified
     *         repositoryProviderId
     */
    boolean matchesRepositoryProviderId(String repositoryProviderId);

    /**
     * Apply version control ignore globs to a directory.
     * 
     * @param dstDir the destination directory
     * @param ignores a list of ignore globs (in Git format). Can be empty, which specifically is the case when the
     *            destination directory contains no files and when {@link #canStoreEmptyDirectories()} returned false.
     * @throws Exception upon error(s)
     */
    void addIgnores(File dstDir, List<String> ignores) throws Exception;
}
