(repo|submodule|txt)_roller: Attribute rolls

For single-commit rolls attribute rolls to the original commit author.
Hide this behind a property since the permissions may not be set up on
all necessary gerrit hosts.

Added code to keep track of author, owner, and reviewer names as well as
email addresses, so the name can be used in the attribution as well.

Changed testing code to use the same account for both author and owner
in most cases, since the attribution code wouldn't be used if they
differ. It's possible something relating to one of those and not the
other could regress since they're no longer independently tested, but
unlikely.

Bug: 595
Change-Id: I720b33d9b994bba7b9427b8e64cd21dbf4bb7e4b
Reviewed-on: https://pigweed-review.googlesource.com/c/infra/recipes/+/77760
Reviewed-by: Anthony Fandrianto <atyfto@google.com>
Commit-Queue: Rob Mohr <mohrr@google.com>
diff --git a/recipe_modules/roll_util/api.py b/recipe_modules/roll_util/api.py
index 964033a..d522cb4 100644
--- a/recipe_modules/roll_util/api.py
+++ b/recipe_modules/roll_util/api.py
@@ -84,6 +84,10 @@
     REBASE = 'REBASE'
 
 
+# Using a namedtuple instead of attrs because this should be hashable.
+Account = collections.namedtuple('Account', 'name email')
+
+
 @attr.s
 class Commit(object):
     hash = attr.ib(type=str)
@@ -125,7 +129,7 @@
 
         log_cmd = [
             'log',
-            '--pretty=format:%H\n%ae\n%B',
+            '--pretty=format:%H\n%an\n%ae\n%B',
             # Separate entries with null bytes since most entries
             # will contain newlines ("%B" is the full commit
             # message, not just the first line.)
@@ -149,7 +153,8 @@
 
         commits = []
         for i, commit in enumerate(commit_log):
-            commit_hash, author, message = commit.split('\n', 2)
+            commit_hash, name, email, message = commit.split('\n', 3)
+            author = Account(name, email)
             owner = None
             reviewers = []
 
@@ -178,12 +183,24 @@
                     host=full_host,
                     test_data=self._api.json.test_api.output(
                         {
-                            'owner': {'email': 'owner@example.com'},
+                            'owner': {
+                                'name': 'author',
+                                'email': 'author@example.com',
+                            },
                             'reviewers': {
                                 'REVIEWER': [
-                                    {'email': 'reviewer@example.com'},
-                                    {'email': 'nobody@google.com'},
-                                    {'email': 'robot@gserviceaccount.com'},
+                                    {
+                                        'name': 'reviewer',
+                                        'email': 'reviewer@example.com',
+                                    },
+                                    {
+                                        'name': 'nobody',
+                                        'email': 'nobody@google.com',
+                                    },
+                                    {
+                                        'name': 'robot',
+                                        'email': 'robot@gserviceaccount.com',
+                                    },
                                 ],
                             },
                         }
@@ -193,9 +210,13 @@
 
                 if step.exc_result.retcode == 0:
                     details = step.json.output
-                    owner = details['owner']['email']
+                    owner = Account(
+                        details['owner']['name'], details['owner']['email']
+                    )
                     for reviewer in details['reviewers']['REVIEWER']:
-                        reviewers.append(reviewer['email'])
+                        reviewers.append(
+                            Account(reviewer['name'], reviewer['email']),
+                        )
 
             commits.append(
                 Commit(
@@ -285,6 +306,14 @@
                     authors.add(commit.owner)
         return authors
 
+    def fake_author(self, author):
+        # Update the author's email address so it can be used for attribution
+        # without literally attributing it to the author's account in Gerrit.
+        return Account(
+            author.name,
+            '{}@pigweed.infra.roller.{}'.format(*author.email.split('@')),
+        )
+
     def reviewers(self, *roll):
         reviewers = set()
         for r in roll:
@@ -303,16 +332,16 @@
             email, 'email:{}'.format(email), host=host, test_data=test_data,
         ).json.output
 
-    def include_cc(self, email, cc_domains, host):
-        with self.m.step.nest('cc {}'.format(email)) as pres:
-            domain = email.split('@', 1)[1]
+    def include_cc(self, account, cc_domains, host):
+        with self.m.step.nest('cc {}'.format(account.email)) as pres:
+            domain = account.email.split('@', 1)[1]
             if domain.endswith('gserviceaccount.com'):
                 pres.step_summary_text = 'not CCing, robot account'
                 return False
             if cc_domains and domain not in cc_domains:
                 pres.step_summary_text = 'not CCing, domain excluded'
                 return False
-            if not self.can_cc_on_roll(email, host=host):
+            if not self.can_cc_on_roll(account.email, host=host):
                 pres.step_summary_text = 'not CCing, no account in Gerrit'
                 return False
 
@@ -422,6 +451,9 @@
 
         return '\n\n'.join(texts)
 
+    def Account(self, name, email):
+        return Account(name, email)
+
     def Roll(self, **kwargs):
         """Create a Roll. See Roll class above for details."""
         return Roll(api=self.m, **kwargs)
diff --git a/recipe_modules/roll_util/test_api.py b/recipe_modules/roll_util/test_api.py
index 5130106..62e9921 100644
--- a/recipe_modules/roll_util/test_api.py
+++ b/recipe_modules/roll_util/test_api.py
@@ -16,7 +16,9 @@
 
 
 class RollUtilTestApi(recipe_test_api.RecipeTestApi):
-    def commit(self, commit_hash, message=None, author='author@example.com'):
+    def commit(
+        self, commit_hash, message=None, author='author@example.com', name=None,
+    ):
         if not message:
             message = """
 module: Short commit summary
@@ -29,7 +31,11 @@
             """.strip().format(
                 commit_hash=commit_hash
             )
-        return '\n'.join((commit_hash, author, message))
+
+        if name is None:
+            name = author.split('@')[0]
+
+        return '\n'.join((commit_hash, name, author, message))
 
     def format_prefix(self, p):
         if not p:
diff --git a/recipe_modules/roll_util/tests/multiple_rolls.expected/mixed.json b/recipe_modules/roll_util/tests/multiple_rolls.expected/mixed.json
index 1c76a42..a25102d 100644
--- a/recipe_modules/roll_util/tests/multiple_rolls.expected/mixed.json
+++ b/recipe_modules/roll_util/tests/multiple_rolls.expected/mixed.json
@@ -35,7 +35,7 @@
     "cmd": [
       "git",
       "log",
-      "--pretty=format:%H\n%ae\n%B",
+      "--pretty=format:%H\n%an\n%ae\n%B",
       "-z",
       "1111111111111111111111111111111111111111..4444444444444444444444444444444444444444"
     ],
@@ -180,18 +180,22 @@
       "@@@STEP_NEST_LEVEL@1@@@",
       "@@@STEP_LOG_LINE@json.output@{@@@",
       "@@@STEP_LOG_LINE@json.output@  \"owner\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"email\": \"owner@example.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@    \"email\": \"author@example.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@    \"name\": \"author\"@@@",
       "@@@STEP_LOG_LINE@json.output@  }, @@@",
       "@@@STEP_LOG_LINE@json.output@  \"reviewers\": {@@@",
       "@@@STEP_LOG_LINE@json.output@    \"REVIEWER\": [@@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"reviewer@example.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"reviewer@example.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"reviewer\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }, @@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"nobody@google.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"nobody@google.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"nobody\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }, @@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"robot@gserviceaccount.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"robot@gserviceaccount.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"robot\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }@@@",
       "@@@STEP_LOG_LINE@json.output@    ]@@@",
       "@@@STEP_LOG_LINE@json.output@  }@@@",
@@ -240,7 +244,7 @@
     "cmd": [
       "git",
       "log",
-      "--pretty=format:%H\n%ae\n%B",
+      "--pretty=format:%H\n%an\n%ae\n%B",
       "-z",
       "9999999999999999999999999999999999999999..cccccccccccccccccccccccccccccccccccccccc"
     ],
@@ -298,18 +302,22 @@
       "@@@STEP_NEST_LEVEL@1@@@",
       "@@@STEP_LOG_LINE@json.output@{@@@",
       "@@@STEP_LOG_LINE@json.output@  \"owner\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"email\": \"owner@example.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@    \"email\": \"author@example.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@    \"name\": \"author\"@@@",
       "@@@STEP_LOG_LINE@json.output@  }, @@@",
       "@@@STEP_LOG_LINE@json.output@  \"reviewers\": {@@@",
       "@@@STEP_LOG_LINE@json.output@    \"REVIEWER\": [@@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"reviewer@example.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"reviewer@example.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"reviewer\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }, @@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"nobody@google.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"nobody@google.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"nobody\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }, @@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"robot@gserviceaccount.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"robot@gserviceaccount.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"robot\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }@@@",
       "@@@STEP_LOG_LINE@json.output@    ]@@@",
       "@@@STEP_LOG_LINE@json.output@  }@@@",
@@ -370,18 +378,22 @@
       "@@@STEP_NEST_LEVEL@1@@@",
       "@@@STEP_LOG_LINE@json.output@{@@@",
       "@@@STEP_LOG_LINE@json.output@  \"owner\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"email\": \"owner@example.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@    \"email\": \"author@example.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@    \"name\": \"author\"@@@",
       "@@@STEP_LOG_LINE@json.output@  }, @@@",
       "@@@STEP_LOG_LINE@json.output@  \"reviewers\": {@@@",
       "@@@STEP_LOG_LINE@json.output@    \"REVIEWER\": [@@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"reviewer@example.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"reviewer@example.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"reviewer\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }, @@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"nobody@google.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"nobody@google.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"nobody\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }, @@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"robot@gserviceaccount.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"robot@gserviceaccount.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"robot\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }@@@",
       "@@@STEP_LOG_LINE@json.output@    ]@@@",
       "@@@STEP_LOG_LINE@json.output@  }@@@",
@@ -442,18 +454,22 @@
       "@@@STEP_NEST_LEVEL@1@@@",
       "@@@STEP_LOG_LINE@json.output@{@@@",
       "@@@STEP_LOG_LINE@json.output@  \"owner\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"email\": \"owner@example.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@    \"email\": \"author@example.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@    \"name\": \"author\"@@@",
       "@@@STEP_LOG_LINE@json.output@  }, @@@",
       "@@@STEP_LOG_LINE@json.output@  \"reviewers\": {@@@",
       "@@@STEP_LOG_LINE@json.output@    \"REVIEWER\": [@@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"reviewer@example.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"reviewer@example.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"reviewer\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }, @@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"nobody@google.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"nobody@google.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"nobody\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }, @@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"robot@gserviceaccount.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"robot@gserviceaccount.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"robot\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }@@@",
       "@@@STEP_LOG_LINE@json.output@    ]@@@",
       "@@@STEP_LOG_LINE@json.output@  }@@@",
@@ -502,7 +518,7 @@
     "cmd": [
       "git",
       "log",
-      "--pretty=format:%H\n%ae\n%B",
+      "--pretty=format:%H\n%an\n%ae\n%B",
       "-z",
       "5555555555555555555555555555555555555555..8888888888888888888888888888888888888888"
     ],
@@ -560,18 +576,22 @@
       "@@@STEP_NEST_LEVEL@1@@@",
       "@@@STEP_LOG_LINE@json.output@{@@@",
       "@@@STEP_LOG_LINE@json.output@  \"owner\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"email\": \"owner@example.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@    \"email\": \"author@example.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@    \"name\": \"author\"@@@",
       "@@@STEP_LOG_LINE@json.output@  }, @@@",
       "@@@STEP_LOG_LINE@json.output@  \"reviewers\": {@@@",
       "@@@STEP_LOG_LINE@json.output@    \"REVIEWER\": [@@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"reviewer@example.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"reviewer@example.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"reviewer\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }, @@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"nobody@google.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"nobody@google.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"nobody\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }, @@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"robot@gserviceaccount.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"robot@gserviceaccount.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"robot\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }@@@",
       "@@@STEP_LOG_LINE@json.output@    ]@@@",
       "@@@STEP_LOG_LINE@json.output@  }@@@",
@@ -632,18 +652,22 @@
       "@@@STEP_NEST_LEVEL@1@@@",
       "@@@STEP_LOG_LINE@json.output@{@@@",
       "@@@STEP_LOG_LINE@json.output@  \"owner\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"email\": \"owner@example.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@    \"email\": \"author@example.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@    \"name\": \"author\"@@@",
       "@@@STEP_LOG_LINE@json.output@  }, @@@",
       "@@@STEP_LOG_LINE@json.output@  \"reviewers\": {@@@",
       "@@@STEP_LOG_LINE@json.output@    \"REVIEWER\": [@@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"reviewer@example.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"reviewer@example.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"reviewer\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }, @@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"nobody@google.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"nobody@google.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"nobody\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }, @@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"robot@gserviceaccount.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"robot@gserviceaccount.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"robot\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }@@@",
       "@@@STEP_LOG_LINE@json.output@    ]@@@",
       "@@@STEP_LOG_LINE@json.output@  }@@@",
diff --git a/recipe_modules/roll_util/tests/multiple_rolls.expected/multiple_commits.json b/recipe_modules/roll_util/tests/multiple_rolls.expected/multiple_commits.json
index a6ee8b5..4fc07d6 100644
--- a/recipe_modules/roll_util/tests/multiple_rolls.expected/multiple_commits.json
+++ b/recipe_modules/roll_util/tests/multiple_rolls.expected/multiple_commits.json
@@ -35,7 +35,7 @@
     "cmd": [
       "git",
       "log",
-      "--pretty=format:%H\n%ae\n%B",
+      "--pretty=format:%H\n%an\n%ae\n%B",
       "-z",
       "1111111111111111111111111111111111111111..4444444444444444444444444444444444444444"
     ],
@@ -180,18 +180,22 @@
       "@@@STEP_NEST_LEVEL@1@@@",
       "@@@STEP_LOG_LINE@json.output@{@@@",
       "@@@STEP_LOG_LINE@json.output@  \"owner\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"email\": \"owner@example.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@    \"email\": \"author@example.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@    \"name\": \"author\"@@@",
       "@@@STEP_LOG_LINE@json.output@  }, @@@",
       "@@@STEP_LOG_LINE@json.output@  \"reviewers\": {@@@",
       "@@@STEP_LOG_LINE@json.output@    \"REVIEWER\": [@@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"reviewer@example.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"reviewer@example.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"reviewer\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }, @@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"nobody@google.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"nobody@google.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"nobody\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }, @@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"robot@gserviceaccount.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"robot@gserviceaccount.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"robot\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }@@@",
       "@@@STEP_LOG_LINE@json.output@    ]@@@",
       "@@@STEP_LOG_LINE@json.output@  }@@@",
@@ -252,18 +256,22 @@
       "@@@STEP_NEST_LEVEL@1@@@",
       "@@@STEP_LOG_LINE@json.output@{@@@",
       "@@@STEP_LOG_LINE@json.output@  \"owner\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"email\": \"owner@example.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@    \"email\": \"author@example.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@    \"name\": \"author\"@@@",
       "@@@STEP_LOG_LINE@json.output@  }, @@@",
       "@@@STEP_LOG_LINE@json.output@  \"reviewers\": {@@@",
       "@@@STEP_LOG_LINE@json.output@    \"REVIEWER\": [@@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"reviewer@example.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"reviewer@example.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"reviewer\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }, @@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"nobody@google.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"nobody@google.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"nobody\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }, @@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"robot@gserviceaccount.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"robot@gserviceaccount.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"robot\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }@@@",
       "@@@STEP_LOG_LINE@json.output@    ]@@@",
       "@@@STEP_LOG_LINE@json.output@  }@@@",
@@ -324,18 +332,22 @@
       "@@@STEP_NEST_LEVEL@1@@@",
       "@@@STEP_LOG_LINE@json.output@{@@@",
       "@@@STEP_LOG_LINE@json.output@  \"owner\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"email\": \"owner@example.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@    \"email\": \"author@example.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@    \"name\": \"author\"@@@",
       "@@@STEP_LOG_LINE@json.output@  }, @@@",
       "@@@STEP_LOG_LINE@json.output@  \"reviewers\": {@@@",
       "@@@STEP_LOG_LINE@json.output@    \"REVIEWER\": [@@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"reviewer@example.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"reviewer@example.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"reviewer\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }, @@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"nobody@google.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"nobody@google.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"nobody\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }, @@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"robot@gserviceaccount.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"robot@gserviceaccount.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"robot\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }@@@",
       "@@@STEP_LOG_LINE@json.output@    ]@@@",
       "@@@STEP_LOG_LINE@json.output@  }@@@",
@@ -384,7 +396,7 @@
     "cmd": [
       "git",
       "log",
-      "--pretty=format:%H\n%ae\n%B",
+      "--pretty=format:%H\n%an\n%ae\n%B",
       "-z",
       "9999999999999999999999999999999999999999..cccccccccccccccccccccccccccccccccccccccc"
     ],
@@ -442,18 +454,22 @@
       "@@@STEP_NEST_LEVEL@1@@@",
       "@@@STEP_LOG_LINE@json.output@{@@@",
       "@@@STEP_LOG_LINE@json.output@  \"owner\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"email\": \"owner@example.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@    \"email\": \"author@example.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@    \"name\": \"author\"@@@",
       "@@@STEP_LOG_LINE@json.output@  }, @@@",
       "@@@STEP_LOG_LINE@json.output@  \"reviewers\": {@@@",
       "@@@STEP_LOG_LINE@json.output@    \"REVIEWER\": [@@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"reviewer@example.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"reviewer@example.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"reviewer\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }, @@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"nobody@google.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"nobody@google.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"nobody\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }, @@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"robot@gserviceaccount.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"robot@gserviceaccount.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"robot\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }@@@",
       "@@@STEP_LOG_LINE@json.output@    ]@@@",
       "@@@STEP_LOG_LINE@json.output@  }@@@",
@@ -514,18 +530,22 @@
       "@@@STEP_NEST_LEVEL@1@@@",
       "@@@STEP_LOG_LINE@json.output@{@@@",
       "@@@STEP_LOG_LINE@json.output@  \"owner\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"email\": \"owner@example.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@    \"email\": \"author@example.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@    \"name\": \"author\"@@@",
       "@@@STEP_LOG_LINE@json.output@  }, @@@",
       "@@@STEP_LOG_LINE@json.output@  \"reviewers\": {@@@",
       "@@@STEP_LOG_LINE@json.output@    \"REVIEWER\": [@@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"reviewer@example.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"reviewer@example.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"reviewer\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }, @@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"nobody@google.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"nobody@google.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"nobody\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }, @@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"robot@gserviceaccount.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"robot@gserviceaccount.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"robot\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }@@@",
       "@@@STEP_LOG_LINE@json.output@    ]@@@",
       "@@@STEP_LOG_LINE@json.output@  }@@@",
@@ -586,18 +606,22 @@
       "@@@STEP_NEST_LEVEL@1@@@",
       "@@@STEP_LOG_LINE@json.output@{@@@",
       "@@@STEP_LOG_LINE@json.output@  \"owner\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"email\": \"owner@example.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@    \"email\": \"author@example.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@    \"name\": \"author\"@@@",
       "@@@STEP_LOG_LINE@json.output@  }, @@@",
       "@@@STEP_LOG_LINE@json.output@  \"reviewers\": {@@@",
       "@@@STEP_LOG_LINE@json.output@    \"REVIEWER\": [@@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"reviewer@example.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"reviewer@example.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"reviewer\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }, @@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"nobody@google.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"nobody@google.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"nobody\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }, @@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"robot@gserviceaccount.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"robot@gserviceaccount.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"robot\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }@@@",
       "@@@STEP_LOG_LINE@json.output@    ]@@@",
       "@@@STEP_LOG_LINE@json.output@  }@@@",
@@ -646,7 +670,7 @@
     "cmd": [
       "git",
       "log",
-      "--pretty=format:%H\n%ae\n%B",
+      "--pretty=format:%H\n%an\n%ae\n%B",
       "-z",
       "5555555555555555555555555555555555555555..8888888888888888888888888888888888888888"
     ],
@@ -704,18 +728,22 @@
       "@@@STEP_NEST_LEVEL@1@@@",
       "@@@STEP_LOG_LINE@json.output@{@@@",
       "@@@STEP_LOG_LINE@json.output@  \"owner\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"email\": \"owner@example.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@    \"email\": \"author@example.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@    \"name\": \"author\"@@@",
       "@@@STEP_LOG_LINE@json.output@  }, @@@",
       "@@@STEP_LOG_LINE@json.output@  \"reviewers\": {@@@",
       "@@@STEP_LOG_LINE@json.output@    \"REVIEWER\": [@@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"reviewer@example.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"reviewer@example.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"reviewer\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }, @@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"nobody@google.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"nobody@google.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"nobody\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }, @@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"robot@gserviceaccount.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"robot@gserviceaccount.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"robot\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }@@@",
       "@@@STEP_LOG_LINE@json.output@    ]@@@",
       "@@@STEP_LOG_LINE@json.output@  }@@@",
