Rank Git Repository Contributors by Number of TODO Comments

6 min read Original article ↗

This command will produce a leaderboard of TODO frequency for an entire repository

grep -r "TODO" . | awk '{print $1}' | cut -d ":" -f 1 | xargs -n 1  git blame  --no-progress | grep TODO | cut -d "(" -f 2 | cut -d "-" -f 1 | rev | cut -c 5- | rev |  awk '{$1=$1};1' | sort | uniq -c | sort -nr

Here are the first 10 lines from running the above in the cpython repo.

    508 Serhiy Storchaka
    281 David Scherer
    139 Terry Jan Reedy
    120 Steven M. Gava
     89 Cheryl Sabella
     62 Guido van Rossum
     43 Tal Einat
     30 Christian Heimes
     26 Benjamin Peterson
     20 Pablo Galindo

Here are Guido's TODOs:

grep -r TODO . | awk '{print $1}' | cut -d ":" -f 1 | xargs -n 1  git blame --no-progress | grep "Guido van Rossum.*TODO"
48b069a003b (Guido van Rossum   2020-04-07 09:50:06 -0700 576)     // TODO: Hash in the hash for the origin
48b069a003b (Guido van Rossum   2020-04-07 09:50:06 -0700 956) // TODO:
48b069a003b (Guido van Rossum   2020-04-07 09:50:06 -0700 576)     // TODO: Hash in the hash for the origin
48b069a003b (Guido van Rossum   2020-04-07 09:50:06 -0700 956) // TODO:
48b069a003b (Guido van Rossum   2020-04-07 09:50:06 -0700 576)     // TODO: Hash in the hash for the origin
48b069a003b (Guido van Rossum   2020-04-07 09:50:06 -0700 956) // TODO:
843bf42aa65 (Guido van Rossum     2019-04-29 05:49:30 -0700  189) .. TODO: Pablo will sprint on docs at PyCon US 2019.
2001da4e0c0 (Guido van Rossum     2000-09-01 22:26:44 +0000 27465) 	argument.  This closes TODO item 2.19.
27b7c7ebf10 (Guido van Rossum                             2013-10-17 13:40:50 -0700 2445)         # TODO: Use assertLess etc.
51fc7251173 (Guido van Rossum   2023-06-26 19:02:57 -0700  441)         lltrace = *uop_debug - '0';  // TODO: Parse an int and all that
61c7249759c (Guido van Rossum   2023-08-17 11:29:58 -0700  752)                                     // TODO: Reason about this -- is it better to bail or not?
4f22152713d (Guido van Rossum   2023-08-29 09:51:51 -0700  893)             lltrace = *uop_debug - '0';  // TODO: Parse an int and all that
51fc7251173 (Guido van Rossum   2023-06-26 19:02:57 -0700  441)         lltrace = *uop_debug - '0';  // TODO: Parse an int and all that
61c7249759c (Guido van Rossum   2023-08-17 11:29:58 -0700  752)                                     // TODO: Reason about this -- is it better to bail or not?
4f22152713d (Guido van Rossum   2023-08-29 09:51:51 -0700  893)             lltrace = *uop_debug - '0';  // TODO: Parse an int and all that
51fc7251173 (Guido van Rossum   2023-06-26 19:02:57 -0700  441)         lltrace = *uop_debug - '0';  // TODO: Parse an int and all that
61c7249759c (Guido van Rossum   2023-08-17 11:29:58 -0700  752)                                     // TODO: Reason about this -- is it better to bail or not?
4f22152713d (Guido van Rossum   2023-08-29 09:51:51 -0700  893)             lltrace = *uop_debug - '0';  // TODO: Parse an int and all that
032f4809094 (Guido van Rossum 2023-07-24 09:38:23 -0700 340)     # Indent must match exactly (TODO: Do something better)
400835ea162 (Guido van Rossum 2023-08-04 09:35:56 -0700 215)             # TODO: Turn this into an error (pass an Analyzer instance?)
400835ea162 (Guido van Rossum 2023-08-04 09:35:56 -0700 286)                     # TODO: Make this an error
400835ea162 (Guido van Rossum 2023-08-04 09:35:56 -0700 308)     # TODO: Handle more cases
400835ea162 (Guido van Rossum 2023-08-04 09:35:56 -0700 398)                 # TODO: Turn this into an error -- variable conflict
b87263be9b8 (Guido van Rossum 2023-09-05 13:58:39 -0700 445)                 # TODO: Check in analyzer that _{PUSH,POP}_FRAME is last.
400835ea162 (Guido van Rossum 2023-08-04 09:35:56 -0700 215)             # TODO: Turn this into an error (pass an Analyzer instance?)
400835ea162 (Guido van Rossum 2023-08-04 09:35:56 -0700 286)                     # TODO: Make this an error
400835ea162 (Guido van Rossum 2023-08-04 09:35:56 -0700 308)     # TODO: Handle more cases
400835ea162 (Guido van Rossum 2023-08-04 09:35:56 -0700 398)                 # TODO: Turn this into an error -- variable conflict
b87263be9b8 (Guido van Rossum 2023-09-05 13:58:39 -0700 445)                 # TODO: Check in analyzer that _{PUSH,POP}_FRAME is last.
400835ea162 (Guido van Rossum 2023-08-04 09:35:56 -0700 215)             # TODO: Turn this into an error (pass an Analyzer instance?)
400835ea162 (Guido van Rossum 2023-08-04 09:35:56 -0700 286)                     # TODO: Make this an error
400835ea162 (Guido van Rossum 2023-08-04 09:35:56 -0700 308)     # TODO: Handle more cases
400835ea162 (Guido van Rossum 2023-08-04 09:35:56 -0700 398)                 # TODO: Turn this into an error -- variable conflict
b87263be9b8 (Guido van Rossum 2023-09-05 13:58:39 -0700 445)                 # TODO: Check in analyzer that _{PUSH,POP}_FRAME is last.
400835ea162 (Guido van Rossum 2023-08-04 09:35:56 -0700 215)             # TODO: Turn this into an error (pass an Analyzer instance?)
400835ea162 (Guido van Rossum 2023-08-04 09:35:56 -0700 286)                     # TODO: Make this an error
400835ea162 (Guido van Rossum 2023-08-04 09:35:56 -0700 308)     # TODO: Handle more cases
400835ea162 (Guido van Rossum 2023-08-04 09:35:56 -0700 398)                 # TODO: Turn this into an error -- variable conflict
b87263be9b8 (Guido van Rossum 2023-09-05 13:58:39 -0700 445)                 # TODO: Check in analyzer that _{PUSH,POP}_FRAME is last.
400835ea162 (Guido van Rossum 2023-08-04 09:35:56 -0700 215)             # TODO: Turn this into an error (pass an Analyzer instance?)
400835ea162 (Guido van Rossum 2023-08-04 09:35:56 -0700 286)                     # TODO: Make this an error
400835ea162 (Guido van Rossum 2023-08-04 09:35:56 -0700 308)     # TODO: Handle more cases
400835ea162 (Guido van Rossum 2023-08-04 09:35:56 -0700 398)                 # TODO: Turn this into an error -- variable conflict
b87263be9b8 (Guido van Rossum 2023-09-05 13:58:39 -0700 445)                 # TODO: Check in analyzer that _{PUSH,POP}_FRAME is last.
4f5e1cb00a9 Tools/cases_generator/parser.py  (Guido van Rossum 2022-11-17 17:06:07 -0800 180)         # TODO: Make INST a keyword in the lexer.
694e346a01f (Guido van Rossum  2023-02-06 21:03:58 -0800 191)    `ERROR_IF(result == NULL, label)`. (TODO: Unclear what to do with
032f4809094 (Guido van Rossum 2023-07-24 09:38:23 -0700 104)             # TODO: Handle nested #if
41bc101dd67 (Guido van Rossum 2022-11-02 21:31:26 -0700 39) Most known issues are tersely indicated by `# TODO:` comments.
032f4809094 (Guido van Rossum 2023-07-24 09:38:23 -0700 209)                         instr.inst,  # TODO: Use better location
400835ea162 (Guido van Rossum 2023-08-04 09:35:56 -0700 303)     # TODO: Merge with similar code in stacking.py, write_components()
032f4809094 (Guido van Rossum 2023-07-24 09:38:23 -0700 209)                         instr.inst,  # TODO: Use better location
400835ea162 (Guido van Rossum 2023-08-04 09:35:56 -0700 303)     # TODO: Merge with similar code in stacking.py, write_components()
41bc101dd67 (Guido van Rossum 2022-11-02 21:31:26 -0700  33)         # TODO: Return synthetic EOF token instead of None?
acf9184e6b6 (Guido van Rossum 2022-12-02 19:57:30 -0800 335)             # TODO: dedent > 0
acf9184e6b6 (Guido van Rossum 2022-12-02 19:57:30 -0800 335)             # TODO: dedent > 0
11731434df2 (Guido van Rossum          2023-06-28 11:28:07 -0700 631)         counter = 300  # TODO: Avoid collision with pseudo instructions
11731434df2 (Guido van Rossum          2023-06-28 11:28:07 -0700 655)         # TODO: Refactor to share code with write_cody(), is_viaible_uop(), etc.
11731434df2 (Guido van Rossum          2023-06-28 11:28:07 -0700 631)         counter = 300  # TODO: Avoid collision with pseudo instructions
11731434df2 (Guido van Rossum          2023-06-28 11:28:07 -0700 655)         # TODO: Refactor to share code with write_cody(), is_viaible_uop(), etc.
11731434df2 (Guido van Rossum          2023-06-28 11:28:07 -0700 631)         counter = 300  # TODO: Avoid collision with pseudo instructions
11731434df2 (Guido van Rossum          2023-06-28 11:28:07 -0700 655)         # TODO: Refactor to share code with write_cody(), is_viaible_uop(), etc.
1cbaa505d00 Tools/scripts/deepfreeze.py (Guido van Rossum 2021-11-10 18:01:53 -0800 392)         self.write("// TODO: The above tuple should be a frozenset")