summaryrefslogtreecommitdiff
path: root/vendor/guzzle/guzzle/phing
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/guzzle/guzzle/phing')
-rw-r--r--vendor/guzzle/guzzle/phing/build.properties.dist16
-rw-r--r--vendor/guzzle/guzzle/phing/imports/dependencies.xml33
-rw-r--r--vendor/guzzle/guzzle/phing/imports/deploy.xml142
-rw-r--r--vendor/guzzle/guzzle/phing/tasks/ComposerLintTask.php152
-rw-r--r--vendor/guzzle/guzzle/phing/tasks/GuzzlePearPharPackageTask.php338
-rw-r--r--vendor/guzzle/guzzle/phing/tasks/GuzzleSubSplitTask.php385
6 files changed, 1066 insertions, 0 deletions
diff --git a/vendor/guzzle/guzzle/phing/build.properties.dist b/vendor/guzzle/guzzle/phing/build.properties.dist
new file mode 100644
index 0000000..c60d3d9
--- /dev/null
+++ b/vendor/guzzle/guzzle/phing/build.properties.dist
@@ -0,0 +1,16 @@
+# you may need to update this if you're working on a fork.
+guzzle.remote=git@github.com:guzzle/guzzle.git
+
+# github credentials -- only used by GitHub API calls to create subtree repos
+github.basicauth=username:password
+# for the subtree split and testing
+github.org=guzzle
+
+# your git path
+cmd.git=git
+
+# your composer command
+cmd.composer=composer
+
+# test server start
+cmd.testserver=node
diff --git a/vendor/guzzle/guzzle/phing/imports/dependencies.xml b/vendor/guzzle/guzzle/phing/imports/dependencies.xml
new file mode 100644
index 0000000..e40e037
--- /dev/null
+++ b/vendor/guzzle/guzzle/phing/imports/dependencies.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project basedir="../../" default="install-dependencies">
+
+ <property name="cmd.composer" value="" />
+ <property name="cmd.git" value="" />
+ <property name="cmd.testserver" value="" />
+
+ <!--
+ Our custom tasks
+ -->
+ <taskdef name="composerlint" classname="phing.tasks.ComposerLintTask" />
+ <taskdef name="guzzlesubsplit" classname="phing.tasks.GuzzleSubSplitTask" />
+ <taskdef name="guzzlepear" classname="phing.tasks.GuzzlePearPharPackageTask" />
+
+ <target name="find-git">
+ <if>
+ <contains string="${cmd.git}" substring="git" />
+ <then>
+ <echo>using git at ${cmd.git}</echo>
+ </then>
+ <else>
+ <exec command="which git" outputProperty="cmd.git" />
+ <echo>found git at ${cmd.git}</echo>
+ </else>
+ </if>
+ </target>
+
+ <target name="clean-dependencies">
+ <delete dir="${project.basedir}/vendor"/>
+ <delete file="${project.basedir}/composer.lock" />
+ </target>
+
+</project>
diff --git a/vendor/guzzle/guzzle/phing/imports/deploy.xml b/vendor/guzzle/guzzle/phing/imports/deploy.xml
new file mode 100644
index 0000000..109e5ec
--- /dev/null
+++ b/vendor/guzzle/guzzle/phing/imports/deploy.xml
@@ -0,0 +1,142 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project basedir="../../" default="deploy">
+
+ <property name="git.status" value=""/>
+ <property name="git.currentbranch" value=""/>
+ <target name="check-git-branch-status">
+ <exec command="git status -s -b" outputProperty="git.currentbranch" />
+ <echo msg="${git.currentbranch}"/>
+ <if>
+ <contains string="${git.currentbranch}" substring="${head}"/>
+ <then>
+ <echo>On branch ${head}</echo>
+ </then>
+ <else>
+ <fail message="-Dhead=${head} arg did not match ${git.currentbranch}"/>
+ </else>
+ </if>
+ <exec command="git status -s" outputProperty="git.status" />
+ <if>
+ <equals arg1="${git.status}" arg2="" trim="true"/>
+ <then>
+ <echo>working directory clean</echo>
+ </then>
+ <else>
+ <echo>${git.status}</echo>
+ <fail message="Working directory isn't clean." />
+ </else>
+ </if>
+ </target>
+
+ <property name="version.changelog" value=""/>
+ <property name="version.version" value=""/>
+ <target name="check-changelog-version">
+ <exec executable="fgrep" outputProperty="version.changelog">
+ <arg value="${new.version} ("/>
+ <arg value="${project.basedir}/CHANGELOG.md"/>
+ </exec>
+ <if>
+ <equals arg1="${version.changelog}" arg2="" trim="true"/>
+ <then>
+ <fail message="${new.version} not mentioned in CHANGELOG"/>
+ </then>
+ </if>
+
+ <exec executable="fgrep" outputProperty="version.version">
+ <arg value="const VERSION = '${new.version}'"/>
+ <arg value="${project.basedir}/src/Guzzle/Common/Version.php"/>
+ </exec>
+ <if>
+ <equals arg1="${version.version}" arg2="" trim="true"/>
+ <then>
+ <fail message="${new.version} not mentioned in Guzzle\Common\Version"/>
+ </then>
+ </if>
+
+ <echo>ChangeLog Match: ${version.changelog}</echo>
+ <echo>Guzzle\Common\Version Match: ${version.version}</echo>
+ </target>
+
+ <target name="help" description="HELP AND REMINDERS about what you can do with this project">
+ <echo>releasing: phing -Dnew.version=3.0.x -Dhead=master release</echo>
+ <echo>--</echo>
+ <exec command="phing -l" passthru="true"/>
+ </target>
+
+ <target name="release" depends="check-changelog-version,check-git-branch-status"
+ description="tag, subtree split, package, deploy: Use: phing -Dnew.version=[TAG] -Dhead=[BRANCH] release">
+ <if>
+ <isset property="new.version" />
+ <then>
+ <if>
+ <contains string="${new.version}" substring="v" casesensitive="false" />
+ <then>
+ <fail message="Please specify version as [0-9].[0-9].[0-9]. (I'll add v for you.)"/>
+ </then>
+ <else>
+
+ <echo>BEGINNING RELEASE FOR ${new.version}</echo>
+
+ <!-- checkout the specified branch -->
+ <!-- <gitcheckout repository="${repo.dir}" branchname="${head}" gitPath="${cmd.git}" /> -->
+ <!-- Ensure that the tag exists -->
+ <!-- push the tag up so subsplit will get it -->
+ <!--gitpush repository="${repo.dir}" tags="true" gitPath="${cmd.git}" /-->
+
+ <!-- now do the subsplits -->
+ <guzzlesubsplit
+ repository="${repo.dir}"
+ remote="${guzzle.remote}"
+ heads="${head}"
+ tags="v${new.version}"
+ base="src"
+ subIndicatorFile="composer.json"
+ gitPath="${cmd.git}" />
+
+ <!-- Copy .md files into the PEAR package -->
+ <copy file="${repo.dir}/LICENSE" tofile=".subsplit/src/Guzzle/LICENSE.md" />
+ <copy file="${repo.dir}/README.md" tofile=".subsplit/src/Guzzle/README.md" />
+ <copy file="${repo.dir}/CHANGELOG.md" tofile=".subsplit/src/Guzzle/CHANGELOG.md" />
+
+ <!-- and now the pear packages -->
+ <guzzlepear
+ version="${new.version}"
+ makephar="true"
+ />
+ </else>
+
+ </if>
+ </then>
+
+ <else>
+ <echo>Tip: to create a new release, do: phing -Dnew.version=[TAG] -Dhead=[BRANCH] release</echo>
+ </else>
+
+ </if>
+ </target>
+
+ <target name="pear-channel">
+ <guzzlepear version="${new.version}" deploy="true" makephar="true" />
+ </target>
+
+ <target name="package-phar" description="Create a phar with an autoloader">
+ <pharpackage
+ destfile="${dir.output}/guzzle.phar"
+ basedir="${project.basedir}/.subsplit"
+ stub="phar-stub.php"
+ signature="md5">
+ <fileset dir="${project.basedir}/.subsplit">
+ <include name="src/**/*.php" />
+ <include name="src/**/*.pem" />
+ <include name="vendor/symfony/class-loader/Symfony/Component/ClassLoader/UniversalClassLoader.php" />
+ <include name="vendor/symfony/event-dispatcher/**/*.php" />
+ <include name="vendor/doctrine/common/lib/Doctrine/Common/Cache/*.php" />
+ <include name="vendor/monolog/monolog/src/**/*.php" />
+ </fileset>
+ <metadata>
+ <element name="author" value="Michael Dowling" />
+ </metadata>
+ </pharpackage>
+ </target>
+
+</project>
diff --git a/vendor/guzzle/guzzle/phing/tasks/ComposerLintTask.php b/vendor/guzzle/guzzle/phing/tasks/ComposerLintTask.php
new file mode 100644
index 0000000..3b70409
--- /dev/null
+++ b/vendor/guzzle/guzzle/phing/tasks/ComposerLintTask.php
@@ -0,0 +1,152 @@
+<?php
+/**
+ * Phing task for composer validation.
+ *
+ * @copyright 2012 Clay Loveless <clay@php.net>
+ * @license http://claylo.mit-license.org/2012/ MIT License
+ */
+
+require_once 'phing/Task.php';
+
+class ComposerLintTask extends Task
+{
+ protected $dir = null;
+ protected $file = null;
+ protected $passthru = false;
+ protected $composer = null;
+
+ /**
+ * The setter for the dir
+ *
+ * @param string $str Directory to crawl recursively for composer files
+ */
+ public function setDir($str)
+ {
+ $this->dir = $str;
+ }
+
+ /**
+ * The setter for the file
+ *
+ * @param string $str Individual file to validate
+ */
+ public function setFile($str)
+ {
+ $this->file = $str;
+ }
+
+ /**
+ * Whether to use PHP's passthru() function instead of exec()
+ *
+ * @param boolean $passthru If passthru shall be used
+ */
+ public function setPassthru($passthru)
+ {
+ $this->passthru = (bool) $passthru;
+ }
+
+ /**
+ * Composer to execute. If unset, will attempt composer.phar in project
+ * basedir, and if that fails, will attempt global composer
+ * installation.
+ *
+ * @param string $str Individual file to validate
+ */
+ public function setComposer($str)
+ {
+ $this->file = $str;
+ }
+
+ /**
+ * The init method: do init steps
+ */
+ public function init()
+ {
+ // nothing needed here
+ }
+
+ /**
+ * The main entry point
+ */
+ public function main()
+ {
+ if ($this->composer === null) {
+ $this->findComposer();
+ }
+
+ $files = array();
+ if (!empty($this->file) && file_exists($this->file)) {
+ $files[] = $this->file;
+ }
+
+ if (!empty($this->dir)) {
+ $found = $this->findFiles();
+ foreach ($found as $file) {
+ $files[] = $this->dir . DIRECTORY_SEPARATOR . $file;
+ }
+ }
+
+ foreach ($files as $file) {
+
+ $cmd = $this->composer . ' validate ' . $file;
+ $cmd = escapeshellcmd($cmd);
+
+ if ($this->passthru) {
+ $retval = null;
+ passthru($cmd, $retval);
+ if ($retval == 1) {
+ throw new BuildException('invalid composer.json');
+ }
+ } else {
+ $out = array();
+ $retval = null;
+ exec($cmd, $out, $retval);
+ if ($retval == 1) {
+ $err = join("\n", $out);
+ throw new BuildException($err);
+ } else {
+ $this->log($out[0]);
+ }
+ }
+
+ }
+
+ }
+
+ /**
+ * Find the composer.json files using Phing's directory scanner
+ *
+ * @return array
+ */
+ protected function findFiles()
+ {
+ $ds = new DirectoryScanner();
+ $ds->setBasedir($this->dir);
+ $ds->setIncludes(array('**/composer.json'));
+ $ds->scan();
+ return $ds->getIncludedFiles();
+ }
+
+ /**
+ * Find composer installation
+ *
+ */
+ protected function findComposer()
+ {
+ $basedir = $this->project->getBasedir();
+ $php = $this->project->getProperty('php.interpreter');
+
+ if (file_exists($basedir . '/composer.phar')) {
+ $this->composer = "$php $basedir/composer.phar";
+ } else {
+ $out = array();
+ exec('which composer', $out);
+ if (empty($out)) {
+ throw new BuildException(
+ 'Could not determine composer location.'
+ );
+ }
+ $this->composer = $out[0];
+ }
+ }
+}
diff --git a/vendor/guzzle/guzzle/phing/tasks/GuzzlePearPharPackageTask.php b/vendor/guzzle/guzzle/phing/tasks/GuzzlePearPharPackageTask.php
new file mode 100644
index 0000000..f72a6b5
--- /dev/null
+++ b/vendor/guzzle/guzzle/phing/tasks/GuzzlePearPharPackageTask.php
@@ -0,0 +1,338 @@
+<?php
+/**
+ * This file is part of Guzzle's build process.
+ *
+ * @copyright 2012 Clay Loveless <clay@php.net>
+ * @license http://claylo.mit-license.org/2012/ MIT License
+ */
+
+require_once 'phing/Task.php';
+require_once 'PEAR/PackageFileManager2.php';
+require_once 'PEAR/PackageFileManager/File.php';
+require_once 'PEAR/Packager.php';
+
+class GuzzlePearPharPackageTask extends Task
+{
+ private $version;
+ private $deploy = true;
+ private $makephar = true;
+
+ private $subpackages = array();
+
+ public function setVersion($str)
+ {
+ $this->version = $str;
+ }
+
+ public function getVersion()
+ {
+ return $this->version;
+ }
+
+ public function setDeploy($deploy)
+ {
+ $this->deploy = (bool) $deploy;
+ }
+
+ public function getDeploy()
+ {
+ return $this->deploy;
+ }
+
+ public function setMakephar($makephar)
+ {
+ $this->makephar = (bool) $makephar;
+ }
+
+ public function getMakephar()
+ {
+ return $this->makephar;
+ }
+
+ private $basedir;
+ private $guzzleinfo;
+ private $changelog_release_date;
+ private $changelog_notes = '-';
+
+ public function main()
+ {
+ $this->basedir = $this->getProject()->getBasedir();
+
+ if (!is_dir((string) $this->basedir.'/.subsplit')) {
+ throw new BuildException('PEAR packaging requires .subsplit directory');
+ }
+
+ // main composer file
+ $composer_file = file_get_contents((string) $this->basedir.'/.subsplit/composer.json');
+ $this->guzzleinfo = json_decode($composer_file, true);
+
+ // make sure we have a target
+ $pearwork = (string) $this->basedir . '/build/pearwork';
+ if (!is_dir($pearwork)) {
+ mkdir($pearwork, 0777, true);
+ }
+ $pearlogs = (string) $this->basedir . '/build/artifacts/logs';
+ if (!is_dir($pearlogs)) {
+ mkdir($pearlogs, 0777, true);
+ }
+
+ $version = $this->getVersion();
+ $this->grabChangelog();
+ if ($version[0] == '2') {
+ $this->log('building single PEAR package');
+ $this->buildSinglePackage();
+ } else {
+ // $this->log("building PEAR subpackages");
+ // $this->createSubPackages();
+ // $this->log("building PEAR bundle package");
+ $this->buildSinglePackage();
+ }
+
+ if ($this->getMakephar()) {
+ $this->log("building PHAR");
+ $this->getProject()->executeTarget('package-phar');
+ }
+
+ if ($this->getDeploy()) {
+ $this->doDeployment();
+ }
+ }
+
+ public function doDeployment()
+ {
+ $basedir = (string) $this->basedir;
+ $this->log('beginning PEAR/PHAR deployment');
+
+ chdir($basedir . '/build/pearwork');
+ if (!is_dir('./channel')) {
+ mkdir('./channel');
+ }
+
+ // Pull the PEAR channel down locally
+ passthru('aws s3 sync s3://pear.guzzlephp.org ./channel');
+
+ // add PEAR packages
+ foreach (scandir('./') as $file) {
+ if (substr($file, -4) == '.tgz') {
+ passthru('pirum add ./channel ' . $file);
+ }
+ }
+
+ // if we have a new phar, add it
+ if ($this->getMakephar() && file_exists($basedir . '/build/artifacts/guzzle.phar')) {
+ rename($basedir . '/build/artifacts/guzzle.phar', './channel/guzzle.phar');
+ }
+
+ // Sync up with the S3 bucket
+ chdir($basedir . '/build/pearwork/channel');
+ passthru('aws s3 sync . s3://pear.guzzlephp.org');
+ }
+
+ public function buildSinglePackage()
+ {
+ $v = $this->getVersion();
+ $apiversion = $v[0] . '.0.0';
+
+ $opts = array(
+ 'packagedirectory' => (string) $this->basedir . '/.subsplit/src/',
+ 'filelistgenerator' => 'file',
+ 'ignore' => array('*composer.json'),
+ 'baseinstalldir' => '/',
+ 'packagefile' => 'package.xml'
+ //'outputdirectory' => (string) $this->basedir . '/build/pearwork/'
+ );
+ $pfm = new PEAR_PackageFileManager2();
+ $pfm->setOptions($opts);
+ $pfm->addRole('md', 'doc');
+ $pfm->addRole('pem', 'php');
+ $pfm->setPackage('Guzzle');
+ $pfm->setSummary("Object-oriented PHP HTTP Client for PHP 5.3+");
+ $pfm->setDescription($this->guzzleinfo['description']);
+ $pfm->setPackageType('php');
+ $pfm->setChannel('guzzlephp.org/pear');
+ $pfm->setAPIVersion($apiversion);
+ $pfm->setReleaseVersion($this->getVersion());
+ $pfm->setAPIStability('stable');
+ $pfm->setReleaseStability('stable');
+ $pfm->setNotes($this->changelog_notes);
+ $pfm->setPackageType('php');
+ $pfm->setLicense('MIT', 'http://github.com/guzzle/guzzle/blob/master/LICENSE');
+ $pfm->addMaintainer('lead', 'mtdowling', 'Michael Dowling', 'mtdowling@gmail.com', 'yes');
+ $pfm->setDate($this->changelog_release_date);
+ $pfm->generateContents();
+
+ $phpdep = $this->guzzleinfo['require']['php'];
+ $phpdep = str_replace('>=', '', $phpdep);
+ $pfm->setPhpDep($phpdep);
+ $pfm->addExtensionDep('required', 'curl');
+ $pfm->setPearinstallerDep('1.4.6');
+ $pfm->addPackageDepWithChannel('required', 'EventDispatcher', 'pear.symfony.com', '2.1.0');
+ if (!empty($this->subpackages)) {
+ foreach ($this->subpackages as $package) {
+ $pkg = dirname($package);
+ $pkg = str_replace('/', '_', $pkg);
+ $pfm->addConflictingPackageDepWithChannel($pkg, 'guzzlephp.org/pear', false, $apiversion);
+ }
+ }
+
+ ob_start();
+ $startdir = getcwd();
+ chdir((string) $this->basedir . '/build/pearwork');
+
+ echo "DEBUGGING GENERATED PACKAGE FILE\n";
+ $result = $pfm->debugPackageFile();
+ if ($result) {
+ $out = $pfm->writePackageFile();
+ echo "\n\n\nWRITE PACKAGE FILE RESULT:\n";
+ var_dump($out);
+ // load up package file and build package
+ $packager = new PEAR_Packager();
+ echo "\n\n\nBUILDING PACKAGE FROM PACKAGE FILE:\n";
+ $dest_package = $packager->package($opts['packagedirectory'].'package.xml');
+ var_dump($dest_package);
+ } else {
+ echo "\n\n\nDEBUGGING RESULT:\n";
+ var_dump($result);
+ }
+ echo "removing package.xml";
+ unlink($opts['packagedirectory'].'package.xml');
+ $log = ob_get_clean();
+ file_put_contents((string) $this->basedir . '/build/artifacts/logs/pear_package.log', $log);
+ chdir($startdir);
+ }
+
+ public function createSubPackages()
+ {
+ $this->findComponents();
+
+ foreach ($this->subpackages as $package) {
+ $baseinstalldir = dirname($package);
+ $dir = (string) $this->basedir.'/.subsplit/src/' . $baseinstalldir;
+ $composer_file = file_get_contents((string) $this->basedir.'/.subsplit/src/'. $package);
+ $package_info = json_decode($composer_file, true);
+ $this->log('building ' . $package_info['target-dir'] . ' subpackage');
+ $this->buildSubPackage($dir, $baseinstalldir, $package_info);
+ }
+ }
+
+ public function buildSubPackage($dir, $baseinstalldir, $info)
+ {
+ $package = str_replace('/', '_', $baseinstalldir);
+ $opts = array(
+ 'packagedirectory' => $dir,
+ 'filelistgenerator' => 'file',
+ 'ignore' => array('*composer.json', '*package.xml'),
+ 'baseinstalldir' => '/' . $info['target-dir'],
+ 'packagefile' => 'package.xml'
+ );
+ $pfm = new PEAR_PackageFileManager2();
+ $pfm->setOptions($opts);
+ $pfm->setPackage($package);
+ $pfm->setSummary($info['description']);
+ $pfm->setDescription($info['description']);
+ $pfm->setPackageType('php');
+ $pfm->setChannel('guzzlephp.org/pear');
+ $pfm->setAPIVersion('3.0.0');
+ $pfm->setReleaseVersion($this->getVersion());
+ $pfm->setAPIStability('stable');
+ $pfm->setReleaseStability('stable');
+ $pfm->setNotes($this->changelog_notes);
+ $pfm->setPackageType('php');
+ $pfm->setLicense('MIT', 'http://github.com/guzzle/guzzle/blob/master/LICENSE');
+ $pfm->addMaintainer('lead', 'mtdowling', 'Michael Dowling', 'mtdowling@gmail.com', 'yes');
+ $pfm->setDate($this->changelog_release_date);
+ $pfm->generateContents();
+
+ $phpdep = $this->guzzleinfo['require']['php'];
+ $phpdep = str_replace('>=', '', $phpdep);
+ $pfm->setPhpDep($phpdep);
+ $pfm->setPearinstallerDep('1.4.6');
+
+ foreach ($info['require'] as $type => $version) {
+ if ($type == 'php') {
+ continue;
+ }
+ if ($type == 'symfony/event-dispatcher') {
+ $pfm->addPackageDepWithChannel('required', 'EventDispatcher', 'pear.symfony.com', '2.1.0');
+ }
+ if ($type == 'ext-curl') {
+ $pfm->addExtensionDep('required', 'curl');
+ }
+ if (substr($type, 0, 6) == 'guzzle') {
+ $gdep = str_replace('/', ' ', $type);
+ $gdep = ucwords($gdep);
+ $gdep = str_replace(' ', '_', $gdep);
+ $pfm->addPackageDepWithChannel('required', $gdep, 'guzzlephp.org/pear', $this->getVersion());
+ }
+ }
+
+ // can't have main Guzzle package AND sub-packages
+ $pfm->addConflictingPackageDepWithChannel('Guzzle', 'guzzlephp.org/pear', false, $apiversion);
+
+ ob_start();
+ $startdir = getcwd();
+ chdir((string) $this->basedir . '/build/pearwork');
+
+ echo "DEBUGGING GENERATED PACKAGE FILE\n";
+ $result = $pfm->debugPackageFile();
+ if ($result) {
+ $out = $pfm->writePackageFile();
+ echo "\n\n\nWRITE PACKAGE FILE RESULT:\n";
+ var_dump($out);
+ // load up package file and build package
+ $packager = new PEAR_Packager();
+ echo "\n\n\nBUILDING PACKAGE FROM PACKAGE FILE:\n";
+ $dest_package = $packager->package($opts['packagedirectory'].'/package.xml');
+ var_dump($dest_package);
+ } else {
+ echo "\n\n\nDEBUGGING RESULT:\n";
+ var_dump($result);
+ }
+ echo "removing package.xml";
+ unlink($opts['packagedirectory'].'/package.xml');
+ $log = ob_get_clean();
+ file_put_contents((string) $this->basedir . '/build/artifacts/logs/pear_package_'.$package.'.log', $log);
+ chdir($startdir);
+ }
+
+ public function findComponents()
+ {
+ $ds = new DirectoryScanner();
+ $ds->setBasedir((string) $this->basedir.'/.subsplit/src');
+ $ds->setIncludes(array('**/composer.json'));
+ $ds->scan();
+ $files = $ds->getIncludedFiles();
+ $this->subpackages = $files;
+ }
+
+ public function grabChangelog()
+ {
+ $cl = file((string) $this->basedir.'/.subsplit/CHANGELOG.md');
+ $notes = '';
+ $in_version = false;
+ $release_date = null;
+
+ foreach ($cl as $line) {
+ $line = trim($line);
+ if (preg_match('/^\* '.$this->getVersion().' \(([0-9\-]+)\)$/', $line, $matches)) {
+ $release_date = $matches[1];
+ $in_version = true;
+ continue;
+ }
+ if ($in_version && empty($line) && empty($notes)) {
+ continue;
+ }
+ if ($in_version && ! empty($line)) {
+ $notes .= $line."\n";
+ }
+ if ($in_version && empty($line) && !empty($notes)) {
+ $in_version = false;
+ }
+ }
+ $this->changelog_release_date = $release_date;
+
+ if (! empty($notes)) {
+ $this->changelog_notes = $notes;
+ }
+ }
+}
diff --git a/vendor/guzzle/guzzle/phing/tasks/GuzzleSubSplitTask.php b/vendor/guzzle/guzzle/phing/tasks/GuzzleSubSplitTask.php
new file mode 100644
index 0000000..5d56a5b
--- /dev/null
+++ b/vendor/guzzle/guzzle/phing/tasks/GuzzleSubSplitTask.php
@@ -0,0 +1,385 @@
+<?php
+/**
+ * Phing wrapper around git subsplit.
+ *
+ * @see https://github.com/dflydev/git-subsplit
+ * @copyright 2012 Clay Loveless <clay@php.net>
+ * @license http://claylo.mit-license.org/2012/ MIT License
+ */
+
+require_once 'phing/tasks/ext/git/GitBaseTask.php';
+
+// base - base of tree to split out
+// subIndicatorFile - composer.json, package.xml?
+class GuzzleSubSplitTask extends GitBaseTask
+{
+ /**
+ * What git repository to pull from and publish to
+ */
+ protected $remote = null;
+
+ /**
+ * Publish for comma-separated heads instead of all heads
+ */
+ protected $heads = null;
+
+ /**
+ * Publish for comma-separated tags instead of all tags
+ */
+ protected $tags = null;
+
+ /**
+ * Base of the tree RELATIVE TO .subsplit working dir
+ */
+ protected $base = null;
+
+ /**
+ * The presence of this file will indicate that the directory it resides
+ * in is at the top level of a split.
+ */
+ protected $subIndicatorFile = 'composer.json';
+
+ /**
+ * Do everything except actually send the update.
+ */
+ protected $dryRun = null;
+
+ /**
+ * Do not sync any heads.
+ */
+ protected $noHeads = false;
+
+ /**
+ * Do not sync any tags.
+ */
+ protected $noTags = false;
+
+ /**
+ * The splits we found in the heads
+ */
+ protected $splits;
+
+ public function setRemote($str)
+ {
+ $this->remote = $str;
+ }
+
+ public function getRemote()
+ {
+ return $this->remote;
+ }
+
+ public function setHeads($str)
+ {
+ $this->heads = explode(',', $str);
+ }
+
+ public function getHeads()
+ {
+ return $this->heads;
+ }
+
+ public function setTags($str)
+ {
+ $this->tags = explode(',', $str);
+ }
+
+ public function getTags()
+ {
+ return $this->tags;
+ }
+
+ public function setBase($str)
+ {
+ $this->base = $str;
+ }
+
+ public function getBase()
+ {
+ return $this->base;
+ }
+
+ public function setSubIndicatorFile($str)
+ {
+ $this->subIndicatorFile = $str;
+ }
+
+ public function getSubIndicatorFile()
+ {
+ return $this->subIndicatorFile;
+ }
+
+ public function setDryRun($bool)
+ {
+ $this->dryRun = (bool) $bool;
+ }
+
+ public function getDryRun()
+ {
+ return $this->dryRun;
+ }
+
+ public function setNoHeads($bool)
+ {
+ $this->noHeads = (bool) $bool;
+ }
+
+ public function getNoHeads()
+ {
+ return $this->noHeads;
+ }
+
+ public function setNoTags($bool)
+ {
+ $this->noTags = (bool) $bool;
+ }
+
+ public function getNoTags()
+ {
+ return $this->noTags;
+ }
+
+ /**
+ * GitClient from VersionControl_Git
+ */
+ protected $client = null;
+
+ /**
+ * The main entry point
+ */
+ public function main()
+ {
+ $repo = $this->getRepository();
+ if (empty($repo)) {
+ throw new BuildException('"repository" is a required parameter');
+ }
+
+ $remote = $this->getRemote();
+ if (empty($remote)) {
+ throw new BuildException('"remote" is a required parameter');
+ }
+
+ chdir($repo);
+ $this->client = $this->getGitClient(false, $repo);
+
+ // initalized yet?
+ if (!is_dir('.subsplit')) {
+ $this->subsplitInit();
+ } else {
+ // update
+ $this->subsplitUpdate();
+ }
+
+ // find all splits based on heads requested
+ $this->findSplits();
+
+ // check that GitHub has the repos
+ $this->verifyRepos();
+
+ // execute the subsplits
+ $this->publish();
+ }
+
+ public function publish()
+ {
+ $this->log('DRY RUN ONLY FOR NOW');
+ $base = $this->getBase();
+ $base = rtrim($base, '/') . '/';
+ $org = $this->getOwningTarget()->getProject()->getProperty('github.org');
+
+ $splits = array();
+
+ $heads = $this->getHeads();
+ foreach ($heads as $head) {
+ foreach ($this->splits[$head] as $component => $meta) {
+ $splits[] = $base . $component . ':git@github.com:'. $org.'/'.$meta['repo'];
+ }
+
+ $cmd = 'git subsplit publish ';
+ $cmd .= escapeshellarg(implode(' ', $splits));
+
+ if ($this->getNoHeads()) {
+ $cmd .= ' --no-heads';
+ } else {
+ $cmd .= ' --heads='.$head;
+ }
+
+ if ($this->getNoTags()) {
+ $cmd .= ' --no-tags';
+ } else {
+ if ($this->getTags()) {
+ $cmd .= ' --tags=' . escapeshellarg(implode(' ', $this->getTags()));
+ }
+ }
+
+ passthru($cmd);
+ }
+ }
+
+ /**
+ * Runs `git subsplit update`
+ */
+ public function subsplitUpdate()
+ {
+ $repo = $this->getRepository();
+ $this->log('git-subsplit update...');
+ $cmd = $this->client->getCommand('subsplit');
+ $cmd->addArgument('update');
+ try {
+ $cmd->execute();
+ } catch (Exception $e) {
+ throw new BuildException('git subsplit update failed'. $e);
+ }
+ chdir($repo . '/.subsplit');
+ passthru('php ../composer.phar update --dev');
+ chdir($repo);
+ }
+
+ /**
+ * Runs `git subsplit init` based on the remote repository.
+ */
+ public function subsplitInit()
+ {
+ $remote = $this->getRemote();
+ $cmd = $this->client->getCommand('subsplit');
+ $this->log('running git-subsplit init ' . $remote);
+
+ $cmd->setArguments(array(
+ 'init',
+ $remote
+ ));
+
+ try {
+ $output = $cmd->execute();
+ } catch (Exception $e) {
+ throw new BuildException('git subsplit init failed'. $e);
+ }
+ $this->log(trim($output), Project::MSG_INFO);
+ $repo = $this->getRepository();
+ chdir($repo . '/.subsplit');
+ passthru('php ../composer.phar install --dev');
+ chdir($repo);
+ }
+
+ /**
+ * Find the composer.json files using Phing's directory scanner
+ *
+ * @return array
+ */
+ protected function findSplits()
+ {
+ $this->log("checking heads for subsplits");
+ $repo = $this->getRepository();
+ $base = $this->getBase();
+
+ $splits = array();
+ $heads = $this->getHeads();
+
+ if (!empty($base)) {
+ $base = '/' . ltrim($base, '/');
+ } else {
+ $base = '/';
+ }
+
+ chdir($repo . '/.subsplit');
+ foreach ($heads as $head) {
+ $splits[$head] = array();
+
+ // check each head requested *BEFORE* the actual subtree split command gets it
+ passthru("git checkout '$head'");
+ $ds = new DirectoryScanner();
+ $ds->setBasedir($repo . '/.subsplit' . $base);
+ $ds->setIncludes(array('**/'.$this->subIndicatorFile));
+ $ds->scan();
+ $files = $ds->getIncludedFiles();
+
+ // Process the files we found
+ foreach ($files as $file) {
+ $pkg = file_get_contents($repo . '/.subsplit' . $base .'/'. $file);
+ $pkg_json = json_decode($pkg, true);
+ $name = $pkg_json['name'];
+ $component = str_replace('/composer.json', '', $file);
+ // keep this for split cmd
+ $tmpreponame = explode('/', $name);
+ $reponame = $tmpreponame[1];
+ $splits[$head][$component]['repo'] = $reponame;
+ $nscomponent = str_replace('/', '\\', $component);
+ $splits[$head][$component]['desc'] = "[READ ONLY] Subtree split of $nscomponent: " . $pkg_json['description'];
+ }
+ }
+
+ // go back to how we found it
+ passthru("git checkout master");
+ chdir($repo);
+ $this->splits = $splits;
+ }
+
+ /**
+ * Based on list of repositories we determined we *should* have, talk
+ * to GitHub and make sure they're all there.
+ *
+ */
+ protected function verifyRepos()
+ {
+ $this->log('verifying GitHub target repos');
+ $github_org = $this->getOwningTarget()->getProject()->getProperty('github.org');
+ $github_creds = $this->getOwningTarget()->getProject()->getProperty('github.basicauth');
+
+ if ($github_creds == 'username:password') {
+ $this->log('Skipping GitHub repo checks. Update github.basicauth in build.properties to verify repos.', 1);
+ return;
+ }
+
+ $ch = curl_init('https://api.github.com/orgs/'.$github_org.'/repos?type=all');
+ curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
+ curl_setopt($ch, CURLOPT_USERPWD, $github_creds);
+ // change this when we know we can use our bundled CA bundle!
+ curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
+ $result = curl_exec($ch);
+ curl_close($ch);
+ $repos = json_decode($result, true);
+ $existing_repos = array();
+
+ // parse out the repos we found on GitHub
+ foreach ($repos as $repo) {
+ $tmpreponame = explode('/', $repo['full_name']);
+ $reponame = $tmpreponame[1];
+ $existing_repos[$reponame] = $repo['description'];
+ }
+
+ $heads = $this->getHeads();
+ foreach ($heads as $head) {
+ foreach ($this->splits[$head] as $component => $meta) {
+
+ $reponame = $meta['repo'];
+
+ if (!isset($existing_repos[$reponame])) {
+ $this->log("Creating missing repo $reponame");
+ $payload = array(
+ 'name' => $reponame,
+ 'description' => $meta['desc'],
+ 'homepage' => 'http://www.guzzlephp.org/',
+ 'private' => true,
+ 'has_issues' => false,
+ 'has_wiki' => false,
+ 'has_downloads' => true,
+ 'auto_init' => false
+ );
+ $ch = curl_init('https://api.github.com/orgs/'.$github_org.'/repos');
+ curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
+ curl_setopt($ch, CURLOPT_USERPWD, $github_creds);
+ curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json'));
+ curl_setopt($ch, CURLOPT_POST, 1);
+ curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($payload));
+ // change this when we know we can use our bundled CA bundle!
+ curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
+ $result = curl_exec($ch);
+ echo "Response code: ".curl_getinfo($ch, CURLINFO_HTTP_CODE)."\n";
+ curl_close($ch);
+ } else {
+ $this->log("Repo $reponame exists", 2);
+ }
+ }
+ }
+ }
+}