@@ -776,18 +804,22 @@
       "@@@STEP_NEST_LEVEL@1@@@",
       "@@@STEP_LOG_LINE@json.output@{@@@",
       "@@@STEP_LOG_LINE@json.output@  \"owner\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"email\": \"owner@example.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@    \"email\": \"author@example.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@    \"name\": \"author\"@@@",
       "@@@STEP_LOG_LINE@json.output@  }, @@@",
       "@@@STEP_LOG_LINE@json.output@  \"reviewers\": {@@@",
       "@@@STEP_LOG_LINE@json.output@    \"REVIEWER\": [@@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"reviewer@example.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"reviewer@example.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"reviewer\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }, @@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"nobody@google.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"nobody@google.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"nobody\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }, @@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"robot@gserviceaccount.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"robot@gserviceaccount.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"robot\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }@@@",
       "@@@STEP_LOG_LINE@json.output@    ]@@@",
       "@@@STEP_LOG_LINE@json.output@  }@@@",
@@ -848,18 +880,22 @@
       "@@@STEP_NEST_LEVEL@1@@@",
       "@@@STEP_LOG_LINE@json.output@{@@@",
       "@@@STEP_LOG_LINE@json.output@  \"owner\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"email\": \"owner@example.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@    \"email\": \"author@example.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@    \"name\": \"author\"@@@",
       "@@@STEP_LOG_LINE@json.output@  }, @@@",
       "@@@STEP_LOG_LINE@json.output@  \"reviewers\": {@@@",
       "@@@STEP_LOG_LINE@json.output@    \"REVIEWER\": [@@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"reviewer@example.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"reviewer@example.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"reviewer\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }, @@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"nobody@google.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"nobody@google.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"nobody\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }, @@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"robot@gserviceaccount.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"robot@gserviceaccount.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"robot\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }@@@",
       "@@@STEP_LOG_LINE@json.output@    ]@@@",
       "@@@STEP_LOG_LINE@json.output@  }@@@",
diff --git a/recipe_modules/roll_util/tests/multiple_rolls.expected/single_commits.json b/recipe_modules/roll_util/tests/multiple_rolls.expected/single_commits.json
index 8fdecb4..60db5ae 100644
--- a/recipe_modules/roll_util/tests/multiple_rolls.expected/single_commits.json
+++ b/recipe_modules/roll_util/tests/multiple_rolls.expected/single_commits.json
@@ -35,7 +35,7 @@
     "cmd": [
       "git",
       "log",
-      "--pretty=format:%H\n%ae\n%B",
+      "--pretty=format:%H\n%an\n%ae\n%B",
       "-z",
       "1111111111111111111111111111111111111111..4444444444444444444444444444444444444444"
     ],
@@ -180,18 +180,22 @@
       "@@@STEP_NEST_LEVEL@1@@@",
       "@@@STEP_LOG_LINE@json.output@{@@@",
       "@@@STEP_LOG_LINE@json.output@  \"owner\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"email\": \"owner@example.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@    \"email\": \"author@example.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@    \"name\": \"author\"@@@",
       "@@@STEP_LOG_LINE@json.output@  }, @@@",
       "@@@STEP_LOG_LINE@json.output@  \"reviewers\": {@@@",
       "@@@STEP_LOG_LINE@json.output@    \"REVIEWER\": [@@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"reviewer@example.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"reviewer@example.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"reviewer\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }, @@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"nobody@google.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"nobody@google.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"nobody\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }, @@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"robot@gserviceaccount.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"robot@gserviceaccount.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"robot\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }@@@",
       "@@@STEP_LOG_LINE@json.output@    ]@@@",
       "@@@STEP_LOG_LINE@json.output@  }@@@",
@@ -240,7 +244,7 @@
     "cmd": [
       "git",
       "log",
-      "--pretty=format:%H\n%ae\n%B",
+      "--pretty=format:%H\n%an\n%ae\n%B",
       "-z",
       "9999999999999999999999999999999999999999..cccccccccccccccccccccccccccccccccccccccc"
     ],
@@ -298,18 +302,22 @@
       "@@@STEP_NEST_LEVEL@1@@@",
       "@@@STEP_LOG_LINE@json.output@{@@@",
       "@@@STEP_LOG_LINE@json.output@  \"owner\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"email\": \"owner@example.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@    \"email\": \"author@example.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@    \"name\": \"author\"@@@",
       "@@@STEP_LOG_LINE@json.output@  }, @@@",
       "@@@STEP_LOG_LINE@json.output@  \"reviewers\": {@@@",
       "@@@STEP_LOG_LINE@json.output@    \"REVIEWER\": [@@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"reviewer@example.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"reviewer@example.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"reviewer\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }, @@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"nobody@google.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"nobody@google.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"nobody\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }, @@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"robot@gserviceaccount.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"robot@gserviceaccount.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"robot\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }@@@",
       "@@@STEP_LOG_LINE@json.output@    ]@@@",
       "@@@STEP_LOG_LINE@json.output@  }@@@",
@@ -358,7 +366,7 @@
     "cmd": [
       "git",
       "log",
-      "--pretty=format:%H\n%ae\n%B",
+      "--pretty=format:%H\n%an\n%ae\n%B",
       "-z",
       "5555555555555555555555555555555555555555..8888888888888888888888888888888888888888"
     ],
@@ -416,18 +424,22 @@
       "@@@STEP_NEST_LEVEL@1@@@",
       "@@@STEP_LOG_LINE@json.output@{@@@",
       "@@@STEP_LOG_LINE@json.output@  \"owner\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"email\": \"owner@example.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@    \"email\": \"author@example.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@    \"name\": \"author\"@@@",
       "@@@STEP_LOG_LINE@json.output@  }, @@@",
       "@@@STEP_LOG_LINE@json.output@  \"reviewers\": {@@@",
       "@@@STEP_LOG_LINE@json.output@    \"REVIEWER\": [@@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"reviewer@example.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"reviewer@example.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"reviewer\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }, @@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"nobody@google.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"nobody@google.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"nobody\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }, @@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"robot@gserviceaccount.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"robot@gserviceaccount.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"robot\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }@@@",
       "@@@STEP_LOG_LINE@json.output@    ]@@@",
       "@@@STEP_LOG_LINE@json.output@  }@@@",
diff --git a/recipe_modules/roll_util/tests/single_roll.expected/frombranch.json b/recipe_modules/roll_util/tests/single_roll.expected/frombranch.json
index 470eee5..9ebccdc 100644
--- a/recipe_modules/roll_util/tests/single_roll.expected/frombranch.json
+++ b/recipe_modules/roll_util/tests/single_roll.expected/frombranch.json
@@ -70,7 +70,7 @@
     "cmd": [
       "git",
       "log",
-      "--pretty=format:%H\n%ae\n%B",
+      "--pretty=format:%H\n%an\n%ae\n%B",
       "-z",
       "--max-count",
       "5",
@@ -217,18 +217,22 @@
       "@@@STEP_NEST_LEVEL@1@@@",
       "@@@STEP_LOG_LINE@json.output@{@@@",
       "@@@STEP_LOG_LINE@json.output@  \"owner\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"email\": \"owner@example.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@    \"email\": \"author@example.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@    \"name\": \"author\"@@@",
       "@@@STEP_LOG_LINE@json.output@  }, @@@",
       "@@@STEP_LOG_LINE@json.output@  \"reviewers\": {@@@",
       "@@@STEP_LOG_LINE@json.output@    \"REVIEWER\": [@@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"reviewer@example.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"reviewer@example.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"reviewer\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }, @@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"nobody@google.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"nobody@google.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"nobody\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }, @@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"robot@gserviceaccount.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"robot@gserviceaccount.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"robot\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }@@@",
       "@@@STEP_LOG_LINE@json.output@    ]@@@",
       "@@@STEP_LOG_LINE@json.output@  }@@@",
@@ -289,18 +293,22 @@
       "@@@STEP_NEST_LEVEL@1@@@",
       "@@@STEP_LOG_LINE@json.output@{@@@",
       "@@@STEP_LOG_LINE@json.output@  \"owner\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"email\": \"owner@example.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@    \"email\": \"author@example.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@    \"name\": \"author\"@@@",
       "@@@STEP_LOG_LINE@json.output@  }, @@@",
       "@@@STEP_LOG_LINE@json.output@  \"reviewers\": {@@@",
       "@@@STEP_LOG_LINE@json.output@    \"REVIEWER\": [@@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"reviewer@example.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"reviewer@example.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"reviewer\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }, @@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"nobody@google.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"nobody@google.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"nobody\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }, @@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"robot@gserviceaccount.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"robot@gserviceaccount.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"robot\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }@@@",
       "@@@STEP_LOG_LINE@json.output@    ]@@@",
       "@@@STEP_LOG_LINE@json.output@  }@@@",
@@ -361,18 +369,22 @@
       "@@@STEP_NEST_LEVEL@1@@@",
       "@@@STEP_LOG_LINE@json.output@{@@@",
       "@@@STEP_LOG_LINE@json.output@  \"owner\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"email\": \"owner@example.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@    \"email\": \"author@example.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@    \"name\": \"author\"@@@",
       "@@@STEP_LOG_LINE@json.output@  }, @@@",
       "@@@STEP_LOG_LINE@json.output@  \"reviewers\": {@@@",
       "@@@STEP_LOG_LINE@json.output@    \"REVIEWER\": [@@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"reviewer@example.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"reviewer@example.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"reviewer\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }, @@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"nobody@google.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"nobody@google.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"nobody\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }, @@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"robot@gserviceaccount.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"robot@gserviceaccount.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"robot\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }@@@",
       "@@@STEP_LOG_LINE@json.output@    ]@@@",
       "@@@STEP_LOG_LINE@json.output@  }@@@",
@@ -433,18 +445,22 @@
       "@@@STEP_NEST_LEVEL@1@@@",
       "@@@STEP_LOG_LINE@json.output@{@@@",
       "@@@STEP_LOG_LINE@json.output@  \"owner\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"email\": \"owner@example.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@    \"email\": \"author@example.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@    \"name\": \"author\"@@@",
       "@@@STEP_LOG_LINE@json.output@  }, @@@",
       "@@@STEP_LOG_LINE@json.output@  \"reviewers\": {@@@",
       "@@@STEP_LOG_LINE@json.output@    \"REVIEWER\": [@@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"reviewer@example.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"reviewer@example.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"reviewer\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }, @@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"nobody@google.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"nobody@google.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"nobody\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }, @@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"robot@gserviceaccount.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"robot@gserviceaccount.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"robot\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }@@@",
       "@@@STEP_LOG_LINE@json.output@    ]@@@",
       "@@@STEP_LOG_LINE@json.output@  }@@@",
@@ -505,18 +521,22 @@
       "@@@STEP_NEST_LEVEL@1@@@",
       "@@@STEP_LOG_LINE@json.output@{@@@",
       "@@@STEP_LOG_LINE@json.output@  \"owner\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"email\": \"owner@example.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@    \"email\": \"author@example.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@    \"name\": \"author\"@@@",
       "@@@STEP_LOG_LINE@json.output@  }, @@@",
       "@@@STEP_LOG_LINE@json.output@  \"reviewers\": {@@@",
       "@@@STEP_LOG_LINE@json.output@    \"REVIEWER\": [@@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"reviewer@example.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"reviewer@example.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"reviewer\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }, @@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"nobody@google.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"nobody@google.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"nobody\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }, @@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"robot@gserviceaccount.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"robot@gserviceaccount.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"robot\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }@@@",
       "@@@STEP_LOG_LINE@json.output@    ]@@@",
       "@@@STEP_LOG_LINE@json.output@  }@@@",
@@ -548,7 +568,6 @@
     "name": "emails",
     "~followup_annotations": [
       "@@@STEP_LOG_LINE@authors@author@example.com@@@",
-      "@@@STEP_LOG_LINE@authors@owner@example.com@@@",
       "@@@STEP_LOG_END@authors@@@",
       "@@@STEP_LOG_LINE@reviewers@nobody@google.com@@@",
       "@@@STEP_LOG_LINE@reviewers@reviewer@example.com@@@",
diff --git a/recipe_modules/roll_util/tests/single_roll.expected/multicommit.json b/recipe_modules/roll_util/tests/single_roll.expected/multicommit.json
index 9c05fec..2957709 100644
--- a/recipe_modules/roll_util/tests/single_roll.expected/multicommit.json
+++ b/recipe_modules/roll_util/tests/single_roll.expected/multicommit.json
@@ -70,7 +70,7 @@
     "cmd": [
       "git",
       "log",
-      "--pretty=format:%H\n%ae\n%B",
+      "--pretty=format:%H\n%an\n%ae\n%B",
       "-z",
       "0000000000000000000000000000000000000000..4444444444444444444444444444444444444444"
     ],
@@ -215,18 +215,22 @@
       "@@@STEP_NEST_LEVEL@1@@@",
       "@@@STEP_LOG_LINE@json.output@{@@@",
       "@@@STEP_LOG_LINE@json.output@  \"owner\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"email\": \"owner@example.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@    \"email\": \"author@example.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@    \"name\": \"author\"@@@",
       "@@@STEP_LOG_LINE@json.output@  }, @@@",
       "@@@STEP_LOG_LINE@json.output@  \"reviewers\": {@@@",
       "@@@STEP_LOG_LINE@json.output@    \"REVIEWER\": [@@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"reviewer@example.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"reviewer@example.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"reviewer\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }, @@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"nobody@google.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"nobody@google.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"nobody\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }, @@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"robot@gserviceaccount.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"robot@gserviceaccount.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"robot\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }@@@",
       "@@@STEP_LOG_LINE@json.output@    ]@@@",
       "@@@STEP_LOG_LINE@json.output@  }@@@",
@@ -287,18 +291,22 @@
       "@@@STEP_NEST_LEVEL@1@@@",
       "@@@STEP_LOG_LINE@json.output@{@@@",
       "@@@STEP_LOG_LINE@json.output@  \"owner\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"email\": \"owner@example.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@    \"email\": \"author@example.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@    \"name\": \"author\"@@@",
       "@@@STEP_LOG_LINE@json.output@  }, @@@",
       "@@@STEP_LOG_LINE@json.output@  \"reviewers\": {@@@",
       "@@@STEP_LOG_LINE@json.output@    \"REVIEWER\": [@@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"reviewer@example.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"reviewer@example.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"reviewer\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }, @@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"nobody@google.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"nobody@google.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"nobody\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }, @@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"robot@gserviceaccount.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"robot@gserviceaccount.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"robot\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }@@@",
       "@@@STEP_LOG_LINE@json.output@    ]@@@",
       "@@@STEP_LOG_LINE@json.output@  }@@@",
@@ -359,18 +367,22 @@
       "@@@STEP_NEST_LEVEL@1@@@",
       "@@@STEP_LOG_LINE@json.output@{@@@",
       "@@@STEP_LOG_LINE@json.output@  \"owner\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"email\": \"owner@example.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@    \"email\": \"author@example.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@    \"name\": \"author\"@@@",
       "@@@STEP_LOG_LINE@json.output@  }, @@@",
       "@@@STEP_LOG_LINE@json.output@  \"reviewers\": {@@@",
       "@@@STEP_LOG_LINE@json.output@    \"REVIEWER\": [@@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"reviewer@example.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"reviewer@example.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"reviewer\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }, @@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"nobody@google.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"nobody@google.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"nobody\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }, @@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"robot@gserviceaccount.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"robot@gserviceaccount.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"robot\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }@@@",
       "@@@STEP_LOG_LINE@json.output@    ]@@@",
       "@@@STEP_LOG_LINE@json.output@  }@@@",
@@ -431,18 +443,22 @@
       "@@@STEP_NEST_LEVEL@1@@@",
       "@@@STEP_LOG_LINE@json.output@{@@@",
       "@@@STEP_LOG_LINE@json.output@  \"owner\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"email\": \"owner@example.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@    \"email\": \"author@example.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@    \"name\": \"author\"@@@",
       "@@@STEP_LOG_LINE@json.output@  }, @@@",
       "@@@STEP_LOG_LINE@json.output@  \"reviewers\": {@@@",
       "@@@STEP_LOG_LINE@json.output@    \"REVIEWER\": [@@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"reviewer@example.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"reviewer@example.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"reviewer\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }, @@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"nobody@google.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"nobody@google.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"nobody\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }, @@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"robot@gserviceaccount.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"robot@gserviceaccount.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"robot\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }@@@",
       "@@@STEP_LOG_LINE@json.output@    ]@@@",
       "@@@STEP_LOG_LINE@json.output@  }@@@",
@@ -474,7 +490,6 @@
     "name": "emails",
     "~followup_annotations": [
       "@@@STEP_LOG_LINE@authors@author@example.com@@@",
-      "@@@STEP_LOG_LINE@authors@owner@example.com@@@",
       "@@@STEP_LOG_END@authors@@@",
       "@@@STEP_LOG_LINE@reviewers@nobody@google.com@@@",
       "@@@STEP_LOG_LINE@reviewers@reviewer@example.com@@@",
diff --git a/recipe_modules/roll_util/tests/single_roll.expected/rebase.json b/recipe_modules/roll_util/tests/single_roll.expected/rebase.json
index 67efd37..6105837 100644
--- a/recipe_modules/roll_util/tests/single_roll.expected/rebase.json
+++ b/recipe_modules/roll_util/tests/single_roll.expected/rebase.json
@@ -70,7 +70,7 @@
     "cmd": [
       "git",
       "log",
-      "--pretty=format:%H\n%ae\n%B",
+      "--pretty=format:%H\n%an\n%ae\n%B",
       "-z",
       "--max-count",
       "5",
@@ -217,18 +217,22 @@
       "@@@STEP_NEST_LEVEL@1@@@",
       "@@@STEP_LOG_LINE@json.output@{@@@",
       "@@@STEP_LOG_LINE@json.output@  \"owner\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"email\": \"owner@example.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@    \"email\": \"author@example.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@    \"name\": \"author\"@@@",
       "@@@STEP_LOG_LINE@json.output@  }, @@@",
       "@@@STEP_LOG_LINE@json.output@  \"reviewers\": {@@@",
       "@@@STEP_LOG_LINE@json.output@    \"REVIEWER\": [@@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"reviewer@example.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"reviewer@example.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"reviewer\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }, @@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"nobody@google.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"nobody@google.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"nobody\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }, @@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"robot@gserviceaccount.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"robot@gserviceaccount.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"robot\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }@@@",
       "@@@STEP_LOG_LINE@json.output@    ]@@@",
       "@@@STEP_LOG_LINE@json.output@  }@@@",
@@ -289,18 +293,22 @@
       "@@@STEP_NEST_LEVEL@1@@@",
       "@@@STEP_LOG_LINE@json.output@{@@@",
       "@@@STEP_LOG_LINE@json.output@  \"owner\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"email\": \"owner@example.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@    \"email\": \"author@example.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@    \"name\": \"author\"@@@",
       "@@@STEP_LOG_LINE@json.output@  }, @@@",
       "@@@STEP_LOG_LINE@json.output@  \"reviewers\": {@@@",
       "@@@STEP_LOG_LINE@json.output@    \"REVIEWER\": [@@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"reviewer@example.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"reviewer@example.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"reviewer\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }, @@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"nobody@google.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"nobody@google.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"nobody\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }, @@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"robot@gserviceaccount.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"robot@gserviceaccount.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"robot\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }@@@",
       "@@@STEP_LOG_LINE@json.output@    ]@@@",
       "@@@STEP_LOG_LINE@json.output@  }@@@",
@@ -361,18 +369,22 @@
       "@@@STEP_NEST_LEVEL@1@@@",
       "@@@STEP_LOG_LINE@json.output@{@@@",
       "@@@STEP_LOG_LINE@json.output@  \"owner\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"email\": \"owner@example.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@    \"email\": \"author@example.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@    \"name\": \"author\"@@@",
       "@@@STEP_LOG_LINE@json.output@  }, @@@",
       "@@@STEP_LOG_LINE@json.output@  \"reviewers\": {@@@",
       "@@@STEP_LOG_LINE@json.output@    \"REVIEWER\": [@@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"reviewer@example.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"reviewer@example.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"reviewer\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }, @@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"nobody@google.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"nobody@google.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"nobody\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }, @@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"robot@gserviceaccount.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"robot@gserviceaccount.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"robot\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }@@@",
       "@@@STEP_LOG_LINE@json.output@    ]@@@",
       "@@@STEP_LOG_LINE@json.output@  }@@@",
@@ -433,18 +445,22 @@
       "@@@STEP_NEST_LEVEL@1@@@",
       "@@@STEP_LOG_LINE@json.output@{@@@",
       "@@@STEP_LOG_LINE@json.output@  \"owner\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"email\": \"owner@example.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@    \"email\": \"author@example.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@    \"name\": \"author\"@@@",
       "@@@STEP_LOG_LINE@json.output@  }, @@@",
       "@@@STEP_LOG_LINE@json.output@  \"reviewers\": {@@@",
       "@@@STEP_LOG_LINE@json.output@    \"REVIEWER\": [@@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"reviewer@example.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"reviewer@example.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"reviewer\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }, @@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"nobody@google.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"nobody@google.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"nobody\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }, @@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"robot@gserviceaccount.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"robot@gserviceaccount.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"robot\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }@@@",
       "@@@STEP_LOG_LINE@json.output@    ]@@@",
       "@@@STEP_LOG_LINE@json.output@  }@@@",
