| Index: third_party/gsutil/setup.py
 | 
| diff --git a/third_party/gsutil/setup.py b/third_party/gsutil/setup.py
 | 
| new file mode 100755
 | 
| index 0000000000000000000000000000000000000000..af63de6e579531f579661dee40b0bf1ef0a1b491
 | 
| --- /dev/null
 | 
| +++ b/third_party/gsutil/setup.py
 | 
| @@ -0,0 +1,141 @@
 | 
| +#!/usr/bin/env python
 | 
| +# coding=utf8
 | 
| +# Copyright 2011 Google Inc.
 | 
| +#
 | 
| +# Licensed under the Apache License, Version 2.0 (the "License");
 | 
| +# you may not use this file except in compliance with the License.
 | 
| +# You may obtain a copy of the License at
 | 
| +#
 | 
| +#     http://www.apache.org/licenses/LICENSE-2.0
 | 
| +#
 | 
| +# Unless required by applicable law or agreed to in writing, software
 | 
| +# distributed under the License is distributed on an "AS IS" BASIS,
 | 
| +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
| +# See the License for the specific language governing permissions and
 | 
| +# limitations under the License.
 | 
| +
 | 
| +'''Distutils setup.py script for Google Cloud Storage command line tool.'''
 | 
| +
 | 
| +import glob
 | 
| +import sys
 | 
| +import os
 | 
| +import platform
 | 
| +from distutils.core import setup
 | 
| +from pkg_util import parse_manifest
 | 
| +
 | 
| +print '''
 | 
| +NOTE: Enterprise mode (installing gsutil via setup.py) is no longer officially 
 | 
| +supported - unpacking the zip file into a directory is the preferred method 
 | 
| +for installing gsutil for both shared and private configurations. See README 
 | 
| +and README.pkg for further details.
 | 
| +'''
 | 
| +
 | 
| +# Command name and target directory.
 | 
| +NAME = 'gsutil'
 | 
| +TARGET = '/usr/share/gsutil'
 | 
| +BINDIR = '/usr/bin'
 | 
| +
 | 
| +# Enterprise mode (shared/central) installation is not supported
 | 
| +# on Windows.
 | 
| +system = platform.system()
 | 
| +if system.lower().startswith('windows'):
 | 
| +  error = 'ERROR: enterprise (shared/central) installation is not ' \
 | 
| +          'supported on Windows.'
 | 
| +  exit(error)
 | 
| +
 | 
| +def walk(dir, paths):
 | 
| +  '''Do a recursive file tree walk, adding files found to passed dict.'''
 | 
| +  for file in os.listdir(dir):
 | 
| +    # Skip "dot files".
 | 
| +    if file[0] == '.':
 | 
| +      continue
 | 
| +    path = dir + '/' + file
 | 
| +    if os.path.isdir(path):
 | 
| +      walk(path, paths)
 | 
| +    else:
 | 
| +      if dir not in paths:
 | 
| +        paths[dir] = []
 | 
| +      paths[dir].append(path)
 | 
| +
 | 
| +def first_token(filename):
 | 
| +  '''Open file, read first line, parse & return first token to caller.'''
 | 
| +  token = None
 | 
| +  f = open(filename, 'r')
 | 
| +  line = f.readline().strip()
 | 
| +  tokens = line.split()
 | 
| +  token = tokens[0]
 | 
| +  f.close()
 | 
| +  return token
 | 
| +
 | 
| +# Validate python version.
 | 
| +if sys.version_info <= (2, 6):
 | 
| +  error = 'ERROR: gsutil requires Python Version 2.6 or above...exiting.'
 | 
| +  exit(error)
 | 
| +
 | 
| +# Rather than hard-coding package contents here, we read the manifest 
 | 
| +# file to obtain the list of files and directories to include.
 | 
| +files = []
 | 
| +dirs = []
 | 
| +parse_manifest(files, dirs)
 | 
| +
 | 
| +# Build list of data files dynamically.
 | 
| +data_files = [(TARGET, files)]
 | 
| +paths = {}
 | 
| +for dir in dirs:
 | 
| +  walk(dir, paths)
 | 
| +for path in paths:
 | 
| +  data_files += (os.path.join(TARGET, path), paths[path]),
 | 
| +
 | 
| +long_desc = '''
 | 
| +GSUtil is a Python application that lets you access Google Cloud Storage 
 | 
| +from the command line. You can use GSUtil to do a wide range of bucket and 
 | 
| +object management tasks, including:
 | 
| +- Creating and deleting buckets.
 | 
| +- Uploading, downloading, and deleting objects.
 | 
| +- Listing buckets and objects.
 | 
| +- Moving, copying, and renaming objects.
 | 
| +- Setting object and bucket ACLs.
 | 
| +'''
 | 
| +
 | 
| +VERSION = first_token('VERSION')
 | 
| +if not VERSION:
 | 
| +  error = 'ERROR: can\'t find gsutil version...exiting.'
 | 
| +  exit(error)
 | 
| +
 | 
| +# This is the main function call that installs the gsutil package. See
 | 
| +# distutil documentation for details on this function and its arguments.
 | 
| +setup(name = NAME,
 | 
| +      version = VERSION,
 | 
| +      license = 'Apache 2.0',
 | 
| +      author = 'Google',
 | 
| +      author_email = 'gs-team@google.com',
 | 
| +      url = 'http://code.google.com/apis/storage/docs/gsutil.html',
 | 
| +      description = 'gsutil - command line utility for Google Cloud Storage',
 | 
| +      long_description = long_desc,
 | 
| +      data_files = data_files,
 | 
| +      # Dependency on boto commented out for now because initially we plan to 
 | 
| +      # bundle boto with this package, however, when we're ready to depend on 
 | 
| +      # a separate boto rpm package, this line should be uncommented.
 | 
| +      #requires = ['boto (>=2.0)'],
 | 
| +      )
 | 
| +
 | 
| +# Create symlink from /usr/bin/gsutil to /usr/share/gsutil/gsutil but
 | 
| +# only run directly in enterprise mode (see README.pkg). When run by
 | 
| +# rpmbuild we don't want to create this link because it's done by the 
 | 
| +# rpm spec file slightly differently (using a relative link). Same story 
 | 
| +# for permission setting, which is only needed if not run by rpmbuild.
 | 
| +if not os.environ.get('RPM_BUILD_ROOT'):
 | 
| +  link = os.path.join(BINDIR, NAME)
 | 
| +  dest = os.path.join(TARGET, NAME)
 | 
| +  if not os.path.exists(link):
 | 
| +    os.symlink(dest, link)
 | 
| +  # Make all files and dirs in install area readable by other
 | 
| +  # and make all directories executable by other. These steps
 | 
| +  # are performed in support of the enterprise (shared/central)
 | 
| +  # installation mode, in which users with different user/group
 | 
| +  # than the installation user/group must be able to run gsutil.
 | 
| +  os.system('chmod -R o+r ' + TARGET)
 | 
| +  os.system('find ' + TARGET + ' -type d | xargs chmod o+x')
 | 
| +  # Make main gsutil script readable and executable by other.
 | 
| +  os.system('chmod o+rx ' + os.path.join(TARGET, NAME))
 | 
| +
 | 
| 
 |