#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# ==============================================================================
# Copyright and license info is available in the LICENSE file included with
# the Server Deployment Package (SDP), and also available online:
# https://swarm.workshop.perforce.com/projects/perforce-software-sdp/view/main/LICENSE
# ------------------------------------------------------------------------------
"""
NAME:
WorkflowTriggers.py
DESCRIPTION:
Base class with utility functions for interfacing with Swarm and parsing workflow yaml file.
"""
# Python 2.7/3.3 compatibility.
from __future__ import print_function
import sys
import P4Triggers
import P4
import requests
import yaml
class WorkflowTrigger(P4Triggers.P4Trigger):
"""See module doc string for details"""
def load_config(self, config_file=None):
if not config_file:
config_file = "/p4/common/config/Workflow.yaml"
config = {}
try:
with open(config_file, 'r') as f:
config = yaml.load(f)
except Exception as e:
self.logger.error(str(e))
return config
def get_swarm_url(self):
"""Read from Perforce server propery value"""
if self.options.test_mode:
return "http://swarm.dev/"
prop = self.p4.run('property', '-l' , '-n', 'P4.Swarm.URL')
self.logger.debug("Property: %s" % str(prop))
url = prop[0]['value']
if url[-1] != '/':
url += '/'
return url
def get_project(self, config, change):
"""Return first matching project for a file in the change"""
if not 'projects' in config:
return {}
# Search all config projects and return as soon as we find one that we are in which
# has specified key value set to 'y'
for prj in config['projects']:
if not 'name' in prj or not 'depot_paths' in prj:
return False
map = P4.Map()
for p in prj['depot_paths']:
map.insert(p)
for df in change.files:
if map.includes(df.depotFile):
return prj
return {}
def project_flag_true(self, config, change, key):
"""Returns True if specified field (key) has a value of 'y' for a matching project"""
if not 'projects' in config:
return False
# Search all config projects and return as soon as we find one that we are in which
# has specified key value set to 'y'
for prj in config['projects']:
if not 'name' in prj or not 'depot_paths' in prj:
return False
if not key in prj or not prj[key] == 'y':
continue
map = P4.Map()
for p in prj['depot_paths']:
map.insert(p)
for df in change.files:
if map.includes(df.depotFile):
return True
return False