@@ -505,18 +521,22 @@
       "@@@STEP_NEST_LEVEL@1@@@",
       "@@@STEP_LOG_LINE@json.output@{@@@",
       "@@@STEP_LOG_LINE@json.output@  \"owner\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"email\": \"owner@example.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@    \"email\": \"author@example.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@    \"name\": \"author\"@@@",
       "@@@STEP_LOG_LINE@json.output@  }, @@@",
       "@@@STEP_LOG_LINE@json.output@  \"reviewers\": {@@@",
       "@@@STEP_LOG_LINE@json.output@    \"REVIEWER\": [@@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"reviewer@example.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"reviewer@example.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"reviewer\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }, @@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"nobody@google.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"nobody@google.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"nobody\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }, @@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"robot@gserviceaccount.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"robot@gserviceaccount.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"robot\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }@@@",
       "@@@STEP_LOG_LINE@json.output@    ]@@@",
       "@@@STEP_LOG_LINE@json.output@  }@@@",
@@ -548,7 +568,6 @@
     "name": "emails",
     "~followup_annotations": [
       "@@@STEP_LOG_LINE@authors@author@example.com@@@",
-      "@@@STEP_LOG_LINE@authors@owner@example.com@@@",
       "@@@STEP_LOG_END@authors@@@",
       "@@@STEP_LOG_LINE@reviewers@nobody@google.com@@@",
       "@@@STEP_LOG_LINE@reviewers@reviewer@example.com@@@",
diff --git a/recipe_modules/roll_util/tests/single_roll.expected/singlecommit_multiline.json b/recipe_modules/roll_util/tests/single_roll.expected/singlecommit_multiline.json
index b601d6b..aca1634 100644
--- a/recipe_modules/roll_util/tests/single_roll.expected/singlecommit_multiline.json
+++ b/recipe_modules/roll_util/tests/single_roll.expected/singlecommit_multiline.json
@@ -70,7 +70,7 @@
     "cmd": [
       "git",
       "log",
-      "--pretty=format:%H\n%ae\n%B",
+      "--pretty=format:%H\n%an\n%ae\n%B",
       "-z",
       "0000000000000000000000000000000000000000..1111111111111111111111111111111111111111"
     ],
@@ -215,18 +215,22 @@
       "@@@STEP_NEST_LEVEL@1@@@",
       "@@@STEP_LOG_LINE@json.output@{@@@",
       "@@@STEP_LOG_LINE@json.output@  \"owner\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"email\": \"owner@example.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@    \"email\": \"author@example.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@    \"name\": \"author\"@@@",
       "@@@STEP_LOG_LINE@json.output@  }, @@@",
       "@@@STEP_LOG_LINE@json.output@  \"reviewers\": {@@@",
       "@@@STEP_LOG_LINE@json.output@    \"REVIEWER\": [@@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"reviewer@example.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"reviewer@example.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"reviewer\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }, @@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"nobody@google.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"nobody@google.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"nobody\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }, @@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"robot@gserviceaccount.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"robot@gserviceaccount.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"robot\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }@@@",
       "@@@STEP_LOG_LINE@json.output@    ]@@@",
       "@@@STEP_LOG_LINE@json.output@  }@@@",
@@ -258,7 +262,6 @@
     "name": "emails",
     "~followup_annotations": [
       "@@@STEP_LOG_LINE@authors@author@example.com@@@",
-      "@@@STEP_LOG_LINE@authors@owner@example.com@@@",
       "@@@STEP_LOG_END@authors@@@",
       "@@@STEP_LOG_LINE@reviewers@nobody@google.com@@@",
       "@@@STEP_LOG_LINE@reviewers@reviewer@example.com@@@",
diff --git a/recipe_modules/roll_util/tests/single_roll.expected/singlecommit_singleline.json b/recipe_modules/roll_util/tests/single_roll.expected/singlecommit_singleline.json
index 8585663..6a67415 100644
--- a/recipe_modules/roll_util/tests/single_roll.expected/singlecommit_singleline.json
+++ b/recipe_modules/roll_util/tests/single_roll.expected/singlecommit_singleline.json
@@ -70,7 +70,7 @@
     "cmd": [
       "git",
       "log",
-      "--pretty=format:%H\n%ae\n%B",
+      "--pretty=format:%H\n%an\n%ae\n%B",
       "-z",
       "0000000000000000000000000000000000000000..1111111111111111111111111111111111111111"
     ],
@@ -215,18 +215,22 @@
       "@@@STEP_NEST_LEVEL@1@@@",
       "@@@STEP_LOG_LINE@json.output@{@@@",
       "@@@STEP_LOG_LINE@json.output@  \"owner\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"email\": \"owner@example.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@    \"email\": \"author@example.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@    \"name\": \"author\"@@@",
       "@@@STEP_LOG_LINE@json.output@  }, @@@",
       "@@@STEP_LOG_LINE@json.output@  \"reviewers\": {@@@",
       "@@@STEP_LOG_LINE@json.output@    \"REVIEWER\": [@@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"reviewer@example.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"reviewer@example.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"reviewer\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }, @@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"nobody@google.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"nobody@google.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"nobody\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }, @@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"robot@gserviceaccount.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"robot@gserviceaccount.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"robot\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }@@@",
       "@@@STEP_LOG_LINE@json.output@    ]@@@",
       "@@@STEP_LOG_LINE@json.output@  }@@@",
@@ -258,7 +262,6 @@
     "name": "emails",
     "~followup_annotations": [
       "@@@STEP_LOG_LINE@authors@author@example.com@@@",
-      "@@@STEP_LOG_LINE@authors@owner@example.com@@@",
       "@@@STEP_LOG_END@authors@@@",
       "@@@STEP_LOG_LINE@reviewers@nobody@google.com@@@",
       "@@@STEP_LOG_LINE@reviewers@reviewer@example.com@@@",
diff --git a/recipe_modules/roll_util/tests/single_roll.py b/recipe_modules/roll_util/tests/single_roll.py
index 5e7721a..fb0a574 100644
--- a/recipe_modules/roll_util/tests/single_roll.py
+++ b/recipe_modules/roll_util/tests/single_roll.py
@@ -59,8 +59,12 @@
         steplog('gerrit_name', roll.gerrit_name)
 
         with api.step.nest('emails') as pres:
-            pres.logs['authors'] = sorted(api.roll_util.authors(roll))
-            pres.logs['reviewers'] = sorted(api.roll_util.reviewers(roll))
+            pres.logs['authors'] = sorted(
+                x.email for x in api.roll_util.authors(roll)
+            )
+            pres.logs['reviewers'] = sorted(
+                x.email for x in api.roll_util.reviewers(roll)
+            )
 
         api.roll_util.message(roll)
 
@@ -72,14 +76,26 @@
     api.roll_util.can_cc_on_roll('email@example.com', host)
     api.roll_util.can_cc_on_roll('nobody@google.com', host)
 
+    Account = api.roll_util.Account
+    user = Account('user', 'user@example.com')
+
+    assert (
+        api.roll_util.fake_author(user).email
+        == 'user@pigweed.infra.roller.example.com'
+    )
+
     with api.step.nest('CCing'):
-        api.roll_util.include_cc('user@example.com', ('example.com',), host)
+        api.roll_util.include_cc(user, ('example.com',), host)
     with api.step.nest('not CCing, domain excluded'):
-        api.roll_util.include_cc('user@example.com', ('google.com',), host)
+        api.roll_util.include_cc(user, ('google.com',), host)
     with api.step.nest('not CCing, robot account'):
-        api.roll_util.include_cc('robot@gserviceaccount.com', (), host)
+        api.roll_util.include_cc(
+            Account('robot', 'robot@gserviceaccount.com'), (), host,
+        )
     with api.step.nest('not CCing, no account in Gerrit'):
-        api.roll_util.include_cc('nobody@google.com', (), host)
+        api.roll_util.include_cc(
+            Account('nobody', 'nobody@google.com'), (), host,
+        )
 
 
 def GenTests(api):  # pylint: disable=invalid-name
diff --git a/recipes/multiple_submodule_roller.expected/partial_noop.json b/recipes/multiple_submodule_roller.expected/partial_noop.json
index 76c6aad..3cca674 100644
--- a/recipes/multiple_submodule_roller.expected/partial_noop.json
+++ b/recipes/multiple_submodule_roller.expected/partial_noop.json
@@ -581,7 +581,7 @@
     "cmd": [
       "git",
       "log",
-      "--pretty=format:%H\n%ae\n%B",
+      "--pretty=format:%H\n%an\n%ae\n%B",
       "-z",
       "1111111111111111111111111111111111111111..2222222222222222222222222222222222222222"
     ],
@@ -726,18 +726,22 @@
       "@@@STEP_NEST_LEVEL@1@@@",
       "@@@STEP_LOG_LINE@json.output@{@@@",
       "@@@STEP_LOG_LINE@json.output@  \"owner\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"email\": \"owner@example.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@    \"email\": \"author@example.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@    \"name\": \"author\"@@@",
       "@@@STEP_LOG_LINE@json.output@  }, @@@",
       "@@@STEP_LOG_LINE@json.output@  \"reviewers\": {@@@",
       "@@@STEP_LOG_LINE@json.output@    \"REVIEWER\": [@@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"reviewer@example.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"reviewer@example.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"reviewer\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }, @@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"nobody@google.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"nobody@google.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"nobody\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }, @@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"robot@gserviceaccount.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"robot@gserviceaccount.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"robot\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }@@@",
       "@@@STEP_LOG_LINE@json.output@    ]@@@",
       "@@@STEP_LOG_LINE@json.output@  }@@@",
diff --git a/recipes/multiple_submodule_roller.expected/success.json b/recipes/multiple_submodule_roller.expected/success.json
index 692a824..019a9fe 100644
--- a/recipes/multiple_submodule_roller.expected/success.json
+++ b/recipes/multiple_submodule_roller.expected/success.json
@@ -581,7 +581,7 @@
     "cmd": [
       "git",
       "log",
-      "--pretty=format:%H\n%ae\n%B",
+      "--pretty=format:%H\n%an\n%ae\n%B",
       "-z",
       "1111111111111111111111111111111111111111..2222222222222222222222222222222222222222"
     ],
@@ -726,18 +726,22 @@
       "@@@STEP_NEST_LEVEL@1@@@",
       "@@@STEP_LOG_LINE@json.output@{@@@",
       "@@@STEP_LOG_LINE@json.output@  \"owner\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"email\": \"owner@example.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@    \"email\": \"author@example.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@    \"name\": \"author\"@@@",
       "@@@STEP_LOG_LINE@json.output@  }, @@@",
       "@@@STEP_LOG_LINE@json.output@  \"reviewers\": {@@@",
       "@@@STEP_LOG_LINE@json.output@    \"REVIEWER\": [@@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"reviewer@example.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"reviewer@example.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"reviewer\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }, @@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"nobody@google.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"nobody@google.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"nobody\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }, @@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"robot@gserviceaccount.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"robot@gserviceaccount.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"robot\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }@@@",
       "@@@STEP_LOG_LINE@json.output@    ]@@@",
       "@@@STEP_LOG_LINE@json.output@  }@@@",
@@ -876,7 +880,7 @@
     "cmd": [
       "git",
       "log",
-      "--pretty=format:%H\n%ae\n%B",
+      "--pretty=format:%H\n%an\n%ae\n%B",
       "-z",
       "1111111111111111111111111111111111111111..2222222222222222222222222222222222222222"
     ],
@@ -934,18 +938,22 @@
       "@@@STEP_NEST_LEVEL@1@@@",
       "@@@STEP_LOG_LINE@json.output@{@@@",
       "@@@STEP_LOG_LINE@json.output@  \"owner\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"email\": \"owner@example.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@    \"email\": \"author@example.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@    \"name\": \"author\"@@@",
       "@@@STEP_LOG_LINE@json.output@  }, @@@",
       "@@@STEP_LOG_LINE@json.output@  \"reviewers\": {@@@",
       "@@@STEP_LOG_LINE@json.output@    \"REVIEWER\": [@@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"reviewer@example.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"reviewer@example.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"reviewer\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }, @@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"nobody@google.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"nobody@google.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"nobody\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }, @@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"robot@gserviceaccount.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"robot@gserviceaccount.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"robot\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }@@@",
       "@@@STEP_LOG_LINE@json.output@    ]@@@",
       "@@@STEP_LOG_LINE@json.output@  }@@@",
@@ -996,42 +1004,6 @@
   },
   {
     "cmd": [],
-    "name": "cc owner@example.com",
-    "~followup_annotations": [
-      "@@@STEP_SUMMARY_TEXT@CCing@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "[START_DIR]/cipd_tool/path/to/gerrit/version%3Apinned-version/gerrit",
-      "account-query",
-      "-host",
-      "https://pigweed-review.googlesource.com",
-      "-input",
-      "{\"params\": {\"q\": \"email:owner@example.com\"}}",
-      "-output",
-      "/path/to/tmp/json"
-    ],
-    "name": "cc owner@example.com.owner@example.com",
-    "timeout": 600,
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_LOG_LINE@json.output@[@@@",
-      "@@@STEP_LOG_LINE@json.output@  {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"_account_id\": 123@@@",
-      "@@@STEP_LOG_LINE@json.output@  }@@@",
-      "@@@STEP_LOG_LINE@json.output@]@@@",
-      "@@@STEP_LOG_END@json.output@@@",
-      "@@@STEP_LOG_LINE@json.input@{@@@",
-      "@@@STEP_LOG_LINE@json.input@  \"params\": {@@@",
-      "@@@STEP_LOG_LINE@json.input@    \"q\": \"email:owner@example.com\"@@@",
-      "@@@STEP_LOG_LINE@json.input@  }@@@",
-      "@@@STEP_LOG_LINE@json.input@}@@@",
-      "@@@STEP_LOG_END@json.input@@@"
-    ]
-  },
-  {
-    "cmd": [],
     "name": "roll message"
   },
   {
@@ -1219,7 +1191,7 @@
       "--push-option",
       "nokeycheck",
       "origin",
-      "HEAD:refs/for/main%l=Commit-Queue+1,cc=author@example.com,cc=owner@example.com"
+      "HEAD:refs/for/main%l=Commit-Queue+1,cc=author@example.com"
     ],
     "cwd": "[START_DIR]/checkout",
     "infra_step": true,
diff --git a/recipes/multiple_submodule_roller.py b/recipes/multiple_submodule_roller.py
index 2e84f3b..952e6f6 100644
--- a/recipes/multiple_submodule_roller.py
+++ b/recipes/multiple_submodule_roller.py
@@ -184,9 +184,9 @@
 
     roll_kwargs = {}
     if always_cc:
-        roll_kwargs['cc'] = cc
+        roll_kwargs['cc'] = [x.email for x in cc]
     else:
-        roll_kwargs['cc_on_failure'] = cc
+        roll_kwargs['cc_on_failure'] = [x.email for x in cc]
 
     change = api.auto_roller.attempt_roll(
         gerrit_host=api.checkout.gerrit_host(),
diff --git a/recipes/repo_roller.expected/dotdot-prefix.json b/recipes/repo_roller.expected/dotdot-prefix.json
index 7324100..4e2692d 100644
--- a/recipes/repo_roller.expected/dotdot-prefix.json
+++ b/recipes/repo_roller.expected/dotdot-prefix.json
@@ -1632,7 +1632,7 @@
     "cmd": [
       "git",
       "log",
-      "--pretty=format:%H\n%ae\n%B",
+      "--pretty=format:%H\n%an\n%ae\n%B",
       "-z",
       "--max-count",
       "5",
@@ -1851,18 +1851,22 @@
       "@@@STEP_NEST_LEVEL@1@@@",
       "@@@STEP_LOG_LINE@json.output@{@@@",
       "@@@STEP_LOG_LINE@json.output@  \"owner\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"email\": \"owner@example.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@    \"email\": \"author@example.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@    \"name\": \"author\"@@@",
       "@@@STEP_LOG_LINE@json.output@  }, @@@",
       "@@@STEP_LOG_LINE@json.output@  \"reviewers\": {@@@",
       "@@@STEP_LOG_LINE@json.output@    \"REVIEWER\": [@@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"reviewer@example.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"reviewer@example.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"reviewer\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }, @@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"nobody@google.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"nobody@google.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"nobody\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }, @@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"robot@gserviceaccount.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"robot@gserviceaccount.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"robot\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }@@@",
       "@@@STEP_LOG_LINE@json.output@    ]@@@",
       "@@@STEP_LOG_LINE@json.output@  }@@@",
@@ -1877,6 +1881,13 @@
   },
   {
     "cmd": [],
+    "name": "authors",
+    "~followup_annotations": [
+      "@@@STEP_SUMMARY_TEXT@{Account(name='author', email='author@example.com')}@@@"
+    ]
+  },
+  {
+    "cmd": [],
     "name": "roll message"
   },
   {
diff --git a/recipes/repo_roller.expected/equivalent.json b/recipes/repo_roller.expected/equivalent.json
index c511d6a..fe671db 100644
--- a/recipes/repo_roller.expected/equivalent.json
+++ b/recipes/repo_roller.expected/equivalent.json
@@ -1691,7 +1691,7 @@
     "cmd": [
       "git",
       "log",
-      "--pretty=format:%H\n%ae\n%B",
+      "--pretty=format:%H\n%an\n%ae\n%B",
       "-z",
       "2222222222222222222222222222222222222222..2d72510e447ab60a9728aeea2362d8be2cbd7789"
     ],
@@ -1908,18 +1908,22 @@
       "@@@STEP_NEST_LEVEL@1@@@",
       "@@@STEP_LOG_LINE@json.output@{@@@",
       "@@@STEP_LOG_LINE@json.output@  \"owner\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"email\": \"owner@example.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@    \"email\": \"author@example.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@    \"name\": \"author\"@@@",
       "@@@STEP_LOG_LINE@json.output@  }, @@@",
       "@@@STEP_LOG_LINE@json.output@  \"reviewers\": {@@@",
       "@@@STEP_LOG_LINE@json.output@    \"REVIEWER\": [@@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"reviewer@example.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"reviewer@example.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"reviewer\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }, @@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"nobody@google.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"nobody@google.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"nobody\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }, @@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"robot@gserviceaccount.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"robot@gserviceaccount.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"robot\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }@@@",
       "@@@STEP_LOG_LINE@json.output@    ]@@@",
       "@@@STEP_LOG_LINE@json.output@  }@@@",
@@ -2033,6 +2037,13 @@
   },
   {
     "cmd": [],
+    "name": "authors",
+    "~followup_annotations": [
+      "@@@STEP_SUMMARY_TEXT@{Account(name='author', email='author@example.com')}@@@"
+    ]
+  },
+  {
+    "cmd": [],
     "name": "roll message"
   },
   {
diff --git a/recipes/repo_roller.expected/host-dot-dot.json b/recipes/repo_roller.expected/host-dot-dot.json
index 75b234f..3222134 100644
--- a/recipes/repo_roller.expected/host-dot-dot.json
+++ b/recipes/repo_roller.expected/host-dot-dot.json
@@ -1632,7 +1632,7 @@
     "cmd": [
       "git",
       "log",
-      "--pretty=format:%H\n%ae\n%B",
+      "--pretty=format:%H\n%an\n%ae\n%B",
       "-z",
       "--max-count",
       "5",
@@ -1851,18 +1851,22 @@
       "@@@STEP_NEST_LEVEL@1@@@",
       "@@@STEP_LOG_LINE@json.output@{@@@",
       "@@@STEP_LOG_LINE@json.output@  \"owner\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"email\": \"owner@example.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@    \"email\": \"author@example.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@    \"name\": \"author\"@@@",
       "@@@STEP_LOG_LINE@json.output@  }, @@@",
       "@@@STEP_LOG_LINE@json.output@  \"reviewers\": {@@@",
       "@@@STEP_LOG_LINE@json.output@    \"REVIEWER\": [@@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"reviewer@example.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"reviewer@example.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"reviewer\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }, @@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"nobody@google.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"nobody@google.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"nobody\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }, @@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"robot@gserviceaccount.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"robot@gserviceaccount.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"robot\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }@@@",
       "@@@STEP_LOG_LINE@json.output@    ]@@@",
       "@@@STEP_LOG_LINE@json.output@  }@@@",
