Add optional check for "Signed-off-by:" tag

Certain projects (such as Coreboot) require a sign-off. Add a check for
the sign-off field which can be enabled per-project.

BUG=chromium:338878
TEST=Enabled sign-off by check on Coreboot project. Verified that commit
without sign-off was caught by presubmit. Verified that adding sign-off
allowed presubmit pass.

Change-Id: I6872cbbf66ae94afa1952baf8deedea9a1109f28
Original-Change-Id: I30e8b8ccc37413c3ea5942e8c4e3e628017b0b63
Reviewed-on: https://chromium-review.googlesource.com/190686
Reviewed-by: Shawn Nematbakhsh <shawnn@chromium.org>
Commit-Queue: Shawn Nematbakhsh <shawnn@chromium.org>
Tested-by: Shawn Nematbakhsh <shawnn@chromium.org>
Reviewed-by: Aaron Durbin <adurbin@chromium.org>
diff --git a/pre-upload.py b/pre-upload.py
index ff39b3a..575ea2c 100755
--- a/pre-upload.py
+++ b/pre-upload.py
@@ -582,6 +582,16 @@
     return HookFailure(msg)
 
 
+def _check_change_has_signoff_field(project, commit):
+  """Check for a non-empty 'Signed-off-by:' field in the commit message."""
+  SIGNOFF_RE = r'\nSigned-off-by: \S+'
+
+  if not re.search(SIGNOFF_RE, _get_commit_desc(commit)):
+    msg = ('Changelist description needs Signed-off-by: field\n'
+           'E.g. Signed-off-by: My Name <me@chromium.org>')
+    return HookFailure(msg)
+
+
 def _run_project_hook_script(script, project, commit):
   """Runs a project hook script.
 
@@ -669,6 +679,7 @@
     'cros_license_check': _check_license,
     'tab_check': _check_no_tabs,
     'branch_check': _check_change_has_branch_field,
+    'signoff_check': _check_change_has_signoff_field,
 }