mirror of
https://github.com/python/cpython.git
synced 2025-09-26 18:29:57 +00:00
Added the 'have_run' dictionary to Distribution, and changed
'run_command()' to refer to it before attempting to run a command -- that way, command classes can freely invoke other commands without fear of duplicate execution. Beefed up some comments and docstrings.
This commit is contained in:
parent
4d74d73b07
commit
c997334977
1 changed files with 33 additions and 3 deletions
|
@ -136,6 +136,10 @@ class Distribution:
|
||||||
self.licence = None
|
self.licence = None
|
||||||
self.description = None
|
self.description = None
|
||||||
|
|
||||||
|
# 'cmdclass' maps command names to class objects, so we
|
||||||
|
# can 1) quickly figure out which class to instantiate when
|
||||||
|
# we need to create a new command object, and 2) have a way
|
||||||
|
# for the client to override command classes
|
||||||
self.cmdclass = {}
|
self.cmdclass = {}
|
||||||
|
|
||||||
# The rest of these are really the business of various commands,
|
# The rest of these are really the business of various commands,
|
||||||
|
@ -152,9 +156,23 @@ class Distribution:
|
||||||
setattr (self, k, attrs[k])
|
setattr (self, k, attrs[k])
|
||||||
|
|
||||||
# And now initialize bookkeeping stuff that can't be supplied by
|
# And now initialize bookkeeping stuff that can't be supplied by
|
||||||
# the caller at all
|
# the caller at all. 'command_obj' maps command names to
|
||||||
|
# Command instances -- that's how we enforce that every command
|
||||||
|
# class is a singleton.
|
||||||
self.command_obj = {}
|
self.command_obj = {}
|
||||||
|
|
||||||
|
# 'have_run' maps command names to boolean values; it keeps track
|
||||||
|
# of whether we have actually run a particular command, to make it
|
||||||
|
# cheap to "run" a command whenever we think we might need to -- if
|
||||||
|
# it's already been done, no need for expensive filesystem
|
||||||
|
# operations, we just check the 'have_run' dictionary and carry on.
|
||||||
|
# It's only safe to query 'have_run' for a command class
|
||||||
|
# that has been instantiated -- a false value will be put inserted
|
||||||
|
# when the command object is created, and replaced with a true
|
||||||
|
# value when the command is succesfully run. Thus it's
|
||||||
|
# probably best to use '.get()' rather than a straight lookup.
|
||||||
|
self.have_run = {}
|
||||||
|
|
||||||
# __init__ ()
|
# __init__ ()
|
||||||
|
|
||||||
|
|
||||||
|
@ -211,6 +229,7 @@ class Distribution:
|
||||||
# attribute, but we're not enforcing that anywhere!
|
# attribute, but we're not enforcing that anywhere!
|
||||||
args = fancy_getopt (cmd_obj.options, cmd_obj, args[1:])
|
args = fancy_getopt (cmd_obj.options, cmd_obj, args[1:])
|
||||||
self.command_obj[command] = cmd_obj
|
self.command_obj[command] = cmd_obj
|
||||||
|
self.have_run[command] = 0
|
||||||
|
|
||||||
# while args
|
# while args
|
||||||
|
|
||||||
|
@ -347,12 +366,23 @@ class Distribution:
|
||||||
# -- Methods that operate on its Commands --------------------------
|
# -- Methods that operate on its Commands --------------------------
|
||||||
|
|
||||||
def run_command (self, command):
|
def run_command (self, command):
|
||||||
"""Create a command object for 'command' if necessary, and
|
|
||||||
run the command by invoking its 'run()' method."""
|
"""Do whatever it takes to run a command (including nothing at all,
|
||||||
|
if the command has already been run). Specifically: if we have
|
||||||
|
already created and run the command named by 'command', return
|
||||||
|
silently without doing anything. If the command named by
|
||||||
|
'command' doesn't even have a command object yet, create one.
|
||||||
|
Then invoke 'run()' on that command object (or an existing
|
||||||
|
one)."""
|
||||||
|
|
||||||
|
# Already been here, done that? then return silently.
|
||||||
|
if self.have_run.get (command):
|
||||||
|
return
|
||||||
|
|
||||||
self.announce ("running " + command)
|
self.announce ("running " + command)
|
||||||
cmd_obj = self.find_command_obj (command)
|
cmd_obj = self.find_command_obj (command)
|
||||||
cmd_obj.run ()
|
cmd_obj.run ()
|
||||||
|
self.have_run[command] = 1
|
||||||
|
|
||||||
|
|
||||||
def get_command_option (self, command, option):
|
def get_command_option (self, command, option):
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue