From 1f0ad116aafc9db7d4a7edb174b65ac7fc4fe6ba Mon Sep 17 00:00:00 2001
From: lutoff <lutoff@localhost>
Date: Mon, 14 Jan 2008 15:11:07 +0000
Subject: [PATCH] Fix for issue #2640 (Provide RPM delivery)

---
 opendj-sdk/opends/src/build-tools/org/opends/build/tools/GenerateRpm.java |  251 +++++++++++++++++++++++++++++++++++++++++
 opendj-sdk/opends/build.xml                                               |   62 ++++++++++
 2 files changed, 313 insertions(+), 0 deletions(-)

diff --git a/opendj-sdk/opends/build.xml b/opendj-sdk/opends/build.xml
index 6ebdaf8..b09a021 100644
--- a/opendj-sdk/opends/build.xml
+++ b/opendj-sdk/opends/build.xml
@@ -945,6 +945,7 @@
            filemode="755" dirmode="755" />
     </zip>
     <property name="package.built" value="true"/>
+    
     <!-- print a time stamp in Unix 'date' format -->
     <tstamp>
       <format property="package.built.ts" pattern="EEE MMM dd HH:mm:ss zzz yyyy" />
@@ -952,6 +953,67 @@
     <echo message="Package Built: ${package.built.ts}"/>
   </target>
 
+  <!-- Package the Directory Server for the RPM distribution. -->
+  <target name="package-RPM"
+	  	description="Package the Directory Server for RPM distribution.">
+    <taskdef name="getversionnumber"
+		             classname="org.opends.build.tools.CreateVersionString">
+      <classpath>
+        <fileset dir="${build.dir}/build-tools">
+          <include name="*.jar" />
+        </fileset>
+      </classpath>
+    </taskdef>
+
+    <getversionnumber property="VERSION_NUMBER_STRING" />
+
+    <property name="prefix"    value="/opt/opends"/>
+    <property name="release"   value="0"/>
+    <typedef name="genrpm"
+		             classname="org.opends.build.tools.GenerateRpm">
+      <classpath>
+        <fileset dir="${build.dir}/build-tools">
+          <include name="*.jar" />
+        </fileset>
+      </classpath>
+    </typedef>
+
+    <mkdir dir="${build.dir}/rpm/noarch" />
+    <mkdir dir="${build.dir}/rpm/i486" />
+    <mkdir dir="${build.dir}/rpm/i586" />
+    <mkdir dir="${build.dir}/rpm/i686" />
+    <mkdir dir="${build.dir}/rpm/BUILD" />
+    <mkdir dir="${build.dir}/rpm/RPMS" />
+    <mkdir dir="${build.dir}/rpm/SOURCES/${prefix}" />
+    <mkdir dir="${build.dir}/rpm/i386" />
+    <mkdir dir="${build.dir}/rpm/SPECS" />
+    <mkdir dir="${build.dir}/rpm/SRPMS" />
+
+    <genrpm
+    	topDir="${build.dir}/rpm"
+    	prefix="${prefix}"
+    	sourceDirName="${package.dir}/${SHORT_NAME}-${VERSION_NUMBER_STRING}"
+    	specFileName="${build.dir}/rpm/SPECS/specFile"
+    	version="${VERSION_NUMBER_STRING}"
+    	release="${release}"
+		  overwrite="true">
+    </genrpm>
+
+    <rpm 
+			specfile="specFile"
+			topdir="${build.dir}/rpm"
+      quiet="true"
+    />
+
+    <copy todir="${package.dir}">
+      <fileset dir="${build.dir}/rpm/RPMS/noarch">
+        <include name="*.rpm" />
+      </fileset>
+    </copy>
+
+    <delete dir="${build.dir}/rpm"/>
+  </target>
+
 
 
   <!-- Prepare the Directory Server DSML library. -->
diff --git a/opendj-sdk/opends/src/build-tools/org/opends/build/tools/GenerateRpm.java b/opendj-sdk/opends/src/build-tools/org/opends/build/tools/GenerateRpm.java
new file mode 100644
index 0000000..c33c7da
--- /dev/null
+++ b/opendj-sdk/opends/src/build-tools/org/opends/build/tools/GenerateRpm.java
@@ -0,0 +1,251 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License").  You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE
+ * or https://OpenDS.dev.java.net/OpenDS.LICENSE.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at
+ * trunk/opends/resource/legal-notices/OpenDS.LICENSE.  If applicable,
+ * add the following below this CDDL HEADER, with the fields enclosed
+ * by brackets "[]" replaced with your own identifying information:
+ *      Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ *
+ *
+ *      Portions Copyright 2007-2008 Sun Microsystems, Inc.
+ */
+package org.opends.build.tools;
+
+import org.apache.tools.ant.Task;
+import org.apache.tools.ant.BuildException;
+
+import static org.opends.build.tools.Utilities.*;
+
+import java.io.File;
+import java.io.PrintWriter;
+
+/**
+ * Generates an RPM spec file.
+ */
+public class GenerateRpm extends Task {
+
+  private File topDir;
+  private String topDirAbsolutePath;
+  private String sourceDirName;
+  private File destFile;
+  private String prefix;
+  private String version;
+  private String release;
+  private boolean overwrite;
+  private StringBuilder sb;
+
+  private final String filePrefix="%{_prefix}";
+  private final String dirPrefix="%dir %{_prefix}";
+
+
+  /**
+   * Sets the top directory for the rpm build.
+   * @param topDir File representing top directory for rpm build directory
+   */
+  public void setTopDir(File topDir) {
+    this.topDir = topDir;
+    topDirAbsolutePath = topDir.getAbsolutePath();
+  }
+
+  /**
+   * Sets the prefix for the RPM.
+   * @param prefix Used for package relocation
+   */
+  public void setPrefix(String prefix) {
+    this.prefix = prefix;
+  }
+
+  /**
+   * Sets the name of the source directory.
+   * @param sourceDirName name of the source directory.
+   */
+  public void setSourceDirName(String sourceDirName) {
+    this.sourceDirName = sourceDirName;
+  }
+
+
+  /**
+   * Sets the RPM spec file that will be generated.
+   * @param dest The spec file
+   *
+   */
+  public void setSpecFileName(File dest) {
+    this.destFile = dest;
+  }
+
+  /**
+   * Sets the version number.
+   * @param version The version number
+   *
+   */
+  public void setVersion(String version) {
+    this.version = version;
+  }
+
+  /**
+   * Sets the release number.
+   * @param release The release number
+   *
+   */
+  public void setRelease(String release) {
+    this.release = release;
+  }
+
+  /**
+   * Indicates when true that an existing destination
+   * file will be overwritten.
+   * @param o boolean where true means overwrite
+   */
+  public void setOverwrite(boolean o) {
+    this.overwrite = o;
+  }
+
+  /**
+   * {@inheritDoc}
+   */
+  @Override
+  public void execute() throws BuildException {
+
+    try {
+      if (!topDir.exists()) {
+        throw new BuildException("directory " + topDir.getName()
+            + " does not exist");
+      }
+      if (!topDir.isDirectory()) {
+        throw new BuildException(topDir.getName() + " is not a directory");
+      }
+
+      if (destFile.exists()) {
+        if (this.overwrite) {
+          destFile.delete();
+          log("Regenerating " + destFile.getName() + " from "
+              + topDir.getName());
+        } else {
+          log(destFile.getName() + " has not been regenerated");
+        }
+      }
+
+      sb = new StringBuilder();
+      File rootDir = new File(sourceDirName);
+      String opendsDir = rootDir.getName();
+
+      // Generate the package information
+      sb.append("Summary            : OpenDS Directory Server"           + EOL);
+      sb.append("Name               : opends"                            + EOL);
+      sb.append("Version            : " + version                        + EOL);
+      sb.append("Release            : " + release                        + EOL);
+      sb.append("License            : CDDL"                              + EOL);
+      sb.append("Group              : Applications/Network"              + EOL);
+      sb.append("URL                : https://opends.org"                + EOL);
+      sb.append(                                                           EOL);
+      sb.append("BuildArchitectures : noarch"                            + EOL);
+      sb.append("BuildRoot          : " + topDirAbsolutePath + "/SOURCES"+ EOL);
+      sb.append("Prefix             : " + prefix                         + EOL);
+      sb.append(                                                           EOL);
+      sb.append("%define _prefix " + prefix                              + EOL);
+      sb.append(                                                           EOL);
+      sb.append("%Description"                                           + EOL);
+      sb.append("OpenDS Directory Server"                                + EOL);
+      sb.append(                                                           EOL);
+      sb.append("# ========================="                            + EOL);
+      sb.append("# pre/post installation"                                + EOL);
+      sb.append("# ========================="                            + EOL);
+      sb.append("# The order is:"                                        + EOL);
+      sb.append("#     1. %pre new"                                      + EOL);
+      sb.append("#     2. install new"                                   + EOL);
+      sb.append("#     3. %post new"                                     + EOL);
+      sb.append("#     4. %preun old"                                    + EOL);
+      sb.append("#     5. delete old"                                    + EOL);
+      sb.append("#     6. %postun old"                                   + EOL);
+      sb.append("# Note: \"$1 equals \"1\" it means \"fresh install"     + EOL);
+      sb.append(                                                           EOL);
+      sb.append("# PRE INSTALL"                                          + EOL);
+      sb.append("%pre"                                                   + EOL);
+      sb.append("if [ \"$1\" != \"1\" ]; then"                           + EOL);
+      sb.append("echo \"  This version of the OpenDS RPM does not work"  + EOL);
+      sb.append("echo \"  with the standard RPM upgrade mechanism"       + EOL);
+      sb.append("echo \"  (rpm -U or rpm -F)."                           + EOL);
+      sb.append("echo \"  To perform an upgrade, use the OpenDS upgrade" + EOL);
+      sb.append("echo \"  tool included in the package delivery."        + EOL);
+      sb.append("echo \"  For more information about the upgrade process"+ EOL);
+      sb.append("echo \"  with RPM see https://www.opends.org/wiki//page/OpendsRPM."+ EOL);
+      sb.append("exit 1"                                                 + EOL);
+      sb.append("fi"                                                     + EOL);
+      sb.append(                                                           EOL);
+      sb.append("# POST INSTALL"                                         + EOL);
+      sb.append("%post"                                                  + EOL);
+      sb.append(                                                           EOL);
+      sb.append("# PRE UNINSTALL"                                        + EOL);
+      sb.append("%preun"                                                 + EOL);
+      sb.append("${RPM_INSTALL_PREFIX}/OpenDS-1.0.0/bin/stop-ds"         + EOL);
+      sb.append(                                                           EOL);
+      sb.append("# POST UNINSTALL"                                       + EOL);
+      sb.append("%postun"                                                + EOL);
+      sb.append("rm -rf ${RPM_INSTALL_PREFIX}/" + opendsDir              + EOL);
+      sb.append("rmdir --ignore-fail-on-non-empty ${RPM_INSTALL_PREFIX}" + EOL);
+      sb.append(                                                           EOL);
+      sb.append("# ========================="                            + EOL);
+      sb.append("# Prepare, Build, Install"                              + EOL);
+      sb.append("# ========================="                            + EOL);
+      sb.append("%prep"                                                  + EOL);
+      sb.append("cd "+ topDirAbsolutePath +"/SOURCES" + prefix           +
+          " ; cp -r " + sourceDirName + " ."                             + EOL);
+      sb.append("%build"                                                 + EOL);
+      sb.append("%install"                                               + EOL);
+      sb.append(                                                           EOL);
+      sb.append("# ========================="                            + EOL);
+      sb.append("# FILES LAYOUT"                                         + EOL);
+      sb.append("# ========================="                            + EOL);
+      sb.append("%files"                                                 + EOL);
+      sb.append(dirPrefix                                                + EOL);
+      generatedLevel("", rootDir);
+
+      // flush the spec file.
+      PrintWriter destWriter = new PrintWriter(destFile);
+      destWriter.print(sb.toString());
+      destWriter.close();
+    } catch (Exception e) {
+      // Don't leave a malformed file laying around. Delete
+      // it so it will be forced to be regenerated.
+      if (destFile.exists()) {
+        destFile.deleteOnExit();
+      }
+      e.printStackTrace();
+      throw new BuildException("Error processing " + topDir + ":  "
+          + e.getMessage());
+    }
+  }
+
+  private void generatedLevel (String parent, File source )
+  {
+    if (source.isDirectory())
+    {
+      sb.append(dirPrefix + parent + "/" +source.getName());
+      sb.append(EOL);
+      for (File child : source.listFiles())
+      {
+        generatedLevel( parent + "/" +source.getName(), child);
+      }
+    }
+    else
+    {
+      sb.append(filePrefix + parent + "/" +source.getName());
+      sb.append(EOL);
+    }
+  }
+}

--
Gitblit v1.10.0