blob: 91264bac4badd0832a494a5801e69de8fa095a45 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2005, 2018 Red Hat, Inc.
*
* This program and the accompanying materials are made
* available under the terms of the Eclipse Public License 2.0
* which is available at https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Red Hat - initial API and implementation
*******************************************************************************/
package org.eclipse.linuxtools.internal.rpm.core.utils;
import java.io.IOException;
import java.io.OutputStream;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.preferences.DefaultScope;
import org.eclipse.core.runtime.preferences.IEclipsePreferences;
import org.eclipse.linuxtools.profiling.launch.IRemoteCommandLauncher;
import org.eclipse.linuxtools.profiling.launch.IRemoteProxyManager;
import org.eclipse.linuxtools.profiling.launch.RemoteProxyManager;
import org.eclipse.linuxtools.rpm.core.IProjectConfiguration;
import org.eclipse.linuxtools.rpm.core.IRPMConstants;
import org.eclipse.linuxtools.rpm.core.utils.Utils;
/**
* A utility class for executing rpmbuild commands.
*
*/
public class RPMBuild {
private List<String> macroDefines = new ArrayList<>();
private String rpmBuildCmd;
private String mainFolder;
/**
* Constructs a new object.
*
* @param config
* the RPM configuration to use
*/
public RPMBuild(IProjectConfiguration config) {
IEclipsePreferences node = DefaultScope.INSTANCE.getNode(IRPMConstants.RPM_CORE_ID);
if (config.getBuildFolder().getLocation() == null) {
mainFolder = config.getSourcesFolder().getLocationURI().toString();
}
rpmBuildCmd = node.get(IRPMConstants.RPMBUILD_CMD, ""); //$NON-NLS-1$
String[] tmpMacroDefines = { rpmBuildCmd, "-v" }; //$NON-NLS-1$
macroDefines.addAll(Arrays.asList(tmpMacroDefines));
macroDefines.addAll(config.getConfigDefines());
}
/**
* Prepares the sources for a given spec file.
*
* @param specFile
* the spec file
* @param outStream
* The stream to write the output to.
* @return The return code of the build job.
* @throws CoreException
* If the operation fails.
*/
public IStatus buildPrep(IResource specFile, OutputStream outStream) throws CoreException {
return build(specFile, outStream, "-bp"); //$NON-NLS-1$
}
/**
* Builds a binary RPM for a given spec file.
*
* @param specFile
* the spec file
* @param outStream
* The stream to write the output to.
* @return The return code of the build job.
* @throws CoreException
* if the operation fails
*/
public IStatus buildBinary(IResource specFile, OutputStream outStream) throws CoreException {
return build(specFile, outStream, "-bb"); //$NON-NLS-1$
}
/**
* Builds both a binary and source RPM for a given spec file.
*
* @param specFile
* the spec file
* @param outStream
* The stream to write the output to.
* @return The return code of the build job.
* @throws CoreException
* if the operation fails
*/
public IStatus buildAll(IResource specFile, OutputStream outStream) throws CoreException {
return build(specFile, outStream, "-ba"); //$NON-NLS-1$
}
/**
* Builds a source RPM for a given spec file.
*
* @param specFile
* the spec file
* @param outStream
* The stream to write the output to.
* @return The return code of the build job.
* @throws CoreException
* if the operation fails
*/
public IStatus buildSource(IResource specFile, OutputStream outStream) throws CoreException {
return build(specFile, outStream, "-bs"); //$NON-NLS-1$
}
/**
*
* Operations for actually running rpmbuild binary
*
* @param specFile
* The specfile used by rpmbuild
* @param outStream
* The stream to write the output to.
* @param buildParameter
* rpmbuild parameters
* @return The return code of the build job.
* @throws CoreException
* if the operation fails
* @since 0.4
*/
public IStatus build(IResource specFile, OutputStream outStream, String buildParameter) throws CoreException {
if (specFile == null) {
throw new CoreException(new Status(IStatus.ERROR, IRPMConstants.RPM_CORE_ID, Messages.Specfile_not_found));
}
final List<String> command = new ArrayList<>();
command.addAll(macroDefines);
command.add(buildParameter);
try {
if (specFile.getLocation() == null) {
return remoteBuild(specFile, outStream, command);
} else {
command.add(specFile.getLocation().toString());
return Utils.runCommand(outStream, specFile.getProject(), command.toArray(new String[command.size()]));
}
} catch (IOException | URISyntaxException e) {
throw new CoreException(new Status(IStatus.ERROR, IRPMConstants.RPM_CORE_ID, e.getMessage(), e));
}
}
private IStatus remoteBuild(IResource specFile, OutputStream outStream, List<String> command)
throws CoreException, URISyntaxException {
command.remove(0);
IRemoteProxyManager rmtProxyMgr = RemoteProxyManager.getInstance();
IRemoteCommandLauncher rmtCmdLauncher = null;
rmtCmdLauncher = rmtProxyMgr.getLauncher(new URI(mainFolder));
command.add(specFile.getLocationURI().getPath());
String empty[] = new String[0];
Process pProxy = rmtCmdLauncher.execute(Path.fromOSString(rpmBuildCmd),
command.toArray(new String[command.size()]), empty, null, new NullProgressMonitor());
if (pProxy != null) {
return Utils.watchProcess(outStream, pProxy);
}
return Status.OK_STATUS;
}
}