@@ -1877,6 +1881,13 @@
   },
   {
     "cmd": [],
+    "name": "authors",
+    "~followup_annotations": [
+      "@@@STEP_SUMMARY_TEXT@{Account(name='author', email='author@example.com')}@@@"
+    ]
+  },
+  {
+    "cmd": [],
     "name": "roll message"
   },
   {
diff --git a/recipes/repo_roller.expected/host-prefix.json b/recipes/repo_roller.expected/host-prefix.json
index e865201..ec4785e 100644
--- a/recipes/repo_roller.expected/host-prefix.json
+++ b/recipes/repo_roller.expected/host-prefix.json
@@ -1632,7 +1632,7 @@
     "cmd": [
       "git",
       "log",
-      "--pretty=format:%H\n%ae\n%B",
+      "--pretty=format:%H\n%an\n%ae\n%B",
       "-z",
       "--max-count",
       "5",
@@ -1851,18 +1851,22 @@
       "@@@STEP_NEST_LEVEL@1@@@",
       "@@@STEP_LOG_LINE@json.output@{@@@",
       "@@@STEP_LOG_LINE@json.output@  \"owner\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"email\": \"owner@example.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@    \"email\": \"author@example.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@    \"name\": \"author\"@@@",
       "@@@STEP_LOG_LINE@json.output@  }, @@@",
       "@@@STEP_LOG_LINE@json.output@  \"reviewers\": {@@@",
       "@@@STEP_LOG_LINE@json.output@    \"REVIEWER\": [@@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"reviewer@example.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"reviewer@example.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"reviewer\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }, @@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"nobody@google.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"nobody@google.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"nobody\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }, @@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"robot@gserviceaccount.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"robot@gserviceaccount.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"robot\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }@@@",
       "@@@STEP_LOG_LINE@json.output@    ]@@@",
       "@@@STEP_LOG_LINE@json.output@  }@@@",
@@ -1877,6 +1881,13 @@
   },
   {
     "cmd": [],
+    "name": "authors",
+    "~followup_annotations": [
+      "@@@STEP_SUMMARY_TEXT@{Account(name='author', email='author@example.com')}@@@"
+    ]
+  },
+  {
+    "cmd": [],
     "name": "roll message"
   },
   {
diff --git a/recipes/repo_roller.expected/no-trigger-with-revision-branch.json b/recipes/repo_roller.expected/no-trigger-with-revision-branch.json
index 6aab6e0..8c29e49 100644
--- a/recipes/repo_roller.expected/no-trigger-with-revision-branch.json
+++ b/recipes/repo_roller.expected/no-trigger-with-revision-branch.json
@@ -982,7 +982,7 @@
     "cmd": [
       "git",
       "log",
-      "--pretty=format:%H\n%ae\n%B",
+      "--pretty=format:%H\n%an\n%ae\n%B",
       "-z",
       "--max-count",
       "5",
@@ -1129,18 +1129,22 @@
       "@@@STEP_NEST_LEVEL@1@@@",
       "@@@STEP_LOG_LINE@json.output@{@@@",
       "@@@STEP_LOG_LINE@json.output@  \"owner\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"email\": \"owner@example.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@    \"email\": \"author@example.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@    \"name\": \"author\"@@@",
       "@@@STEP_LOG_LINE@json.output@  }, @@@",
       "@@@STEP_LOG_LINE@json.output@  \"reviewers\": {@@@",
       "@@@STEP_LOG_LINE@json.output@    \"REVIEWER\": [@@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"reviewer@example.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"reviewer@example.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"reviewer\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }, @@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"nobody@google.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"nobody@google.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"nobody\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }, @@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"robot@gserviceaccount.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"robot@gserviceaccount.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"robot\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }@@@",
       "@@@STEP_LOG_LINE@json.output@    ]@@@",
       "@@@STEP_LOG_LINE@json.output@  }@@@",
@@ -1155,6 +1159,13 @@
   },
   {
     "cmd": [],
+    "name": "authors",
+    "~followup_annotations": [
+      "@@@STEP_SUMMARY_TEXT@{Account(name='author', email='author@example.com')}@@@"
+    ]
+  },
+  {
+    "cmd": [],
     "name": "roll message"
   },
   {
diff --git a/recipes/repo_roller.expected/no-trigger-with-upstream.json b/recipes/repo_roller.expected/no-trigger-with-upstream.json
index 8c50d7d..598bc99 100644
--- a/recipes/repo_roller.expected/no-trigger-with-upstream.json
+++ b/recipes/repo_roller.expected/no-trigger-with-upstream.json
@@ -1017,7 +1017,7 @@
     "cmd": [
       "git",
       "log",
-      "--pretty=format:%H\n%ae\n%B",
+      "--pretty=format:%H\n%an\n%ae\n%B",
       "-z",
       "1111111111111111111111111111111111111111..hash-from-special-checkout"
     ],
@@ -1162,18 +1162,22 @@
       "@@@STEP_NEST_LEVEL@1@@@",
       "@@@STEP_LOG_LINE@json.output@{@@@",
       "@@@STEP_LOG_LINE@json.output@  \"owner\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"email\": \"owner@example.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@    \"email\": \"author@example.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@    \"name\": \"author\"@@@",
       "@@@STEP_LOG_LINE@json.output@  }, @@@",
       "@@@STEP_LOG_LINE@json.output@  \"reviewers\": {@@@",
       "@@@STEP_LOG_LINE@json.output@    \"REVIEWER\": [@@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"reviewer@example.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"reviewer@example.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"reviewer\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }, @@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"nobody@google.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"nobody@google.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"nobody\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }, @@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"robot@gserviceaccount.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"robot@gserviceaccount.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"robot\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }@@@",
       "@@@STEP_LOG_LINE@json.output@    ]@@@",
       "@@@STEP_LOG_LINE@json.output@  }@@@",
@@ -1188,6 +1192,13 @@
   },
   {
     "cmd": [],
+    "name": "authors",
+    "~followup_annotations": [
+      "@@@STEP_SUMMARY_TEXT@{Account(name='author', email='author@example.com')}@@@"
+    ]
+  },
+  {
+    "cmd": [],
     "name": "roll message"
   },
   {
diff --git a/recipes/repo_roller.expected/success.json b/recipes/repo_roller.expected/success.json
index f1b13ca..45c3213 100644
--- a/recipes/repo_roller.expected/success.json
+++ b/recipes/repo_roller.expected/success.json
@@ -1691,7 +1691,7 @@
     "cmd": [
       "git",
       "log",
-      "--pretty=format:%H\n%ae\n%B",
+      "--pretty=format:%H\n%an\n%ae\n%B",
       "-z",
       "1111111111111111111111111111111111111111..2d72510e447ab60a9728aeea2362d8be2cbd7789"
     ],
@@ -1908,18 +1908,22 @@
       "@@@STEP_NEST_LEVEL@1@@@",
       "@@@STEP_LOG_LINE@json.output@{@@@",
       "@@@STEP_LOG_LINE@json.output@  \"owner\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"email\": \"owner@example.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@    \"email\": \"author@example.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@    \"name\": \"author\"@@@",
       "@@@STEP_LOG_LINE@json.output@  }, @@@",
       "@@@STEP_LOG_LINE@json.output@  \"reviewers\": {@@@",
       "@@@STEP_LOG_LINE@json.output@    \"REVIEWER\": [@@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"reviewer@example.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"reviewer@example.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"reviewer\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }, @@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"nobody@google.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"nobody@google.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"nobody\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }, @@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"robot@gserviceaccount.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"robot@gserviceaccount.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"robot\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }@@@",
       "@@@STEP_LOG_LINE@json.output@    ]@@@",
       "@@@STEP_LOG_LINE@json.output@  }@@@",
@@ -1982,50 +1986,9 @@
   },
   {
     "cmd": [],
-    "name": "cc owner@example.com",
+    "name": "authors",
     "~followup_annotations": [
-      "@@@STEP_SUMMARY_TEXT@CCing@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "[START_DIR]/cipd_tool/path/to/gerrit/version%3Apinned-version/gerrit",
-      "account-query",
-      "-host",
-      "https://host-review.googlesource.com",
-      "-input",
-      "{\"params\": {\"q\": \"email:owner@example.com\"}}",
-      "-output",
-      "/path/to/tmp/json"
-    ],
-    "luci_context": {
-      "realm": {
-        "name": "project:ci"
-      },
-      "resultdb": {
-        "current_invocation": {
-          "name": "invocations/build:8945511751514863184",
-          "update_token": "token"
-        },
-        "hostname": "rdbhost"
-      }
-    },
-    "name": "cc owner@example.com.owner@example.com",
-    "timeout": 600,
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_LOG_LINE@json.output@[@@@",
-      "@@@STEP_LOG_LINE@json.output@  {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"_account_id\": 123@@@",
-      "@@@STEP_LOG_LINE@json.output@  }@@@",
-      "@@@STEP_LOG_LINE@json.output@]@@@",
-      "@@@STEP_LOG_END@json.output@@@",
-      "@@@STEP_LOG_LINE@json.input@{@@@",
-      "@@@STEP_LOG_LINE@json.input@  \"params\": {@@@",
-      "@@@STEP_LOG_LINE@json.input@    \"q\": \"email:owner@example.com\"@@@",
-      "@@@STEP_LOG_LINE@json.input@  }@@@",
-      "@@@STEP_LOG_LINE@json.input@}@@@",
-      "@@@STEP_LOG_END@json.input@@@"
+      "@@@STEP_SUMMARY_TEXT@{Account(name='author', email='author@example.com')}@@@"
     ]
   },
   {
@@ -2274,7 +2237,7 @@
       "--push-option",
       "nokeycheck",
       "origin",
-      "HEAD:refs/for/main%l=Commit-Queue+1,cc=author@example.com,cc=owner@example.com"
+      "HEAD:refs/for/main%l=Commit-Queue+1,cc=author@example.com"
     ],
     "cwd": "[START_DIR]/checkout",
     "infra_step": true,
diff --git a/recipes/repo_roller.expected/upstream-not-set.json b/recipes/repo_roller.expected/upstream-not-set.json
index b8cf5ab..66722ba 100644
--- a/recipes/repo_roller.expected/upstream-not-set.json
+++ b/recipes/repo_roller.expected/upstream-not-set.json
@@ -1632,7 +1632,7 @@
     "cmd": [
       "git",
       "log",
-      "--pretty=format:%H\n%ae\n%B",
+      "--pretty=format:%H\n%an\n%ae\n%B",
       "-z",
       "--max-count",
       "5",
@@ -1851,18 +1851,22 @@
       "@@@STEP_NEST_LEVEL@1@@@",
       "@@@STEP_LOG_LINE@json.output@{@@@",
       "@@@STEP_LOG_LINE@json.output@  \"owner\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"email\": \"owner@example.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@    \"email\": \"author@example.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@    \"name\": \"author\"@@@",
       "@@@STEP_LOG_LINE@json.output@  }, @@@",
       "@@@STEP_LOG_LINE@json.output@  \"reviewers\": {@@@",
       "@@@STEP_LOG_LINE@json.output@    \"REVIEWER\": [@@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"reviewer@example.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"reviewer@example.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"reviewer\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }, @@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"nobody@google.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"nobody@google.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"nobody\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }, @@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"robot@gserviceaccount.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"robot@gserviceaccount.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"robot\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }@@@",
       "@@@STEP_LOG_LINE@json.output@    ]@@@",
       "@@@STEP_LOG_LINE@json.output@  }@@@",
@@ -1877,6 +1881,13 @@
   },
   {
     "cmd": [],
+    "name": "authors",
+    "~followup_annotations": [
+      "@@@STEP_SUMMARY_TEXT@{Account(name='author', email='author@example.com')}@@@"
+    ]
+  },
+  {
+    "cmd": [],
     "name": "roll message"
   },
   {
diff --git a/recipes/repo_roller.proto b/recipes/repo_roller.proto
index 5c3d7a9..2e1d638 100644
--- a/recipes/repo_roller.proto
+++ b/recipes/repo_roller.proto
@@ -20,9 +20,6 @@
   // The "path" attribute of the project to update. Required.
   string path_to_update = 1;
 
-  // The revision hash to update to. Default: get from buildbucket.
-  string new_revision = 2;
-
   // Don't do anything that has external effects.
   bool dry_run = 3;
 
@@ -44,4 +41,8 @@
 
   // Vote Bot-Commit+1 instead of Code-Review+2.
   bool bot_commit = 8;
+
+  // Forge the author so rolls of single commits are attributed to the original
+  // commit author.
+  bool forge_author = 9;
 }
diff --git a/recipes/repo_roller.py b/recipes/repo_roller.py
index 440cac2..99cad2f 100644
--- a/recipes/repo_roller.py
+++ b/recipes/repo_roller.py
@@ -226,8 +226,9 @@
     )
 
     cc = set()
+    authors = api.roll_util.authors(roll)
     if cc_authors_on_rolls:
-        cc.update(api.roll_util.authors(roll))
+        cc.update(authors)
     if cc_reviewers_on_rolls:
         cc.update(api.roll_util.reviewers(roll))
 
@@ -242,9 +243,17 @@
 
     roll_kwargs = {}
     if always_cc:
-        roll_kwargs['cc'] = cc
+        roll_kwargs['cc'] = [x.email for x in cc]
     else:
-        roll_kwargs['cc_on_failure'] = cc
+        roll_kwargs['cc_on_failure'] = [x.email for x in cc]
+
+    author_override = None
+    with api.step.nest('authors') as pres:
+        pres.step_summary_text = repr(authors)
+    if len(authors) == 1 and props.forge_author:
+        author_override = api.roll_util.fake_author(
+            next(iter(authors))
+        )._asdict()
 
     change = api.auto_roller.attempt_roll(
         gerrit_host=api.checkout.gerrit_host(),
@@ -270,6 +279,7 @@
             remote='https://host.googlesource.com/manifest',
             equivalent_remotes=equivalent_remotes,
         )
+        props['forge_author'] = True
         props['path_to_update'] = path
         props['dry_run'] = dry_run
         props.update(**kwargs)
diff --git a/recipes/submodule_roller.expected/failure-cc-authors.json b/recipes/submodule_roller.expected/failure-cc-authors.json
index 09c113e..8107563 100644
--- a/recipes/submodule_roller.expected/failure-cc-authors.json
+++ b/recipes/submodule_roller.expected/failure-cc-authors.json
@@ -981,7 +981,7 @@
     "cmd": [
       "git",
       "log",
-      "--pretty=format:%H\n%ae\n%B",
+      "--pretty=format:%H\n%an\n%ae\n%B",
       "-z",
       "1111111111111111111111111111111111111111..2d72510e447ab60a9728aeea2362d8be2cbd7789"
     ],
@@ -1198,18 +1198,22 @@
       "@@@STEP_NEST_LEVEL@1@@@",
       "@@@STEP_LOG_LINE@json.output@{@@@",
       "@@@STEP_LOG_LINE@json.output@  \"owner\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"email\": \"owner@example.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@    \"email\": \"author@example.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@    \"name\": \"author\"@@@",
       "@@@STEP_LOG_LINE@json.output@  }, @@@",
       "@@@STEP_LOG_LINE@json.output@  \"reviewers\": {@@@",
       "@@@STEP_LOG_LINE@json.output@    \"REVIEWER\": [@@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"reviewer@example.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"reviewer@example.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"reviewer\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }, @@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"nobody@google.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"nobody@google.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"nobody\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }, @@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"robot@gserviceaccount.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"robot@gserviceaccount.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"robot\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }@@@",
       "@@@STEP_LOG_LINE@json.output@    ]@@@",
       "@@@STEP_LOG_LINE@json.output@  }@@@",
@@ -1510,50 +1514,9 @@
   },
   {
     "cmd": [],
-    "name": "cc owner@example.com",
+    "name": "authors",
     "~followup_annotations": [
-      "@@@STEP_SUMMARY_TEXT@CCing@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "[START_DIR]/cipd_tool/path/to/gerrit/version%3Apinned-version/gerrit",
-      "account-query",
-      "-host",
-      "https://pigweed-review.googlesource.com",
-      "-input",
-      "{\"params\": {\"q\": \"email:owner@example.com\"}}",
-      "-output",
-      "/path/to/tmp/json"
-    ],
-    "luci_context": {
-      "realm": {
-        "name": "project:ci"
-      },
-      "resultdb": {
-        "current_invocation": {
-          "name": "invocations/build:8945511751514863184",
-          "update_token": "token"
-        },
-        "hostname": "rdbhost"
-      }
-    },
-    "name": "cc owner@example.com.owner@example.com",
-    "timeout": 600,
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_LOG_LINE@json.output@[@@@",
-      "@@@STEP_LOG_LINE@json.output@  {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"_account_id\": 123@@@",
-      "@@@STEP_LOG_LINE@json.output@  }@@@",
-      "@@@STEP_LOG_LINE@json.output@]@@@",
-      "@@@STEP_LOG_END@json.output@@@",
-      "@@@STEP_LOG_LINE@json.input@{@@@",
-      "@@@STEP_LOG_LINE@json.input@  \"params\": {@@@",
-      "@@@STEP_LOG_LINE@json.input@    \"q\": \"email:owner@example.com\"@@@",
-      "@@@STEP_LOG_LINE@json.input@  }@@@",
-      "@@@STEP_LOG_LINE@json.input@}@@@",
-      "@@@STEP_LOG_END@json.input@@@"
+      "@@@STEP_SUMMARY_TEXT@{Account(name='author', email='author@example.com')}@@@"
     ]
   },
   {
@@ -1778,7 +1741,9 @@
       "commit",
       "-m",
       "[roll a1] foo\nbar\n\n\nhttps://pigweed.googlesource.com/pigweed/pigweed\na1 Rolled-Commits: 111111111111111..2d72510e447ab60\nRoller-URL: https://ci.chromium.org/b/8945511751514863184\nCq-Cl-Tag: roller-builder:builder\nCq-Cl-Tag: roller-bid:8945511751514863184\nCQ-Do-Not-Cancel-Tryjobs: true\nChange-Id: I27ec3e6a65adbbeb0f5d0b74ef7036a069efcfe8",
-      "-a"
+      "-a",
+      "--author",
+      "author <author@pigweed.infra.roller.example.com>"
     ],
     "cwd": "[START_DIR]/checkout",
     "infra_step": true,
@@ -1899,7 +1864,7 @@
       "-host",
       "https://pigweed-review.googlesource.com",
       "-input",
-      "{\"change_id\": \"pigweed/pigweed~main~I27ec3e6a65adbbeb0f5d0b74ef7036a069efcfe8\", \"input\": {\"reviewers\": [{\"reviewer\": \"author@example.com\", \"state\": \"CC\"}, {\"reviewer\": \"owner@example.com\", \"state\": \"CC\"}]}, \"revision_id\": \"current\"}",
+      "{\"change_id\": \"pigweed/pigweed~main~I27ec3e6a65adbbeb0f5d0b74ef7036a069efcfe8\", \"input\": {\"reviewers\": [{\"reviewer\": \"author@example.com\", \"state\": \"CC\"}]}, \"revision_id\": \"current\"}",
       "-output",
       "/path/to/tmp/json"
     ],
@@ -1928,10 +1893,6 @@
       "@@@STEP_LOG_LINE@json.input@      {@@@",
       "@@@STEP_LOG_LINE@json.input@        \"reviewer\": \"author@example.com\", @@@",
       "@@@STEP_LOG_LINE@json.input@        \"state\": \"CC\"@@@",
-      "@@@STEP_LOG_LINE@json.input@      }, @@@",
-      "@@@STEP_LOG_LINE@json.input@      {@@@",
-      "@@@STEP_LOG_LINE@json.input@        \"reviewer\": \"owner@example.com\", @@@",
-      "@@@STEP_LOG_LINE@json.input@        \"state\": \"CC\"@@@",
       "@@@STEP_LOG_LINE@json.input@      }@@@",
       "@@@STEP_LOG_LINE@json.input@    ]@@@",
       "@@@STEP_LOG_LINE@json.input@  }, @@@",
diff --git a/recipes/submodule_roller.expected/no-revision.json b/recipes/submodule_roller.expected/no-revision.json
index b7071fa..10b8af4 100644
--- a/recipes/submodule_roller.expected/no-revision.json
+++ b/recipes/submodule_roller.expected/no-revision.json
@@ -572,7 +572,7 @@
     "cmd": [
       "git",
       "log",
-      "--pretty=format:%H\n%ae\n%B",
+      "--pretty=format:%H\n%an\n%ae\n%B",
       "-z",
       "1111111111111111111111111111111111111111..2222222222222222222222222222222222222222"
     ],
@@ -717,18 +717,22 @@
       "@@@STEP_NEST_LEVEL@1@@@",
       "@@@STEP_LOG_LINE@json.output@{@@@",
       "@@@STEP_LOG_LINE@json.output@  \"owner\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"email\": \"owner@example.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@    \"email\": \"author@example.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@    \"name\": \"author\"@@@",
       "@@@STEP_LOG_LINE@json.output@  }, @@@",
       "@@@STEP_LOG_LINE@json.output@  \"reviewers\": {@@@",
       "@@@STEP_LOG_LINE@json.output@    \"REVIEWER\": [@@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"reviewer@example.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"reviewer@example.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"reviewer\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }, @@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"nobody@google.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"nobody@google.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"nobody\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }, @@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"robot@gserviceaccount.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"robot@gserviceaccount.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"robot\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }@@@",
       "@@@STEP_LOG_LINE@json.output@    ]@@@",
       "@@@STEP_LOG_LINE@json.output@  }@@@",
