diff options
author | Mike Frysinger <vapier@google.com> | 2020-02-25 15:18:31 -0500 |
---|---|---|
committer | David Pursehouse <dpursehouse@collab.net> | 2020-03-17 00:08:52 +0000 |
commit | bb930461cee056de210816e58c36a8d6dfd122be (patch) | |
tree | 3f98c279580f02ecf7c1608a20caa294f1075f45 /subcmds/__init__.py | |
parent | d3639c53d56feaea81474ffd28395a124744dab7 (diff) | |
download | git-repo-bb930461cee056de210816e58c36a8d6dfd122be.tar.gz |
subcmds: stop instantiating at import time
The current subcmds design has singletons in all_commands. This isn't
exactly unusual, but the fact that our main & help subcommand will then
attach members to the classes before invoking them is. This makes it
hard to keep track of what members a command has access to, and the two
code paths (main & help) attach different members depending on what APIs
they then invoke.
Lets pull this back a step by storing classes in all_commands and leave
the instantiation step to when they're used. This doesn't fully clean
up the confusion, but gets us closer.
Change-Id: I6a768ff97fe541e6f3228358dba04ed66c4b070a
Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/259154
Tested-by: Mike Frysinger <vapier@google.com>
Reviewed-by: David Pursehouse <dpursehouse@collab.net>
Diffstat (limited to 'subcmds/__init__.py')
-rw-r--r-- | subcmds/__init__.py | 3 |
1 files changed, 2 insertions, 1 deletions
diff --git a/subcmds/__init__.py b/subcmds/__init__.py index a49e7bd3..c3de9d1e 100644 --- a/subcmds/__init__.py +++ b/subcmds/__init__.py | |||
@@ -16,6 +16,7 @@ | |||
16 | 16 | ||
17 | import os | 17 | import os |
18 | 18 | ||
19 | # A mapping of the subcommand name to the class that implements it. | ||
19 | all_commands = {} | 20 | all_commands = {} |
20 | 21 | ||
21 | my_dir = os.path.dirname(__file__) | 22 | my_dir = os.path.dirname(__file__) |
@@ -37,7 +38,7 @@ for py in os.listdir(my_dir): | |||
37 | ['%s' % name]) | 38 | ['%s' % name]) |
38 | mod = getattr(mod, name) | 39 | mod = getattr(mod, name) |
39 | try: | 40 | try: |
40 | cmd = getattr(mod, clsn)() | 41 | cmd = getattr(mod, clsn) |
41 | except AttributeError: | 42 | except AttributeError: |
42 | raise SyntaxError('%s/%s does not define class %s' % ( | 43 | raise SyntaxError('%s/%s does not define class %s' % ( |
43 | __name__, py, clsn)) | 44 | __name__, py, clsn)) |