Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

API Moved build tools to new silverstripe-buildtools module

  • Loading branch information...
commit 8b6864468b3185c02f2aa4a9882a079a5e5673ff 1 parent 8e074cd
Ingo Schommer chillu authored
6 build.properties.default
View
@@ -1,6 +0,0 @@
-getlocalization.framework.project = sapphire
-getlocalization.framework.user = silverstripe
-getlocalization.framework.password =
-getlocalization.cms.project = silverstripe_cms
-getlocalization.cms.user = silverstripe
-getlocalization.cms.password =
504 build.xml
View
@@ -1,124 +1,23 @@
<?xml version="1.0" encoding="UTF-8"?>
-<!-- Installation instructions:
-
+<!--
+# phing installation
sudo pear channel-discover pear.phing.info
sudo pear install phing/phing
sudo pear install pear/VersionControl_Git-0.4.4
-phing help
-
-->
-<project name="silverstripe-installer" default="tag" phingVersion="2.4.5">
+<project name="silverstripe-installer" default="help" phingVersion="2.4.5">
- <!-- Load in the custom tasks -->
- <taskdef name="findRepos" classname="tools.FindRepositoriesTask" classpath="${project.basedir}" />
- <taskdef name="ssmodules" classname="tools.LoadModulesTask" classpath="${project.basedir}" />
- <taskdef name="sschanglog" classname="tools.CreateChangelog" classpath="${project.basedir}" />
- <taskdef name="gitstash" classname="tools.GitStashTask" classpath="${project.basedir}" />
- <taskdef name="updateTranslationsTask" classname="tools.UpdateTranslationsTask" classpath="${project.basedir}" />
+ <!-- Install with "composer require silverstripe/buildtools" -->
+ <import file="buildtools/build.xml" optional="true" />
<property name="basedir" value="." override="true" />
- <property name="dependent-modules-file" value="dependent-modules" override="true" />
- <property name="changelog-definitions-file" value="changelog-definitions" override="true" />
- <property name="ni_build" value="false" override="true"/> <!-- Prompt if local changes would be overwritten by update -->
- <property name="changelogSort" value="type" override="true"/>
-
- <property name="archivedest" value="." />
-
- <available file="${dependent-modules-file}" property="dependent-modules-file-exists" />
- <available file="${changelog-definition-file}" property="changelog-definition-file-exists" />
-
- <!--
- =================================================================
- Helper Targets
- =================================================================
- -->
<target name="help">
- <echo>
-SilverStripe Project Build
-------------------------------------
-
-This build file contains targets to assist in creating new SilverStripe builds and releases.
-Run "phing -l" to get a full list of available targets.
-
-
-Options:
-
--Dbasedir = . (the base directory to operate on)
--Ddependent-modules-file = dependent-modules (the file of dependent modules to use when updating modules)
--Dchangelog-definitions-file = changelog-definitions (the file of changelog-definitions to use when generating the changelog)
--DchangelogSort = type (sort the changelog file by commit type)
--Dni_build = false (non-interactive build, overwrite local changes without prompting)
-
--Dmodurl (the URL of a single module to load when using add_modules)
--Dmodule (the name of the module directory to create the module in when using add_modules)
-
--Darchivename (the name of the created archive file)
--Darchivedest (the destination directory to put the archive)
-
--Dtagname (the name of the tag/branch to check out or to create as a new tag)
--DincludeBaseDir (whether or not to include the base dir in a git checkout operation)
-</echo>
- </target>
-
- <target name="_gitRepositories">
- <findRepos TargetDir="${basedir}" />
- </target>
-
- <target name="_gitBinary" description="find the git binary and set it">
- <exec command="which git" outputProperty="gitPath1" />
- </target>
-
- <target name="_tagTask" if="tagname,reponame,gitPath1"
- description="Tag a git repo with a specific tag.">
- <gittag
- repository="${reponame}"
- name="${tagname}"
- gitPath="${gitPath1}"
- force="true" /> <!-- allow overwrite of existing tags-->
- <echo msg="git tag '${tagname}' added to '${reponame}' git repository" />
- </target>
-
- <target name="_pushTask" if="reponame,gitPath1"
- description="Push all local tags">
- <ssgitpush
- repository="${reponame}"
- tags="true"
- gitPath="${gitPath1}" />
- <echo msg="pushed all tags to '${reponame}' git repository" />
- </target>
-
- <target name="_checkoutTask" if="reponame,gitPath1,tagname"
- description="Checkout the specified tag on all working copies">
- <echo msg="checking out ${reponame}"/>
- <gitstash repository="${reponame}" gitPath="${gitPath1}" />
-
- <ssgitcheckout
- repository="${reponame}"
- branchname="${tagname}"
- gitPath="${gitPath1}" />
-
- <gitstash repository="${reponame}" gitPath="${gitPath1}" pop="true" />
-
- <echo msg="checked out ${tagname} tag/branch in '${reponame}' git repository" />
- </target>
-
- <target name="_createDependentModulesFile" unless="dependent-modules-file-exists">
- <copy file="${dependent-modules-file}.default" tofile="${dependent-modules-file}" />
- </target>
-
- <target name="_createChangelogDefinitionsFile" unless="changelog-definitions-file-exists">
- <copy file="${changelog-definitions-file}.default" tofile="${changelog-definitions-file}" />
+ <phingcall target="buildtools.help" />
</target>
- <!--
- =================================================================
- Main Targets
- =================================================================
- -->
-
<target name="phpunit"
description="Runs unit tests as defined through phpunix.xml. Requires the 'phpunit' binary.">
<if>
@@ -154,395 +53,4 @@ Options:
</target>
- <target name="tag" if="basedir"
- description="Creates a new git tag in all the nested working copies (optionally pushes the created tag)"
- depends="_gitRepositories,_gitBinary">
- <if>
- <isset property="tagname"/>
- <then>
- <echo msg="Using '${tagname}' tag"/>
- </then>
- <else>
- <input propertyName="tagname" promptChar=":">Please enter the name of the tag</input>
- <echo msg="Using '${tagname}' tag"/>
- </else>
- </if>
-
- <!-- find all git repos and run the tagTask on them -->
- <foreach list="${GitReposList}" param="reponame" target="_tagTask" />
-
- <input propertyName="pushToOrigin" defaultValue="no" validArgs="yes,no" promptChar=":">Push local tags to origin?</input>
- <if>
- <equals arg1="${pushToOrigin}" arg2="yes" casesensitive="false" trim="true"/>
- <then>
- <phingCall target="pushtags" />
- </then>
- </if>
- </target>
-
- <target name="pushtags" if="basedir"
- description="Pushes all local tags to their respective origin repositories"
- depends="_gitRepositories,_gitBinary">
- <foreach list="${GitReposList}" param="reponame" target="_pushTask" />
- </target>
-
- <target name="checkout" if="basedir"
- description="Switches all working copies to the specified tag or branch"
- depends="_gitRepositories,_gitBinary">
- <if>
- <isset property="tagname"/>
- <then>
- <echo msg="Using '${tagname}' tag/branch"/>
- </then>
- <else>
- <input propertyName="tagname" defaultValue="HEAD" promptChar=":">Please enter the name of the tag or branch you wish to checkout</input>
- <echo msg="Using '${tagname}' tag/branch"/>
- </else>
- </if>
-
- <if>
- <isset property="includeBaseDir"/>
- <then>
- <echo msg="Including BaseDir in checkout: ${includeBaseDir}"/>
- </then>
- <else>
- <input propertyName="includeBaseDir" validArgs="yes,no" promptChar=":">Include the base dir '${basedir}' in checkout?</input>
- <echo msg="Including BaseDir in checkout: ${includeBaseDir}"/>
- </else>
- </if>
-
- <if>
- <isfalse value="${includeBaseDir}"/>
- <then><!-- get a list of git repos without the base dir -->
- <findRepos TargetDir="${basedir}" includeTarget="${includeBaseDir}"/>
- </then>
- </if>
-
- <!-- find all git repos and run the checkoutTask on them -->
- <foreach list="${GitReposList}" param="reponame" target="_checkoutTask" />
- </target>
-
- <target name="archive" if="basedir" description="Creates a gzip archive from the current folder (removes any version control files)">
-
- <if>
- <not><isset property="version"/></not>
- <then><input propertyName="version" defaultValue="x.y.z" promptChar=":">Please choose a version</input></then>
- </if>
-
- <if>
- <isset property="archivename"/>
- <then>
- <echo msg="Creating '${archivename}' archive"/>
- </then>
- <else>
- <property name="archivename" value="SilverStripe" />
- </else>
- </if>
-
- <!-- Copy into a new folder, and tar the whole folder in order to avoid toplevel extracts -->
- <php function="sys_get_temp_dir" returnProperty="systmp" />
-
- <property name="tmp" value="${systmp}/archiveTask/" />
- <delete dir="${tmp}" failonerror="false" quiet="true" />
-
- <copy todir="${tmp}/${archivename}-cms-v${version}">
- <fileset dir="${basedir}">
- <include name="**/**" />
- <exclude name="assets/**" />
- <exclude name="mysite/local.conf.php" />
- <exclude name="mysite/db.conf.php" />
- <exclude name="**/*.log" />
- <exclude name="**/.svn/**" />
- <exclude name="**/.git/**" />
- <exclude name="**/.project" /> <!-- remove eclipse configuration file -->
- <exclude name="**/.buildpath" />
- <exclude name="**/.settings" />
- <exclude name="**/.idea/**" /> <!-- remove phpstorm configuration file -->
- <exclude name="tools/**" />
- <exclude name="**/tests/**" />
- <exclude name="cms/docs/**" />
- <exclude name="framework/docs/**" />
- <exclude name="build.xml" />
- <exclude name="dependent-modules*" />
- <exclude name="changelog-definitions*" />
- <exclude name="_ss_environment.php" />
- <exclude name="*.tar.gz" />
- <exclude name="*.zip" />
- <exclude name="behat.yml" />
- <exclude name="composer.*" />
- </fileset>
- <fileset dir="${basedir}">
- <include name="assets/Uploads" />
- <include name="assets/.htaccess" />
- <include name="assets/web.config" />
- </fileset>
- </copy>
- <copy todir="${tmp}/${archivename}-framework-v${version}">
- <fileset dir="${basedir}">
- <include name="**/**" />
- <exclude name="assets/**" />
- <exclude name="mysite/local.conf.php" />
- <exclude name="mysite/db.conf.php" />
- <exclude name="**/*.log" />
- <exclude name="**/.svn/**" />
- <exclude name="**/.git/**" />
- <exclude name="**/.project" /> <!-- remove eclipse configuration file -->
- <exclude name="**/.buildpath" />
- <exclude name="**/.settings" />
- <exclude name="**/.idea/**" /> <!-- remove phpstorm configuration file -->
- <exclude name="tools/**" />
- <exclude name="**/tests/**" />
- <exclude name="cms/docs/**" />
- <exclude name="framework/docs/**" />
- <exclude name="build.xml" />
- <exclude name="dependent-modules*" />
- <exclude name="changelog-definitions*" />
- <exclude name="_ss_environment.php" />
- <exclude name="*.tar.gz" />
- <exclude name="*.zip" />
- <exclude name="behat.yml" />
- <exclude name="composer.*" />
- <exclude name="cms/**" />
- </fileset>
- <fileset dir="${basedir}">
- <include name="assets/Uploads" />
- <include name="assets/.htaccess" />
- <include name="assets/web.config" />
- </fileset>
- </copy>
-
-
- <!-- Write version info to the core folders (shouldn't be in version control) -->
- <echo msg="${version}" file="${tmp}/${archivename}-cms-v${version}/framework/silverstripe_version" />
- <echo msg="${version}" file="${tmp}/${archivename}-cms-v${version}/cms/silverstripe_version" />
- <echo msg="${version}" file="${tmp}/${archivename}-cms-v${version}/framework/silverstripe_version" />
-
- <!-- remove any pre-existing archives -->
- <delete file="${archivedest}/${archivename}-cms-v${version}.tar.gz" failonerror="false" quiet="true" />
- <delete file="${archivedest}/${archivename}-cms-v${version}.zip" failonerror="false" quiet="true" />
- <delete file="${archivedest}/${archivename}-framework-v${version}.tar.gz" failonerror="false" quiet="true" />
- <delete file="${archivedest}/${archivename}-framework-v${version}.zip" failonerror="false" quiet="true" />
-
- <!-- create tar archive - CMS -->
- <tar destfile="${archivedest}/${archivename}-cms-v${version}.tar.gz" compression="gzip">
- <fileset dir="${tmp}">
- <include name="${archivename}-cms-v${version}/**" />
- </fileset>
- </tar>
-
- <!-- create zip archive - CMS -->
- <zip destfile="${archivedest}/${archivename}-cms-v${version}.zip">
- <fileset dir="${tmp}">
- <include name="${archivename}-cms-v${version}/**" />
- </fileset>
- </zip>
-
- <!-- create tar archive - Framework -->
- <tar destfile="${archivedest}/${archivename}-framework-v${version}.tar.gz" compression="gzip">
- <fileset dir="${tmp}">
- <include name="${archivename}-framework-v${version}/**" />
- </fileset>
- </tar>
-
- <!-- create zip archive - Framework -->
- <zip destfile="${archivedest}/${archivename}-framework-v${version}.zip">
- <fileset dir="${tmp}">
- <include name="${archivename}-framework-v${version}/**" />
- </fileset>
- </zip>
-
- <!-- clear the temp file -->
- <delete file="${tmp}" failonerror="false" quiet="true" />
-
- <echo msg="Created archive: ${archivedest}/${archivename}-cms-v${version}.tar.gz" />
- <echo msg="##teamcity[publishArtifacts '${archivename}-cms-v${version}.tar.gz']" />
-
- <echo msg="Created archive: ${archivedest}/${archivename}-cms-v${version}.zip" />
- <echo msg="##teamcity[publishArtifacts '${archivename}-cms-v${version}.zip']" />
-
- <echo msg="Created archive: ${archivedest}/${archivename}-framework-v${version}.tar.gz" />
- <echo msg="##teamcity[publishArtifacts '${archivename}-framework-v${version}.tar.gz']" />
-
- <echo msg="Created archive: ${archivedest}/${archivename}-framework-v${version}.tar.gz" />
- <echo msg="##teamcity[publishArtifacts '${archivename}-framework-v${version}.zip']" />
- </target>
-
- <target name="upload-release"
- description="Uploads archives previously created through 'ping archive' to a public webhost, and notifies a group of people of the new release. Requires working public key auth on the release destination.">
- <if>
- <not><isset property="version"/></not>
- <then><input propertyName="version" defaultValue="x.y.z" promptChar=":">Please choose a version</input></then>
- </if>
-
- <property name="release_dest" value="qa-servers@homer:/sites/ssorg-v2/www/assets/releases/" />
- <property name="release_url" value="http://silverstripe.org/assets/releases/" />
- <property name="release_notify_list" value="all@silverstripe.com,everyone@silverstripe.com.au" />
-
- <exec command="scp -P 2222 SilverStripe-cms-v${version}.tar.gz SilverStripe-framework-v${version}.tar.gz SilverStripe-cms-v${version}.zip SilverStripe-framework-v${version}.zip ${release_dest}" checkreturn="true" logoutput="true" />
-
- <mail from="reports@silverstripe.com" tolist="${release_notify_list}" subject="SilverStripe ${version} has been uploaded">A new SilverStripe release is ready, and although it hasn't been publicly announced yet, is available at the following locations:
-
-${release_url}SilverStripe-cms-v${version}.tar.gz
-${release_url}SilverStripe-framework-v${version}.tar.gz
-${release_url}SilverStripe-cms-v${version}.zip
-${release_url}SilverStripe-framework-v${version}.zip
-
-Thanks,
-Your friendly automated release script.
-</mail>
-
- </target>
-
- <target name="upload-nightly"
- description="Uploads archives previously created through 'phing archive' to a public webhost">
- <property name="nightly_dest" value="qa-servers@homer:/sites/ssorg-v2/www/assets/nightlies/" />
- <exec command="scp -P 2222 SilverStripe-*.tar.gz ${nightly_dest}" />
- <exec command="scp -P 2222 SilverStripe-*.zip ${nightly_dest}" />
- </target>
-
-
-
- <target name="update_modules"
- description="Checks out repositories defined in the 'dependent-modules' file into the current directory"
- depends="_createDependentModulesFile">
- <ssmodules file="${basedir}/${dependent-modules-file}" noninteractive="${ni_build}"/>
- </target>
-
- <target name="add_module" description="Checks out a module at a specific repository URL. Usage: phing add_module -Dmodule=blog -Dmodurl=http://path/to/svn.">
- <if>
- <isset property="modurl"/>
- <then>
- <echo msg="Downloading module from '${modurl}'"/>
- </then>
- <else>
- <input propertyName="modurl" promptChar=":">Please enter the module's git or svn URL</input>
- <echo msg="Downloading module from '${modurl}'"/>
- </else>
- </if>
-
- <if>
- <isset property="module"/>
- <then>
- <echo msg="Creating new '${module}' module"/>
- </then>
- <else>
- <input propertyName="module" promptChar=":">Please enter the module's name (i.e. the folder to module should be created in)</input>
- <echo msg="Creating new '${module}' module"/>
- </else>
- </if>
-
- <ssmodules name="${module}" url="${modurl}" />
- </target>
-
- <target name="changelog"
- description="Create a changelog.md file from the repositories specified in the 'changelog-definitions' file"
- depends="_createChangelogDefinitionsFile"
- if="basedir,changelogSort">
- <sschanglog definitions="${changelog-definitions-file}" baseDir="${basedir}" sort="${changelogSort}"/>
- <echo msg="${changelogOutput}" />
- </target>
-
- <target name="translations-staging-setup">
- <propertyprompt propertyName="module"
- promptText="Module name?"
- useExistingValue="true"
- defaultValue="framework" />
- <propertyprompt propertyName="getlocalization.${module}.project"
- promptText="getlocalization project"
- useExistingValue="true"
- defaultValue="sapphire" />
- <propertyprompt propertyName="getlocalization.${module}.user"
- promptText="getlocalization username"
- useExistingValue="true"
- defaultValue="silverstripe" />
- <propertyprompt propertyName="getlocalization.${module}.password"
- promptText="getlocalization password"
- useExistingValue="true" />
-
- <exec command="git checkout master" dir="${module}" checkreturn="true" />
- <exec command="git fetch origin" dir="${module}" checkreturn="true" />
- <exec command="git branch --force --track translation-staging origin/translation-staging" dir="${module}" checkreturn="true" />
- <exec command="git checkout translation-staging" dir="${module}" checkreturn="true" />
- </target>
-
- <target name="translations-staging-teardown">
- <exec command="git checkout master" dir="${module}" checkreturn="true" />
- </target>
-
- <target name="translations-update-git-masterfile"
- description="Collect translation on a module, commit them into a specialized branch and push to the origin repository."
- depends="translations-staging-setup">
- <exec command="git merge --strategy recursive -X theirs origin/master" dir="${module}" checkreturn="true" />
- <exec command="php framework/cli-script.php dev/tasks/i18nTextCollectorTask module=${module}" passthru="true" checkreturn="true" />
- <exec command="git status --short" dir="${module}" outputProperty="git.status.${module}" />
- <if>
- <istrue value="${git.status.${module}}" />
- <then>
- <exec command="git add lang/*" dir="${module}" passthru="true" checkreturn="true" />
- <exec command="git commit -m 'MINOR Updated translations master'" dir="${module}" passthru="true" checkreturn="true" />
- <exec command="git merge origin/master" dir="${module}" checkreturn="true" />
- </then>
- </if>
- </target>
-
- <target name="translations-update-gl-masterfile"
- description="Pushes translation master files to getlocalization.com"
- depends="translations-staging-setup">
- <exec command="curl --fail --form file=@${module}/lang/en.yml --form name='lang/en.yml' --user ${getlocalization.${module}.user}:${getlocalization.${module}.password} https://api.getlocalization.com/${getlocalization.${module}.project}/api/update-master/" passthru="true" checkreturn="true" />
- <exec command="git checkout master" dir="${module}" checkreturn="true" />
- </target>
-
- <target name="translations-update-gl-contribs" description="Update translations in working copy from getlocalization.com, and commit changes to a specialized branch and push to origin repository. Note: The API requests can take a couple of minutes."
- depends="translations-staging-setup">
- <exec command="git stash" dir="${module}" />
- <updateTranslationsTask
- glProductName="${getlocalization.${module}.project}"
- glUser="${getlocalization.${module}.user}"
- glPassword="${getlocalization.${module}.password}"
- modulePath="${module}"
- />
- <exec command="git status --short" dir="${module}" outputProperty="git.status.${module}" />
- <if>
- <istrue value="${git.status.${module}}" />
- <then>
- <exec command="git add lang/*" dir="${module}" passthru="true" checkreturn="true" />
- <exec command="git add javascript/lang/*" dir="${module}" passthru="true" checkreturn="true" />
- <exec command="git commit -m 'MINOR Updated translations'" dir="${module}" passthru="true" checkreturn="true" />
- <exec command="git push origin translation-staging" dir="${module}" checkreturn="true" />
- </then>
- </if>
- <exec command="git checkout master" dir="${module}" checkreturn="true" />
- <exec command="git stash pop" dir="${module}" />
- </target>
-
- <target name="translations-mergeback"
- description="Copies changes from the translation staging branch back to the current branch. Doesn't use 'git merge' because the staging branch works on master. Usage: phing -Dmodule=[module] translations-mergeback">
-
- <php function="sys_get_temp_dir" returnProperty="systmp" />
- <property name="tmp" value="${systmp}/translationsMergebackTask/" />
- <exec command="git fetch origin" dir="${module}" checkreturn="true" />
- <exec command="git branch --force --track translation-staging origin/translation-staging" dir="${module}" checkreturn="true" />
- <exec command="git checkout translation-staging" dir="${module}" checkreturn="true" />
- <copy todir="${tmp}/${module}">
- <fileset dir="${module}/lang" />
- </copy>
- <exec command="git checkout 3.0" dir="${module}" checkreturn="true" />
- <copy todir="${module}/lang" overwrite="true">
- <fileset dir="${tmp}/${module}/" />
- </copy>
-
- <exec command="git add lang/*" dir="${module}" passthru="true" checkreturn="true" />
- <exec command="git commit -m 'Updated translations'" dir="${module}" passthru="true" checkreturn="true" />
-
- <echo msg="Done! Please review the commit before pushing it, ensure no malicious code has been injected." />
-
- </target>
-
- <target name="translations-sync"
- description="Wrapper task to handle updating translations and master files, using the getlocalization.com API, committing to a specialized branch in the working copy and pushing to the origin repository. ">
- <foreach list="framework,cms" param="module" target="translations-update-git-masterfile" />
- <foreach list="framework,cms" param="module" target="translations-update-gl-masterfile" />
- <foreach list="framework,cms" param="module" target="translations-update-gl-contribs" />
- </target>
-
</project>
12 changelog-definitions.default
View
@@ -1,12 +0,0 @@
-# Use this file to define which git repositories the "phing changlog" task will include when generating
-# a changelog.md file.
-#
-# Any paths not mentioned here will be excluded from the changelog. The script will ignore any paths that are not git
-# repositories, or are otherwise invalid.
-#
-# Leave the <from-commit> <to-commit> fields blank to include all commits.
-#
-# <path> <from-commit> <to-commit>
-. 2.4.4-rc1 2.4.5
-framework 2.4.4-rc1 2.4.5
-cms 2.4.4-rc1 2.4.5
38 dependent-modules.default
View
@@ -1,38 +0,0 @@
-# File format
-# -----------
-# Each line represents one dependent module.
-#
-# local_module_folder[:git_branch|:svn_revision_number] repository_url [run_dev_build=true] [local]
-#
-# Note that the local_module_folder can contain subfolders delimited via '/' characters
-# A specific git branch or SVN revision can be added in by specifying after the local
-# foldername, separated by a colon. By default, the 'master' branch of a git repository is used.
-#
-# Using the "piston" flag will strip versioning information, but keep metadata in the working copy
-# to update from version control later on, and merge in potential local changes.
-# See http://piston.rubyforge.org for details.
-#
-# It is recommended to have sqlite3 and cms first with [run_dev_build] set to "false".
-# Having this set to 'false' prevents the execution of the dev/build process, meaning it can be
-# deferred until all dependencies are in place, specifically the framework module. List
-# all additional modules after that.
-#
-# Examples
-#
-# frontend-editing:development git://github.com/nyeholt/silverstripe-frontend-editing.git
-# themes/mytheme git://local.server/themes/mytheme.git false
-
-
-cms:3.0 git://github.com/silverstripe/silverstripe-cms.git
-framework:3.0 git://github.com/silverstripe/sapphire.git
-themes/simple:master git://github.com/silverstripe-themes/silverstripe-simple.git
-
-
-# The following are the some other modules you might like to import
-
-# sqlite3:master git://github.com/silverstripe-labs/silverstripe-sqlite3.git
-# userforms:master:0.3.0 git://github.com/silverstripe/silverstripe-userforms.git
-# securefiles http://svn.polemic.net.nz/silverstripe/modules/SecureFiles/tags/0.30/
-
-
-
301 tools/CreateChangelog.php
View
@@ -1,301 +0,0 @@
-<?php
-include_once dirname(__FILE__) . '/SilverStripeBuildTask.php';
-
-/**
- * Returns changelogs for the git (or svn) repositories specified in the changelog-definitions file
- *
- * @author jseide
- *
- */
-class CreateChangelog extends SilverStripeBuildTask {
-
- protected $definitions = null;
- protected $baseDir = null;
- protected $sort = 'type';
- protected $filter = null;
-
- /**
- * Order of the array keys determines order of the lists.
- */
- public $types = array(
- 'API Changes' => array('/^(APICHANGE|API-CHANGE|API CHANGE|API)\s?:?/i'),
- 'Features and Enhancements' => array('/^(ENHANCEMENT|ENHNACEMENT|FEATURE|NEW)\s?:?/i'),
- 'Bugfixes' => array('/^(BUGFIX|BUGFUX|BUG|FIX)\s?:?/i','/^(BUG FIX)\s?:?/i'),
- 'Other' => array('/^(MINOR)\s?:?/i')
- );
-
- public $commitUrls = array(
- '.' => 'https://github.com/silverstripe/silverstripe-installer/commit/%s',
- 'framework' => 'https://github.com/silverstripe/sapphire/commit/%s',
- 'cms' => 'https://github.com/silverstripe/silverstripe-cms/commit/%s',
- 'themes/simple' => 'https://github.com/silverstripe-themes/silverstripe-simple/commit/%s',
- );
-
- public $ignoreRules = array(
- '/^Merge/',
- '/^Blocked revisions/',
- '/^Initialized merge tracking /',
- '/^Created (branches|tags)/',
- '/^NOTFORMERGE/',
- '/^\s*$/'
- );
-
- public function setDefinitions($definitions) {
- $this->definitions = $definitions;
- }
-
- public function setBaseDir($base) {
- $this->baseDir = realpath($base);
- }
-
- public function setSort($sort) {
- $this->sort = $sort;
- }
-
- public function setFilter($filter) {
- $this->filter = $filter;
- }
-
- /**
- * Checks is a folder is a version control repository
- */
- protected function isRepository($dir_path, $filter) {
- $dir = $dir_path;
-
- if (file_exists($dir)) {
- // open this directory
- if ($handle = opendir($dir)) {
-
- // get each file
- while (false !== ($file = readdir($handle))) {
- if ($file == $filter && is_dir($file)) {
- if ($filter == '.git') { //extra check for git repos
- if (file_exists($dir.'/'.$file.'/HEAD')) {
- return true; //$dir is a git repository
- }
- } else { //return true for .svn repos
- return true;
- }
- }
- }
-
- echo "Folder '$dir' is not a $filter repository\n";
- }
- } else {
- echo "Folder '$dir' does not exist\n";
- }
-
- return false;
- }
-
- protected function isGitRepo($dir) {
- return $this->isRepository($dir, '.git');
- }
-
- protected function isSvnRepo($dir) {
- return $this->isRepository($dir, '.svn');
- }
-
- protected function gitLog($path, $from = null, $to = null) {
- //set the from -> to range, depending on which os these have been set
- if ($from && $to) $range = " $from..$to";
- elseif ($from) $range = " $from..HEAD";
- else $range = "";
-
- $this->log(sprintf('Changing to directory "%s"', $path), Project::MSG_INFO);
-
- chdir("$this->baseDir/$path"); //switch to the module's path
-
- // Internal serialization format, ideally this would be JSON but we can't escape characters in git logs.
- $log = $this->exec("git log --pretty=tformat:\"message:%s|||author:%aN|||abbrevhash:%h|||hash:%H|||date:%ad|||timestamp:%at\" --date=short {$range}", true);
-
- chdir($this->baseDir); //switch the working directory back
-
- return $log;
- }
-
- /** Sort by the first two letters of the commit string.
- * Put any commits without BUGFIX, ENHANCEMENT, etc. at the end of the list
- */
- function sortByType($commits) {
- $groupedByType = array();
-
- // sort by timestamp
- usort($commits, function($a, $b) {
- if($a['timestamp'] == $b['timestamp']) return 0;
- else return ($a['timestamp'] > $b['timestamp']) ? -1 : 1;
- });
-
- foreach($commits as $k => $commit) {
- // TODO
- // skip ignored revisions
- // if(in_array($commit['changeset'], $this->ignorerevisions)) continue;
-
- // Remove email addresses
- $commit['message'] = preg_replace('/(<?[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}>?)/mi', '', $commit['message']);
-
- // Condense git-style "From:" messages (remove preceding newline)
- if(preg_match('/^From\:/mi', $commit['message'])) {
- $commit['message'] = preg_replace('/\n\n^(From\:)/mi', ' $1', $commit['message']);
- }
-
- $matched = false;
- foreach($this->types as $name => $rules) {
- if(!isset($groupedByType[$name])) $groupedByType[$name] = array();
- foreach($rules as $rule) {
- if(!$matched && preg_match($rule, $commit['message'], $matches)) {
- // @todo The fallback rule on other can't be replaced, as it doesn't match a full prefix
- $commit['message'] = trim(preg_replace($rule, '', $commit['message']));
- $groupedByType[$name][] = $commit;
- $matched = true;
- }
- }
- }
- if(!$matched) {
- if(!isset($groupedByType['Other'])) $groupedByType['Other'] = array();
- $groupedByType['Other'][] = $commit;
- }
-
- }
-
- // // remove all categories which should be ignored
- // if($this->categoryIgnore) foreach($this->categoryIgnore as $categoryIgnore) {
- // if(isset($groupedByType[$categoryIgnore])) unset($groupedByType[$categoryIgnore]);
- // }
-
- return $groupedByType;
- }
-
- function commitToArray($commit) {
- $arr = array();
- $parts = explode('|||', $commit);
- foreach($parts as $part) {
- preg_match('/([^:]*)\:(.*)/', $part, $matches);
- $arr[$matches[1]] = $matches[2];
- }
-
- return $arr;
- }
-
- static function isupper($i) {
- return (strtoupper($i) === $i);
- }
- static function islower($i) {
- return (strtolower($i) === $i);
- }
-
- public function main() {
- error_reporting(E_ALL);
-
- chdir($this->baseDir); //change current working directory
-
- //parse the definitions file
- $items = file($this->definitions);
- $repos = array(); //git (or svn) repos to scan
- foreach ($items as $item) {
- $item = trim($item);
- if (strpos($item, '#') === 0) {
- continue;
- }
-
- $bits = preg_split('/\s+/', $item);
-
- if (count($bits) == 1) {
- $repos[$bits[0]] = "";
- } elseif (count($bits) == 2) {
- $repos[$bits[0]] = array($bits[1], null); //framework => array(from => HEAD)
- } elseif (count($bits) == 3) {
- $repos[$bits[0]] = array($bits[1],$bits[2]); //framework => array(from => to)
- } else {
- continue;
- }
- }
-
- //check all the paths are valid git repos
- $gitRepos = array();
- $svnRepos = array();
- foreach($repos as $path => $range) {
- if ($this->isGitRepo($path)) $gitRepos[$path] = $range; //add all git repos to a special array
- //TODO: for svn support use the isSvnRepo() method to add repos to the svnRepos array
- }
-
- //run git log
- $log = array();
- foreach($gitRepos as $path => $range) {
- $logForPath = array();
- if (!empty($range)) {
- $from = (isset($range[0])) ? $range[0] : null;
- $to = (isset($range[1])) ? $range[1] : null;
- $logForPath = explode("\n", $this->gitLog($path, $from, $to));
- } else {
- $logForPath = explode("\n", $this->gitLog($path));
- }
- foreach($logForPath as $commit) {
- if(!$commit) continue;
- $commitArr = $this->commitToArray($commit);
- $commitArr['path'] = $path;
- // Avoid duplicates by keying on hash
- $log[$commitArr['hash']] = $commitArr;
- }
- }
-
- // Remove ignored commits
- foreach($log as $k => $commit) {
- $ignore = false;
- foreach($this->ignoreRules as $ignoreRule) {
- if(preg_match($ignoreRule, $commit['message'])) {
- unset($log[$k]);
- continue;
- }
- }
- }
-
- //sort the output (based on params), grouping
- if ($this->sort == 'type') {
- $groupedLog = $this->sortByType($log);
- } else {
- //leave as sorted by default order
- $groupedLog = array('All' => $log);
- }
-
- //filter out commits we don't want
- // if ($this->filter) {
- // foreach($groupedLog as $key => $item) {
- // if (preg_match($this->filter, $item)) unset($groupedLog[$key]);
- // }
- // }
-
- //convert to string
- //and generate markdown (add list to beginning of each item)
- $output = "\n";
- foreach($groupedLog as $groupName => $commits) {
- if(!$commits) continue;
-
- $output .= "\n### $groupName\n\n";
-
- foreach($commits as $commit) {
- if(isset($this->commitUrls[$commit['path']])) {
- $hash = sprintf('[%s](%s)',
- $commit['abbrevhash'],
- sprintf($this->commitUrls[$commit['path']], $commit['abbrevhash'])
- );
- } else {
- $hash = sprintf('[%s]', $commit['abbrevhash']);
- }
- $commitStr = sprintf('%s %s %s (%s)',
- $commit['date'],
- $hash,
- // Avoid rendering HTML in markdown
- str_replace(array('<', '>'), array('&lt;', '&gt;'), $commit['message']),
- $commit['author']
- );
- // $commitStr = sprintf($this->exec("git log --pretty=tformat:\"%s\" --date=short {$hash}^..{$hash}", true), $this->gitLogFormat);
- $output .= " * $commitStr\n";
- }
- }
-
- $this->project->setProperty('changelogOutput',$output);
- }
-}
-
-?>
77 tools/FindRepositoriesTask.php
View
@@ -1,77 +0,0 @@
-<?php
-
-/**
- * Scans a folder and its subfolders and returns all the git repositories contained within
- * @author jseide
- *
- */
-class FindRepositoriesTask extends Task {
-
- private $targetDir = null;
- private $includeTarget = true;
-
-
- public function setTargetDir($targetDir) {
- $this->targetDir = $targetDir;
- }
-
- public function setIncludeTarget($includeTarget) {
- $this->includeTarget = $includeTarget;
- }
-
- /**
- * Recursively lists a folder and includes only those directories that have the filter parameter as a sub-item
- */
- protected function recursiveListDirFilter($dir, &$result, $filter = '.git') {
- $dir = realpath($dir);
-
- // open this directory
- if ($handle = opendir($dir)) {
-
- // get each git entry
- while (false !== ($file = readdir($handle))) {
- if ($file == "." || $file == "..") continue;
- //var_dump($file);
- if ($file == '.git' && is_dir($file)) {
- if (file_exists($dir.'/'.$file.'/HEAD')) {
- $result[] = $dir; //$dir is a git repository
- }
- } else {
- $path = $dir.'/'.$file;
- if (is_dir($path)) {
- $this->recursiveListDirFilter($path, $result, $filter);
- }
- }
- }
- }
-
- // close directory
- closedir($handle);
-
- return $result;
- }
-
- public function main() {
- if (!is_dir($this->targetDir)) {
- throw new BuildException("Invalid target directory: $this->targetDir");
- }
-
- $gitDirs = array();
- $this->recursiveListDirFilter($this->targetDir, $gitDirs, '.git');
-
- $gitDirsOutput = array();
- if (!$this->includeTarget) { //don't include the target dir
- foreach($gitDirs as $dir) {
- if ($dir != $this->targetDir && $dir != realpath($this->targetDir)) {
- $gitDirsOutput[] = $dir;
- }
- }
- } else {
- $gitDirsOutput = $gitDirs;
- }
-
- $this->project->setProperty('GitReposList',implode(',',$gitDirsOutput));
- }
-}
-
-?>
43 tools/GitStashTask.php
View
@@ -1,43 +0,0 @@
-<?php
-
-/**
- * Git stashes a particular folder
- * @author jseide
- *
- */
-class GitStashTask extends SilverStripeBuildTask {
- private $repository = null;
- private $gitPath = null;
- private $pop = false;
-
- public function setRepository($repo) {
- $this->repository = $repo;
- }
-
- public function setGitPath($gitPath) {
- $this->gitPath = $gitPath;
- }
-
- public function setPop($pop) {
- $this->pop = $pop;
- }
-
- public function main() {
- if (!is_dir($this->repository)) {
- throw new BuildException("Invalid target directory: $this->repository");
- }
-
- $cwd = realpath(getcwd());
-
- chdir($this->repository);
-
- if ($this->pop == true) $result = parent::exec("$this->gitPath stash pop",true);
- else $result = parent::exec("$this->gitPath stash",true);
-
- if ($result) echo $result;
-
- chdir($cwd);
- }
-}
-
-?>
474 tools/LoadModulesTask.php
View
@@ -1,474 +0,0 @@
-<?php
-
-include_once dirname(__FILE__) . '/SilverStripeBuildTask.php';
-
-/**
- * A phing task to load modules from a specific URL via SVN, git checkout, or
- * through the "piston" binary (http://piston.rubyforge.org).
- *
- * Passes commands directly to the commandline to actually perform the
- * svn checkout/updates, so you must have these on your path when this
- * runs.
- *
- * @author Marcus Nyeholt <marcus@silverstripe.com.au>
- *
- */
-class LoadModulesTask extends SilverStripeBuildTask {
- /**
- * Character used to separate the module/revision name from the output path
- */
- const MODULE_SEPARATOR = ':';
-
- /**
- * The file that defines the dependency
- *
- * @var String
- */
- private $file = '';
- /**
- * Optionally specify a module name
- *
- * @var String
- */
- private $name = '';
- /**
- * And a module url
- * @var String
- */
- private $url = '';
-
- /**
- * Is this a non-interactive build session?
- * @var boolean
- */
- private $nonInteractive = false;
-
- public function setNoninteractive($v) {
- if (!strpos($v, '${') && $v == 'true' || $v == 1) {
- $this->nonInteractive = true;
- }
- }
-
- public function setFile($v) {
- $this->file = $v;
- }
-
- public function setName($v) {
- $this->name = $v;
- }
-
- public function setUrl($v) {
- $this->url = $v;
- }
-
- public function main() {
- // $this->configureEnvFile();
-
- if ($this->name) {
- $this->loadModule($this->name, $this->url);
- } else {
- // load the items from the dependencies file
- if (!file_exists($this->file)) {
- throw new BuildException("Modules file " . $this->modulesFile . " cannot be read");
- }
-
- $items = file($this->file);
- foreach ($items as $item) {
- $item = trim($item);
- if (strpos($item, '#') === 0) {
- continue;
- }
-
- $bits = preg_split('/\s+/', $item);
- // skip malformed lines
- if (count($bits) < 2) {
- continue;
- }
-
- $moduleName = trim($bits[0], '/');
- $url = trim($bits[1], '/');
- $storeLocally = false;
- $usePiston = false;
- if (isset($bits[2])) {
- $devBuild = $bits[2] == 'true';
- $storeLocally = $bits[2] == 'local';
- $usePiston = $bits[2] == 'piston';
- if (isset($bits[3])) {
- $storeLocally = $bits[3] == 'local';
- $usePiston = $bits[3] == 'piston';
- }
- }
-
- $this->loadModule($moduleName, $url, $devBuild, $storeLocally, $usePiston);
- }
- }
- }
-
- /**
- * Actually load the module!
- *
- * @param String $moduleName
- * @param String $url
- * @param boolean $devBuild
- * Do we run a dev/build?
- * @param boolean $storeLocally
- * Should we store the module locally, for it to be included in
- * the local project's repository?
- * @param boolean $usePiston Same as $storeLocally, but retain versioning metadata in piston.
- */
- protected function loadModule($moduleName, $url, $devBuild = false, $storeLocally=false, $usePiston=false) {
- $git = strrpos($url, '.git') == (strlen($url) - 4);
- $branch = 'master';
-
- $originalName = $moduleName;
-
- if (strpos($moduleName, self::MODULE_SEPARATOR) > 0) {
- $branch = substr($moduleName, strpos($moduleName, self::MODULE_SEPARATOR) + 1);
- $moduleName = substr($moduleName, 0, strpos($moduleName, self::MODULE_SEPARATOR));
- }
-
- $md = $this->loadMetadata();
- if (!isset($md['store'])) {
- // backwards compatibility
- $md['store'] = false;
- }
-
- // create loader
- if($usePiston) {
- $loader = new LoadModulesTask_PistonLoader($this, $moduleName, $url, $branch);
- } elseif($git) {
- $loader = new LoadModulesTask_GitLoader($this, $moduleName, $url, $branch);
- } else {
- $loader = new LoadModulesTask_SubversionLoader($this, $moduleName, $url, $branch);
- }
-
- // check the module out if it doesn't exist
- if (!file_exists($moduleName)) {
- $this->log("Check out $moduleName from $url");
-
- // Create new working copy
- $loader->checkout($storeLocally);
-
- // Ignore locally added modules from base working copy.
- // Only applies when this base contains versioning information.
- // Note: This is specific to the base working copy, not the module itself.
- if (!$storeLocally && !$usePiston && file_exists('.gitignore')) {
- $gitIgnore = file_get_contents('.gitignore');
- if (strpos($gitIgnore, $moduleName) === false) {
- $this->exec("echo $moduleName >> .gitignore");
- }
- }
- } else {
- $this->log("Updating $moduleName $branch from $url");
-
- // Check for modifications
- // TODO Shows all files as modified when switching repository types or branches'
- $overwrite = true;
- $mods = $loader->getModifiedFiles();
- if (strlen($mods) && !$storeLocally) {
- $this->log("The following files are locally modified");
- $this->log($mods);
- if (!$this->nonInteractive) {
- $overwrite = strtolower(trim($this->getInput("Overwrite local changes? [y/N]")));
- $overwrite = $overwrite == 'y';
- }
- }
-
- // get the metadata and make sure it's not the same
- // TODO Doesn't handle switch from git to svn repositories
- if ($md && isset($md[$moduleName]) && isset($md[$moduleName]['url'])) {
- if (
- $md[$moduleName]['url'] != $url
- || $md[$moduleName]['store'] != $storeLocally
- || $md[$moduleName]['piston'] != $usePiston
- ) {
- if ($overwrite) {
- // delete the directory and reload the module
- $this->log("Deleting $moduleName and reloading");
- unset($md[$moduleName]);
- $this->writeMetadata($md);
- rrmdir($moduleName, true);
- // TODO Doesn't handle changes between svn/git/piston
- $loader->checkout($storeLocally);
- return;
- } else {
- throw new Exception("You have chosen not to overwrite changes, but also want to change your " .
- "SCM settings. Please resolve changes and try again");
- }
- }
- }
-
- // Update existing versioned copy
- $loader->update($overwrite);
- }
-
- // Write new metadata
- $metadata = array(
- 'url' => $url,
- 'store' => $storeLocally,
- 'piston' => $usePiston,
- 'branch' => str_replace($moduleName, '', $originalName),
- );
- $md[$moduleName] = $metadata;
- $this->writeMetadata($md);
-
- // Make sure to remove from the .gitignore file - don't need to do it EVERY
- // run, but it's better than munging code up above
- if ($storeLocally && file_exists('.gitignore')) {
- $gitIgnore = file('.gitignore');
- $newIgnore = array();
- foreach ($gitIgnore as $line) {
- $line = trim($line);
- if (!$line || $line == $moduleName || $line == "$moduleName/") {
- continue;
- }
- $newIgnore[] = $line;
- }
- file_put_contents('.gitignore', implode("\n", $newIgnore));
- }
-
- if ($devBuild) $this->devBuild();
- }
-
- protected function loadMetadata() {
- $metadataFile = dirname(__FILE__) . DIRECTORY_SEPARATOR . 'phing-metadata';
-
- $md = array();
- if (file_exists($metadataFile)) {
- $md = unserialize(file_get_contents($metadataFile));
- }
-
- return $md;
- }
-
- protected function writeMetadata($md) {
- $metadataFile = dirname(__FILE__) . DIRECTORY_SEPARATOR . 'phing-metadata';
- file_put_contents($metadataFile, serialize($md));
- }
-
-
-}
-
-if (!function_exists('rrmdir')) {
- function rrmdir($dir) {
- if (is_dir($dir)) {
- $objects = scandir($dir);
- foreach ($objects as $object) {
- if ($object != "." && $object != "..") {
- if (filetype($dir . "/" . $object) == "dir")
- rrmdir($dir . "/" . $object); else
- unlink($dir . "/" . $object);
- }
- }
- reset($objects);
- rmdir($dir);
- }
- }
-}
-
-class LoadModulesTask_Loader {
-
- /**
- * @var SilverStripeBuildTask
- */
- protected $callingTask;
-
- /**
- * @var string
- */
- protected $url;
-
- /**
- * @var string
- */
- protected $name;
-
- /**
- * @var string
- */
- protected $branch;
-
- /**
- * @var boolean
- */
- protected $nonInteractive = false;
-
- /**
- * @param SilverStripeBuildTask Phing crashes when extending the loader from SilverStripeBuildTask
- * @param String
- * @param String
- * @param String
- */
- function __construct($callingTask, $name, $url, $branch = null) {
- $this->callingTask = $callingTask;
- $this->name = $name;
- $this->url = $url;
- $this->branch = $branch;
- }
-
- /**
- * Check out a new working copy.
- * Call {@link storeLocally()} afterwards to remove versioning information
- * from the working copy.
- */
- function checkout($storeLocally = false) {
- // noop
- }
-
- /**
- * Update an existing working copy
- */
- function update($overwrite = true) {
- // noop
- }
-
- /**
- * @return array
- */
- function getModifiedFiles() {
- // noop
- }
-
-}
-
-class LoadModulesTask_GitLoader extends LoadModulesTask_Loader {
-
- function checkout($storeLocally = false) {
- $branch = $this->branch;
- $currentDir = getcwd();
- $this->callingTask->exec("git clone $this->url $this->name");
-
- if ($branch != 'master') {
- // check if we're also hooking onto a revision
- $commitId = null;
- if (strpos($this->branch, LoadModulesTask::MODULE_SEPARATOR) > 0) {
- $commitId = substr($branch, strpos($branch, LoadModulesTask::MODULE_SEPARATOR) + 1);
- $branch = substr($branch, 0, strpos($branch, LoadModulesTask::MODULE_SEPARATOR));
- }
- // need to make sure we've pulled from the correct branch also
- if ($branch != 'master') {
- $this->callingTask->exec("cd $this->name && git checkout -f -b $branch --track origin/$branch && cd \"$currentDir\"");
- }
-
- if ($commitId) {
- $this->callingTask->exec("cd $this->name && git checkout $commitId && cd \"$currentDir\"");
- }
- }
-
- if($storeLocally) rrmdir("$this->name/.git");
- }
-
- function getModifiedFiles() {
- $currentDir = getcwd();
- $statCmd = "git diff --name-status";
- return trim($this->callingTask->exec("cd $this->name && $statCmd && cd \"$currentDir\"", true));
- }
-
- /**
- *
- * @param boolean $overwrite
- */
- public function update($overwrite = true) {
- $branch = $this->branch;
- $currentDir = getcwd();
-
- $commitId = null;
- // Extract the branch and the commit to use for the update
- if(strpos($branch, LoadModulesTask::MODULE_SEPARATOR) > 0) {
- $commitId = substr($branch, strpos($branch, LoadModulesTask::MODULE_SEPARATOR) + 1);
- $branch = substr($branch, 0, strpos($branch, LoadModulesTask::MODULE_SEPARATOR));
- }
-
- // Finds the current checked out branch
- $cliBranches = trim($this->callingTask->exec("cd $this->name && git branch && cd \"$currentDir\"", true));
- $currentBranch = 'master';
- foreach(explode(PHP_EOL, $cliBranches) as $cliBranch) {
- if(strstr($cliBranch, '* ') !== false) {
- $currentBranch = str_replace('* ', '', $cliBranch);
- break;
- }
- }
-
- $overwriteOpt = $overwrite ? '-f' : '';
-
- // We are already on the target branch, don't checkout it again
- if($currentBranch == $branch) {
- $this->callingTask->exec("cd $this->name && git pull origin $branch && cd \"$currentDir\"");
- } else {
- $this->callingTask->exec("cd $this->name && git checkout $overwriteOpt $branch && git pull origin $branch && cd \"$currentDir\"");
- }
-
- if ($commitId) {
- $this->callingTask->exec("cd $this->name && git checkout $commitId && cd \"$currentDir\"");
- }
- }
-
-}
-
-class LoadModulesTask_SubversionLoader extends LoadModulesTask_Loader {
-
- function checkout($storeLocally = false) {
- $revision = '';
- if ($this->branch != 'master') {
- $revision = " --revision $this->branch ";
- }
-
- $cmd = ($storeLocally) ? 'export' : 'co';
- $this->callingTask->exec("svn $cmd $revision $this->url $this->name");
- }
-
- function update($overwrite = true) {
- $branch = $this->branch;
- $currentDir = getcwd();
-
- $revision = '';
- if ($branch != 'master') {
- $revision = " --revision $branch ";
- }
-
- echo $this->callingTask->exec("svn up $revision $this->name");
- }
-
- function getModifiedFiles() {
- $currentDir = getcwd();
- $statCmd = "svn stat";
- return trim($this->callingTask->exec("cd $this->module && $statCmd && cd \"$currentDir\"", true));
- }
-
-}
-
-class LoadModulesTask_PistonLoader extends LoadModulesTask_Loader {
-
- function __construct($callingTask, $name, $url, $branch = null) {
- parent::__construct($callingTask, $name, $url, $branch);
-
- if(strpos($branch, ':') !== FALSE) {
- throw new BuildException(sprintf('Git tags not supported by piston'));
- }
- }
-
- function update($overwrite = true) {
- $currentDir = getcwd();
- $revision = ($this->branch != 'master') ? " --commit $this->branch " : '';
- $overwriteOpts = ($overwrite) ? '--force' : '';
- echo $this->callingTask->exec("piston update $overwriteOpts $revision $this->name");
-
- $this->callingTask->log(sprintf('Updated "$this->name" via piston, please don\'t forget to commit any changes'));
- }
-
- function checkout($storeLocally = false) {
- $git = strrpos($this->url, '.git') == (strlen($this->url) - 4);
- $revision = ($this->branch != 'master') ? " --commit $this->branch " : '';
- $type = ($git) ? 'git' : 'subversion';
- $this->callingTask->exec("piston import --repository-type $type $revision $this->url $this->name");
-
- $this->callingTask->log(sprintf('Created "$this->name" via piston, please don\'t forget to commit any changes'));
- }
-
- /**
- * @todo Check base working copy if not dealing with flattened directory.
- */
- function getModifiedFiles() {
- return '';
- }
-}
84 tools/SilverStripeBuildTask.php
View
@@ -1,84 +0,0 @@
-<?php
-/*
- *
-All code covered by the BSD license located at http://silverstripe.org/bsd-license/
- */
-
-/**
- * Build task that provides some commonly used functionality
- *
- * @author marcus
- */
-abstract class SilverStripeBuildTask extends Task {
-
- protected $cleanupEnv = false;
-
- protected function configureEnvFile() {
- // fake the _ss_environment.php file for the moment
- $ssEnv = <<<TEXT
-<?php
-// Set the \$_FILE_MAPPING for running the test cases, it's basically a fake but useful
-global \$_FILE_TO_URL_MAPPING;
-\$_FILE_TO_URL_MAPPING[dirname(__FILE__)] = 'http://localhost';
-TEXT;
-
- $envFile = dirname(dirname(__FILE__)).'/_ss_environment.php';
- $this->cleanupEnv = false;
- if (!file_exists($envFile)) {
- file_put_contents($envFile, $ssEnv);
- $this->cleanupEnv = true;
- }
- }
-
- function cleanEnv() {
- if ($this->cleanupEnv) {
- $envFile = dirname(dirname(__FILE__)).'/_ss_environment.php';
- if (file_exists($envFile)) {
- unlink($envFile);
- }
- }
- }
-
- function devBuild() {
- if (file_exists('framework/cli-script.php')) {
- $this->log("Running dev/build");
- $this->exec('php framework/cli-script.php dev/build');
- }
- }
-
-
- /**
- * Get some input from the user
- *
- * @param string $prompt
- * @return string
- */
- function getInput($prompt) {
- require_once 'phing/input/InputRequest.php';
- $request = new InputRequest($prompt);
- $request->setPromptChar(':');
-
- $this->project->getInputHandler()->handleInput($request);
- $value = $request->getInput();
- return $value;
- }
-
- function exec($cmd, $returnContent = false, $ignoreError = false) {
- $ret = null;
- $return = null;
-
- $this->log($cmd, Project::MSG_VERBOSE);
-
- if ($returnContent) {
- $ret = shell_exec($cmd);
- } else {
- passthru($cmd, $return);
- }
-
- if ($return != 0 && !$ignoreError) {
- throw new BuildException("Command '$cmd' failed");
- }
-
- return $ret;
- }
-}
229 tools/UpdateTranslationsTask.php
View
@@ -1,229 +0,0 @@
-<?php
-/**
- * Fetch translation files as a ZIP from getlocalization.com,
- * extract the YAML files from it, and do some reformatting on them
- * to make them suitable for usage in the SilverStripe translation system.
- *
- * Requires 'unzip' binary.
- */
-class UpdateTranslationsTask extends SilverStripeBuildTask {
-
- static $url_translations = 'https://www.getlocalization.com/%s/api/translations/zip/';
-
- /**
- * Absolute path to module base (not lang folder)
- */
- protected $modulePath;
-
- /**
- * GetLocalization product name, as documented in their API:
- * http://www.getlocalization.com/library/api/get-localization-file-management-api/
- * @var [type]
- */
- protected $glProductName;
-
- protected $glUser;
-
- protected $glPassword;
-
- protected $langFolders = array(
- 'yml' => 'lang',
- 'js' => 'javascript/lang'
- );
-
- /**
- * @var String If set, will use existing files rather than try to download them.
- */
- protected $downloadPath;
-
- public function getGlUser() {
- return $this->glUser;
- }
-
- public function setGlUser($newGlUser) {
- $this->glUser = $newGlUser;
- return $this;
- }
-
- public function getGlPassword() {
- return $this->glPassword;
- }
-
- public function setGlPassword($newGlPassword) {
- $this->glPassword = $newGlPassword;
- return $this;
- }
-
- public function setModulePath($path) {
- $this->modulePath = $path;
- }
-
- public function setDownloadPath($path) {
- $this->downloadPath = $path;
- }
-
- public function setGlProductName($name) {
- $this->glProductName = $name;
- }
-
- public function main() {
- if (!is_dir($this->modulePath)) {
- throw new BuildException("Invalid target directory: $this->modulePath");
- }
-
- $downloadPath = $this->downloadPath ? $this->downloadPath : $this->download();
- $files = $this->findFiles($downloadPath);
- foreach($files as $file) {
- $ext = pathinfo($file, PATHINFO_EXTENSION);
- if($ext == 'yml') {
- $this->processYmlFile($file);
- } elseif($ext == 'js') {
- $this->processJavascriptFile($file);
- } else {
- throw new LogicException(sprintf('Unknown extension: %s', $ext));
- }
- }
-
- }
-
- /**
- * @return File path to a folder structure containing translation files
- */
- protected function download() {
- $tmpFolder = tempnam(sys_get_temp_dir(), $this->glProductName . '-');
- $tmpFilePath = $tmpFolder . '.zip';
- rename($tmpFolder, $tmpFilePath);
- $url = sprintf(self::$url_translations, $this->glProductName);
-
- $this->log(sprintf("Downloading $url to $tmpFilePath"));
-
- $ch = curl_init($url);
- curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
- curl_setopt($ch, CURLOPT_USERPWD, $this->glUser. ":" . $this->glPassword);
- $data = curl_exec($ch);
- $code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
- if($code >= 400) {
- throw new BuildException(sprintf(
- 'Error downloading %s: %s %s',
- $url,
- $code,
- $data
- ));
- }
- if(curl_error($ch)) {
- throw new BuildException(sprintf(
- 'Error downloading %s: %s (#%s)',
- $url,
- curl_error($ch),
- curl_errno($ch)
- ));
- }
-
- curl_close($ch);
- file_put_contents($tmpFilePath, $data);
-
- $this->log(sprintf("Extracting to $tmpFolder"));
- $this->exec("unzip $tmpFilePath -d $tmpFolder");
-
- return $tmpFolder;
- }
-
- /**
- * @param String Absolute path to a folder structure containing translation files
- * @return Array with file paths
- */
- protected function findFiles($path) {
- // Recursively find files with certain extensions.
- // Can't use glob() since its non-recursive.
- // Directory structure doesn't matter here.
- $files = array();
- $matches = new RegexIterator(
- new RecursiveIteratorIterator(
- new RecursiveDirectoryIterator($path)
- ),
- '/^.+\.(yml$|js)/i',
- RecursiveRegexIterator::GET_MATCH
- );
- foreach($matches as $match) $files[] = $match[0];
- return $files;
- }
-
- protected function processYmlFile($file) {
- $this->log(sprintf("Processing $file"));
-
- // Rename locale to correct convention (underscored rather than dashed).
- // GL wants filenames to adhere to its saved locales, but SS framework
- // can't easily change to that format for backwards compat reasons, so we need to convert.
- // The passed in file name doesn't really matter here, only the contained locale.
- // By convention, the first line in the YAML file is always the locale used, as a YAML "root key".
- $localeRegex = '/^([\w-_]*):/';
- $content = file_get_contents($file);
- preg_match($localeRegex, $content, $matches);
- $locale = $matches[1];
- $locale = str_replace('-', '_', $locale);
- $locale = str_replace(':', '', $locale);
- $content = preg_replace($localeRegex, $locale . ':', $content);
-
- // Convert faulty multiline double quoted string YAML
- // to block format, in order to allow the YAML Parser to open it later
- // TODO Remove once getlocalization.com has fixed their output format (see support.getlocalization.com #2022)
- $isBlock = false;
- $blockIndex = -1;
- $lines = explode(PHP_EOL, $content);
- $keyedLineRegex = '/^\s*[\w\d-_\.]*:\s*/';
- $leadingQuoteRegex = '/^\s*\"/';
- $trailingQuoteRegex = '/[^\\\\]\"$/';
- foreach($lines as $i => $line) {
- preg_match($keyedLineRegex, $line, $matches);
- $key = $matches ? $matches[0] : null;
- $val = trim(preg_replace($keyedLineRegex, '', $line));
- // If its a multiline double quoted string (no unescaped closing quote)
- if($val && $line != '"' && preg_match($leadingQuoteRegex, $val) && !preg_match($trailingQuoteRegex, $val)) {
- $isBlock = true;
- $blockIndex = $i;
- } elseif($key) {
- $isBlock = false;
- $blockIndex = -1;
- } else {
- $lines[$blockIndex] .= $line;
- unset($lines[$i]);
- }
- }
- $content = implode(PHP_EOL, $lines);
-
- // Parse YML as a sanity check,
- // and reorder alphabetically by key to ensure consistent diffs.
- require_once dirname(__FILE__) . '/../framework/thirdparty/zend_translate_railsyaml/library/Translate/Adapter/thirdparty/sfYaml/lib/sfYaml.php';
- require_once dirname(__FILE__) . '/../framework/thirdparty/zend_translate_railsyaml/library/Translate/Adapter/thirdparty/sfYaml/lib/sfYamlParser.php';
- require_once dirname(__FILE__) . '/../framework/thirdparty/zend_translate_railsyaml/library/Translate/Adapter/thirdparty/sfYaml/lib/sfYamlDumper.php';
- $yamlHandler = new sfYaml();
- $yml = $yamlHandler->load($content);
- if(isset($yml[$locale]) && is_array($yml[$locale])) {
- ksort($yml[$locale]);
- foreach($yml[$locale] as $k => &$v) {
- if(is_array($v)) ksort($v);
- }
- }
- $content = $yamlHandler->dump($yml, 99); // don't inline first levels
-
- // Save into correct path, overwriting existing files
- $path = $this->modulePath . '/' . $this->langFolders['yml'] . '/' . $locale . '.yml';
- $this->log("Saving to $path");
- file_put_contents($path, $content);
- }
-
- protected function processJavascriptFile($file) {
- $this->log(sprintf("Processing $file"));
-
- $locale = pathinfo($file, PATHINFO_FILENAME);
- $locale = str_replace('-', '_', $locale);
-
- // Save into correct path, overwriting existing files
- $path = $this->modulePath . '/' . $this->langFolders['js'] . '/' . $locale . '.yml';
- $this->log("Saving to $path");
- file_put_contents($path, file_get_contents($file));
- }
-}
-
-
-?>
151 tools/lib/sources.php
View
@@ -1,151 +0,0 @@
-<?php
-
-/**
-Sources define a set of instructions for exporting, pistoning or checking out code from some sort of repository
-*/
-
-class GitRepo {
- function __construct($data) {
- $this->data = $data;
- }
-
- function repoURL() {
- return $this->data['repo'];
- }
-
- function export($out) {
- throw new Exception('Dont know how to do this yet');
- }
-
- function canExport() {
- return array('Cant currently use flat mode with git source repositories');
- }
-
- function piston($out) {
- $data = $this->data;
- Piston::import($this->repoURL(), $data['branch'], $out);
- }
-
- function canPiston() {
- $errors = array();
- if (!GIT::available()) $errors = "Git is not available.";
- if (!Piston::available()) $errors[] = "Piston is not available.";
- if (!SVN::isSVNRepo() && !GIT::isGITRepo()) $errors[] = "Piston only works on svn working copies and git repositories.";
- return $errors;
- }
-
- function checkout($out) {
- $data = $this->data;
- GIT::checkout($this->repoURL(), $data['branch'], $out);
- }
-
- function canCheckout() {
- $errors = array();
- if (!GIT::available()) $errors = "Git is not available.";
- return $errors;
- }
-}
-
-class Github extends GitRepo {
- protected $data;
-
- function __construct($data) {
- $this->data = $data;
- }
-
- function repoURL() {
- $data = $this->data;
- return "git://github.com/{$data['user']}/{$data['project']}.git";
- }
-
- function export($out) {
- $data = $this->data;
-
- $tmp = tempnam(sys_get_temp_dir(), 'phpinstaller-') . '.zip';
-
- HTTP::get("https://github.com/{$data['user']}/{$data['project']}/zipball/{$data['branch']}", $tmp);
- Zip::import($tmp, $out, 1);
- }
-
- function canExport() {
- $errors = array();
- if (!HTTP::available()) $errors[] = "The curl module is not available";
- if (!Zip::available()) $errors[] = "The zip module is not available";
- return $errors;
- }
-}
-
-class GithubSparse extends Github {
- function piston($out) {
- $this->export($out);
- if (Git::isGITRepo()) Git::add($out);
- }
-
- function canPiston() {
- $data = $this->data;
- echo "WARNING: Sparse import of directory {$data['subdir']} from {$this->repoURL()} will be flat, not pistoned\n";
- return $this->canExport();
- }
-
- function checkout($out) {
- $this->export($out);
- }
-
- function canCheckout() {
- $data = $this->data;
- echo "WARNING: Sparse import of directory {$data['subdir']} from {$this->repoURL()} will be flat, not checked out\n";
- return $this->canExport();
- }
-
- function export($out) {
- $data = $this->data;
-
- $tmp = tempnam(sys_get_temp_dir(), 'phpinstaller-') . '.zip';
-
- HTTP::get("https://github.com/{$data['user']}/{$data['project']}/zipball/{$data['branch']}", $tmp);
- Zip::import($tmp, $out, 1, $data['subdir']);
- }
-}
-
-class SvnRepo {
- function __construct($data) {
- $this->data = $data;
- }
-
- function repoURL() {
- $data = $this->data;
- return "{$data['repo']}/{$data['branch']}" . (isset($data['subdir']) ? "/{$data['subdir']}" : '');
- }
-
- function export($out) {
- SVN::export($this->repoURL(), $out);
- }
-
- function canExport() {
- $errors = array();
- if (!SVN::available()) $errors[] = "Subversion is not available.";
- return $errors;
- }
-
- function piston($out) {
- Piston::import($this->repoURL(), null, $out);
- }
-
- function canPiston() {
- $errors = array();
- if (!SVN::available()) $errors[] = "Subversion is not available.";
- if (!Piston::available()) $errors[] = "Piston is not available.";
- if (!SVN::isSVNRepo() && !GIT::isGITRepo()) $errors[] = "Piston only works on svn working copies and git repositories.";
- return $errors;
- }
-
- function checkout($out) {
- SVN::checkout($this->repoURL(), $out);
- }
-
- function canCheckout() {
- $errors = array();
- if (!SVN::available()) $errors[] = "Subversion is not available.";
- return $errors;
- }
-}
150 tools/lib/tools.php
View
@@ -1,150 +0,0 @@
-<?php
-
-/**
-Interfaces to various external modules or binaries
-*/
-
-class HTTP {
- static function available() {
- return function_exists('curl_init');
- }
-
- static function get($url, $dst = null) {
- $hndl = curl_init($url); $fhndl = null;
-
- curl_setopt($hndl, CURLOPT_FOLLOWLOCATION, true);
- // Unfortunately, ssl isn't set up right by default in php for windows
- if (strpos(PHP_OS, "WIN") !== false) curl_setopt($hndl, CURLOPT_SSL_VERIFYPEER, false);
-
- if ($dst) {
- $fhndl = fopen($dst, 'wb');
- curl_setopt($hndl, CURLOPT_FILE, $fhndl);
- }
- else {
- curl_setopt($hndl, CURLOPT_RETURNTRANSFER, true);
- }
-
- $res = curl_exec($hndl);
- if (!$res) {
- throw new Exception("Downloading ".$url." failed - curl says: ".curl_error($hndl));
- }
-
- curl_close($hndl);
- if ($fhndl) fclose($fhndl);
-
- return $res;
- }
-}
-
-class SVN {
- static function available() {
- exec('svn --version', $out, $rv);
- return $rv === 0;
- }
-
- static function isSVNRepo() {
- return is_dir('.svn');
- }
-
- static function export($repo, $out) {
- `svn export $repo $out`;
- }
-
- static function checkout($repo, $out) {
- `svn checkout $repo $out`;
- }
-}
-
-class GIT {
- static function available() {
- exec('git --version', $out, $rv);
- return $rv === 0;
- }
-
- static function isGITRepo() {
- return is_dir('.git');
- }
-
- static function add($dir) {
- `git add $dir`;
- }
-
- static function ignore($dir) {
- $hndl = fopen('.gitignore', 'a');
- fwrite($hfnl, $dir."\n");
- fclose($hndl);
- }
-
- static function checkout($repo, $branch, $out) {
- if ($branch) `git clone -b $branch $repo $out`;
- else `git clone -b $branch $repo $out`;
- }
-}
-
-class Piston {
- static function available() {
- exec('piston --version', $out, $rv);
- return $rv === 0;
- }
-
- static function import($src, $branch, $dest) {
- if ($branch) `piston import --commit $branch $src $dest`;
- else `piston import $src $dest`;
- }
-}
-
-class Zip {
- static function available() {
- return class_exists('ZipArchive');
- }
-
- static function import($src, $dest, $skipdirs = 0, $subdir = null) {
- $zip = new ZipArchive;
- $res = $zip->open($src);
- if ($res === TRUE) {
-
- if ($skipdirs) {
- $tmpdir = tempnam(sys_get_temp_dir(), 'phpinstaller-') . '.ext';
- mkdir($tmpdir, 0700);
-
- mkdir($dest);
-
- $zip->extractTo($tmpdir);
-
- for($i = 0; $i < $zip->numFiles; $i++){
- $name = $srcname = $zip->getNameIndex($i);
- $parts = array();
-
- while ($name && $name != '.' && $name != '/') {
- array_unshift($parts, basename($name));
- $name = dirname($name);
- }
-
- if ($subdir) {
- // We only need to move the level after the level after the skipdirs level, presuming that level after the skipdirs level == $subdir
- if (count($parts) != $skipdirs+2) continue;
- if ($parts[$skipdirs] != $subdir) continue;
-
- $dstname = $parts[$skipdirs+1];
- }
- else {
- // We only need to move the very next level after the skipdirs level
- if (count($parts) != $skipdirs+1) continue;
-
- $dstname = $parts[$skipdirs];
- }
-
- rename($tmpdir.'/'.$srcname, $dest.'/'.$dstname);
- }
- }
- else {
- $zip->extractTo($dest);
- }
-
- $zip->close();
- } else {
- throw new Exception('Could not extract zip at '.$src.' to '.$dest);
- }
- }
-}
-
Please sign in to comment.
Something went wrong with that request. Please try again.