@@ -933,6 +937,13 @@
   },
   {
     "cmd": [],
+    "name": "authors",
+    "~followup_annotations": [
+      "@@@STEP_SUMMARY_TEXT@{Account(name='author', email='author@example.com')}@@@"
+    ]
+  },
+  {
+    "cmd": [],
     "name": "roll message"
   },
   {
@@ -1081,7 +1092,9 @@
       "commit",
       "-m",
       "[roll a1] foo\nbar\n\n\nhttps://pigweed.googlesource.com/pigweed/pigweed\na1 Rolled-Commits: 111111111111111..222222222222222\nRoller-URL: https://ci.chromium.org/b/0\nCq-Cl-Tag: roller-builder:\nCq-Cl-Tag: roller-bid:0\nCQ-Do-Not-Cancel-Tryjobs: true\nChange-Id: Idcafe3609bd1c8c808cc0005865453850afdf06e",
-      "-a"
+      "-a",
+      "--author",
+      "author <author@pigweed.infra.roller.example.com>"
     ],
     "cwd": "[START_DIR]/checkout",
     "infra_step": true,
diff --git a/recipes/submodule_roller.expected/relative-dot.json b/recipes/submodule_roller.expected/relative-dot.json
index d9a8917..b289d2c 100644
--- a/recipes/submodule_roller.expected/relative-dot.json
+++ b/recipes/submodule_roller.expected/relative-dot.json
@@ -981,7 +981,7 @@
     "cmd": [
       "git",
       "log",
-      "--pretty=format:%H\n%ae\n%B",
+      "--pretty=format:%H\n%an\n%ae\n%B",
       "-z",
       "1111111111111111111111111111111111111111..2d72510e447ab60a9728aeea2362d8be2cbd7789"
     ],
@@ -1198,18 +1198,22 @@
       "@@@STEP_NEST_LEVEL@1@@@",
       "@@@STEP_LOG_LINE@json.output@{@@@",
       "@@@STEP_LOG_LINE@json.output@  \"owner\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"email\": \"owner@example.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@    \"email\": \"author@example.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@    \"name\": \"author\"@@@",
       "@@@STEP_LOG_LINE@json.output@  }, @@@",
       "@@@STEP_LOG_LINE@json.output@  \"reviewers\": {@@@",
       "@@@STEP_LOG_LINE@json.output@    \"REVIEWER\": [@@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"reviewer@example.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"reviewer@example.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"reviewer\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }, @@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"nobody@google.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"nobody@google.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"nobody\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }, @@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"robot@gserviceaccount.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"robot@gserviceaccount.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"robot\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }@@@",
       "@@@STEP_LOG_LINE@json.output@    ]@@@",
       "@@@STEP_LOG_LINE@json.output@  }@@@",
@@ -1510,50 +1514,9 @@
   },
   {
     "cmd": [],
-    "name": "cc owner@example.com",
+    "name": "authors",
     "~followup_annotations": [
-      "@@@STEP_SUMMARY_TEXT@CCing@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "[START_DIR]/cipd_tool/path/to/gerrit/version%3Apinned-version/gerrit",
-      "account-query",
-      "-host",
-      "https://pigweed-review.googlesource.com",
-      "-input",
-      "{\"params\": {\"q\": \"email:owner@example.com\"}}",
-      "-output",
-      "/path/to/tmp/json"
-    ],
-    "luci_context": {
-      "realm": {
-        "name": "project:ci"
-      },
-      "resultdb": {
-        "current_invocation": {
-          "name": "invocations/build:8945511751514863184",
-          "update_token": "token"
-        },
-        "hostname": "rdbhost"
-      }
-    },
-    "name": "cc owner@example.com.owner@example.com",
-    "timeout": 600,
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_LOG_LINE@json.output@[@@@",
-      "@@@STEP_LOG_LINE@json.output@  {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"_account_id\": 123@@@",
-      "@@@STEP_LOG_LINE@json.output@  }@@@",
-      "@@@STEP_LOG_LINE@json.output@]@@@",
-      "@@@STEP_LOG_END@json.output@@@",
-      "@@@STEP_LOG_LINE@json.input@{@@@",
-      "@@@STEP_LOG_LINE@json.input@  \"params\": {@@@",
-      "@@@STEP_LOG_LINE@json.input@    \"q\": \"email:owner@example.com\"@@@",
-      "@@@STEP_LOG_LINE@json.input@  }@@@",
-      "@@@STEP_LOG_LINE@json.input@}@@@",
-      "@@@STEP_LOG_END@json.input@@@"
+      "@@@STEP_SUMMARY_TEXT@{Account(name='author', email='author@example.com')}@@@"
     ]
   },
   {
@@ -1778,7 +1741,9 @@
       "commit",
       "-m",
       "[roll a1] foo\nbar\n\n\nhttps://pigweed.googlesource.com/pigweed/pigweed\na1 Rolled-Commits: 111111111111111..2d72510e447ab60\nRoller-URL: https://ci.chromium.org/b/8945511751514863184\nCq-Cl-Tag: roller-builder:builder\nCq-Cl-Tag: roller-bid:8945511751514863184\nCQ-Do-Not-Cancel-Tryjobs: true\nChange-Id: I27ec3e6a65adbbeb0f5d0b74ef7036a069efcfe8",
-      "-a"
+      "-a",
+      "--author",
+      "author <author@pigweed.infra.roller.example.com>"
     ],
     "cwd": "[START_DIR]/checkout",
     "infra_step": true,
@@ -1899,7 +1864,7 @@
       "-host",
       "https://pigweed-review.googlesource.com",
       "-input",
-      "{\"change_id\": \"pigweed/pigweed~main~I27ec3e6a65adbbeb0f5d0b74ef7036a069efcfe8\", \"input\": {\"reviewers\": [{\"reviewer\": \"author@example.com\", \"state\": \"CC\"}, {\"reviewer\": \"owner@example.com\", \"state\": \"CC\"}]}, \"revision_id\": \"current\"}",
+      "{\"change_id\": \"pigweed/pigweed~main~I27ec3e6a65adbbeb0f5d0b74ef7036a069efcfe8\", \"input\": {\"reviewers\": [{\"reviewer\": \"author@example.com\", \"state\": \"CC\"}]}, \"revision_id\": \"current\"}",
       "-output",
       "/path/to/tmp/json"
     ],
@@ -1928,10 +1893,6 @@
       "@@@STEP_LOG_LINE@json.input@      {@@@",
       "@@@STEP_LOG_LINE@json.input@        \"reviewer\": \"author@example.com\", @@@",
       "@@@STEP_LOG_LINE@json.input@        \"state\": \"CC\"@@@",
-      "@@@STEP_LOG_LINE@json.input@      }, @@@",
-      "@@@STEP_LOG_LINE@json.input@      {@@@",
-      "@@@STEP_LOG_LINE@json.input@        \"reviewer\": \"owner@example.com\", @@@",
-      "@@@STEP_LOG_LINE@json.input@        \"state\": \"CC\"@@@",
       "@@@STEP_LOG_LINE@json.input@      }@@@",
       "@@@STEP_LOG_LINE@json.input@    ]@@@",
       "@@@STEP_LOG_LINE@json.input@  }, @@@",
diff --git a/recipes/submodule_roller.expected/relative-dotdot-dotdot-always-cc-reviewers.json b/recipes/submodule_roller.expected/relative-dotdot-dotdot-always-cc-reviewers.json
index a639111..97f8b7c 100644
--- a/recipes/submodule_roller.expected/relative-dotdot-dotdot-always-cc-reviewers.json
+++ b/recipes/submodule_roller.expected/relative-dotdot-dotdot-always-cc-reviewers.json
@@ -981,7 +981,7 @@
     "cmd": [
       "git",
       "log",
-      "--pretty=format:%H\n%ae\n%B",
+      "--pretty=format:%H\n%an\n%ae\n%B",
       "-z",
       "1111111111111111111111111111111111111111..2d72510e447ab60a9728aeea2362d8be2cbd7789"
     ],
@@ -1198,18 +1198,22 @@
       "@@@STEP_NEST_LEVEL@1@@@",
       "@@@STEP_LOG_LINE@json.output@{@@@",
       "@@@STEP_LOG_LINE@json.output@  \"owner\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"email\": \"owner@example.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@    \"email\": \"author@example.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@    \"name\": \"author\"@@@",
       "@@@STEP_LOG_LINE@json.output@  }, @@@",
       "@@@STEP_LOG_LINE@json.output@  \"reviewers\": {@@@",
       "@@@STEP_LOG_LINE@json.output@    \"REVIEWER\": [@@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"reviewer@example.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"reviewer@example.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"reviewer\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }, @@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"nobody@google.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"nobody@google.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"nobody\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }, @@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"robot@gserviceaccount.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"robot@gserviceaccount.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"robot\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }@@@",
       "@@@STEP_LOG_LINE@json.output@    ]@@@",
       "@@@STEP_LOG_LINE@json.output@  }@@@",
@@ -1561,6 +1565,13 @@
   },
   {
     "cmd": [],
+    "name": "authors",
+    "~followup_annotations": [
+      "@@@STEP_SUMMARY_TEXT@{Account(name='author', email='author@example.com')}@@@"
+    ]
+  },
+  {
+    "cmd": [],
     "name": "roll message"
   },
   {
@@ -1781,7 +1792,9 @@
       "commit",
       "-m",
       "[roll a1] foo\nbar\n\n\nhttps://pigweed.googlesource.com/pigweed/pigweed\na1 Rolled-Commits: 111111111111111..2d72510e447ab60\nRoller-URL: https://ci.chromium.org/b/8945511751514863184\nCq-Cl-Tag: roller-builder:builder\nCq-Cl-Tag: roller-bid:8945511751514863184\nCQ-Do-Not-Cancel-Tryjobs: true\nChange-Id: I27ec3e6a65adbbeb0f5d0b74ef7036a069efcfe8",
-      "-a"
+      "-a",
+      "--author",
+      "author <author@pigweed.infra.roller.example.com>"
     ],
     "cwd": "[START_DIR]/checkout",
     "infra_step": true,
diff --git a/recipes/submodule_roller.expected/relative-dotdot.json b/recipes/submodule_roller.expected/relative-dotdot.json
index 8584825..43bbe35 100644
--- a/recipes/submodule_roller.expected/relative-dotdot.json
+++ b/recipes/submodule_roller.expected/relative-dotdot.json
@@ -981,7 +981,7 @@
     "cmd": [
       "git",
       "log",
-      "--pretty=format:%H\n%ae\n%B",
+      "--pretty=format:%H\n%an\n%ae\n%B",
       "-z",
       "1111111111111111111111111111111111111111..2d72510e447ab60a9728aeea2362d8be2cbd7789"
     ],
@@ -1198,18 +1198,22 @@
       "@@@STEP_NEST_LEVEL@1@@@",
       "@@@STEP_LOG_LINE@json.output@{@@@",
       "@@@STEP_LOG_LINE@json.output@  \"owner\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"email\": \"owner@example.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@    \"email\": \"author@example.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@    \"name\": \"author\"@@@",
       "@@@STEP_LOG_LINE@json.output@  }, @@@",
       "@@@STEP_LOG_LINE@json.output@  \"reviewers\": {@@@",
       "@@@STEP_LOG_LINE@json.output@    \"REVIEWER\": [@@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"reviewer@example.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"reviewer@example.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"reviewer\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }, @@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"nobody@google.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"nobody@google.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"nobody\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }, @@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"robot@gserviceaccount.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"robot@gserviceaccount.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"robot\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }@@@",
       "@@@STEP_LOG_LINE@json.output@    ]@@@",
       "@@@STEP_LOG_LINE@json.output@  }@@@",
@@ -1510,50 +1514,9 @@
   },
   {
     "cmd": [],
-    "name": "cc owner@example.com",
+    "name": "authors",
     "~followup_annotations": [
-      "@@@STEP_SUMMARY_TEXT@CCing@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "[START_DIR]/cipd_tool/path/to/gerrit/version%3Apinned-version/gerrit",
-      "account-query",
-      "-host",
-      "https://pigweed-review.googlesource.com",
-      "-input",
-      "{\"params\": {\"q\": \"email:owner@example.com\"}}",
-      "-output",
-      "/path/to/tmp/json"
-    ],
-    "luci_context": {
-      "realm": {
-        "name": "project:ci"
-      },
-      "resultdb": {
-        "current_invocation": {
-          "name": "invocations/build:8945511751514863184",
-          "update_token": "token"
-        },
-        "hostname": "rdbhost"
-      }
-    },
-    "name": "cc owner@example.com.owner@example.com",
-    "timeout": 600,
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_LOG_LINE@json.output@[@@@",
-      "@@@STEP_LOG_LINE@json.output@  {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"_account_id\": 123@@@",
-      "@@@STEP_LOG_LINE@json.output@  }@@@",
-      "@@@STEP_LOG_LINE@json.output@]@@@",
-      "@@@STEP_LOG_END@json.output@@@",
-      "@@@STEP_LOG_LINE@json.input@{@@@",
-      "@@@STEP_LOG_LINE@json.input@  \"params\": {@@@",
-      "@@@STEP_LOG_LINE@json.input@    \"q\": \"email:owner@example.com\"@@@",
-      "@@@STEP_LOG_LINE@json.input@  }@@@",
-      "@@@STEP_LOG_LINE@json.input@}@@@",
-      "@@@STEP_LOG_END@json.input@@@"
+      "@@@STEP_SUMMARY_TEXT@{Account(name='author', email='author@example.com')}@@@"
     ]
   },
   {
@@ -1778,7 +1741,9 @@
       "commit",
       "-m",
       "[roll a1] foo\nbar\n\n\nhttps://pigweed.googlesource.com/pigweed/pigweed\na1 Rolled-Commits: 111111111111111..2d72510e447ab60\nRoller-URL: https://ci.chromium.org/b/8945511751514863184\nCq-Cl-Tag: roller-builder:builder\nCq-Cl-Tag: roller-bid:8945511751514863184\nCQ-Do-Not-Cancel-Tryjobs: true\nChange-Id: I27ec3e6a65adbbeb0f5d0b74ef7036a069efcfe8",
-      "-a"
+      "-a",
+      "--author",
+      "author <author@pigweed.infra.roller.example.com>"
     ],
     "cwd": "[START_DIR]/checkout",
     "infra_step": true,
@@ -1899,7 +1864,7 @@
       "-host",
       "https://pigweed-review.googlesource.com",
       "-input",
-      "{\"change_id\": \"pigweed/pigweed~main~I27ec3e6a65adbbeb0f5d0b74ef7036a069efcfe8\", \"input\": {\"reviewers\": [{\"reviewer\": \"author@example.com\", \"state\": \"CC\"}, {\"reviewer\": \"owner@example.com\", \"state\": \"CC\"}]}, \"revision_id\": \"current\"}",
+      "{\"change_id\": \"pigweed/pigweed~main~I27ec3e6a65adbbeb0f5d0b74ef7036a069efcfe8\", \"input\": {\"reviewers\": [{\"reviewer\": \"author@example.com\", \"state\": \"CC\"}]}, \"revision_id\": \"current\"}",
       "-output",
       "/path/to/tmp/json"
     ],
@@ -1928,10 +1893,6 @@
       "@@@STEP_LOG_LINE@json.input@      {@@@",
       "@@@STEP_LOG_LINE@json.input@        \"reviewer\": \"author@example.com\", @@@",
       "@@@STEP_LOG_LINE@json.input@        \"state\": \"CC\"@@@",
-      "@@@STEP_LOG_LINE@json.input@      }, @@@",
-      "@@@STEP_LOG_LINE@json.input@      {@@@",
-      "@@@STEP_LOG_LINE@json.input@        \"reviewer\": \"owner@example.com\", @@@",
-      "@@@STEP_LOG_LINE@json.input@        \"state\": \"CC\"@@@",
       "@@@STEP_LOG_LINE@json.input@      }@@@",
       "@@@STEP_LOG_LINE@json.input@    ]@@@",
       "@@@STEP_LOG_LINE@json.input@  }, @@@",
diff --git a/recipes/submodule_roller.expected/success-sso-cc-authors.json b/recipes/submodule_roller.expected/success-sso-cc-authors.json
index b919601..fe452b1 100644
--- a/recipes/submodule_roller.expected/success-sso-cc-authors.json
+++ b/recipes/submodule_roller.expected/success-sso-cc-authors.json
@@ -981,7 +981,7 @@
     "cmd": [
       "git",
       "log",
-      "--pretty=format:%H\n%ae\n%B",
+      "--pretty=format:%H\n%an\n%ae\n%B",
       "-z",
       "1111111111111111111111111111111111111111..2d72510e447ab60a9728aeea2362d8be2cbd7789"
     ],
@@ -1198,18 +1198,22 @@
       "@@@STEP_NEST_LEVEL@1@@@",
       "@@@STEP_LOG_LINE@json.output@{@@@",
       "@@@STEP_LOG_LINE@json.output@  \"owner\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"email\": \"owner@example.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@    \"email\": \"author@example.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@    \"name\": \"author\"@@@",
       "@@@STEP_LOG_LINE@json.output@  }, @@@",
       "@@@STEP_LOG_LINE@json.output@  \"reviewers\": {@@@",
       "@@@STEP_LOG_LINE@json.output@    \"REVIEWER\": [@@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"reviewer@example.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"reviewer@example.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"reviewer\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }, @@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"nobody@google.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"nobody@google.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"nobody\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }, @@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"robot@gserviceaccount.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"robot@gserviceaccount.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"robot\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }@@@",
       "@@@STEP_LOG_LINE@json.output@    ]@@@",
       "@@@STEP_LOG_LINE@json.output@  }@@@",
@@ -1510,50 +1514,9 @@
   },
   {
     "cmd": [],
-    "name": "cc owner@example.com",
+    "name": "authors",
     "~followup_annotations": [
-      "@@@STEP_SUMMARY_TEXT@CCing@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "[START_DIR]/cipd_tool/path/to/gerrit/version%3Apinned-version/gerrit",
-      "account-query",
-      "-host",
-      "https://pigweed-review.googlesource.com",
-      "-input",
-      "{\"params\": {\"q\": \"email:owner@example.com\"}}",
-      "-output",
-      "/path/to/tmp/json"
-    ],
-    "luci_context": {
-      "realm": {
-        "name": "project:ci"
-      },
-      "resultdb": {
-        "current_invocation": {
-          "name": "invocations/build:8945511751514863184",
-          "update_token": "token"
-        },
-        "hostname": "rdbhost"
-      }
-    },
-    "name": "cc owner@example.com.owner@example.com",
-    "timeout": 600,
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_LOG_LINE@json.output@[@@@",
-      "@@@STEP_LOG_LINE@json.output@  {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"_account_id\": 123@@@",
-      "@@@STEP_LOG_LINE@json.output@  }@@@",
-      "@@@STEP_LOG_LINE@json.output@]@@@",
-      "@@@STEP_LOG_END@json.output@@@",
-      "@@@STEP_LOG_LINE@json.input@{@@@",
-      "@@@STEP_LOG_LINE@json.input@  \"params\": {@@@",
-      "@@@STEP_LOG_LINE@json.input@    \"q\": \"email:owner@example.com\"@@@",
-      "@@@STEP_LOG_LINE@json.input@  }@@@",
-      "@@@STEP_LOG_LINE@json.input@}@@@",
-      "@@@STEP_LOG_END@json.input@@@"
+      "@@@STEP_SUMMARY_TEXT@{Account(name='author', email='author@example.com')}@@@"
     ]
   },
   {
@@ -1778,7 +1741,9 @@
       "commit",
       "-m",
       "[roll a1] foo\nbar\n\n\nhttps://pigweed.googlesource.com/pigweed/pigweed\na1 Rolled-Commits: 111111111111111..2d72510e447ab60\nRoller-URL: https://ci.chromium.org/b/8945511751514863184\nCq-Cl-Tag: roller-builder:builder\nCq-Cl-Tag: roller-bid:8945511751514863184\nCQ-Do-Not-Cancel-Tryjobs: true\nChange-Id: I27ec3e6a65adbbeb0f5d0b74ef7036a069efcfe8",
-      "-a"
+      "-a",
+      "--author",
+      "author <author@pigweed.infra.roller.example.com>"
     ],
     "cwd": "[START_DIR]/checkout",
     "infra_step": true,
diff --git a/recipes/submodule_roller.expected/too-many-skip-deps.json b/recipes/submodule_roller.expected/too-many-skip-deps.json
index efb333f..09d9ba5 100644
--- a/recipes/submodule_roller.expected/too-many-skip-deps.json
+++ b/recipes/submodule_roller.expected/too-many-skip-deps.json
@@ -981,7 +981,7 @@
     "cmd": [
       "git",
       "log",
-      "--pretty=format:%H\n%ae\n%B",
+      "--pretty=format:%H\n%an\n%ae\n%B",
       "-z",
       "1111111111111111111111111111111111111111..2d72510e447ab60a9728aeea2362d8be2cbd7789"
     ],
