Index: site_scons/site_tools/publish.py |
=================================================================== |
--- site_scons/site_tools/publish.py (revision 12583) |
+++ site_scons/site_tools/publish.py (working copy) |
@@ -1,195 +0,0 @@ |
-#!/usr/bin/python2.4 |
-# Copyright 2008, Google Inc. |
-# All rights reserved. |
-# |
-# Redistribution and use in source and binary forms, with or without |
-# modification, are permitted provided that the following conditions are |
-# met: |
-# |
-# * Redistributions of source code must retain the above copyright |
-# notice, this list of conditions and the following disclaimer. |
-# * Redistributions in binary form must reproduce the above |
-# copyright notice, this list of conditions and the following disclaimer |
-# in the documentation and/or other materials provided with the |
-# distribution. |
-# * Neither the name of Google Inc. nor the names of its |
-# contributors may be used to endorse or promote products derived from |
-# this software without specific prior written permission. |
-# |
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
-# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
-# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
-# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
-# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
-# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
-# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
-# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
-# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
-# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
-# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
- |
-"""Publish tool for SCons.""" |
- |
- |
-# List of published resources. This is a dict indexed by group name. Each |
-# item in this dict is a dict indexed by resource type. Items in that dict |
-# are lists of files for that resource. |
-__published = {} |
- |
-#------------------------------------------------------------------------------ |
- |
- |
-class PublishItem(object): |
- """Item to be published.""" |
- |
- def __init__(self, source, subdir): |
- """Initialize object. |
- |
- Args: |
- source: Source node. |
- subdir: If not None, subdirectory to copy node into in |
- ReplicatePublished(). |
- """ |
- object.__init__(self) |
- self.source = source |
- self.subdir = subdir |
- |
-#------------------------------------------------------------------------------ |
- |
- |
-def _InitializePublish(env): |
- """Re-initializes published resources. |
- |
- Args: |
- env: Parent environment |
- """ |
- env=env # Silence gpylint |
- |
- # Clear the dict of published resources |
- __published.clear() |
- |
- |
-def ReplicatePublished(self, target, group_name, resource_type): |
- """Replicate published resources for the group to the target directory. |
- |
- Args: |
- self: Environment in which this function was called. |
- target: Target directory for resources. |
- group_name: Name of resource group, or a list of names of resource groups. |
- resource_type: Type of resources (string), or a list of resource types. |
- |
- Uses the subdir parameter passed to Publish() when replicating source nodes |
- to the target. |
- |
- Returns: |
- The list of target nodes from the calls to Replicate(). |
- |
- Since this is based on Replicate(), it will also use the REPLICATE_REPLACE |
- variable, if it's set in the calling environment. |
- """ |
- target_path = self.Dir(target).abspath |
- |
- dest_nodes = [] |
- for group in self.SubstList2(group_name): |
- for resource in self.SubstList2(resource_type): |
- # Get items for publish group and resource type |
- items = __published.get(group, {}).get(resource, []) |
- for i in items: |
- if i.subdir: |
- dest_nodes += self.Replicate(target_path + '/' + i.subdir, i.source) |
- else: |
- dest_nodes += self.Replicate(target_path, i.source) |
- return dest_nodes |
- |
- |
-def GetPublished(self, group_name, resource_type): |
- """Returns a list of the published resources of the specified type. |
- |
- Args: |
- self: Environment in which this function was called. |
- group_name: Name of resource group, or a list of names of resource groups. |
- resource_type: Type of resources (string), or a list of resource types. |
- |
- Returns: |
- A flattened list of the source nodes from calls to Publish() for the |
- specified group and resource type. Returns an empty list if there are |
- no matching resources. |
- """ |
- source_list = [] |
- for group in self.SubstList2(group_name): |
- # Get items for publish group and resource type |
- for resource in self.SubstList2(resource_type): |
- items = __published.get(group, {}).get(resource, []) |
- for i in items: |
- source_list.append(i.source) |
- |
- return source_list |
- |
- |
-def Publish(self, group_name, resource_type, source, subdir=None): |
- """Publishes resources for use by other scripts. |
- |
- Args: |
- self: Environment in which this function was called. |
- group_name: Name of resource group. |
- resource_type: Type of resources (string). |
- source: Source file(s) to copy. May be a string, Node, or a list of |
- mixed strings or Nodes. Strings will be passed through env.Glob() to |
- evaluate wildcards. If a source evaluates to a directory, the entire |
- directory will be recursively copied. |
- subdir: Subdirectory to which the resources should be copied, relative to |
- the primary directory for that resource type, if not None. |
- """ |
- if subdir is None: |
- subdir = '' # Make string so we can append to it |
- |
- # Evaluate SCons variables in group name |
- # TODO(rspangler): Should Publish() be able to take a list of group names |
- # and publish the resource to all of them? |
- group_name = self.subst(group_name) |
- |
- # Get list of sources |
- items = [] |
- for source_entry in self.Flatten(source): |
- if isinstance(source_entry, str): |
- # Search for matches for each source entry |
- # TODO(rspangler): If there are no wildcard chars in the source entry, |
- # should generate an error if there were no matches? |
- source_nodes = self.Glob(source_entry) |
- else: |
- # Source entry is already a file or directory node; no need to glob it |
- source_nodes = [source_entry] |
- for s in source_nodes: |
- if str(s.__class__) == 'SCons.Node.FS.Dir': |
- # Recursively publish all files in subdirectory. Since glob('*') |
- # doesn't match dot files, also glob('.*'). |
- self.Publish(group_name, resource_type, |
- [s.abspath + '/*', s.abspath + '/.*'], |
- subdir=subdir + '/' + s.name) |
- else: |
- items.append(PublishItem(s, subdir)) |
- |
- # Publish items, if any |
- if items: |
- # Get publish group |
- if group_name not in __published: |
- __published[group_name] = {} |
- group = __published[group_name] |
- if resource_type not in group: |
- group[resource_type] = [] |
- |
- # Publish items into group |
- group[resource_type] += items |
- |
- |
-def generate(env): |
- # NOTE: SCons requires the use of this name, which fails gpylint. |
- """SCons entry point for this tool.""" |
- |
- # Defer initializing publish, but do before building SConscripts |
- env.Defer(_InitializePublish) |
- env.Defer('BuildEnvironmentSConscripts', after=_InitializePublish) |
- |
- env.AddMethod(GetPublished) |
- env.AddMethod(Publish) |
- env.AddMethod(ReplicatePublished) |