Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(25)

Unified Diff: third_party/twisted_8_1/twisted/python/zshcomp.py

Issue 12261012: Remove third_party/twisted_8_1 (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/tools/build
Patch Set: Created 7 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: third_party/twisted_8_1/twisted/python/zshcomp.py
diff --git a/third_party/twisted_8_1/twisted/python/zshcomp.py b/third_party/twisted_8_1/twisted/python/zshcomp.py
deleted file mode 100644
index 4910cfd59f456e6ac1202443317c3d6c5a9eadcf..0000000000000000000000000000000000000000
--- a/third_party/twisted_8_1/twisted/python/zshcomp.py
+++ /dev/null
@@ -1,780 +0,0 @@
-# -*- test-case-name: twisted.test.test_zshcomp -*-
-# Copyright (c) 2006 Twisted Matrix Laboratories.
-# See LICENSE for details.
-
-"""
-Rebuild the completion functions for the currently active version of Twisted::
- $ python zshcomp.py -i
-
-This module implements a zsh code generator which generates completion code for
-commands that use twisted.python.usage. This is the stuff that makes pressing
-Tab at the command line work.
-
-Maintainer: Eric Mangold
-
-To build completion functions for your own commands, and not Twisted commands,
-then just do something like this::
-
- o = mymodule.MyOptions()
- f = file('_mycommand', 'w')
- Builder("mycommand", o, f).write()
-
-Then all you have to do is place the generated file somewhere in your
-C{$fpath}, and restart zsh. Note the "site-functions" directory in your
-C{$fpath} where you may install 3rd-party completion functions (like the one
-you're building). Call C{siteFunctionsPath} to locate this directory
-programmatically.
-
-SPECIAL CLASS VARIABLES. You may set these on your usage.Options subclass::
-
- zsh_altArgDescr
- zsh_multiUse
- zsh_mutuallyExclusive
- zsh_actions
- zsh_actionDescr
- zsh_extras
-
-Here is what they mean (with examples)::
-
- zsh_altArgDescr = {"foo":"use this description for foo instead"}
- A dict mapping long option names to alternate descriptions. When this
- variable is present, the descriptions contained here will override
- those descriptions provided in the optFlags and optParameters
- variables.
-
- zsh_multiUse = ["foo", "bar"]
- A sequence containing those long option names which may appear on the
- command line more than once. By default, options will only be completed
- one time.
-
- zsh_mutuallyExclusive = [("foo", "bar"), ("bar", "baz")]
- A sequence of sequences, with each sub-sequence containing those long
- option names that are mutually exclusive. That is, those options that
- cannot appear on the command line together.
-
- zsh_actions = {"foo":'_files -g "*.foo"', "bar":"(one two three)",
- "colors":"_values -s , 'colors to use' red green blue"}
- A dict mapping long option names to Zsh "actions". These actions
- define what will be completed as the argument to the given option. By
- default, all files/dirs will be completed if no action is given.
-
- Callables may instead be given for the values in this dict. The
- callable should accept no arguments, and return a string that will be
- used as the zsh "action" in the same way as the literal strings in the
- examples above.
-
- As you can see in the example above. The "foo" option will have files
- that end in .foo completed when the user presses Tab. The "bar"
- option will have either of the strings "one", "two", or "three"
- completed when the user presses Tab.
-
- "colors" will allow multiple arguments to be completed, seperated by
- commas. The possible arguments are red, green, and blue. Examples::
-
- my_command --foo some-file.foo --colors=red,green
- my_command --colors=green
- my_command --colors=green,blue
-
- Actions may take many forms, and it is beyond the scope of this
- document to illustrate them all. Please refer to the documention for
- the Zsh _arguments function. zshcomp is basically a front-end to Zsh's
- _arguments completion function.
-
- That documentation is available on the zsh web site at this URL:
- U{http://zsh.sunsite.dk/Doc/Release/zsh_19.html#SEC124}
-
- zsh_actionDescr = {"logfile":"log file name", "random":"random seed"}
- A dict mapping long option names to a description for the corresponding
- zsh "action". These descriptions are show above the generated matches
- when the user is doing completions for this option.
-
- Normally Zsh does not show these descriptions unless you have
- "verbose" completion turned on. Turn on verbosity with this in your
- ~/.zshrc::
-
- zstyle ':completion:*' verbose yes
- zstyle ':completion:*:descriptions' format '%B%d%b'
-
- zsh_extras = [":file to read from:action", ":file to write to:action"]
- A sequence of extra arguments that will be passed verbatim to Zsh's
- _arguments completion function. The _arguments function does all the
- hard work of doing command line completions. You can see how zshcomp
- invokes the _arguments call by looking at the generated completion
- files that this module creates.
-
- *** NOTE ***
-
- You will need to use this variable to describe completions for normal
- command line arguments. That is, those arguments that are not
- associated with an option. That is, the arguments that are given to the
- parseArgs method of your usage.Options subclass.
-
- In the example above, the 1st non-option argument will be described as
- "file to read from" and completion options will be generated in
- accordance with the "action". (See above about zsh "actions") The
- 2nd non-option argument will be described as "file to write to" and
- the action will be interpreted likewise.
-
- Things you can put here are all documented under the _arguments
- function here: U{http://zsh.sunsite.dk/Doc/Release/zsh_19.html#SEC124}
-
-Zsh Notes:
-
-To enable advanced completion add something like this to your ~/.zshrc::
-
- autoload -U compinit
- compinit
-
-For some extra verbosity, and general niceness add these lines too::
-
- zstyle ':completion:*' verbose yes
- zstyle ':completion:*:descriptions' format '%B%d%b'
- zstyle ':completion:*:messages' format '%d'
- zstyle ':completion:*:warnings' format 'No matches for: %d'
-
-Have fun!
-"""
-import itertools, sys, commands, os.path
-
-from twisted.python import reflect, util, usage
-from twisted.scripts.mktap import IServiceMaker
-
-class MyOptions(usage.Options):
- """
- Options for this file
- """
- longdesc = ""
- synopsis = "Usage: python zshcomp.py [--install | -i] | <output directory>"
- optFlags = [["install", "i",
- 'Output files to the "installation" directory ' \
- '(twisted/python/zsh in the currently active ' \
- 'Twisted package)']]
- optParameters = [["directory", "d", None,
- "Output files to this directory"]]
- def postOptions(self):
- if self['install'] and self['directory']:
- raise usage.UsageError, "Can't have --install and " \
- "--directory at the same time"
- if not self['install'] and not self['directory']:
- raise usage.UsageError, "Not enough arguments"
- if self['directory'] and not os.path.isdir(self['directory']):
- raise usage.UsageError, "%s is not a directory" % self['directory']
-
-class Builder:
- def __init__(self, cmd_name, options, file):
- """
- @type cmd_name: C{str}
- @param cmd_name: The name of the command
-
- @type options: C{twisted.usage.Options}
- @param options: The C{twisted.usage.Options} instance defined for
- this command
-
- @type file: C{file}
- @param file: The C{file} to write the completion function to
- """
-
- self.cmd_name = cmd_name
- self.options = options
- self.file = file
-
- def write(self):
- """
- Write the completion function to the file given to __init__
- @return: C{None}
- """
- # by default, we just write out a single call to _arguments
- self.file.write('#compdef %s\n' % (self.cmd_name,))
- gen = ArgumentsGenerator(self.cmd_name, self.options, self.file)
- gen.write()
-
-class SubcommandBuilder(Builder):
- """
- Use this builder for commands that have sub-commands. twisted.python.usage
- has the notion of sub-commands that are defined using an entirely seperate
- Options class.
- """
- interface = None
- subcmdLabel = None
-
- def write(self):
- """
- Write the completion function to the file given to __init__
- @return: C{None}
- """
- self.file.write('#compdef %s\n' % (self.cmd_name,))
- self.file.write('local _zsh_subcmds_array\n_zsh_subcmds_array=(\n')
- from twisted import plugin as newplugin
- plugins = newplugin.getPlugins(self.interface)
-
- for p in plugins:
- self.file.write('"%s:%s"\n' % (p.tapname, p.description))
- self.file.write(")\n\n")
-
- self.options.__class__.zsh_extras = ['*::subcmd:->subcmd']
- gen = ArgumentsGenerator(self.cmd_name, self.options, self.file)
- gen.write()
-
- self.file.write("""if (( CURRENT == 1 )); then
- _describe "%s" _zsh_subcmds_array && ret=0
-fi
-(( ret )) || return 0
-
-service="$words[1]"
-
-case $service in\n""" % (self.subcmdLabel,))
-
- plugins = newplugin.getPlugins(self.interface)
- for p in plugins:
- self.file.write(p.tapname + ")\n")
- gen = ArgumentsGenerator(p.tapname, p.options(), self.file)
- gen.write()
- self.file.write(";;\n")
- self.file.write("*) _message \"don't know how to" \
- " complete $service\";;\nesac")
-
-class MktapBuilder(SubcommandBuilder):
- """
- Builder for the mktap command
- """
- interface = IServiceMaker
- subcmdLabel = 'tap to build'
-
-class TwistdBuilder(SubcommandBuilder):
- """
- Builder for the twistd command
- """
- interface = IServiceMaker
- subcmdLabel = 'service to run'
-
-class ArgumentsGenerator:
- """
- Generate a call to the zsh _arguments completion function
- based on data in a usage.Options subclass
- """
- def __init__(self, cmd_name, options, file):
- """
- @type cmd_name: C{str}
- @param cmd_name: The name of the command
-
- @type options: C{twisted.usage.Options}
- @param options: The C{twisted.usage.Options} instance defined
- for this command
-
- @type file: C{file}
- @param file: The C{file} to write the completion function to
- """
- self.cmd_name = cmd_name
- self.options = options
- self.file = file
-
- self.altArgDescr = {}
- self.actionDescr = {}
- self.multiUse = []
- self.mutuallyExclusive = []
- self.actions = {}
- self.extras = []
-
- aCL = reflect.accumulateClassList
- aCD = reflect.accumulateClassDict
-
- aCD(options.__class__, 'zsh_altArgDescr', self.altArgDescr)
- aCD(options.__class__, 'zsh_actionDescr', self.actionDescr)
- aCL(options.__class__, 'zsh_multiUse', self.multiUse)
- aCL(options.__class__, 'zsh_mutuallyExclusive',
- self.mutuallyExclusive)
- aCD(options.__class__, 'zsh_actions', self.actions)
- aCL(options.__class__, 'zsh_extras', self.extras)
-
- optFlags = []
- optParams = []
-
- aCL(options.__class__, 'optFlags', optFlags)
- aCL(options.__class__, 'optParameters', optParams)
-
- for i, optList in enumerate(optFlags):
- if len(optList) != 3:
- optFlags[i] = util.padTo(3, optList)
-
- for i, optList in enumerate(optParams):
- if len(optList) != 4:
- optParams[i] = util.padTo(4, optList)
-
-
- self.optFlags = optFlags
- self.optParams = optParams
-
- optParams_d = {}
- for optList in optParams:
- optParams_d[optList[0]] = optList[1:]
- self.optParams_d = optParams_d
-
- optFlags_d = {}
- for optList in optFlags:
- optFlags_d[optList[0]] = optList[1:]
- self.optFlags_d = optFlags_d
-
- optAll_d = {}
- optAll_d.update(optParams_d)
- optAll_d.update(optFlags_d)
- self.optAll_d = optAll_d
-
- self.addAdditionalOptions()
-
- # makes sure none of the zsh_ data structures reference option
- # names that don't exist. (great for catching typos)
- self.verifyZshNames()
-
- self.excludes = self.makeExcludesDict()
-
- def write(self):
- """
- Write the zsh completion code to the file given to __init__
- @return: C{None}
- """
- self.writeHeader()
- self.writeExtras()
- self.writeOptions()
- self.writeFooter()
-
- def writeHeader(self):
- """
- This is the start of the code that calls _arguments
- @return: C{None}
- """
- self.file.write('_arguments -s -A "-*" \\\n')
-
- def writeOptions(self):
- """
- Write out zsh code for each option in this command
- @return: C{None}
- """
- optNames = self.optAll_d.keys()
- optNames.sort()
- for long in optNames:
- self.writeOpt(long)
-
- def writeExtras(self):
- """
- Write out the "extras" list. These are just passed verbatim to the
- _arguments call
- @return: C{None}
- """
- for s in self.extras:
- self.file.write(escape(s))
- self.file.write(' \\\n')
-
- def writeFooter(self):
- """
- Write the last bit of code that finishes the call to _arguments
- @return: C{None}
- """
- self.file.write('&& return 0\n')
-
- def verifyZshNames(self):
- """
- Ensure that none of the names given in zsh_* variables are typoed
- @return: C{None}
- @raise ValueError: Raised if unknown option names have been given in
- zsh_* variables
- """
- def err(name):
- raise ValueError, "Unknown option name \"%s\" found while\n" \
- "examining zsh_ attributes for the %s command" % (
- name, self.cmd_name)
-
- for name in itertools.chain(self.altArgDescr, self.actionDescr,
- self.actions, self.multiUse):
- if name not in self.optAll_d:
- err(name)
-
- for seq in self.mutuallyExclusive:
- for name in seq:
- if name not in self.optAll_d:
- err(name)
-
- def excludeStr(self, long, buildShort=False):
- """
- Generate an "exclusion string" for the given option
-
- @type long: C{str}
- @param long: The long name of the option
- (i.e. "verbose" instead of "v")
-
- @type buildShort: C{bool}
- @param buildShort: May be True to indicate we're building an excludes
- string for the short option that correspondes to
- the given long opt
-
- @return: The generated C{str}
- """
- if long in self.excludes:
- exclusions = self.excludes[long][:]
- else:
- exclusions = []
-
- # if long isn't a multiUse option (can't appear on the cmd line more
- # than once), then we have to exclude the short option if we're
- # building for the long option, and vice versa.
- if long not in self.multiUse:
- if buildShort is False:
- short = self.getShortOption(long)
- if short is not None:
- exclusions.append(short)
- else:
- exclusions.append(long)
-
- if not exclusions:
- return ''
-
- strings = []
- for optName in exclusions:
- if len(optName) == 1:
- # short option
- strings.append("-" + optName)
- else:
- strings.append("--" + optName)
- return "(%s)" % " ".join(strings)
-
- def makeExcludesDict(self):
- """
- @return: A C{dict} that maps each option name appearing in
- self.mutuallyExclusive to a list of those option names that
- is it mutually exclusive with (can't appear on the cmd line with)
- """
-
- #create a mapping of long option name -> single character name
- longToShort = {}
- for optList in itertools.chain(self.optParams, self.optFlags):
- try:
- if optList[1] != None:
- longToShort[optList[0]] = optList[1]
- except IndexError:
- pass
-
- excludes = {}
- for lst in self.mutuallyExclusive:
- for i, long in enumerate(lst):
- tmp = []
- tmp.extend(lst[:i])
- tmp.extend(lst[i+1:])
- for name in tmp[:]:
- if name in longToShort:
- tmp.append(longToShort[name])
-
- if long in excludes:
- excludes[long].extend(tmp)
- else:
- excludes[long] = tmp
- return excludes
-
- def writeOpt(self, long):
- """
- Write out the zsh code for the given argument. This is just part of the
- one big call to _arguments
-
- @type long: C{str}
- @param long: The long name of the option
- (i.e. "verbose" instead of "v")
-
- @return: C{None}
- """
- if long in self.optFlags_d:
- # It's a flag option. Not one that takes a parameter.
- long_field = "--%s" % long
- else:
- long_field = "--%s=" % long
-
- short = self.getShortOption(long)
- if short != None:
- short_field = "-" + short
- else:
- short_field = ''
-
- descr = self.getDescription(long)
- descr_field = descr.replace("[", "\[")
- descr_field = descr_field.replace("]", "\]")
- descr_field = '[%s]' % descr_field
-
- if long in self.actionDescr:
- actionDescr_field = self.actionDescr[long]
- else:
- actionDescr_field = descr
-
- action_field = self.getAction(long)
- if long in self.multiUse:
- multi_field = '*'
- else:
- multi_field = ''
-
- longExclusions_field = self.excludeStr(long)
-
- if short:
- #we have to write an extra line for the short option if we have one
- shortExclusions_field = self.excludeStr(long, buildShort=True)
- self.file.write(escape('%s%s%s%s%s' % (shortExclusions_field,
- multi_field, short_field, descr_field, action_field)))
- self.file.write(' \\\n')
-
- self.file.write(escape('%s%s%s%s%s' % (longExclusions_field,
- multi_field, long_field, descr_field, action_field)))
- self.file.write(' \\\n')
-
- def getAction(self, long):
- """
- Return a zsh "action" string for the given argument
- @return: C{str}
- """
- if long in self.actions:
- if callable(self.actions[long]):
- action = self.actions[long]()
- else:
- action = self.actions[long]
- return ":%s:%s" % (self.getActionDescr(long), action)
- if long in self.optParams_d:
- return ':%s:_files' % self.getActionDescr(long)
- return ''
-
- def getActionDescr(self, long):
- """
- Return the description to be used when this argument is completed
- @return: C{str}
- """
- if long in self.actionDescr:
- return self.actionDescr[long]
- else:
- return long
-
- def getDescription(self, long):
- """
- Return the description to be used for this argument
- @return: C{str}
- """
- #check if we have an alternate descr for this arg, and if so use it
- if long in self.altArgDescr:
- return self.altArgDescr[long]
-
- #otherwise we have to get it from the optFlags or optParams
- try:
- descr = self.optFlags_d[long][1]
- except KeyError:
- try:
- descr = self.optParams_d[long][2]
- except KeyError:
- descr = None
-
- if descr is not None:
- return descr
-
- # lets try to get it from the opt_foo method doc string if there is one
- longMangled = long.replace('-', '_') # this is what t.p.usage does
- obj = getattr(self.options, 'opt_%s' % longMangled, None)
- if obj:
- descr = descrFromDoc(obj)
- if descr is not None:
- return descr
-
- return long # we really ought to have a good description to use
-
- def getShortOption(self, long):
- """
- Return the short option letter or None
- @return: C{str} or C{None}
- """
- optList = self.optAll_d[long]
- try:
- return optList[0] or None
- except IndexError:
- pass
-
- def addAdditionalOptions(self):
- """
- Add additional options to the optFlags and optParams lists.
- These will be defined by 'opt_foo' methods of the Options subclass
- @return: C{None}
- """
- methodsDict = {}
- reflect.accumulateMethods(self.options, methodsDict, 'opt_')
- methodToShort = {}
- for name in methodsDict.copy():
- if len(name) == 1:
- methodToShort[methodsDict[name]] = name
- del methodsDict[name]
-
- for methodName, methodObj in methodsDict.items():
- long = methodName.replace('_', '-') # t.p.usage does this
- # if this option is already defined by the optFlags or
- # optParameters then we don't want to override that data
- if long in self.optAll_d:
- continue
-
- descr = self.getDescription(long)
-
- short = None
- if methodObj in methodToShort:
- short = methodToShort[methodObj]
-
- reqArgs = methodObj.im_func.func_code.co_argcount
- if reqArgs == 2:
- self.optParams.append([long, short, None, descr])
- self.optParams_d[long] = [short, None, descr]
- self.optAll_d[long] = [short, None, descr]
- elif reqArgs == 1:
- self.optFlags.append([long, short, descr])
- self.optFlags_d[long] = [short, descr]
- self.optAll_d[long] = [short, None, descr]
- else:
- raise TypeError, '%r has wrong number ' \
- 'of arguments' % (methodObj,)
-
-def descrFromDoc(obj):
- """
- Generate an appropriate description from docstring of the given object
- """
- if obj.__doc__ is None:
- return None
-
- lines = obj.__doc__.split("\n")
- descr = None
- try:
- if lines[0] != "" and not lines[0].isspace():
- descr = lines[0].lstrip()
- # skip first line if it's blank
- elif lines[1] != "" and not lines[1].isspace():
- descr = lines[1].lstrip()
- except IndexError:
- pass
- return descr
-
-def firstLine(s):
- """
- Return the first line of the given string
- """
- try:
- i = s.index('\n')
- return s[:i]
- except ValueError:
- return s
-
-def escape(str):
- """
- Shell escape the given string
- """
- return commands.mkarg(str)[1:]
-
-def siteFunctionsPath():
- """
- Return the path to the system-wide site-functions directory or
- C{None} if it cannot be determined
- """
- try:
- cmd = "zsh -f -c 'echo ${(M)fpath:#/*/site-functions}'"
- output = commands.getoutput(cmd)
- if os.path.isdir(output):
- return output
- except:
- pass
-
-generateFor = [('conch', 'twisted.conch.scripts.conch', 'ClientOptions'),
- ('mktap', 'twisted.scripts.mktap', 'FirstPassOptions'),
- ('trial', 'twisted.scripts.trial', 'Options'),
- ('cftp', 'twisted.conch.scripts.cftp', 'ClientOptions'),
- ('tapconvert', 'twisted.scripts.tapconvert', 'ConvertOptions'),
- ('twistd', 'twisted.scripts.twistd', 'ServerOptions'),
- ('ckeygen', 'twisted.conch.scripts.ckeygen', 'GeneralOptions'),
- ('lore', 'twisted.lore.scripts.lore', 'Options'),
- ('pyhtmlizer', 'twisted.scripts.htmlizer', 'Options'),
- ('tap2deb', 'twisted.scripts.tap2deb', 'MyOptions'),
- ('tkconch', 'twisted.conch.scripts.tkconch', 'GeneralOptions'),
- ('manhole', 'twisted.scripts.manhole', 'MyOptions'),
- ('tap2rpm', 'twisted.scripts.tap2rpm', 'MyOptions'),
- ('websetroot', None, None),
- ('tkmktap', None, None),
- ]
-# NOTE: the commands using None above are no longer included in Twisted.
-# However due to limitations in zsh's completion system the version of
-# _twisted_zsh_stub shipped with zsh contains a static list of Twisted's
-# commands. It will display errors if completion functions for these missing
-# commands are not found :( So we just include dummy (empty) completion
-# function files
-
-specialBuilders = {'mktap' : MktapBuilder,
- 'twistd' : TwistdBuilder}
-
-def makeCompFunctionFiles(out_path, generateFor=generateFor,
- specialBuilders=specialBuilders):
- """
- Generate completion function files in the given directory for all
- twisted commands
-
- @type out_path: C{str}
- @param out_path: The path to the directory to generate completion function
- fils in
-
- @param generateFor: Sequence in the form of the 'generateFor' top-level
- variable as defined in this module. Indicates what
- commands to build completion files for.
-
- @param specialBuilders: Sequence in the form of the 'specialBuilders'
- top-level variable as defined in this module.
- Indicates what commands require a special
- Builder class.
-
- @return: C{list} of 2-tuples of the form (cmd_name, error) indicating
- commands that we skipped building completions for. cmd_name
- is the name of the skipped command, and error is the Exception
- that was raised when trying to import the script module.
- Commands are usually skipped due to a missing dependency,
- e.g. Tkinter.
- """
- skips = []
- for cmd_name, module_name, class_name in generateFor:
- if module_name is None:
- # create empty file
- f = _openCmdFile(out_path, cmd_name)
- f.close()
- continue
- try:
- m = __import__('%s' % (module_name,), None, None, (class_name))
- f = _openCmdFile(out_path, cmd_name)
- o = getattr(m, class_name)() # instantiate Options class
-
- if cmd_name in specialBuilders:
- b = specialBuilders[cmd_name](cmd_name, o, f)
- b.write()
- else:
- b = Builder(cmd_name, o, f)
- b.write()
- except Exception, e:
- skips.append( (cmd_name, e) )
- continue
- return skips
-
-def _openCmdFile(out_path, cmd_name):
- return file(os.path.join(out_path, '_'+cmd_name), 'w')
-
-def run():
- options = MyOptions()
- try:
- options.parseOptions(sys.argv[1:])
- except usage.UsageError, e:
- print e
- print options.getUsage()
- sys.exit(2)
-
- if options['install']:
- import twisted
- dir = os.path.join(os.path.dirname(twisted.__file__), "python", "zsh")
- skips = makeCompFunctionFiles(dir)
- else:
- skips = makeCompFunctionFiles(options['directory'])
-
- for cmd_name, error in skips:
- sys.stderr.write("zshcomp: Skipped building for %s. Script module " \
- "could not be imported:\n" % (cmd_name,))
- sys.stderr.write(str(error)+'\n')
- if skips:
- sys.exit(3)
-
-if __name__ == '__main__':
- run()
« no previous file with comments | « third_party/twisted_8_1/twisted/python/zsh/_websetroot ('k') | third_party/twisted_8_1/twisted/runner/__init__.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698