@@ -1198,18 +1198,22 @@
       "@@@STEP_NEST_LEVEL@1@@@",
       "@@@STEP_LOG_LINE@json.output@{@@@",
       "@@@STEP_LOG_LINE@json.output@  \"owner\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"email\": \"owner@example.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@    \"email\": \"author@example.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@    \"name\": \"author\"@@@",
       "@@@STEP_LOG_LINE@json.output@  }, @@@",
       "@@@STEP_LOG_LINE@json.output@  \"reviewers\": {@@@",
       "@@@STEP_LOG_LINE@json.output@    \"REVIEWER\": [@@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"reviewer@example.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"reviewer@example.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"reviewer\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }, @@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"nobody@google.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"nobody@google.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"nobody\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }, @@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"robot@gserviceaccount.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"robot@gserviceaccount.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"robot\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }@@@",
       "@@@STEP_LOG_LINE@json.output@    ]@@@",
       "@@@STEP_LOG_LINE@json.output@  }@@@",
@@ -1294,18 +1298,22 @@
       "@@@STEP_NEST_LEVEL@1@@@",
       "@@@STEP_LOG_LINE@json.output@{@@@",
       "@@@STEP_LOG_LINE@json.output@  \"owner\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"email\": \"owner@example.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@    \"email\": \"author@example.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@    \"name\": \"author\"@@@",
       "@@@STEP_LOG_LINE@json.output@  }, @@@",
       "@@@STEP_LOG_LINE@json.output@  \"reviewers\": {@@@",
       "@@@STEP_LOG_LINE@json.output@    \"REVIEWER\": [@@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"reviewer@example.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"reviewer@example.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"reviewer\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }, @@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"nobody@google.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"nobody@google.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"nobody\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }, @@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"robot@gserviceaccount.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"robot@gserviceaccount.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"robot\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }@@@",
       "@@@STEP_LOG_LINE@json.output@    ]@@@",
       "@@@STEP_LOG_LINE@json.output@  }@@@",
@@ -1390,18 +1398,22 @@
       "@@@STEP_NEST_LEVEL@1@@@",
       "@@@STEP_LOG_LINE@json.output@{@@@",
       "@@@STEP_LOG_LINE@json.output@  \"owner\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"email\": \"owner@example.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@    \"email\": \"author@example.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@    \"name\": \"author\"@@@",
       "@@@STEP_LOG_LINE@json.output@  }, @@@",
       "@@@STEP_LOG_LINE@json.output@  \"reviewers\": {@@@",
       "@@@STEP_LOG_LINE@json.output@    \"REVIEWER\": [@@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"reviewer@example.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"reviewer@example.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"reviewer\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }, @@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"nobody@google.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"nobody@google.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"nobody\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }, @@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"robot@gserviceaccount.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"robot@gserviceaccount.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"robot\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }@@@",
       "@@@STEP_LOG_LINE@json.output@    ]@@@",
       "@@@STEP_LOG_LINE@json.output@  }@@@",
@@ -1486,18 +1498,22 @@
       "@@@STEP_NEST_LEVEL@1@@@",
       "@@@STEP_LOG_LINE@json.output@{@@@",
       "@@@STEP_LOG_LINE@json.output@  \"owner\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"email\": \"owner@example.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@    \"email\": \"author@example.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@    \"name\": \"author\"@@@",
       "@@@STEP_LOG_LINE@json.output@  }, @@@",
       "@@@STEP_LOG_LINE@json.output@  \"reviewers\": {@@@",
       "@@@STEP_LOG_LINE@json.output@    \"REVIEWER\": [@@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"reviewer@example.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"reviewer@example.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"reviewer\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }, @@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"nobody@google.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"nobody@google.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"nobody\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }, @@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"robot@gserviceaccount.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"robot@gserviceaccount.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"robot\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }@@@",
       "@@@STEP_LOG_LINE@json.output@    ]@@@",
       "@@@STEP_LOG_LINE@json.output@  }@@@",
@@ -1582,18 +1598,22 @@
       "@@@STEP_NEST_LEVEL@1@@@",
       "@@@STEP_LOG_LINE@json.output@{@@@",
       "@@@STEP_LOG_LINE@json.output@  \"owner\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"email\": \"owner@example.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@    \"email\": \"author@example.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@    \"name\": \"author\"@@@",
       "@@@STEP_LOG_LINE@json.output@  }, @@@",
       "@@@STEP_LOG_LINE@json.output@  \"reviewers\": {@@@",
       "@@@STEP_LOG_LINE@json.output@    \"REVIEWER\": [@@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"reviewer@example.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"reviewer@example.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"reviewer\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }, @@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"nobody@google.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"nobody@google.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"nobody\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }, @@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"robot@gserviceaccount.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"robot@gserviceaccount.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"robot\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }@@@",
       "@@@STEP_LOG_LINE@json.output@    ]@@@",
       "@@@STEP_LOG_LINE@json.output@  }@@@",
@@ -1678,18 +1698,22 @@
       "@@@STEP_NEST_LEVEL@1@@@",
       "@@@STEP_LOG_LINE@json.output@{@@@",
       "@@@STEP_LOG_LINE@json.output@  \"owner\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"email\": \"owner@example.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@    \"email\": \"author@example.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@    \"name\": \"author\"@@@",
       "@@@STEP_LOG_LINE@json.output@  }, @@@",
       "@@@STEP_LOG_LINE@json.output@  \"reviewers\": {@@@",
       "@@@STEP_LOG_LINE@json.output@    \"REVIEWER\": [@@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"reviewer@example.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"reviewer@example.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"reviewer\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }, @@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"nobody@google.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"nobody@google.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"nobody\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }, @@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"robot@gserviceaccount.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"robot@gserviceaccount.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"robot\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }@@@",
       "@@@STEP_LOG_LINE@json.output@    ]@@@",
       "@@@STEP_LOG_LINE@json.output@  }@@@",
@@ -1774,18 +1798,22 @@
       "@@@STEP_NEST_LEVEL@1@@@",
       "@@@STEP_LOG_LINE@json.output@{@@@",
       "@@@STEP_LOG_LINE@json.output@  \"owner\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"email\": \"owner@example.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@    \"email\": \"author@example.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@    \"name\": \"author\"@@@",
       "@@@STEP_LOG_LINE@json.output@  }, @@@",
       "@@@STEP_LOG_LINE@json.output@  \"reviewers\": {@@@",
       "@@@STEP_LOG_LINE@json.output@    \"REVIEWER\": [@@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"reviewer@example.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"reviewer@example.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"reviewer\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }, @@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"nobody@google.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"nobody@google.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"nobody\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }, @@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"robot@gserviceaccount.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"robot@gserviceaccount.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"robot\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }@@@",
       "@@@STEP_LOG_LINE@json.output@    ]@@@",
       "@@@STEP_LOG_LINE@json.output@  }@@@",
@@ -1870,18 +1898,22 @@
       "@@@STEP_NEST_LEVEL@1@@@",
       "@@@STEP_LOG_LINE@json.output@{@@@",
       "@@@STEP_LOG_LINE@json.output@  \"owner\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"email\": \"owner@example.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@    \"email\": \"author@example.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@    \"name\": \"author\"@@@",
       "@@@STEP_LOG_LINE@json.output@  }, @@@",
       "@@@STEP_LOG_LINE@json.output@  \"reviewers\": {@@@",
       "@@@STEP_LOG_LINE@json.output@    \"REVIEWER\": [@@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"reviewer@example.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"reviewer@example.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"reviewer\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }, @@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"nobody@google.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"nobody@google.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"nobody\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }, @@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"robot@gserviceaccount.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"robot@gserviceaccount.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"robot\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }@@@",
       "@@@STEP_LOG_LINE@json.output@    ]@@@",
       "@@@STEP_LOG_LINE@json.output@  }@@@",
@@ -1966,18 +1998,22 @@
       "@@@STEP_NEST_LEVEL@1@@@",
       "@@@STEP_LOG_LINE@json.output@{@@@",
       "@@@STEP_LOG_LINE@json.output@  \"owner\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"email\": \"owner@example.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@    \"email\": \"author@example.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@    \"name\": \"author\"@@@",
       "@@@STEP_LOG_LINE@json.output@  }, @@@",
       "@@@STEP_LOG_LINE@json.output@  \"reviewers\": {@@@",
       "@@@STEP_LOG_LINE@json.output@    \"REVIEWER\": [@@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"reviewer@example.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"reviewer@example.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"reviewer\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }, @@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"nobody@google.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"nobody@google.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"nobody\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }, @@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"robot@gserviceaccount.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"robot@gserviceaccount.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"robot\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }@@@",
       "@@@STEP_LOG_LINE@json.output@    ]@@@",
       "@@@STEP_LOG_LINE@json.output@  }@@@",
@@ -2062,18 +2098,22 @@
       "@@@STEP_NEST_LEVEL@1@@@",
       "@@@STEP_LOG_LINE@json.output@{@@@",
       "@@@STEP_LOG_LINE@json.output@  \"owner\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"email\": \"owner@example.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@    \"email\": \"author@example.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@    \"name\": \"author\"@@@",
       "@@@STEP_LOG_LINE@json.output@  }, @@@",
       "@@@STEP_LOG_LINE@json.output@  \"reviewers\": {@@@",
       "@@@STEP_LOG_LINE@json.output@    \"REVIEWER\": [@@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"reviewer@example.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"reviewer@example.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"reviewer\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }, @@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"nobody@google.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"nobody@google.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"nobody\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }, @@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"robot@gserviceaccount.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"robot@gserviceaccount.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"robot\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }@@@",
       "@@@STEP_LOG_LINE@json.output@    ]@@@",
       "@@@STEP_LOG_LINE@json.output@  }@@@",
@@ -2140,50 +2180,9 @@
   },
   {
     "cmd": [],
-    "name": "cc owner@example.com",
+    "name": "authors",
     "~followup_annotations": [
-      "@@@STEP_SUMMARY_TEXT@CCing@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "[START_DIR]/cipd_tool/path/to/gerrit/version%3Apinned-version/gerrit",
-      "account-query",
-      "-host",
-      "https://pigweed-review.googlesource.com",
-      "-input",
-      "{\"params\": {\"q\": \"email:owner@example.com\"}}",
-      "-output",
-      "/path/to/tmp/json"
-    ],
-    "luci_context": {
-      "realm": {
-        "name": "project:ci"
-      },
-      "resultdb": {
-        "current_invocation": {
-          "name": "invocations/build:8945511751514863184",
-          "update_token": "token"
-        },
-        "hostname": "rdbhost"
-      }
-    },
-    "name": "cc owner@example.com.owner@example.com",
-    "timeout": 600,
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@1@@@",
-      "@@@STEP_LOG_LINE@json.output@[@@@",
-      "@@@STEP_LOG_LINE@json.output@  {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"_account_id\": 123@@@",
-      "@@@STEP_LOG_LINE@json.output@  }@@@",
-      "@@@STEP_LOG_LINE@json.output@]@@@",
-      "@@@STEP_LOG_END@json.output@@@",
-      "@@@STEP_LOG_LINE@json.input@{@@@",
-      "@@@STEP_LOG_LINE@json.input@  \"params\": {@@@",
-      "@@@STEP_LOG_LINE@json.input@    \"q\": \"email:owner@example.com\"@@@",
-      "@@@STEP_LOG_LINE@json.input@  }@@@",
-      "@@@STEP_LOG_LINE@json.input@}@@@",
-      "@@@STEP_LOG_END@json.input@@@"
+      "@@@STEP_SUMMARY_TEXT@{Account(name='author', email='author@example.com')}@@@"
     ]
   },
   {
@@ -2435,7 +2434,9 @@
       "commit",
       "-m",
       "[a1] Roll 26 commits\n\naaaaaaaaaaaaaaa a\nbbbbbbbbbbbbbbb b\nccccccccccccccc c\nddddddddddddddd d\neeeeeeeeeeeeeee e\nfffffffffffffff f\nggggggggggggggg g\nhhhhhhhhhhhhhhh h\niiiiiiiiiiiiiii i\njjjjjjjjjjjjjjj j\nkkkkkkkkkkkkkkk k\nlllllllllllllll l\nmmmmmmmmmmmmmmm m\nnnnnnnnnnnnnnnn n\nooooooooooooooo o\nppppppppppppppp p\nqqqqqqqqqqqqqqq q\nrrrrrrrrrrrrrrr r\nsssssssssssssss s\nttttttttttttttt t\nuuuuuuuuuuuuuuu u\nvvvvvvvvvvvvvvv v\nwwwwwwwwwwwwwww w\nxxxxxxxxxxxxxxx x\nyyyyyyyyyyyyyyy y\nzzzzzzzzzzzzzzz z\n\nhttps://pigweed.googlesource.com/pigweed/pigweed\na1 Rolled-Commits: 111111111111111..2d72510e447ab60\nRoller-URL: https://ci.chromium.org/b/8945511751514863184\nCq-Cl-Tag: roller-builder:builder\nCq-Cl-Tag: roller-bid:8945511751514863184\nCQ-Do-Not-Cancel-Tryjobs: true\nChange-Id: I27ec3e6a65adbbeb0f5d0b74ef7036a069efcfe8",
-      "-a"
+      "-a",
+      "--author",
+      "author <author@pigweed.infra.roller.example.com>"
     ],
     "cwd": "[START_DIR]/checkout",
     "infra_step": true,
diff --git a/recipes/submodule_roller.expected/trigger-mismatch-equivalent.json b/recipes/submodule_roller.expected/trigger-mismatch-equivalent.json
index f362fad..0acb3b7 100644
--- a/recipes/submodule_roller.expected/trigger-mismatch-equivalent.json
+++ b/recipes/submodule_roller.expected/trigger-mismatch-equivalent.json
@@ -981,7 +981,7 @@
     "cmd": [
       "git",
       "log",
-      "--pretty=format:%H\n%ae\n%B",
+      "--pretty=format:%H\n%an\n%ae\n%B",
       "-z",
       "1111111111111111111111111111111111111111..2d72510e447ab60a9728aeea2362d8be2cbd7789"
     ],
@@ -1198,18 +1198,22 @@
       "@@@STEP_NEST_LEVEL@1@@@",
       "@@@STEP_LOG_LINE@json.output@{@@@",
       "@@@STEP_LOG_LINE@json.output@  \"owner\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"email\": \"owner@example.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@    \"email\": \"author@example.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@    \"name\": \"author\"@@@",
       "@@@STEP_LOG_LINE@json.output@  }, @@@",
       "@@@STEP_LOG_LINE@json.output@  \"reviewers\": {@@@",
       "@@@STEP_LOG_LINE@json.output@    \"REVIEWER\": [@@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"reviewer@example.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"reviewer@example.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"reviewer\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }, @@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"nobody@google.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"nobody@google.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"nobody\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }, @@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"robot@gserviceaccount.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"robot@gserviceaccount.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"robot\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }@@@",
       "@@@STEP_LOG_LINE@json.output@    ]@@@",
       "@@@STEP_LOG_LINE@json.output@  }@@@",
@@ -1462,6 +1466,13 @@
   },
   {
     "cmd": [],
+    "name": "authors",
+    "~followup_annotations": [
+      "@@@STEP_SUMMARY_TEXT@{Account(name='author', email='author@example.com')}@@@"
+    ]
+  },
+  {
+    "cmd": [],
     "name": "roll message"
   },
   {
@@ -1682,7 +1693,9 @@
       "commit",
       "-m",
       "[roll a1] foo\nbar\n\n\nhttps://pigweed.googlesource.com/pigweed/pigweed\na1 Rolled-Commits: 111111111111111..2d72510e447ab60\nRoller-URL: https://ci.chromium.org/b/8945511751514863184\nCq-Cl-Tag: roller-builder:builder\nCq-Cl-Tag: roller-bid:8945511751514863184\nCQ-Do-Not-Cancel-Tryjobs: true\nChange-Id: I27ec3e6a65adbbeb0f5d0b74ef7036a069efcfe8",
-      "-a"
+      "-a",
+      "--author",
+      "author <author@pigweed.infra.roller.example.com>"
     ],
     "cwd": "[START_DIR]/checkout",
     "infra_step": true,
diff --git a/recipes/submodule_roller.expected/with-branch-prop-filter-emails.json b/recipes/submodule_roller.expected/with-branch-prop-filter-emails.json
index 24b84ac..9952de7 100644
--- a/recipes/submodule_roller.expected/with-branch-prop-filter-emails.json
+++ b/recipes/submodule_roller.expected/with-branch-prop-filter-emails.json
@@ -572,7 +572,7 @@
     "cmd": [
       "git",
       "log",
-      "--pretty=format:%H\n%ae\n%B",
+      "--pretty=format:%H\n%an\n%ae\n%B",
       "-z",
       "1111111111111111111111111111111111111111..2222222222222222222222222222222222222222"
     ],
@@ -717,18 +717,22 @@
       "@@@STEP_NEST_LEVEL@1@@@",
       "@@@STEP_LOG_LINE@json.output@{@@@",
       "@@@STEP_LOG_LINE@json.output@  \"owner\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"email\": \"owner@example.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@    \"email\": \"author@example.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@    \"name\": \"author\"@@@",
       "@@@STEP_LOG_LINE@json.output@  }, @@@",
       "@@@STEP_LOG_LINE@json.output@  \"reviewers\": {@@@",
       "@@@STEP_LOG_LINE@json.output@    \"REVIEWER\": [@@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"reviewer@example.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"reviewer@example.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"reviewer\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }, @@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"nobody@google.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"nobody@google.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"nobody\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }, @@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"robot@gserviceaccount.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"robot@gserviceaccount.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"robot\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }@@@",
       "@@@STEP_LOG_LINE@json.output@    ]@@@",
       "@@@STEP_LOG_LINE@json.output@  }@@@",
@@ -972,13 +976,6 @@
   },
   {
     "cmd": [],
-    "name": "cc owner@example.com",
-    "~followup_annotations": [
-      "@@@STEP_SUMMARY_TEXT@not CCing, domain excluded@@@"
-    ]
-  },
-  {
-    "cmd": [],
     "name": "cc reviewer@example.com",
     "~followup_annotations": [
       "@@@STEP_SUMMARY_TEXT@not CCing, domain excluded@@@"
@@ -993,6 +990,13 @@
   },
   {
     "cmd": [],
+    "name": "authors",
+    "~followup_annotations": [
+      "@@@STEP_SUMMARY_TEXT@{Account(name='author', email='author@example.com')}@@@"
+    ]
+  },
+  {
+    "cmd": [],
     "name": "roll message"
   },
   {
@@ -1141,7 +1145,9 @@
       "commit",
       "-m",
       "[roll a1] foo\nbar\n\n\nhttps://pigweed.googlesource.com/pigweed/pigweed\na1 Rolled-Commits: 111111111111111..222222222222222\nRoller-URL: https://ci.chromium.org/b/0\nCq-Cl-Tag: roller-builder:\nCq-Cl-Tag: roller-bid:0\nCQ-Do-Not-Cancel-Tryjobs: true\nChange-Id: Idcafe3609bd1c8c808cc0005865453850afdf06e",
-      "-a"
+      "-a",
+      "--author",
+      "author <author@pigweed.infra.roller.example.com>"
     ],
     "cwd": "[START_DIR]/checkout",
     "infra_step": true,
diff --git a/recipes/submodule_roller.expected/with-requires-already-applied.json b/recipes/submodule_roller.expected/with-requires-already-applied.json
index fec040e..1dedefb 100644
--- a/recipes/submodule_roller.expected/with-requires-already-applied.json
+++ b/recipes/submodule_roller.expected/with-requires-already-applied.json
@@ -1087,7 +1087,7 @@
     "cmd": [
       "git",
       "log",
-      "--pretty=format:%H\n%ae\n%B",
+      "--pretty=format:%H\n%an\n%ae\n%B",
       "-z",
       "1111111111111111111111111111111111111111..2222222222222222222222222222222222222222"
     ],
@@ -1304,18 +1304,22 @@
       "@@@STEP_NEST_LEVEL@1@@@",
       "@@@STEP_LOG_LINE@json.output@{@@@",
       "@@@STEP_LOG_LINE@json.output@  \"owner\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"email\": \"owner@example.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@    \"email\": \"author@example.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@    \"name\": \"author\"@@@",
       "@@@STEP_LOG_LINE@json.output@  }, @@@",
       "@@@STEP_LOG_LINE@json.output@  \"reviewers\": {@@@",
       "@@@STEP_LOG_LINE@json.output@    \"REVIEWER\": [@@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"reviewer@example.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"reviewer@example.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"reviewer\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }, @@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"nobody@google.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"nobody@google.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"nobody\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }, @@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"robot@gserviceaccount.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"robot@gserviceaccount.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"robot\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }@@@",
       "@@@STEP_LOG_LINE@json.output@    ]@@@",
       "@@@STEP_LOG_LINE@json.output@  }@@@",
