blob: 989375b340a40303e5956b6ca58f0298afe55b7e [file] [log] [blame]
<?php
/**
* *****************************************************************************
* Copyright (c) 2016 Eclipse Foundation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Wayne Beaton (Eclipse Foundation)- initial API and implementation
* Christopher Guindon (Eclipse Foundation) - minor changes
* *****************************************************************************
*/
/**
* This class represents a forge instance (e.g.
* Eclipse, LocationTech,
* or PolarSys). The intent is to try and centralize the notion of a
* forge rather than have bits of code here and there to handle all of
* the different forges (i.e. to reduce the long term maintenance burden).
*/
class Forge {
/**
* Forge data
*
* @var array
*/
public $data = array();
/**
* List of all forges
*
* @var array
*/
private static $forges = array();
/**
* Constructor
*
* @param unknown $data
*/
function __construct($data = array()) {
$this->data = $data;
}
/**
* Get $forges
*
* @return Forge[]
*/
static function getForges() {
if (!empty(self::$forges)) {
return self::$forges;
}
$forges = array(
'eclipse' => array(
'id' => 'eclipse',
'name' => 'Eclipse',
'url' => 'https://projects.eclipse.org',
'hudson_domain' => array(
'hudson.eclipse.org',
'ci.eclipse.org'
)
)
);
foreach ($forges as &$forge) {
$forge = new self($forge);
}
return self::$forges = $forges;
}
/**
* Get specific forge
*
* @param string $id
*
* @return Forge
*/
static function getForge($id) {
$forges = self::getForges();
if (isset($forges[$id])) {
return $forges[$id];
}
return array();
}
/**
* Get default forge
*
* @return Forge
*/
static function getDefault() {
return self::getForge('eclipse');
}
/**
* Get forge from project id
*
* @param unknown $id
*
* @return NULL|Forge
*/
static function getForgeForProjectId($id) {
$segments = explode('.', $id);
if ($segments[0] == 'foundation-internal') {
return null;
}
foreach (self::getForges() as $id => $forge) {
if ($id == $segments[0]) {
return $forge;
}
}
return self::getDefault();
}
/**
* Get forge id
*
* @return string
*/
function getId() {
if (isset($this->data['id'])) {
return $this->data['id'];
}
return "";
}
/**
* Get forge name
*
* @return string
*/
function getName() {
if (isset($this->data['name'])) {
return $this->data['name'];
}
return "";
}
/**
* Get forge url
*
* @return string
*/
function getUrl() {
if (isset($this->data['url'])) {
return $this->data['url'];
}
return "";
}
/**
* Get hudson url
*
* @return array
*/
function getHudsonDomain() {
if (isset($this->data['hudson_domain'])) {
return $this->data['hudson_domain'];
}
return array();
}
/**
* Get local project id based off the forge
*
* @param unknown $id
* @return unknown|NULL
*/
function getLocalProjectId($id) {
if ($this->isEclipseForge()) {
return $id;
}
$forgeId = $this->getId();
if (preg_match("/^$forgeId\.(.*)$/", $id, $matches)) {
return $matches[1];
}
return null;
}
/**
* Verify if current forge is Eclipse
*
* @return boolean
*/
function isEclipseForge() {
return $this->getId() == 'eclipse';
}
/**
* Validate if url is a valid CI url
*
* @param string $url
* @return boolean
*/
public function isValidCIUrl($url = "") {
// Verify the syntax of the given URL
if (!filter_var($url, FILTER_VALIDATE_URL)) {
return FALSE;
}
// get forge class from eclipse.org-common
$parsed_url = parse_url(strtolower($url));
if (!isset($parsed_url['path'])) {
// no path specified
return FALSE;
}
$host_parts = explode('.', $parsed_url['host']);
// main domain name should be 2nd from last
if (count($host_parts) < 2) {
// the build link url is very unlikely to be valid
return FALSE;
}
// check host is in the list of accepted domains
$hudson_domain = $this->getHudsonDomain();
if (!in_array($parsed_url['host'], $hudson_domain)) {
return FALSE;
}
// break the path into parts
$path_parts = explode('/', trim($parsed_url['path'], '/'));
if (empty($path_parts[0])) {
// first part is empty, parsed path had only contained '/'
return FALSE;
}
// check path size, should be 1 or 3 parts
if (count($path_parts) < 1 || count($path_parts) > 3) {
// path longer than expected
return FALSE;
}
if (count($path_parts) === 3) {
// some projects have hudson for first path part - should be project name
// 2nd part should be job if job specified (3rd part is build job name)
if ($path_parts[0] === 'hudson' || $path_parts[1] !== 'job') {
return FALSE;
}
}
return TRUE;
}
}