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 @@ ...@@ -3,23 +3,27 @@
# Use of this source code is governed by a BSD-style license that can be # Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file. # found in the LICENSE file.
# This scripts generates a manifest file for the MountHttp file system. """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 Files and directory paths are specified on the command-line. The names
# with glob and directories are recursed to form a list of files. 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 For each file, the mode bits, size and path relative to the CWD are written
# to the output file which is stdout by default. to the output file which is stdout by default.
# """
import glob import glob
import optparse import optparse
import os import os
import sys import sys
import urllib
class Error(Exception):
pass
def main(argv): def main(argv):
parser = optparse.OptionParser( parser = optparse.OptionParser(description=__doc__,
usage='Usage: %prog [options] filename ...') usage='Usage: %prog [options] <filename>...')
parser.add_option('-C', '--srcdir', parser.add_option('-C', '--srcdir',
help='Change directory.', dest='srcdir', default=None) help='Change directory.', dest='srcdir', default=None)
parser.add_option('-o', '--output', parser.add_option('-o', '--output',
...@@ -39,12 +43,15 @@ def main(argv): ...@@ -39,12 +43,15 @@ def main(argv):
if options.srcdir: if options.srcdir:
os.chdir(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 # Generate a set of unique file names bases on the input globs
fileset = set() fileset = set()
for fileglob in args: for fileglob in args:
filelist = glob.glob(fileglob) filelist = glob.glob(fileglob)
if not filelist: 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: for filename in filelist:
if os.path.isfile(filename): if os.path.isfile(filename):
fileset |= set([filename]) fileset |= set([filename])
...@@ -53,18 +60,19 @@ def main(argv): ...@@ -53,18 +60,19 @@ def main(argv):
for root, _, files in os.walk(filename): for root, _, files in os.walk(filename):
fileset |= set([os.path.join(root, name) for name in files]) fileset |= set([os.path.join(root, name) for name in files])
continue 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()) cwd = os.path.abspath(os.getcwd())
cwdlen = len(cwd) cwdlen = len(cwd)
for filename in sorted(fileset): for filename in sorted(fileset):
relname = os.path.abspath(filename) relname = os.path.abspath(filename)
if cwd not in relname: 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:] relname = relname[cwdlen:]
stat = os.stat(filename) stat = os.stat(filename)
mode = '-r--' 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 return 0
...@@ -72,6 +80,6 @@ def main(argv): ...@@ -72,6 +80,6 @@ def main(argv):
if __name__ == '__main__': if __name__ == '__main__':
try: try:
sys.exit(main(sys.argv[1:])) sys.exit(main(sys.argv[1:]))
except OSError, e: except Error, e:
sys.stderr.write('%s: %s\n' % (os.path.basename(__file__), e)) sys.stderr.write('%s: %s\n' % (os.path.basename(__file__), e))
sys.exit(1) 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