view teamcity-common.xml @ 379:55c2c88a2d82 Eluru-6.5.x

TW-17630, TW-18815 fix encoding for hg log command Mercurial stores commit messages in UTF-8. During commit it tries to guess a system encoding and transcode message from system encoding to UTF-8. When it prints to output it transcodes from UTF-8 to the system encoding and replace characters which cannot be represented in the system encoding with the symbol of '?'. Default console encoding on windows is cp437, and it cannot represent non-latin symbols, see http://mercurial.selenic.com/wiki/CharacterEncodingOnWindows for details. The fix is to not use a console to run hg, and tell mercurial to do the output in UTF-8.
author Dmitry Neverov <dmitry.neverov@jetbrains.com>
date Wed, 15 Feb 2012 12:07:12 +0400
parents 63fcc9b14221
children 31a1aca3305c
line wrap: on
line source
<?xml version="1.0" encoding="UTF-8"?>
<project name="TeamCityPluginCommon">

  <!--
  Tasks:
                package.teamcity.plugin
                deploy.teamcity.plugin
                undeploy.teamcity.plugin
                unpack.teamcity

  Targets:
                check.teamcitydistribution
  -->

  <property name="path.variable.teamcitydistribution" value="${teamcity.distribution}"/>

  <property name="teamcity.internal.default.out" value="dist"/>


  <macrodef name="package.teamcity.plugin" description="packages TeamCity plugin">
    <attribute name="name" description="name of the plugin"/>
    <attribute name="server.output" default="" description="path to compiled server plugin output"/>
    <attribute name="agent.output" default="" description="path to compiled agent plugin output"/>
    <attribute name="common.output" default="" description="path to compiled common plugin output"/>
    <attribute name="out" default="${teamcity.internal.default.out}" description="directory to put prepared plugin zip into"/>
    <attribute name="plugin.descriptor.file" default="${basedir}/teamcity-plugin.xml" description="path to teamcity-plugin.xml file"/>
    <attribute name="common.jar.name" default="@{name}-common.jar" description="name of the shared jar between server and agent"/>
    <attribute name="out.unpacked" default="@{out}/unpacked"
               description="name of the directory to store unpacked plugin (not packed into zip)"/>

    <attribute name="server.lib.dir" default="" description="directory to get libs for the server part"/>
    <attribute name="server.lib.includes" default="none should match" description="includes pattern of the files in the directory"/>
    <attribute name="plugin.version" default="SNAPSHOT"
               description="the version of the plugin to put into teamcity-plugin.xml instead of '@Plugin_Version@'"/>
    <attribute name="plugin.vendor" default="Unknown vendor"
               description="name of the vendor to put into teamcity-plugin.xml instead of '@Plugin_Vendor@'"/>
    <attribute name="plugin.vendor.url" default=""
               description="vendor URL to put into teamcity-plugin.xml instead of '@Plugin_Vendor_Url@'"/>

    <element name="server-additional-files" optional="yes" description="fileset of the files to pack into root of the server plugin part"/>
    <element name="agent-additional-files" optional="yes" description="fileset of the files to pack into root of the agent plugin part"/>

    <sequential>

      <antcall target="check.already.defined"/>

      <property name="teamcity.internal.distrib.prep" value="${basedir}/temp/dist_prep"/>
      <property name="teamcity.internal.distrib.prep.agent" value="${teamcity.internal.distrib.prep}/agent"/>
      <property name="teamcity.internal.distrib.prep.common" value="${teamcity.internal.distrib.prep}/common"/>
      <property name="teamcity.internal.distrib.prep.agent.jars" value="${teamcity.internal.distrib.prep.agent}/unpacked"/>


      <!-- build jars -->

      <delete dir="@{out.unpacked}" quiet="true"/>
      <delete dir="${teamcity.internal.distrib.prep}" quiet="true"/>

      <mkdir dir="@{out.unpacked}"/>

      <condition property="common.needed">
        <length string="@{common.output}" when="greater" length="0"/>
      </condition>
      <condition property="server.needed">
        <length string="@{server.output}" when="greater" length="0"/>
      </condition>
      <condition property="agent.needed">
        <length string="@{agent.output}" when="greater" length="0"/>
      </condition>

      <condition property="plugin.descriptor.file.needed">
        <and>
          <available file="@{plugin.descriptor.file}"/>
          <length string="@{plugin.descriptor.file}" when="greater" length="0"/>
        </and>
      </condition>

      <mkdir dir="${teamcity.internal.distrib.prep.common}"/>
      <antcall target="prepare.common.part">
        <param name="common.output" value="@{common.output}"/>
        <param name="common.jar.path" value="${teamcity.internal.distrib.prep.common}/@{common.jar.name}"/>
      </antcall>

      <antcall target="prepare.server.part">
        <param name="out.unpacked" value="@{out.unpacked}"/>
        <param name="name" value="@{name}"/>
        <param name="server.output" value="@{server.output}"/>
        <param name="common.jar.path" value="${teamcity.internal.distrib.prep.common}/@{common.jar.name}"/>
        <param name="lib.dir" value="@{server.lib.dir}"/>
        <param name="lib.includes" value="@{server.lib.includes}"/>
      </antcall>

      <antcall target="prepare.agent.part">
        <param name="out.unpacked" value="@{out.unpacked}"/>
        <param name="name" value="@{name}"/>
        <param name="agent.output" value="@{agent.output}"/>
        <param name="common.jar.path" value="${teamcity.internal.distrib.prep.common}/@{common.jar.name}"/>
      </antcall>

      <!-- copy additional agent files -->
      <mkdir dir="${teamcity.internal.distrib.prep.agent.jars}/@{name}" />
      <copy todir="${teamcity.internal.distrib.prep.agent.jars}/@{name}">
        <fileset dir="${basedir}" excludes="**"/>
        <agent-additional-files/>
      </copy>

      <antcall target="pack.agent.part">
        <param name="out.unpacked" value="@{out.unpacked}"/>
        <param name="name" value="@{name}"/>
      </antcall>

      <!-- copy teamcity-plugin.xml -->
      <antcall target="prepare.plugin.descriptor.file">
        <param name="source" value="@{plugin.descriptor.file}"/>
        <param name="dest" value="@{out.unpacked}/teamcity-plugin.xml"/>
        <param name="plugin.version" value="@{plugin.version}"/>
        <param name="plugin.vendor" value="@{plugin.vendor}"/>
        <param name="plugin.vendor.url" value="@{plugin.vendor.url}"/>
      </antcall>

      <!-- copy additional server plugin files -->
      <copy todir="@{out.unpacked}">
        <fileset dir="${basedir}" excludes="**"/>
        <server-additional-files/>
      </copy>

      <!-- clean -->
      <echo message="Cleaning..."/>
      <delete dir="${teamcity.internal.distrib.prep}" quiet="true"/>

      <!-- package in zip -->
      <echo message="Packaging zip..."/>
      <delete file="@{out}/@{name}.zip" quiet="true"/>
      <zip destfile="@{out}/@{name}.zip">
        <fileset dir="@{out.unpacked}"/>
      </zip>
      <echo message="To install the plugin, place '@{out}\@{name}.zip' into '.BuildServer/plugins' directory"/>

    </sequential>
  </macrodef>

  <target name="check.teamcitydistribution" description="checks whether TeamCity distribution ready to be used by IDEA-generated build">
    <check.property name="path.variable.teamcitydistribution"
                    fail-message="Please define 'teamcity.distribution' or 'path.variable.teamcitydistribution' property (e.g. in build.properties file). The property should point to unpacked TeamCity .tar.gz or .exe distribution."
        />

    <condition property="teamcity.distribution.not.present">
      <not>
        <and>
          <available file="${path.variable.teamcitydistribution}/webapps/ROOT/WEB-INF/lib"/>
        </and>
      </not>
    </condition>
    <fail if="teamcity.distribution.not.present"
          message="Cannot find TeamCity distribution at path '${path.variable.teamcitydistribution}'. The property 'teamcity.distribution' or 'path.variable.teamcitydistribution' should point to unpacked TeamCity .tar.gz or .exe distribution."/>
    <echo message="Using ${path.variable.teamcitydistribution} as TeamCity distribution" />
  </target>

  <macrodef name="deploy.teamcity.plugin">
    <attribute name="name"/>
    <attribute name="teamcity.data.path" default="${user.home}/.BuildServer" description="path to .BuildServer"/>
    <attribute name="out" default="${teamcity.internal.default.out}" description="directory storing prepared plugin zip"/>

    <sequential>
      <copy file="@{out}/@{name}.zip" todir="@{teamcity.data.path}/plugins" failonerror="true"/>
    </sequential>
  </macrodef>

  <macrodef name="undeploy.teamcity.plugin">
    <attribute name="name"/>
    <attribute name="teamcity.data.path" default="${user.home}/.BuildServer" description="path to .BuildServer"/>

    <sequential>
      <delete file="@{teamcity.data.path}/plugins/@{name}.zip" quiet="true"/>
    </sequential>
  </macrodef>


  <macrodef name="unpack.teamcity" description="TeamCity distribution unpacking">
    <attribute name="distribution.dir" default="${basedir}/teamcity-dist"
               description="path to put unpacked TeamCity distribution into. Warning: the content of the directory will be deleted!"/>
    <attribute name="teamcity.data.path" default="${user.home}/.BuildServer" description="path to .BuildServer"/>
    <attribute name="teamcity.tar.gz-location" default="${basedir}" description="path where TeamCity-NNNN.tar.gz file resides"/>

    <sequential>
      <delete dir="@{distribution.dir}" quiet="true"/>
      <mkdir dir="@{distribution.dir}"/>

      <!-- TODO: issue error if there are several matching files -->

      <untar compression="gzip" dest="@{distribution.dir}">
        <fileset dir="@{teamcity.tar.gz-location}">
          <include name="*.tar.gz"/>
        </fileset>
      </untar>

      <move todir="@{distribution.dir}">
        <fileset dir="@{distribution.dir}\TeamCity">
          <include name="**"/>
        </fileset>
      </move>
    </sequential>
  </macrodef>


  <!--   ** Implementation **   -->

  <macrodef name="check.property">
    <attribute name="name"/>
    <attribute name="fail-message" default=""/>
    <attribute name="check-path" default=""/>
    <sequential>
      <condition property="is.configured.@{name}">
        <not>
          <and>
            <isset property="@{name}"/>
            <length string="${@{name}}" when="greater" length="0"/>
          </and>
        </not>
      </condition>
      <fail if="is.configured.@{name}"
            message="Property '@{name}' not defined. @{fail-message}"/>
    </sequential>
  </macrodef>


  <target name="prepare.common.part" if="common.needed">
    <jar destfile="${common.jar.path}">
      <fileset dir="${common.output}"/>
    </jar>
  </target>


  <target name="prepare.server.part" if="server.needed">
    <mkdir dir="${out.unpacked}/server"/>

    <jar destfile="${out.unpacked}/server/${name}.jar">
      <fileset dir="${server.output}"/>
    </jar>

    <copy todir="${out.unpacked}/server" failonerror="false">
      <fileset file="${common.jar.path}"/>
      <fileset dir="${lib.dir}" includes="${lib.includes}"/>
    </copy>
  </target>

  <target name="pack.agent.part" if="agent.needed">
    <zip destfile="${out.unpacked}/agent/${name}.zip">
      <fileset dir="${teamcity.internal.distrib.prep.agent.jars}"/>
    </zip>
  </target>

  <target name="prepare.agent.part" if="agent.needed">
    <!-- prepare.agent.part -->
    <mkdir dir="${teamcity.internal.distrib.prep.agent}"/>
    <mkdir dir="${teamcity.internal.distrib.prep.agent.jars}/${name}/lib"/>
    <mkdir dir="${out.unpacked}/agent"/>

    <jar destfile="${teamcity.internal.distrib.prep.agent.jars}/${name}/lib/${name}.jar">
      <fileset dir="${agent.output}"/>
    </jar>

    <copy todir="${teamcity.internal.distrib.prep.agent.jars}/${name}/lib" failonerror="false">
      <fileset file="${common.jar.path}"/>
    </copy>
  </target>

  <target name="prepare.plugin.descriptor.file" if="plugin.descriptor.file.needed">
    <echo message="Copying plugin descriptor file '${source}' to '${dest}'."/>
    <copy file="${source}" tofile="${dest}" failonerror="false"/>

    <echo message="Replacing '@Plugin_Version@', '@Plugin_Vendor@' and '@Plugin_Vendor_Url@' in the copied plugin descriptor file."/>
    <replace file="${dest}">
      <replacefilter token="@version@" value="${plugin.version}"/>
      <replacefilter token="@Plugin_Version@" value="${plugin.version}"/>
      <replacefilter token="@Plugin_Vendor@" value="${plugin.vendor}"/>
      <replacefilter token="@Plugin_Vendor_Url@" value="${plugin.vendor.url}"/>
    </replace>
  </target>

  <target name="check.already.defined">
    <condition property="already.defined">
      <isset property="teamcity.internal.distrib.prep"/>
    </condition>
    <fail if="already.defined"
          message="It seems you are trying to use the script several times in the same context. This script does not support such use. Please call this script as a separate Ant process, via 'ant' task."/>
  </target>

</project>