@@ -1755,6 +1759,13 @@
   },
   {
     "cmd": [],
+    "name": "authors",
+    "~followup_annotations": [
+      "@@@STEP_SUMMARY_TEXT@{Account(name='author', email='author@example.com')}@@@"
+    ]
+  },
+  {
+    "cmd": [],
     "name": "roll message"
   },
   {
@@ -1978,7 +1989,9 @@
       "commit",
       "-m",
       "[roll spam] module: Short commit summary\n\nLonger commit details.\n\nOriginal-Bug: 123\nReviewed-On: https://pigweed-review.googlesource.com/c/project/+/22222\n\nhttps://pigweed.googlesource.com/pigweed/pigweed\nspam Rolled-Commits: 111111111111111..222222222222222\nRoller-URL: https://ci.chromium.org/b/8945511751514863184\nCq-Cl-Tag: roller-builder:builder\nCq-Cl-Tag: roller-bid:8945511751514863184\nCQ-Do-Not-Cancel-Tryjobs: true\nChange-Id: I27ec3e6a65adbbeb0f5d0b74ef7036a069efcfe8",
-      "-a"
+      "-a",
+      "--author",
+      "author <author@pigweed.infra.roller.example.com>"
     ],
     "cwd": "[START_DIR]/checkout",
     "infra_step": true,
diff --git a/recipes/submodule_roller.expected/with-requires-child.json b/recipes/submodule_roller.expected/with-requires-child.json
index a1c5436..7f2bc81 100644
--- a/recipes/submodule_roller.expected/with-requires-child.json
+++ b/recipes/submodule_roller.expected/with-requires-child.json
@@ -1087,7 +1087,7 @@
     "cmd": [
       "git",
       "log",
-      "--pretty=format:%H\n%ae\n%B",
+      "--pretty=format:%H\n%an\n%ae\n%B",
       "-z",
       "1111111111111111111111111111111111111111..2222222222222222222222222222222222222222"
     ],
@@ -1304,18 +1304,22 @@
       "@@@STEP_NEST_LEVEL@1@@@",
       "@@@STEP_LOG_LINE@json.output@{@@@",
       "@@@STEP_LOG_LINE@json.output@  \"owner\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"email\": \"owner@example.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@    \"email\": \"author@example.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@    \"name\": \"author\"@@@",
       "@@@STEP_LOG_LINE@json.output@  }, @@@",
       "@@@STEP_LOG_LINE@json.output@  \"reviewers\": {@@@",
       "@@@STEP_LOG_LINE@json.output@    \"REVIEWER\": [@@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"reviewer@example.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"reviewer@example.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"reviewer\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }, @@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"nobody@google.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"nobody@google.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"nobody\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }, @@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"robot@gserviceaccount.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"robot@gserviceaccount.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"robot\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }@@@",
       "@@@STEP_LOG_LINE@json.output@    ]@@@",
       "@@@STEP_LOG_LINE@json.output@  }@@@",
@@ -1979,7 +1983,7 @@
     "cmd": [
       "git",
       "log",
-      "--pretty=format:%H\n%ae\n%B",
+      "--pretty=format:%H\n%an\n%ae\n%B",
       "-z",
       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa..HASH"
     ],
@@ -2073,18 +2077,22 @@
       "@@@STEP_NEST_LEVEL@2@@@",
       "@@@STEP_LOG_LINE@json.output@{@@@",
       "@@@STEP_LOG_LINE@json.output@  \"owner\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"email\": \"owner@example.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@    \"email\": \"author@example.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@    \"name\": \"author\"@@@",
       "@@@STEP_LOG_LINE@json.output@  }, @@@",
       "@@@STEP_LOG_LINE@json.output@  \"reviewers\": {@@@",
       "@@@STEP_LOG_LINE@json.output@    \"REVIEWER\": [@@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"reviewer@example.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"reviewer@example.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"reviewer\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }, @@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"nobody@google.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"nobody@google.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"nobody\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }, @@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"robot@gserviceaccount.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"robot@gserviceaccount.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"robot\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }@@@",
       "@@@STEP_LOG_LINE@json.output@    ]@@@",
       "@@@STEP_LOG_LINE@json.output@  }@@@",
@@ -2354,7 +2362,7 @@
     "cmd": [
       "git",
       "log",
-      "--pretty=format:%H\n%ae\n%B",
+      "--pretty=format:%H\n%an\n%ae\n%B",
       "-z",
       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa..HASH"
     ],
@@ -2448,18 +2456,22 @@
       "@@@STEP_NEST_LEVEL@2@@@",
       "@@@STEP_LOG_LINE@json.output@{@@@",
       "@@@STEP_LOG_LINE@json.output@  \"owner\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"email\": \"owner@example.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@    \"email\": \"author@example.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@    \"name\": \"author\"@@@",
       "@@@STEP_LOG_LINE@json.output@  }, @@@",
       "@@@STEP_LOG_LINE@json.output@  \"reviewers\": {@@@",
       "@@@STEP_LOG_LINE@json.output@    \"REVIEWER\": [@@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"reviewer@example.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"reviewer@example.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"reviewer\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }, @@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"nobody@google.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"nobody@google.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"nobody\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }, @@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"robot@gserviceaccount.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"robot@gserviceaccount.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"robot\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }@@@",
       "@@@STEP_LOG_LINE@json.output@    ]@@@",
       "@@@STEP_LOG_LINE@json.output@  }@@@",
@@ -2474,6 +2486,13 @@
   },
   {
     "cmd": [],
+    "name": "authors",
+    "~followup_annotations": [
+      "@@@STEP_SUMMARY_TEXT@{Account(name='author', email='author@example.com')}@@@"
+    ]
+  },
+  {
+    "cmd": [],
     "name": "roll message"
   },
   {
@@ -2726,7 +2745,9 @@
       "commit",
       "-m",
       "[roll ham, spam] Roll 2 commits\n\n[roll ham] module: Short commit summary\n\nLonger commit details.\n\nOriginal-Bug: 123\nReviewed-On: https://pigweed-review.googlesource.com/c/project/+/55555\n\nhttps://pigweed.googlesource.com/pigweed/pigweed\nham Rolled-Commits: aaaaaaaaaaaaaaa..HASH\n\n[roll spam] module: Short commit summary\n\nLonger commit details.\n\nOriginal-Bug: 123\nReviewed-On: https://pigweed-review.googlesource.com/c/project/+/22222\n\nhttps://pigweed.googlesource.com/pigweed/pigweed\nspam Rolled-Commits: 111111111111111..222222222222222\n\n\nRoller-URL: https://ci.chromium.org/b/8945511751514863184\nCq-Cl-Tag: roller-builder:builder\nCq-Cl-Tag: roller-bid:8945511751514863184\nCQ-Do-Not-Cancel-Tryjobs: true\nChange-Id: I27ec3e6a65adbbeb0f5d0b74ef7036a069efcfe8",
-      "-a"
+      "-a",
+      "--author",
+      "author <author@pigweed.infra.roller.example.com>"
     ],
     "cwd": "[START_DIR]/checkout",
     "infra_step": true,
diff --git a/recipes/submodule_roller.expected/with-requires-forbidden.json b/recipes/submodule_roller.expected/with-requires-forbidden.json
index 20521e5..08a3162 100644
--- a/recipes/submodule_roller.expected/with-requires-forbidden.json
+++ b/recipes/submodule_roller.expected/with-requires-forbidden.json
@@ -1087,7 +1087,7 @@
     "cmd": [
       "git",
       "log",
-      "--pretty=format:%H\n%ae\n%B",
+      "--pretty=format:%H\n%an\n%ae\n%B",
       "-z",
       "1111111111111111111111111111111111111111..2222222222222222222222222222222222222222"
     ],
@@ -1304,18 +1304,22 @@
       "@@@STEP_NEST_LEVEL@1@@@",
       "@@@STEP_LOG_LINE@json.output@{@@@",
       "@@@STEP_LOG_LINE@json.output@  \"owner\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"email\": \"owner@example.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@    \"email\": \"author@example.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@    \"name\": \"author\"@@@",
       "@@@STEP_LOG_LINE@json.output@  }, @@@",
       "@@@STEP_LOG_LINE@json.output@  \"reviewers\": {@@@",
       "@@@STEP_LOG_LINE@json.output@    \"REVIEWER\": [@@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"reviewer@example.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"reviewer@example.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"reviewer\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }, @@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"nobody@google.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"nobody@google.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"nobody\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }, @@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"robot@gserviceaccount.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"robot@gserviceaccount.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"robot\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }@@@",
       "@@@STEP_LOG_LINE@json.output@    ]@@@",
       "@@@STEP_LOG_LINE@json.output@  }@@@",
@@ -1664,6 +1668,13 @@
   },
   {
     "cmd": [],
+    "name": "authors",
+    "~followup_annotations": [
+      "@@@STEP_SUMMARY_TEXT@{Account(name='author', email='author@example.com')}@@@"
+    ]
+  },
+  {
+    "cmd": [],
     "name": "roll message"
   },
   {
@@ -1887,7 +1898,9 @@
       "commit",
       "-m",
       "[roll spam] module: Short commit summary\n\nLonger commit details.\n\nOriginal-Bug: 123\nReviewed-On: https://pigweed-review.googlesource.com/c/project/+/22222\n\nhttps://pigweed.googlesource.com/pigweed/pigweed\nspam Rolled-Commits: 111111111111111..222222222222222\nRoller-URL: https://ci.chromium.org/b/8945511751514863184\nCq-Cl-Tag: roller-builder:builder\nCq-Cl-Tag: roller-bid:8945511751514863184\nCQ-Do-Not-Cancel-Tryjobs: true\nChange-Id: I27ec3e6a65adbbeb0f5d0b74ef7036a069efcfe8",
-      "-a"
+      "-a",
+      "--author",
+      "author <author@pigweed.infra.roller.example.com>"
     ],
     "cwd": "[START_DIR]/checkout",
     "infra_step": true,
diff --git a/recipes/submodule_roller.expected/with-requires-loop.json b/recipes/submodule_roller.expected/with-requires-loop.json
index 6b58011..03427f9 100644
--- a/recipes/submodule_roller.expected/with-requires-loop.json
+++ b/recipes/submodule_roller.expected/with-requires-loop.json
@@ -1087,7 +1087,7 @@
     "cmd": [
       "git",
       "log",
-      "--pretty=format:%H\n%ae\n%B",
+      "--pretty=format:%H\n%an\n%ae\n%B",
       "-z",
       "1111111111111111111111111111111111111111..2222222222222222222222222222222222222222"
     ],
@@ -1304,18 +1304,22 @@
       "@@@STEP_NEST_LEVEL@1@@@",
       "@@@STEP_LOG_LINE@json.output@{@@@",
       "@@@STEP_LOG_LINE@json.output@  \"owner\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"email\": \"owner@example.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@    \"email\": \"author@example.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@    \"name\": \"author\"@@@",
       "@@@STEP_LOG_LINE@json.output@  }, @@@",
       "@@@STEP_LOG_LINE@json.output@  \"reviewers\": {@@@",
       "@@@STEP_LOG_LINE@json.output@    \"REVIEWER\": [@@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"reviewer@example.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"reviewer@example.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"reviewer\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }, @@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"nobody@google.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"nobody@google.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"nobody\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }, @@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"robot@gserviceaccount.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"robot@gserviceaccount.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"robot\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }@@@",
       "@@@STEP_LOG_LINE@json.output@    ]@@@",
       "@@@STEP_LOG_LINE@json.output@  }@@@",
@@ -1901,7 +1905,7 @@
     "cmd": [
       "git",
       "log",
-      "--pretty=format:%H\n%ae\n%B",
+      "--pretty=format:%H\n%an\n%ae\n%B",
       "-z",
       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa..HASH"
     ],
@@ -1995,18 +1999,22 @@
       "@@@STEP_NEST_LEVEL@2@@@",
       "@@@STEP_LOG_LINE@json.output@{@@@",
       "@@@STEP_LOG_LINE@json.output@  \"owner\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"email\": \"owner@example.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@    \"email\": \"author@example.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@    \"name\": \"author\"@@@",
       "@@@STEP_LOG_LINE@json.output@  }, @@@",
       "@@@STEP_LOG_LINE@json.output@  \"reviewers\": {@@@",
       "@@@STEP_LOG_LINE@json.output@    \"REVIEWER\": [@@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"reviewer@example.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"reviewer@example.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"reviewer\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }, @@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"nobody@google.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"nobody@google.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"nobody\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }, @@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"robot@gserviceaccount.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"robot@gserviceaccount.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"robot\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }@@@",
       "@@@STEP_LOG_LINE@json.output@    ]@@@",
       "@@@STEP_LOG_LINE@json.output@  }@@@",
@@ -2021,6 +2029,13 @@
   },
   {
     "cmd": [],
+    "name": "authors",
+    "~followup_annotations": [
+      "@@@STEP_SUMMARY_TEXT@{Account(name='author', email='author@example.com')}@@@"
+    ]
+  },
+  {
+    "cmd": [],
     "name": "roll message"
   },
   {
@@ -2273,7 +2288,9 @@
       "commit",
       "-m",
       "[roll ham, spam] Roll 2 commits\n\n[roll ham] module: Short commit summary\n\nLonger commit details.\n\nOriginal-Bug: 123\nReviewed-On: https://pigweed-review.googlesource.com/c/project/+/22222\n\nhttps://pigweed.googlesource.com/pigweed/pigweed\nham Rolled-Commits: aaaaaaaaaaaaaaa..HASH\n\n[roll spam] module: Short commit summary\n\nLonger commit details.\n\nOriginal-Bug: 123\nReviewed-On: https://pigweed-review.googlesource.com/c/project/+/22222\n\nhttps://pigweed.googlesource.com/pigweed/pigweed\nspam Rolled-Commits: 111111111111111..222222222222222\n\n\nRoller-URL: https://ci.chromium.org/b/8945511751514863184\nCq-Cl-Tag: roller-builder:builder\nCq-Cl-Tag: roller-bid:8945511751514863184\nCQ-Do-Not-Cancel-Tryjobs: true\nChange-Id: I27ec3e6a65adbbeb0f5d0b74ef7036a069efcfe8",
-      "-a"
+      "-a",
+      "--author",
+      "author <author@pigweed.infra.roller.example.com>"
     ],
     "cwd": "[START_DIR]/checkout",
     "infra_step": true,
diff --git a/recipes/submodule_roller.expected/with-requires-not-in-checkout.json b/recipes/submodule_roller.expected/with-requires-not-in-checkout.json
index 3027beb..1b302c7 100644
--- a/recipes/submodule_roller.expected/with-requires-not-in-checkout.json
+++ b/recipes/submodule_roller.expected/with-requires-not-in-checkout.json
@@ -1087,7 +1087,7 @@
     "cmd": [
       "git",
       "log",
-      "--pretty=format:%H\n%ae\n%B",
+      "--pretty=format:%H\n%an\n%ae\n%B",
       "-z",
       "1111111111111111111111111111111111111111..2222222222222222222222222222222222222222"
     ],
@@ -1304,18 +1304,22 @@
       "@@@STEP_NEST_LEVEL@1@@@",
       "@@@STEP_LOG_LINE@json.output@{@@@",
       "@@@STEP_LOG_LINE@json.output@  \"owner\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"email\": \"owner@example.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@    \"email\": \"author@example.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@    \"name\": \"author\"@@@",
       "@@@STEP_LOG_LINE@json.output@  }, @@@",
       "@@@STEP_LOG_LINE@json.output@  \"reviewers\": {@@@",
       "@@@STEP_LOG_LINE@json.output@    \"REVIEWER\": [@@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"reviewer@example.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"reviewer@example.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"reviewer\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }, @@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"nobody@google.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"nobody@google.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"nobody\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }, @@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"robot@gserviceaccount.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"robot@gserviceaccount.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"robot\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }@@@",
       "@@@STEP_LOG_LINE@json.output@    ]@@@",
       "@@@STEP_LOG_LINE@json.output@  }@@@",
@@ -1653,6 +1657,13 @@
   },
   {
     "cmd": [],
+    "name": "authors",
+    "~followup_annotations": [
+      "@@@STEP_SUMMARY_TEXT@{Account(name='author', email='author@example.com')}@@@"
+    ]
+  },
+  {
+    "cmd": [],
     "name": "roll message"
   },
   {
@@ -1876,7 +1887,9 @@
       "commit",
       "-m",
       "[roll spam] module: Short commit summary\n\nLonger commit details.\n\nOriginal-Bug: 123\nReviewed-On: https://pigweed-review.googlesource.com/c/project/+/22222\n\nhttps://pigweed.googlesource.com/pigweed/pigweed\nspam Rolled-Commits: 111111111111111..222222222222222\nRoller-URL: https://ci.chromium.org/b/8945511751514863184\nCq-Cl-Tag: roller-builder:builder\nCq-Cl-Tag: roller-bid:8945511751514863184\nCQ-Do-Not-Cancel-Tryjobs: true\nChange-Id: I27ec3e6a65adbbeb0f5d0b74ef7036a069efcfe8",
-      "-a"
+      "-a",
+      "--author",
+      "author <author@pigweed.infra.roller.example.com>"
     ],
     "cwd": "[START_DIR]/checkout",
     "infra_step": true,
diff --git a/recipes/submodule_roller.expected/with-requires-parent.json b/recipes/submodule_roller.expected/with-requires-parent.json
index b280bb5..97190eb 100644
--- a/recipes/submodule_roller.expected/with-requires-parent.json
+++ b/recipes/submodule_roller.expected/with-requires-parent.json
@@ -1087,7 +1087,7 @@
     "cmd": [
       "git",
       "log",
-      "--pretty=format:%H\n%ae\n%B",
+      "--pretty=format:%H\n%an\n%ae\n%B",
       "-z",
       "1111111111111111111111111111111111111111..2222222222222222222222222222222222222222"
     ],
@@ -1304,18 +1304,22 @@
       "@@@STEP_NEST_LEVEL@1@@@",
       "@@@STEP_LOG_LINE@json.output@{@@@",
       "@@@STEP_LOG_LINE@json.output@  \"owner\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"email\": \"owner@example.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@    \"email\": \"author@example.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@    \"name\": \"author\"@@@",
       "@@@STEP_LOG_LINE@json.output@  }, @@@",
       "@@@STEP_LOG_LINE@json.output@  \"reviewers\": {@@@",
       "@@@STEP_LOG_LINE@json.output@    \"REVIEWER\": [@@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"reviewer@example.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"reviewer@example.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"reviewer\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }, @@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"nobody@google.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"nobody@google.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"nobody\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }, @@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"robot@gserviceaccount.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"robot@gserviceaccount.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"robot\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }@@@",
       "@@@STEP_LOG_LINE@json.output@    ]@@@",
       "@@@STEP_LOG_LINE@json.output@  }@@@",
@@ -1979,7 +1983,7 @@
     "cmd": [
       "git",
       "log",
-      "--pretty=format:%H\n%ae\n%B",
+      "--pretty=format:%H\n%an\n%ae\n%B",
       "-z",
       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa..HASH"
     ],
@@ -2073,18 +2077,22 @@
       "@@@STEP_NEST_LEVEL@2@@@",
       "@@@STEP_LOG_LINE@json.output@{@@@",
       "@@@STEP_LOG_LINE@json.output@  \"owner\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"email\": \"owner@example.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@    \"email\": \"author@example.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@    \"name\": \"author\"@@@",
       "@@@STEP_LOG_LINE@json.output@  }, @@@",
       "@@@STEP_LOG_LINE@json.output@  \"reviewers\": {@@@",
       "@@@STEP_LOG_LINE@json.output@    \"REVIEWER\": [@@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"reviewer@example.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"reviewer@example.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"reviewer\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }, @@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"nobody@google.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"nobody@google.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"nobody\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }, @@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"robot@gserviceaccount.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"robot@gserviceaccount.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"robot\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }@@@",
       "@@@STEP_LOG_LINE@json.output@    ]@@@",
       "@@@STEP_LOG_LINE@json.output@  }@@@",
