Commit f0240366 authored by sbc's avatar sbc Committed by Commit bot

[NaCl SDK] genhttpfs.py: allow filenames with spaces in them.

Allow special characters such as spaces in filenames.

Also includes some general cleanup, and documentation.

Review URL: https://codereview.chromium.org/15854004

Cr-Commit-Position: refs/heads/master@{#292713}
parent 89acb2b4
......@@ -3,23 +3,27 @@
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
# This scripts generates a manifest file for the MountHttp file system.
# Files and directory paths are specified on the command-line. The names
# with glob and directories are recursed to form a list of files.
#
# For each file, the mode bits, size and path relative to the CWD are written
# to the output file which is stdout by default.
#
"""This script generates a manifest file for nacl_io's HTTP file-system.
Files and directory paths are specified on the command-line. The names
with glob and directories are recursed to form a list of files.
For each file, the mode bits, size and path relative to the CWD are written
to the output file which is stdout by default.
"""
import glob
import optparse
import os
import sys
import urllib
class Error(Exception):
pass
def main(argv):
parser = optparse.OptionParser(
usage='Usage: %prog [options] filename ...')
parser = optparse.OptionParser(description=__doc__,
usage='Usage: %prog [options] <filename>...')
parser.add_option('-C', '--srcdir',
help='Change directory.', dest='srcdir', default=None)
parser.add_option('-o', '--output',
......@@ -39,12 +43,15 @@ def main(argv):
if options.srcdir:
os.chdir(options.srcdir)
if not args:
parser.error("One or more pathnames must be specified. See --help.")
# Generate a set of unique file names bases on the input globs
fileset = set()
for fileglob in args:
filelist = glob.glob(fileglob)
if not filelist:
raise RuntimeError('Could not find match for "%s".\n' % fileglob)
raise Error('Could not find match for "%s".\n' % fileglob)
for filename in filelist:
if os.path.isfile(filename):
fileset |= set([filename])
......@@ -53,18 +60,19 @@ def main(argv):
for root, _, files in os.walk(filename):
fileset |= set([os.path.join(root, name) for name in files])
continue
raise RuntimeError('Can not handle path "%s".\n' % filename)
raise Error('Can not handle path "%s".\n' % filename)
cwd = os.path.abspath(os.getcwd())
cwdlen = len(cwd)
for filename in sorted(fileset):
relname = os.path.abspath(filename)
if cwd not in relname:
raise RuntimeError('%s is not relative to CWD %s.\n' % filename, cwd)
raise Error('%s is not relative to CWD %s.\n' % filename, cwd)
relname = relname[cwdlen:]
stat = os.stat(filename)
mode = '-r--'
outfile.write('%s %d %s\n' % (mode, stat.st_size, relname))
name = urllib.quote(relname)
outfile.write('%s %d %s\n' % (mode, stat.st_size, name))
return 0
......@@ -72,6 +80,6 @@ def main(argv):
if __name__ == '__main__':
try:
sys.exit(main(sys.argv[1:]))
except OSError, e:
except Error, e:
sys.stderr.write('%s: %s\n' % (os.path.basename(__file__), e))
sys.exit(1)
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment