Index: site_scons/site_tools/replicate.py |
=================================================================== |
--- site_scons/site_tools/replicate.py (revision 12583) |
+++ site_scons/site_tools/replicate.py (working copy) |
@@ -1,126 +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. |
- |
-"""Replicate tool for SCons.""" |
- |
- |
-import re |
- |
- |
-def Replicate(env, target, source, **kw): |
- """Replicates (copies) source files/directories to the target directory. |
- |
- Much like env.Install(), with the following differences: |
- * If the source is a directory, recurses through it and calls |
- env.Install() on each source file, rather than copying the entire |
- directory at once. This provides more opportunity for hard linking, and |
- also makes the destination files/directories all writable. |
- * Can take sources which contain env.Glob()-style wildcards. |
- * Can take multiple target directories; will copy to all of them. |
- * Handles duplicate requests. |
- |
- Args: |
- env: Environment in which to operate. |
- target: Destination(s) for copy. Must evaluate to a directory via |
- env.Dir(), or a list of directories. If more than one directory is |
- passed, the entire source list will be copied to each target |
- directory. |
- 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. |
- |
- From env: |
- REPLICATE_REPLACE: A list of pairs of regex search and replacement strings. |
- Each full destination path has substitution performed on each pair |
- (search_regex, replacement) in order. |
- |
- env.Replicate('destdir', ['footxt.txt'], REPLICATE_REPLACE = [ |
- ('\\.txt', '.bar'), ('est', 'ist')]) |
- will copy to 'distdir/footxt.bar' |
- |
- In the example above, note the use of \\ to escape the '.' character, |
- so that it doesn't act like the regexp '.' and match any character. |
- |
- Returns: |
- A list of the destination nodes from the calls to env.Install(). |
- """ |
- replace_list = kw.get('REPLICATE_REPLACE', env.get('REPLICATE_REPLACE', [])) |
- |
- dest_nodes = [] |
- for target_entry in env.Flatten(target): |
- for source_entry in env.Flatten(source): |
- if type(source_entry) == str: |
- # Search for matches for each source entry |
- source_nodes = env.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: |
- target_name = env.Dir(target_entry).abspath + '/' + s.name |
- # We need to use the following incantation rather than s.isdir() in |
- # order to handle chained replicates (A -> B -> C). The isdir() |
- # function is not properly defined in all of the Node type classes in |
- # SCons. This change is particularly crucial if hardlinks are present, |
- # in which case using isdir() can cause files to be unintentionally |
- # deleted. |
- # TODO(bradnelson): Look into fixing the innards of SCons so this isn't |
- # needed. |
- if str(s.__class__) == 'SCons.Node.FS.Dir': |
- # Recursively copy all files in subdir. Since glob('*') doesn't |
- # match dot files, also glob('.*'). |
- dest_nodes += env.Replicate( |
- target_name, [s.abspath + '/*', s.abspath + '/.*'], |
- REPLICATE_REPLACE=replace_list) |
- else: |
- # Apply replacement strings, if any |
- for r in replace_list: |
- target_name = re.sub(r[0], r[1], target_name) |
- target = env.File(target_name) |
- if (target.has_builder() |
- and hasattr(target.get_builder(), 'name') |
- and target.get_builder().name == 'InstallBuilder' |
- and target.sources == [s]): |
- # Already installed that file, so pass through the destination node |
- # TODO(rspangler): Is there a better way to determine if this is a |
- # duplicate install? |
- dest_nodes += [target] |
- else: |
- dest_nodes += env.InstallAs(target_name, s) |
- |
- # Return list of destination nodes |
- return dest_nodes |
- |
- |
-def generate(env): |
- # NOTE: SCons requires the use of this name, which fails gpylint. |
- """SCons entry point for this tool.""" |
- |
- env.AddMethod(Replicate) |