@@ -2201,6 +2209,13 @@
   },
   {
     "cmd": [],
+    "name": "authors",
+    "~followup_annotations": [
+      "@@@STEP_SUMMARY_TEXT@{Account(name='author', email='author@example.com')}@@@"
+    ]
+  },
+  {
+    "cmd": [],
     "name": "roll message"
   },
   {
@@ -2453,7 +2468,9 @@
       "commit",
       "-m",
       "[roll ham, spam] Roll 2 commits\n\n[roll ham] module: Short commit summary\n\nLonger commit details.\n\nOriginal-Bug: 123\nReviewed-On: https://pigweed-review.googlesource.com/c/project/+/44444\n\nhttps://pigweed.googlesource.com/pigweed/pigweed\nham Rolled-Commits: aaaaaaaaaaaaaaa..HASH\n\n[roll spam] module: Short commit summary\n\nLonger commit details.\n\nOriginal-Bug: 123\nReviewed-On: https://pigweed-review.googlesource.com/c/project/+/22222\n\nhttps://pigweed.googlesource.com/pigweed/pigweed\nspam Rolled-Commits: 111111111111111..222222222222222\n\n\nRoller-URL: https://ci.chromium.org/b/8945511751514863184\nCq-Cl-Tag: roller-builder:builder\nCq-Cl-Tag: roller-bid:8945511751514863184\nCQ-Do-Not-Cancel-Tryjobs: true\nChange-Id: I27ec3e6a65adbbeb0f5d0b74ef7036a069efcfe8",
-      "-a"
+      "-a",
+      "--author",
+      "author <author@pigweed.infra.roller.example.com>"
     ],
     "cwd": "[START_DIR]/checkout",
     "infra_step": true,
diff --git a/recipes/submodule_roller.expected/with-requires-transitive.json b/recipes/submodule_roller.expected/with-requires-transitive.json
index ddba5a6..b5b315e 100644
--- a/recipes/submodule_roller.expected/with-requires-transitive.json
+++ b/recipes/submodule_roller.expected/with-requires-transitive.json
@@ -1087,7 +1087,7 @@
     "cmd": [
       "git",
       "log",
-      "--pretty=format:%H\n%ae\n%B",
+      "--pretty=format:%H\n%an\n%ae\n%B",
       "-z",
       "1111111111111111111111111111111111111111..2222222222222222222222222222222222222222"
     ],
@@ -1304,18 +1304,22 @@
       "@@@STEP_NEST_LEVEL@1@@@",
       "@@@STEP_LOG_LINE@json.output@{@@@",
       "@@@STEP_LOG_LINE@json.output@  \"owner\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"email\": \"owner@example.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@    \"email\": \"author@example.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@    \"name\": \"author\"@@@",
       "@@@STEP_LOG_LINE@json.output@  }, @@@",
       "@@@STEP_LOG_LINE@json.output@  \"reviewers\": {@@@",
       "@@@STEP_LOG_LINE@json.output@    \"REVIEWER\": [@@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"reviewer@example.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"reviewer@example.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"reviewer\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }, @@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"nobody@google.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"nobody@google.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"nobody\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }, @@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"robot@gserviceaccount.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"robot@gserviceaccount.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"robot\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }@@@",
       "@@@STEP_LOG_LINE@json.output@    ]@@@",
       "@@@STEP_LOG_LINE@json.output@  }@@@",
@@ -1978,7 +1982,7 @@
     "cmd": [
       "git",
       "log",
-      "--pretty=format:%H\n%ae\n%B",
+      "--pretty=format:%H\n%an\n%ae\n%B",
       "-z",
       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa..HASH"
     ],
@@ -2072,18 +2076,22 @@
       "@@@STEP_NEST_LEVEL@2@@@",
       "@@@STEP_LOG_LINE@json.output@{@@@",
       "@@@STEP_LOG_LINE@json.output@  \"owner\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"email\": \"owner@example.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@    \"email\": \"author@example.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@    \"name\": \"author\"@@@",
       "@@@STEP_LOG_LINE@json.output@  }, @@@",
       "@@@STEP_LOG_LINE@json.output@  \"reviewers\": {@@@",
       "@@@STEP_LOG_LINE@json.output@    \"REVIEWER\": [@@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"reviewer@example.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"reviewer@example.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"reviewer\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }, @@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"nobody@google.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"nobody@google.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"nobody\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }, @@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"robot@gserviceaccount.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"robot@gserviceaccount.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"robot\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }@@@",
       "@@@STEP_LOG_LINE@json.output@    ]@@@",
       "@@@STEP_LOG_LINE@json.output@  }@@@",
@@ -2353,7 +2361,7 @@
     "cmd": [
       "git",
       "log",
-      "--pretty=format:%H\n%ae\n%B",
+      "--pretty=format:%H\n%an\n%ae\n%B",
       "-z",
       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa..HASH"
     ],
@@ -2447,18 +2455,22 @@
       "@@@STEP_NEST_LEVEL@2@@@",
       "@@@STEP_LOG_LINE@json.output@{@@@",
       "@@@STEP_LOG_LINE@json.output@  \"owner\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"email\": \"owner@example.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@    \"email\": \"author@example.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@    \"name\": \"author\"@@@",
       "@@@STEP_LOG_LINE@json.output@  }, @@@",
       "@@@STEP_LOG_LINE@json.output@  \"reviewers\": {@@@",
       "@@@STEP_LOG_LINE@json.output@    \"REVIEWER\": [@@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"reviewer@example.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"reviewer@example.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"reviewer\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }, @@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"nobody@google.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"nobody@google.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"nobody\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }, @@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"robot@gserviceaccount.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"robot@gserviceaccount.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"robot\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }@@@",
       "@@@STEP_LOG_LINE@json.output@    ]@@@",
       "@@@STEP_LOG_LINE@json.output@  }@@@",
@@ -2473,6 +2485,13 @@
   },
   {
     "cmd": [],
+    "name": "authors",
+    "~followup_annotations": [
+      "@@@STEP_SUMMARY_TEXT@{Account(name='author', email='author@example.com')}@@@"
+    ]
+  },
+  {
+    "cmd": [],
     "name": "roll message"
   },
   {
@@ -2754,7 +2773,9 @@
       "commit",
       "-m",
       "[roll eggs, ham, spam] Roll 3 commits\n\n[roll eggs] module: Short commit summary\n\nLonger commit details.\n\nOriginal-Bug: 123\nReviewed-On: https://pigweed-review.googlesource.com/c/project/+/22222\n\nhttps://pigweed.googlesource.com/pigweed/pigweed\neggs Rolled-Commits: aaaaaaaaaaaaaaa..HASH\n\n[roll ham] module: Short commit summary\n\nLonger commit details.\n\nOriginal-Bug: 123\nReviewed-On: https://pigweed-review.googlesource.com/c/project/+/22222\n\nhttps://pigweed.googlesource.com/pigweed/pigweed\nham Rolled-Commits: aaaaaaaaaaaaaaa..HASH\n\n[roll spam] module: Short commit summary\n\nLonger commit details.\n\nOriginal-Bug: 123\nReviewed-On: https://pigweed-review.googlesource.com/c/project/+/22222\n\nhttps://pigweed.googlesource.com/pigweed/pigweed\nspam Rolled-Commits: 111111111111111..222222222222222\n\n\nRoller-URL: https://ci.chromium.org/b/8945511751514863184\nCq-Cl-Tag: roller-builder:builder\nCq-Cl-Tag: roller-bid:8945511751514863184\nCQ-Do-Not-Cancel-Tryjobs: true\nChange-Id: I27ec3e6a65adbbeb0f5d0b74ef7036a069efcfe8",
-      "-a"
+      "-a",
+      "--author",
+      "author <author@pigweed.infra.roller.example.com>"
     ],
     "cwd": "[START_DIR]/checkout",
     "infra_step": true,
diff --git a/recipes/submodule_roller.expected/with-requires.json b/recipes/submodule_roller.expected/with-requires.json
index 7e6ab60..c0b97f3 100644
--- a/recipes/submodule_roller.expected/with-requires.json
+++ b/recipes/submodule_roller.expected/with-requires.json
@@ -1087,7 +1087,7 @@
     "cmd": [
       "git",
       "log",
-      "--pretty=format:%H\n%ae\n%B",
+      "--pretty=format:%H\n%an\n%ae\n%B",
       "-z",
       "1111111111111111111111111111111111111111..2222222222222222222222222222222222222222"
     ],
@@ -1304,18 +1304,22 @@
       "@@@STEP_NEST_LEVEL@1@@@",
       "@@@STEP_LOG_LINE@json.output@{@@@",
       "@@@STEP_LOG_LINE@json.output@  \"owner\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"email\": \"owner@example.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@    \"email\": \"author@example.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@    \"name\": \"author\"@@@",
       "@@@STEP_LOG_LINE@json.output@  }, @@@",
       "@@@STEP_LOG_LINE@json.output@  \"reviewers\": {@@@",
       "@@@STEP_LOG_LINE@json.output@    \"REVIEWER\": [@@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"reviewer@example.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"reviewer@example.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"reviewer\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }, @@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"nobody@google.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"nobody@google.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"nobody\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }, @@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"robot@gserviceaccount.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"robot@gserviceaccount.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"robot\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }@@@",
       "@@@STEP_LOG_LINE@json.output@    ]@@@",
       "@@@STEP_LOG_LINE@json.output@  }@@@",
@@ -1901,7 +1905,7 @@
     "cmd": [
       "git",
       "log",
-      "--pretty=format:%H\n%ae\n%B",
+      "--pretty=format:%H\n%an\n%ae\n%B",
       "-z",
       "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa..HASH"
     ],
@@ -1995,18 +1999,22 @@
       "@@@STEP_NEST_LEVEL@2@@@",
       "@@@STEP_LOG_LINE@json.output@{@@@",
       "@@@STEP_LOG_LINE@json.output@  \"owner\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"email\": \"owner@example.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@    \"email\": \"author@example.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@    \"name\": \"author\"@@@",
       "@@@STEP_LOG_LINE@json.output@  }, @@@",
       "@@@STEP_LOG_LINE@json.output@  \"reviewers\": {@@@",
       "@@@STEP_LOG_LINE@json.output@    \"REVIEWER\": [@@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"reviewer@example.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"reviewer@example.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"reviewer\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }, @@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"nobody@google.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"nobody@google.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"nobody\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }, @@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"robot@gserviceaccount.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"robot@gserviceaccount.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"robot\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }@@@",
       "@@@STEP_LOG_LINE@json.output@    ]@@@",
       "@@@STEP_LOG_LINE@json.output@  }@@@",
@@ -2021,6 +2029,13 @@
   },
   {
     "cmd": [],
+    "name": "authors",
+    "~followup_annotations": [
+      "@@@STEP_SUMMARY_TEXT@{Account(name='author', email='author@example.com')}@@@"
+    ]
+  },
+  {
+    "cmd": [],
     "name": "roll message"
   },
   {
@@ -2273,7 +2288,9 @@
       "commit",
       "-m",
       "[roll ham, spam] Roll 2 commits\n\n[roll ham] module: Short commit summary\n\nLonger commit details.\n\nOriginal-Bug: 123\nReviewed-On: https://pigweed-review.googlesource.com/c/project/+/22222\n\nhttps://pigweed.googlesource.com/pigweed/pigweed\nham Rolled-Commits: aaaaaaaaaaaaaaa..HASH\n\n[roll spam] module: Short commit summary\n\nLonger commit details.\n\nOriginal-Bug: 123\nReviewed-On: https://pigweed-review.googlesource.com/c/project/+/22222\n\nhttps://pigweed.googlesource.com/pigweed/pigweed\nspam Rolled-Commits: 111111111111111..222222222222222\n\n\nRoller-URL: https://ci.chromium.org/b/8945511751514863184\nCq-Cl-Tag: roller-builder:builder\nCq-Cl-Tag: roller-bid:8945511751514863184\nCQ-Do-Not-Cancel-Tryjobs: true\nChange-Id: I27ec3e6a65adbbeb0f5d0b74ef7036a069efcfe8",
-      "-a"
+      "-a",
+      "--author",
+      "author <author@pigweed.infra.roller.example.com>"
     ],
     "cwd": "[START_DIR]/checkout",
     "infra_step": true,
diff --git a/recipes/submodule_roller.proto b/recipes/submodule_roller.proto
index d40bb95..a5ee1b3 100644
--- a/recipes/submodule_roller.proto
+++ b/recipes/submodule_roller.proto
@@ -20,9 +20,6 @@
   // The path of the submodule to update. Required.
   string submodule_path = 1;
 
-  // The hash to update to. Default: get from buildbucket.
-  string new_revision = 2;
-
   // Branch to get latest from when new_revision is None and no buildbucket
   // trigger.
   string submodule_branch = 3;
@@ -53,4 +50,8 @@
 
   // Vote Bot-Commit+1 instead of Code-Review+2.
   bool bot_commit = 10;
+
+  // Forge the author so rolls of single commits are attributed to the original
+  // commit author.
+  bool forge_author = 11;
 }
diff --git a/recipes/submodule_roller.py b/recipes/submodule_roller.py
index 0e9c5c1..af35c74 100644
--- a/recipes/submodule_roller.py
+++ b/recipes/submodule_roller.py
@@ -289,8 +289,9 @@
         _process_deps(api, rolls, submodules, gerrit_name)
 
     cc = set()
+    authors = api.roll_util.authors(*rolls.values())
     if cc_authors_on_rolls:
-        cc.update(api.roll_util.authors(*rolls.values()))
+        cc.update(authors)
     if cc_reviewers_on_rolls:
         cc.update(api.roll_util.reviewers(*rolls.values()))
 
@@ -305,9 +306,17 @@
 
     roll_kwargs = {}
     if always_cc:
-        roll_kwargs['cc'] = cc
+        roll_kwargs['cc'] = [x.email for x in cc]
     else:
-        roll_kwargs['cc_on_failure'] = cc
+        roll_kwargs['cc_on_failure'] = [x.email for x in cc]
+
+    author_override = None
+    with api.step.nest('authors') as pres:
+        pres.step_summary_text = repr(authors)
+    if len(authors) == 1 and props.forge_author:
+        author_override = api.roll_util.fake_author(
+            next(iter(authors))
+        )._asdict()
 
     change = api.auto_roller.attempt_roll(
         gerrit_host=api.checkout.gerrit_host(),
@@ -319,6 +328,7 @@
         labels_to_set=api.roll_util.labels_to_set,
         labels_to_wait_on=api.roll_util.labels_to_wait_on,
         bot_commit=props.bot_commit,
+        author_override=author_override,
         **roll_kwargs
     )
 
@@ -361,8 +371,9 @@
 
     def properties(**kwargs):
         new_kwargs = api.checkout.git_properties()
+        new_kwargs['forge_author'] = True
+        new_kwargs['dry_run'] = True
         new_kwargs.update(kwargs)
-        new_kwargs.setdefault('dry_run', True)
         return api.properties(**new_kwargs)
 
     def commit_data(name, **kwargs):
diff --git a/recipes/txt_roller.expected/no-trigger.json b/recipes/txt_roller.expected/no-trigger.json
index 16412b5..13325e6 100644
--- a/recipes/txt_roller.expected/no-trigger.json
+++ b/recipes/txt_roller.expected/no-trigger.json
@@ -1238,7 +1238,7 @@
     "cmd": [
       "git",
       "log",
-      "--pretty=format:%H\n%ae\n%B",
+      "--pretty=format:%H\n%an\n%ae\n%B",
       "-z",
       "1111111111111111111111111111111111111111..2222222222222222222222222222222222222222"
     ],
@@ -1296,18 +1296,22 @@
       "@@@STEP_NEST_LEVEL@1@@@",
       "@@@STEP_LOG_LINE@json.output@{@@@",
       "@@@STEP_LOG_LINE@json.output@  \"owner\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"email\": \"owner@example.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@    \"email\": \"author@example.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@    \"name\": \"author\"@@@",
       "@@@STEP_LOG_LINE@json.output@  }, @@@",
       "@@@STEP_LOG_LINE@json.output@  \"reviewers\": {@@@",
       "@@@STEP_LOG_LINE@json.output@    \"REVIEWER\": [@@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"reviewer@example.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"reviewer@example.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"reviewer\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }, @@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"nobody@google.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"nobody@google.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"nobody\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }, @@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"robot@gserviceaccount.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"robot@gserviceaccount.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"robot\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }@@@",
       "@@@STEP_LOG_LINE@json.output@    ]@@@",
       "@@@STEP_LOG_LINE@json.output@  }@@@",
@@ -1470,7 +1474,9 @@
       "commit",
       "-m",
       "[roll foo.txt] foo\nbar\n\n\nhttps://pigweed.googlesource.com/pigweed/pigweed\nfoo.txt Rolled-Commits: 111111111111111..222222222222222\nRoller-URL: https://ci.chromium.org/b/0\nCq-Cl-Tag: roller-builder:\nCq-Cl-Tag: roller-bid:0\nCQ-Do-Not-Cancel-Tryjobs: true\nChange-Id: Ib92a62842ab6b0cc6777dcd33fb1c8532c7396ad",
-      "-a"
+      "-a",
+      "--author",
+      "author <author@pigweed.infra.roller.example.com>"
     ],
     "cwd": "[START_DIR]/checkout",
     "infra_step": true,
diff --git a/recipes/txt_roller.expected/success.json b/recipes/txt_roller.expected/success.json
index 35959b9..d0bed31 100644
--- a/recipes/txt_roller.expected/success.json
+++ b/recipes/txt_roller.expected/success.json
@@ -2024,7 +2024,7 @@
     "cmd": [
       "git",
       "log",
-      "--pretty=format:%H\n%ae\n%B",
+      "--pretty=format:%H\n%an\n%ae\n%B",
       "-z",
       "1111111111111111111111111111111111111111..2d72510e447ab60a9728aeea2362d8be2cbd7789"
     ],
@@ -2118,18 +2118,22 @@
       "@@@STEP_NEST_LEVEL@1@@@",
       "@@@STEP_LOG_LINE@json.output@{@@@",
       "@@@STEP_LOG_LINE@json.output@  \"owner\": {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"email\": \"owner@example.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@    \"email\": \"author@example.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@    \"name\": \"author\"@@@",
       "@@@STEP_LOG_LINE@json.output@  }, @@@",
       "@@@STEP_LOG_LINE@json.output@  \"reviewers\": {@@@",
       "@@@STEP_LOG_LINE@json.output@    \"REVIEWER\": [@@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"reviewer@example.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"reviewer@example.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"reviewer\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }, @@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"nobody@google.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"nobody@google.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"nobody\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }, @@@",
       "@@@STEP_LOG_LINE@json.output@      {@@@",
-      "@@@STEP_LOG_LINE@json.output@        \"email\": \"robot@gserviceaccount.com\"@@@",
+      "@@@STEP_LOG_LINE@json.output@        \"email\": \"robot@gserviceaccount.com\", @@@",
+      "@@@STEP_LOG_LINE@json.output@        \"name\": \"robot\"@@@",
       "@@@STEP_LOG_LINE@json.output@      }@@@",
       "@@@STEP_LOG_LINE@json.output@    ]@@@",
       "@@@STEP_LOG_LINE@json.output@  }@@@",
@@ -2364,7 +2368,9 @@
       "commit",
       "-m",
       "[roll foo.txt] foo\nbar\n\n\nhttps://pigweed.googlesource.com/pigweed/pigweed\nfoo.txt Rolled-Commits: 111111111111111..2d72510e447ab60\nRoller-URL: https://ci.chromium.org/b/8945511751514863184\nCq-Cl-Tag: roller-builder:builder\nCq-Cl-Tag: roller-bid:8945511751514863184\nCQ-Do-Not-Cancel-Tryjobs: true\nChange-Id: I28135185e8ac8c69d0b894c4be54ddbb0ea69d5c",
-      "-a"
+      "-a",
+      "--author",
+      "author <author@pigweed.infra.roller.example.com>"
     ],
     "cwd": "[START_DIR]/checkout",
     "infra_step": true,
diff --git a/recipes/txt_roller.proto b/recipes/txt_roller.proto
index 3c83ffb..d1bd96b 100644
--- a/recipes/txt_roller.proto
+++ b/recipes/txt_roller.proto
@@ -32,4 +32,8 @@
 
   // Vote Bot-Commit+1 instead of Code-Review+2.
   bool bot_commit = 5;
+
+  // Forge the author so rolls of single commits are attributed to the original
+  // commit author.
+  bool forge_author = 6;
 }
diff --git a/recipes/txt_roller.py b/recipes/txt_roller.py
index d1bfc41..f855f0b 100644
--- a/recipes/txt_roller.py
+++ b/recipes/txt_roller.py
@@ -116,6 +116,14 @@
         ),
     }
 
+    authors = api.roll_util.authors(*rolls.values())
+
+    author_override = None
+    if len(authors) == 1 and props.forge_author:
+        author_override = api.roll_util.fake_author(
+            next(iter(authors))
+        )._asdict()
+
     change = api.auto_roller.attempt_roll(
         gerrit_host=api.checkout.gerrit_host(),
         gerrit_project=api.checkout.gerrit_project(),
@@ -126,6 +134,7 @@
         labels_to_set=api.roll_util.labels_to_set,
         labels_to_wait_on=api.roll_util.labels_to_wait_on,
         bot_commit=props.bot_commit,
+        author_override=author_override,
     )
 
     return api.auto_roller.raw_result(change)
@@ -143,6 +152,7 @@
 
     def properties(**kwargs):
         new_kwargs = api.checkout.git_properties()
+        new_kwargs['forge_author'] = True
         new_kwargs.update(kwargs)
         return api.properties(**new_kwargs)