blob: 9f1b9f824de2c9282ae52dcc959830ddab344a20 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2013, 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:
* Neil Guzman - ruby implementation (B#350066)
*******************************************************************************/
package org.eclipse.linuxtools.internal.rpmstubby;
import java.util.List;
import org.eclipse.core.resources.IFile;
import org.eclipse.linuxtools.internal.rpmstubby.model.GemModel;
/**
* Generator for RPM specfile from ruby gemspec.
*
*/
public class StubbyGemGenerator extends AbstractGenerator {
private GemModel model;
private static final String FIX_ME = "#FIXME";
/**
* Creates the generator by parsing the gemspec file.
*
* @param gemFile
* The gemspec file to generate specfile for.
*/
public StubbyGemGenerator(IFile gemFile) {
parse(gemFile);
specfileName = model.getPackageName().toLowerCase() + ".spec";
projectName = gemFile.getProject().getName();
}
/**
* Creates the model which contains the information
*
* @param gemFile The gemspec file
*/
private void parse(IFile gemFile) {
model = new GemModel(gemFile);
}
/**
* Generates a RPM specfile based on the parsed data from the gemspec file.
*
* @return The generated specfile.
*/
@Override
public String generateSpecfile() {
StringBuilder buffer = new StringBuilder();
generateDefines(buffer);
String packageName = model.getPackageName();
buffer.append("Name: " + packageName.toLowerCase() + "\n");
buffer.append("Version: " + model.getVersion() + "\n");
buffer.append("Release: 1%{?dist}" + "\n");
buffer.append("Summary: " + model.getSummary() + "\n\n");
buffer.append("Group: Development/Libraries\n");
buffer.append("License: " + model.getLicense() + "\n");
buffer.append("URL: " + model.getURL() + "\n");
buffer.append("Source0: #FIXME\n\n");
generateRequires(buffer);
buffer.append("BuildArch: noarch\n");
buffer.append("Provides: rubygem(%{gem_name}) = %{version}\n\n\n");
buffer.append("%description\n" + model.getDescription() + "\n\n\n");
generatePrepSection(buffer);
generateBuildSection(buffer);
generateInstallSection(buffer);
generateFilesSections(buffer);
generateChangelog(buffer);
return buffer.toString();
}
private void generateDefines(StringBuilder buffer) {
buffer.append("%global gem_name " + model.getSimplePackageName().toLowerCase() +"\n\n");
}
/**
* Generate requires
*
* @param buffer Buffer to write content to
*/
private void generateRequires(StringBuilder buffer) {
buffer.append("BuildRequires: rubygems-devel\n");
List<String> requireList = model.getBuildRequiresList();
for (String require : requireList) {
buffer.append("BuildRequires: " + require + "\n");
}
buffer.append("Requires: ruby(release)\n");
String rubyGemsVersion = model.getGemVersion();
if (rubyGemsVersion.equals(FIX_ME)) {
buffer.append("Requires: rubygems\n");
} else {
buffer.append("Requires: rubygems == " + rubyGemsVersion +"\n");
}
requireList = model.getInstallRequiresList();
for (String require : requireList) {
buffer.append("Requires: " + require + "\n");
}
buffer.append("\n");
}
/**
* Generate prep
*
* @param buffer Buffer to write content to
*/
private static void generatePrepSection(StringBuilder buffer) {
buffer.append("%prep\n");
buffer.append("gem unpack %{SOURCE0}\n");
buffer.append("%setup -q -D -T -n %{gem_name}-%{version} #You may need to update this according to your Source0\n\n");
buffer.append("gem spec %{SOURCE0} -l --ruby > %{gem_name}.gemspec\n\n\n");
}
/**
* Generate build
*
* @param buffer Buffer to write content to
*/
private static void generateBuildSection(StringBuilder buffer) {
buffer.append("%build\n");
buffer.append("gem build %{gem_name}.gemspec\n\n");
buffer.append("%gem_install\n\n\n");
}
/**
* Generate install
*
* @param buffer Buffer to write content to
*/
private void generateInstallSection(StringBuilder buffer) {
buffer.append("%install\n");
buffer.append("mkdir -p %{buildroot}%{gem_dir}\n");
buffer.append("cp -a ./%{gem_dir}/* %{buildroot}%{gem_dir}/\n\n");
buffer.append("mkdir -p %{buildroot}%{_bindir}\n");
buffer.append("cp -a ./%{_bindir}/* %{buildroot}%{_bindir}\n\n");
List<String> requirePaths = model.getRequirePaths();
if (!requirePaths.isEmpty()) {
buffer.append("mkdir -p %{buildroot}%{gem_extdir_mri}/"+ requirePaths.get(0) +"\n");
buffer.append("mv %{buildroot}%{gem_instdir}/"+requirePaths.get(0)+"/shared_object.so %{buildroot}%{gem_extdir_mri}/"+ requirePaths.get(0)+"/\n\n");
}
buffer.append("\n");
}
/**
* Generate files
*
* @param buffer Buffer to write content to
*/
private static void generateFilesSections(StringBuilder buffer) {
buffer.append("%files\n");
buffer.append("%dir %{gem_instdir}\n");
buffer.append("%{gem_libdir}\n");
buffer.append("%{gem_spec}\n\n");
buffer.append("%files doc\n");
buffer.append("%doc %{gem_docdir}\n\n\n");
}
}