diff --git a/mercurial/templatekw.py b/mercurial/templatekw.py
index 774b1c0f2507a6f1c5b59ce73d36bd8e47c0c234_bWVyY3VyaWFsL3RlbXBsYXRla3cucHk=..f67741e8264beff52e49a02293d39492f9b3f707_bWVyY3VyaWFsL3RlbXBsYXRla3cucHk= 100644
--- a/mercurial/templatekw.py
+++ b/mercurial/templatekw.py
@@ -634,6 +634,19 @@
     return b''
 
 
+@templatekeyword(b'onelinesummary', requires={b'ui', b'ctx'})
+def showonelinesummary(context, mapping):
+    """String. A one-line summary for the ctx (not including trailing newline).
+    The default template be overridden in command-templates.oneline-summary."""
+    # Avoid cycle:
+    # mercurial.cmdutil -> mercurial.templatekw -> mercurial.cmdutil
+    from . import cmdutil
+
+    ui = context.resource(mapping, b'ui')
+    ctx = context.resource(mapping, b'ctx')
+    return cmdutil.format_changeset_summary(ui, ctx)
+
+
 @templatekeyword(b'path', requires={b'fctx'})
 def showpath(context, mapping):
     """String. Repository-absolute path of the current file. (EXPERIMENTAL)"""
diff --git a/tests/test-template-keywords.t b/tests/test-template-keywords.t
index 774b1c0f2507a6f1c5b59ce73d36bd8e47c0c234_dGVzdHMvdGVzdC10ZW1wbGF0ZS1rZXl3b3Jkcy50..f67741e8264beff52e49a02293d39492f9b3f707_dGVzdHMvdGVzdC10ZW1wbGF0ZS1rZXl3b3Jkcy50 100644
--- a/tests/test-template-keywords.t
+++ b/tests/test-template-keywords.t
@@ -114,6 +114,30 @@
   |
   o  0 (public): -1 (public) -1 (public)
   
+Test {onelinesummary}
+
+  $ hg log -G -T '{onelinesummary}'
+  @  8:95c24699272e tip "third"
+  |
+  o  7:29114dbae42b "second"
+  
+  o    6:d41e714fe50d "merge"
+  |\
+  | o  5:13207e5a10d9 "new head"
+  | |
+  o |  4:bbe44766e73d "new branch"
+  |/
+  o  3:10e46f2dcbf4 "no user, no domain"
+  |
+  o  2:97054abb4ab8 "no person"
+  |
+  o  1:b608e9d1a3f0 "other 1"
+  |
+  o  0:1e4e1b8f71e0 "line 1"
+  
+  $ hg log -T '{onelinesummary}' -r 0 \
+  > --config command-templates.oneline-summary='{rev} - {desc}'
+  0 - line 1 (no-eol)
 
 Keys work: